Skip to content
12Case studySW · 12 of 10

A brand site maintained for four years without a rewrite, for a CSO with no web team.

A European humanitarian-aid CSO scaled overnight in early 2022. We built their public site in two weeks, then spent four years doing very little to it. That restraint was the work.

ClientConfidential
Year2022 — 2026
Duration5 yrs
StackTypeScript · Next.js · React · Vercel
Hero image for humanitarian-aid-brand-siteFIG 01 · HERO

A site for an organisation whose job is not the site.

The client is a small European humanitarian-aid CSO that grew from a diaspora network into an active aid operation after February 2022. By the time we started, they were coordinating supply delivery, housing for displaced people, and equipment for frontline responders. The website was the last thing on anyone's mind — and that was exactly the right priority.

No web team. No product manager. No one whose job it was to write tickets, approve copy, or shepherd a CMS. The brief was not a product brief. It was an infrastructure brief: give us a public face that answers the question 'who are you and how do I help?', and then don't make us think about it again.

That constraint shaped every decision that followed.

Two weeks. Bilingual. No CMS.

We shipped the initial site in roughly two weeks, timed to the operational push in mid-2022. Next.js on Vercel, Tailwind CSS, React. Bilingual from day one — English and the organisation's native language — using Next.js's native i18n routing, no third-party library.

The content decision was deliberate: no CMS. No Sanity, no Contentful, no Strapi. All content — project descriptions, partner lists, focus areas, donation tiers — lives in typed TypeScript objects in /data/<locale>/, version-controlled alongside the code. Updating copy is a git commit. There is no login, no editor interface, no deployment pipeline the team would need to be trained on.

We also left out: animation libraries, API routes, a runtime database, a rate-limiting layer, a custom auth surface. None of it was needed. The donation flow goes off-site to dedicated donation rails. The site's job is to inform and direct, not to transact.

Static generation throughout. The build produces HTML. Vercel serves it. The only thing that can go wrong is a build failing — and builds don't page anyone at 3am.

F · 01Bilingual static site
English and the organisation's native language from day one. Next.js native i18n routing, full content parity, no third-party i18n library.
F · 02Content as code
All copy lives in typed TypeScript objects in /data/<locale>/, version-controlled. No CMS login, no editor interface, no deployment pipeline to learn.
F · 03Static generation throughout
Every page pre-rendered at build time. No API routes, no runtime database, no on-call rotation for infrastructure.
F · 04Two Next.js majors crossed
The codebase ran from Next.js 12 to 14 to 16 without a rewrite. Stack choices that age well.
F · 05Dark mode via CSS class
Zustand holds the toggle state; localStorage persists it. No flash on reload. No third-party theming library.
F · 06Zero rewrites in four years
The architecture drawn in the initial sprint is the architecture in production today.

Twelve months of silence, then a single commit.

After the initial sprint: silence. From August 2022 to May 2023, the codebase received zero changes. The site held. The organisation was delivering aid. That was the correct state of affairs.

June 2023: one commit. Analytics. July 2024: nine commits. A small maintenance sprint — Next.js upgrade, a carousel library swap, dependency hygiene. Nothing structural.

March–April 2026: the current overhaul. A design refresh, a full mobile pass, Tailwind v4 migration, SEO improvements. The codebase crossed two Next.js majors — from 12 to 14 to 16 — without a rewrite.

240 commits over four years. The burst pattern is honest: most of the work happened at the start, and then at the end. The long middle was the site working.

The right amount of engineering for a CSO is the amount that disappears.

The site has not been a problem the organisation had to think about. That is the outcome. Not a conversion rate, not a bounce rate — the absence of the site as a source of friction.

The same codebase that shipped in 2022 is the codebase in production today. The same team that built it maintains it. No migration trauma, no 'we need to rebuild this on a modern stack' conversation, because the stack was chosen carefully enough to stay modern without constant intervention. Bun replaced Node as the runtime. Biome replaced ESLint and Prettier. Tailwind v4 replaced v3. All of it was additive — no architectural debt to unpick.

Four years. Two Next.js majors crossed (12 → 14 → 16). Zero rewrites. 240 commits. One team.

PULL QUOTE / 04
The site has not been a problem we've had to think about.
DirectorHumanitarian-aid CSOEurope
Outcome
Initial sprint
~2 weeks
Years in production
4
Next.js majors crossed
2 (12 → 14 → 16)
Commits over four years
240
NEXTCase study 13SW · 13 of 10
E-commerce2026

Made-to-order commerce for a market that needs its own stack.