Every feature touches unexpected parts of the system
A billing change surprises shipping. A small ticket becomes a tour of the monolith.
Legacy PHP modernization · SaaS and product teams
I help product teams make business-critical PHP systems easier to change, upgrade and scale — incrementally, while the existing product keeps running.
Prefer a fixed-scope first step? See the €1,200 Migration Readiness Audit →
monolith/ ├── billing keep in PHP · upgrade framework ├── admin keep in PHP · low traffic ├── search extract to Go · latency + CPU ├── event-pipeline extract to Go · throughput └── reporting keep, but move off the primary DB code after the decision
Not every legacy PHP system has all of these. If two or three are familiar, the next conversation is about sequencing work — not picking a new language.
A billing change surprises shipping. A small ticket becomes a tour of the monolith.
Deploys wait for a quiet window. Rollback is folklore. Nobody wants to ship on a Friday.
The runtime is past its support window, or a major framework bump is pinned by abandoned packages.
Rules live in controllers, SQL, and jobs that nobody owns. Changing behaviour means archaeology.
Critical paths have no characterisation tests, so every cleanup is a production bet.
A worker or an endpoint is the constraint, but capacity still means more of the whole PHP fleet.
The money path has a reputation. Estimates inflate around it. New hires learn not to touch it.
Not because microservices are fashionable — because one workload needs its own deploy, scale, or runtime.
Modernization is a set of options. A rewrite in Go is one of them, and usually not the first.
Keep PHP where PHP works. Replace or extract only what creates measurable engineering value.
Before a large migration, look at the running architecture. The output is a concrete modernization roadmap rather than a generic rewrite proposal.
A written sequence: what can stay, what should be upgraded, where boundaries are missing, and which workload — if any — is worth extracting. A valid result is “keep this in PHP.”
Send the runtime, the framework, and the part of the system that is painful to touch. You get a technical conversation, not a rewrite pitch.
Incremental modernization instead of a big-bang rewrite.
01
Architecture, constraints, and the business-critical paths. What actually hurts, not what a rewrite would look like.
02
Identify what causes engineering or business risk. Upgrade, refactor, extract, or leave it alone.
03
Change one slice while the product keeps shipping. No freeze, no big-bang cutover.
04
Verify the result against the baseline before touching the next part of the system. Stopping is allowed.
Symfony, Laravel, APIs, workers, and the operational path around them — not greenfield demos.
PostgreSQL, Redis, queues, Docker, Kubernetes, CI/CD. Schema and deploy work included, not bolted on later.
Boundaries, data ownership, service extraction, and production debugging on systems that already make money.
Unsupported runtimes, tangled monoliths, and migrations sequenced so each step can be reversed.
Two PHP products — Blog and Academy — each contained their own file and image upload implementation. The logic was duplicated, so upload and validation rules had to be kept in sync across more than one codebase.
I proposed extracting upload functionality into a separate backend service.
The extraction added another deployable service and a network dependency, so the boundary had to justify the additional operational complexity.

Senior Backend Engineer
I am a senior backend engineer working in production PHP and Go: architecture, upgrades, and incremental migrations. Engagements run B2B with European product teams.
Almost never as a first move. A full rewrite means two systems, a product freeze risk, and rediscovering rules that only exist in the current code. Most of the value is in upgrades, boundaries, and extracting the few workloads that actually need a different runtime.
That is the intended shape of the work. Changes go out in slices, behind flags or side-by-side consumers where needed, with the existing path kept deployable. I do not promise zero incidents or zero downtime. I do design so a step can be reversed instead of becoming a weekend cutover.
No. Keep PHP where PHP works. Go is for named workloads where concurrency, long-lived processes, or independent scaling is the actual lever. A valid outcome of the assessment is that nothing should move.
Yes. That is the default. I work in your repository, your review process and your tracker. Your team keeps the domain knowledge. I add modernization sequencing and the capacity to execute it without stalling the roadmap.
Yes, and that is usually the right first step. The assessment looks at the running system and produces a concrete modernization roadmap — including the recommendation to upgrade in place and leave Go out of it.
If the architecture question is already settled and the gap is senior backend capacity, that is a separate B2B contractor engagement.
Next step
Let's look at the system and identify the safest next step. You talk to the engineer who would do the work.