Paweł Maj

Paweł Maj

Solutions architect and technical leader

For 15 years I have been turning business problems into systems that keep growing for years. I start by understanding the domain, fit the architecture to the scale and to the team, then lead people through building it — to production and beyond.

  • 15 years of experience
  • technical leader
  • remote
StartOnboardingHandler.php
final class StartOnboardingHandler
{
    public function __construct(
        private ProcessRepository $processes,
        private MessageBusInterface $bus,
    ) {}

    public function __invoke(StartOnboarding $command): void
    {
        $process = Process::start(
            $command->employeeId,
            $command->template,
        );

        $this->processes->save($process);
        $this->bus->dispatch(new ProcessStarted($process->id()));
    }
}

Skills

Backend is where I go deepest, but I deliver whole features — from the domain model to the deployment config.

Backend

  • PHP 8+
  • Symfony 7 (Messenger, Doctrine)
  • Laravel
  • REST APIs
  • RabbitMQ
  • legacy Symfony 3.4

Did every framework upgrade of my system myself: from Symfony 5.3 / PHP 8.0 to Symfony 7.4 / PHP 8.5.

Architecture

  • DDD
  • CQRS
  • Event Sourcing
  • Event Storming
  • modular monolith
  • microservices
  • SOLID
  • TDD

Designed a DDD/CQRS workflow engine from scratch and co-designed a monolith-to-36-microservices migration.

Frontend

  • React 18
  • Next.js
  • TypeScript
  • React Hook Form

For the last 18 months I have delivered the frontend of my features in the admin panel; my own products I build in Next.js.

Databases

  • PostgreSQL
  • MySQL
  • MongoDB
  • Redis
  • Elasticsearch
  • Doctrine
  • Prisma

30+ databases in a microservice architecture, every service owning its database and its own copy of the data.

Testing & quality

  • Behat
  • PHPUnit
  • PHPStan
  • PHPArkitect
  • PHP CS Fixer
  • ESLint
  • Jest

Introduced Behat as the team’s testing standard — the suite has grown to 2,300+ scenarios.

Infrastructure & CI/CD

  • Kubernetes (manifests, kubectl, k9s)
  • Docker
  • Azure (AKS)
  • AWS (ECS/EKS, RDS, Lambda)
  • OVH
  • Bitbucket Pipelines
  • GitHub Actions
  • GitLab CI

I write the Kubernetes definitions with the feature — a change ships with its deployment config in the same pull request.

AI-assisted development

  • Claude Code
  • Codex
  • custom skills
  • MCP integrations
  • AI-assisted refactoring and tests

Brought Claude Code into the team’s daily flow: skills for the Jira → branch → pull request → review cycle.

Languages: Polish (native), English B2 — day-to-day written technical communication, calls with US clients

Case studies

The most interesting problems I have solved. No company names — what matters is what I did and how.

A modular monolith on DDD and CQRS

The HR workflow engine of a SaaS onboarding platform — pre-boarding, onboarding and offboarding for ~170 client applications.

My role: architect and main author

  • Designed the system from an empty repository as a modular monolith: modules with their own domain, boundaries and layers enforced automatically by PHPArkitect.
  • Separated writes from reads (CQRS) and built a mechanism of asynchronous command handlers — heavy operations go through a queue instead of blocking user requests.
  • Scheduled actions, deadlines, reminders and alerts run as domain events, so new process steps are added without touching existing ones.
  • Behat as the testing standard for every feature; the system went through every upgrade from Symfony 5.3 / PHP 8.0 to Symfony 7.4 / PHP 8.5.

Result: 7,000+ commits and 2,300+ Behat scenarios; a six-person team develops it today.

  • DDD
  • CQRS
  • Symfony Messenger
  • RabbitMQ
  • PHPArkitect
  • Behat

AI as a service in the product

Features built on language models — for the platform’s clients and for the company’s employees.

