Ten years of AngularJS, replaced in production in five months

A customer service portal serving several business units, moved off a 2016 AngularJS codebase without stopping the service.

10 years
of legacy code
5 months
to production
~60%
less JavaScript on first load
98
views the legacy app loaded upfront; now only the first screen

The legacy application was rebuilt from source to measure it. Initial JavaScript went from about 470 kB to about 190 kB compressed (about 1.8 MB to 0.7 MB uncompressed). The two compressed figures come from different tools, and CSS is left out because the legacy build does not minify it.

The situation

The group’s customer service portal had run on AngularJS 1.5 since 2016, inside a Java monorepo, built with tooling that no longer ran on a current Node version. One application served two installations on separate backends, and the larger one hosted a growing set of business-unit portals, each with its own branding, languages and access rules.

The constraint that shaped everything

Some decisions had to be fixed at build time: which backend to call must be known before the first request, login included. Others could only be made at runtime, because one build serves every portal and the active one changes as the user navigates. The legacy app blurred the two. We separated them: one build per environment, the portal resolved at runtime.

How we worked

We ran the technology assessment, set up the project and its architecture, then led a two-person frontend team through delivery.

Every feature started as a written specification in the repository (requirements, technical design, UI) before any code existed. AI agents implemented against those specs, and every change went through human review. Seshat, our internal toolkit for spec-driven agentic development, keeps the specs, the code and the decisions in step.

A migration guide mapped each legacy pattern (role hierarchy, route authorisation, session handling, HTTP interception) to its modern equivalent, so neither people nor agents had to reverse-engineer the old code twice. Login, the ticket list with filters and export, and ticket creation were running within the first two weeks.

Result

In production five months after work started. About 60% less JavaScript on first load, because only the first screen loads upfront and the rest arrives on demand. The specifications stayed in the repository, with the client’s team.

Let's talk about what you're building.

A conversation about your codebase and what is getting in its way. If we are not the right people for it, we will say so and point you at someone who is.

30-minute intro call
No commitment required
Honest assessment