· Niklas Nilsson, CEO

Ten years on the same site: two codebases, eight major upgrades, and the year we finally wrote tests

We say this broker web page has been on our hosting and continuous development arrangement since 2015. That is true, and it hides something: ten years is one site and two codebases. The first ran for seven years and was replaced when its platform reached end of life. The second is four years and 2,995 commits old, has been released to production 410 times, and has had eight major-version upgrades of the four things everything else stands on. Of the code serving the site today, 66% was last touched in 2026 and 1.5% dates from the year it was written.

That is what a decade on one site actually looks like. Not one codebase that held; a relationship in which the code is continuously replaced underneath a site that never went away.

The first seven years

The first codebase was Drupal 8 on PHP 7, with a front end built on Foundation. We do not have that repository on this machine any more, so there are no commit counts for it here, and we will not invent them.

What ended it was not the code. Drupal 8 reached end of life on 2 November 2021, which meant no more security releases for the platform under the site. The options were a Drupal 9 migration or a new stack, and in June 2022 the first commit of a Next.js rewrite landed. Seven years is a good run for a codebase; the lesson is that the end came from outside it, on somebody else's calendar.

The second codebase, by year

  • 2022 — 398 commits on 47 days, five people. Next.js 12, React 18, Tailwind 3, TypeScript 4. Contentful from the first commit, Postmark in July, Mapbox in August, Vimeo in December.
  • 2023 — 469 commits on 51 days, seven people, the most of any year. A 150-day silence from May to October, then Next 13 on 20 October and Next 14 on 11 November: two major upgrades in three weeks after five months of nothing. Cloudinary arrived in October.
  • 2024 — 665 commits on 122 days, three people. Mailchimp in February; the CRM integration in October, which turned property data from something typed into the CMS into something synced from the broker's system. reCAPTCHA on the forms the same month.
  • 2025 — 704 commits on 131 days, three people. Next 15 and React 19 in April, Turbopack the same day, Sentry a few days earlier. Tailwind 4 in June, and the translations moved out of the repository into a translation service.
  • 2026 — 759 commits on 77 days to 3 September, one person. Next 16 in February, the Contentful SDK two majors up the same week, bot protection replacing reCAPTCHA. A full audit in March, a migration to the framework's new caching model in the spring, TypeScript 6 in August. And the first test file on 18 August.

The commits went up every year while the number of people went down from seven to one. What changed is how the code gets written, and that is its own article.

What held

Four of the eleven outside services the site talks to date from the first six months of the rewrite and are still in place: the CMS, the transactional email, the maps, and the video host. The content model in the CMS has been the spine of the site since the first commit, and the CRM sync, the image pipeline and the project pages were all built onto it rather than beside it.

The arrangement held too. 410 merges into the production branch in four years, twenty of them labelled hotfixes. That is what "continuous" in continuous development means when it is measured: roughly two releases a week for four years.

What was replaced

  • Eight major upgrades of the foundations: Next.js 12 → 13 → 14 → 15 → 16, React 18 → 19, Tailwind 3 → 4, TypeScript 4 → 5 → 6.
  • 34 of the 125 packages that were ever in the manifest are gone — 27%. Among them, six replacements worth naming: the in-repo translation library gave way to a translation service in 2025; reCAPTCHA gave way to platform bot protection in 2026; a privacy analytics tool gave way to the tag manager in 2024; a headless component kit and its icon set gave way to a generated one in 2025; the bundler was swapped for its successor in 2025; and in spring 2026 the whole caching model was migrated to the framework's new one.
  • The code itself. By last-touch date, today's 43,651 lines of source split: 2022 — 676, 2023 — 2,443, 2024 — 3,441, 2025 — 8,438, 2026 — 28,653. Of the 153 files that existed at the end of 2022, 63 are still at the same path.

None of this was scheduled as a migration. Every replacement went out as an ordinary release among the 410, most of them small, each reversible on a bad afternoon.

The two things we would do differently

Tests, from the first week. The rewrite ran for fifty months without a single test file. The March 2026 audit wrote it down in one line — zero test coverage, the only gate is lint — and the test runner arrived in April, the first test in August, 36 test files today. Everything above was shipped through four years and eight major upgrades on manual checking and a type checker. It worked, at a cost we cannot measure because nobody recorded the afternoons it took. Our approach page now says tests are how we go fast; this site is the reason we believe it.

The 2023 silence. Five months without a commit is not a paused project, it is a site drifting behind its platform while nobody watches — and it was followed by two major upgrades in three weeks, which is exactly the shape you get when the drift is paid back all at once. Seven different people committed that year, the most of any year, and the most turnover. A continuous arrangement needs a continuous person, and 2023 did not have one.

What ten years buys

A site that has not gone away, on a domain that has not changed, whose code is younger than most of its visitors think. The first codebase ended because its platform did; the second has absorbed eight platform changes without ending, because each one was taken as a small release when it arrived rather than as a migration when it could no longer be avoided.

That is the whole difference between the two decades of this site, and it is not a difference in code quality. It is a difference in cadence. Roughly two releases a week, for four years, is what "continuous" costs. The alternative was measured in 2021: the platform under a seven-year-old site reached end of life, and the next release was a rewrite.