My role: designer and builder

  • Survey question generation from materials provided by the client: upload the documents, get a ready set of questions to review.
  • An internal chatbot loaded with the company wiki — every employee can ask a question and get an answer grounded in the company’s documentation.
  • An MCP server opening the platform’s API to AI assistants: per-client access and refresh tokens, an admin-side switch.
  • OpenAI
  • LLM
  • chatbot
  • MCP
  • Symfony

From a monolith to 36 microservices

An ad-buying platform for third-party advertising networks that crashed daily at 50k daily active users.

My role: tech lead

  • Co-designed with the CTO the migration of a Laravel monolith to 36 autonomous services (PHP, Java, Python); my team owned 16.
  • Asynchronous communication over RabbitMQ, every service owning its database and its own copy of the data; synchronous APIs only where money was involved.
  • ~120 service instances and 30+ databases: Elasticsearch for matching, MongoDB for statistics, Redis, ELK.
  • One of six tech leads while the team grew from 6 to 30.

Result: From 50k to 3 million daily active users.

  • microservices
  • event-driven
  • RabbitMQ
  • Elasticsearch
  • MongoDB
  • Redis

A platform clients configure themselves

The same SaaS platform — client HR teams model their own processes in it without engineering work.

My role: data model designer

  • Data model for custom fields and forms, custom reports, document access rules, employee segments, events and meetings.
  • The integrations the business runs on: Stripe billing (subscriptions, payment links, webhooks), HubSpot CRM, SMS delivery.
  • The frontend of these features in the React 18 and TypeScript admin panel.
  • data modelling
  • Stripe
  • HubSpot
  • webhooks
  • React

AI-assisted development in the team

A product team of 8–10 engineers.

My role: initiator and tool author

  • Brought Claude Code into the team’s daily work.
  • Wrote the skills for the Jira → branch → pull request → review cycle.
  • Co-wrote the per-module CLAUDE.md documentation so the agent follows the architecture and testing rules.

Result: The team adopted the skills as its standard way of working.

  • Claude Code
  • skills
  • CLAUDE.md
  • code review

A team and CI/CD from scratch

An employee onboarding and engagement PWA for a Polish client.

My role: team lead

  • Led two backend developers, a frontend developer and a tester; Symfony backend, React frontend.
  • Built CI/CD in Bitbucket Pipelines: build, PHPUnit, PHPStan and PHP CS Fixer on every commit.
  • Deployment to dedicated servers gated on a green pipeline.
  • leadership
  • CI/CD
  • Bitbucket Pipelines
  • PHPStan
  • PWA

I have also worked on

  • an equipment-rental tracking system for a US construction-machinery client (frontend)
  • systems supporting debt-collection processes (tech lead)
  • systems supporting brokerage of credit and insurance sales
  • driving-school services, a diet configurator and children’s games for Android
  • software for city information kiosks

VibeAudit Audits of apps built with AI

Paweł Maj — I created this service and run every audit myself.

Your app was built in a few days. I check it before someone else does.

Lovable, Bolt, Replit, Cursor, Claude Code — they get an app live fast, but nobody looks at where the database sits, who can see the secrets, or whether the login can be bypassed. I review the code and infrastructure against 85 checkpoints in 8 areas, based on OWASP Top 10 and ASVS.

Every finding is verified in the code before it goes into the report. You pay for a senior’s judgement: what actually affects you, what is dangerous today and what can wait.

Included

  • report in HTML and PDF
  • 30-minute call about the results
  • one retest within 30 days
  • a sample CI/CD pipeline for your repository

Fixed price from 599 PLN, agreed before work starts.

See the offer on vibeaudit.pl

The service and its site are in Polish, for clients in Poland.

Sketch of an app: browser, server and database under a magnifying glass

Contact

A project, a role, an audit or just a question — I usually reply the same day.

kontakt@pmaj.pl
Phone
+48 515 558 789
LinkedIn
linkedin.com/in/majpawel
Where
Wrocław, Poland — remote