All products
Custom software

Custom software & system modernization

When your core system runs the business, a rewrite is a gamble you cannot take. We modernize it piece by piece, in production, with no overnight switch that could take the whole company down.

  • Strangler pattern
  • Routing layer
  • Dual-run data migration
  • Legacy integration
  • Zero big-bang cutover
  • Proven tech stack

This is for established companies whose software has become the business — the system that books the orders, moves the money, or runs the floor. It works, mostly, but it is years of decisions deep, the people who built it have moved on, and every change feels risky. A clean rewrite sounds tempting until you price the two years of running both worlds at once, and a failed cutover is the kind of event that reaches the board.

We take the opposite bet. Instead of a single switch from old to new, we modernize the system in place, one capability at a time, with each replacement running in production next to the part it replaces until it has earned the right to take over. The business keeps running the whole way through. There is no weekend where everything changes and everyone holds their breath.

The people who scope this work are the people who ship it — one senior team, the same architecture review, from the first read of your code to the last legacy path switched off. You own the result outright, with no dependency on us to keep it alive.

How we modernize without stopping the business

Discovery and audit

We spend the first couple of weeks reading the code and tracing the data, not just interviewing people — because the real system is in what actually runs, and the gap between how a system is described and how it behaves is where the risk lives. We follow the critical paths end to end, find the undocumented jobs and the integrations nobody mentions, and watch where the data truly flows.

You come out of it with a dependency map and a risk register your board can act on — what is load-bearing, what is fragile, what would cost you most if it failed — plus a written, costed plan for the order we would tackle it in. It is a short fixed-fee audit, and it stands on its own even if you take it to someone else.

OutputA dependency map, a prioritised risk register, and a costed modernization plan

Architecture and sequencing

We design the target shape and, just as importantly, the order of operations to reach it. A routing layer goes in front of the legacy system so traffic can be sent to either the old path or a new one per capability — this is what makes incremental replacement possible without the business noticing a seam.

Sequencing is driven by business risk, not by which parts are the most satisfying to rebuild. We start where a failure would hurt most or where the old code blocks everything else, and we leave the quiet, stable corners for last — sometimes forever, if replacing them buys nothing. Every significant decision is written down as a short record of what we chose and why.

OutputA target architecture, a routing layer plan, and a risk-ordered sequence with decision records

Build in slices

We work in two-week iterations, each ending in working software demoed to the people who use it. A slice is one capability — a report, a workflow, an API — rebuilt, deployed behind the routing layer, and run live alongside the old version so the two can be compared on real traffic before anything is trusted to the new path.

Nothing is a big reveal at the end. You see each piece land, in production, while the system you depend on keeps serving everyone exactly as before. If a slice is not right, we have changed one capability, not bet the company.

OutputWorking releases every two weeks, each one capability live in production

Migrate and integrate

Moving the data is the hard part, and we treat it that way. For each slice we run the old and new stores in parallel, reconcile them continuously, and only cut a capability over once the numbers match — then keep the old path warm so we can fall back in minutes if something surfaces. Every migration step is reversible until we delete the old path, which we do only once it has proven itself.

Where you have systems we cannot or should not replace, we integrate around them — the payroll engine, the regulator's interface, the warehouse controller — so the modern parts and the legacy core cooperate cleanly instead of being forced into one rewrite.

OutputData migrated slice by slice with dual-run and reconciliation, integrations in place, each step reversible

Cutover and harden

Cutover happens in slices, never all at once, and each one is rehearsed. We load-test the new paths, run security and failure drills, and confirm regulatory obligations — GDPR, and sector rules where they apply — before the old code is switched off. Only after a capability has carried full production traffic cleanly do we delete its legacy path for good.

You get a readiness report for each cutover: what was tested, what the fallback is, and the evidence that the new path matches the old one. The result is fewer moving parts than you started with, not more.

OutputLoad, security and failure testing, a readiness report per cutover, and legacy paths retired

Handover

Everything is built to be owned by you, not rented from us. We hand over documented code, the decision records, runbooks for the things that can go wrong, and training for the people who will carry it. We stay for a defined transition and then step back on purpose.

We choose boring, proven technology from the start precisely so that this moment works — stacks you can hire for and that will still be supported in a decade, with every choice written down. There is no proprietary ETEREO layer you would have to keep paying for.

OutputDocumentation, runbooks, training, and full ownership of the code and the know-how

What you walk away with

  • A dependency map and risk register your board can act on
  • A costed, risk-ordered modernization plan from the fixed-fee audit
  • A routing layer that lets old and new run side by side
  • Decision records explaining every significant choice
  • Data migrated in reversible slices, with reconciliation evidence
  • Clean integrations with the systems you keep
  • Documented code, runbooks, training, and full ownership

How we think about modernization

The honest case against a big-bang rewrite is simple: it asks you to run two systems in parallel for years, reproduce behaviour nobody fully remembers, and then switch everything on one date — and the day you learn whether it worked is the worst possible day to find out. Most rewrites that start this way either never ship or ship late and wounded.

The incremental path we use is sometimes called the strangler approach: you put a routing layer in front of the old system and grow the new one around it, replacing a capability at a time, until the legacy core has been quietly surrounded and can be removed. The business never stops. Risk is paid down in small, reversible increments instead of saved up for one enormous bet.

We choose technology for longevity and hiring, not novelty — the kind of stack a new engineer already knows and that will still be maintained long after we are gone. Every decision is documented, because a modernization you cannot understand later is just a different legacy system.

Common questions

Why not just rewrite it from scratch?

Because a rewrite asks you to reproduce years of accumulated behaviour, run two systems at once for a long time, and then bet the business on a single cutover date. For a load-bearing system, that risk is rarely worth it. Replacing one capability at a time keeps the business running and lets you stop, or change course, at any point — something a big-bang rewrite never allows.

How do you modernize without downtime?

A routing layer sits in front of the legacy system and sends each request to the old path or a new one. We build a capability, run it in production next to the version it replaces, compare them on real traffic, and only then route users to it. Because every slice is reversible until the old path is deleted, there is no weekend cutover and no moment where the whole system changes at once.

What about our data — isn't migration the scary part?

It is the hard part, so we treat it as the main event rather than a final step. For each slice we run the old and new data stores in parallel, reconcile them continuously, and cut over only when the numbers agree — keeping the old path warm so we can fall back in minutes. We migrate in slices, not in one overnight dump, so a problem is contained to one capability instead of the whole dataset.

Will we be locked in to ETEREO afterwards?

No, and we design against it deliberately. You own the code, and we hand over documentation, decision records, runbooks and training so your own team can run and extend it. We build on boring, proven, widely known technology precisely so you can hire for it, and there is no proprietary layer of ours that you would have to keep paying to license.

Can you work with a system you cannot fully replace?

Yes — that is the normal case. Some parts are too regulated, too specialised, or simply not worth replacing. We integrate around them cleanly, letting the modern capabilities and the legacy core cooperate, and we are honest when the right answer is to leave something as it is rather than spend your budget touching a stable corner that works.

Is your core system too important to rewrite?

Start with a short, fixed-fee audit — we read the code and the data and give your board a dependency map, a risk register, and a costed plan for modernizing without stopping the business.

Book a modernization audit