This website

A build that refuses to ship a page it knows is wrong

This site is a Next.js application in twenty-two languages whose build fails — not warns — when a page is missing from the sitemap, a translation key does not resolve, an internal link would cause a full page load, an entrance animation is slow enough to read as a stall, or a quoted price cannot be verified against the live catalogue. You do not have to take our word for any of it.

Every number here names where it came from and when it was measured.
MeasureValueSourceMeasured
Automated guards that fail the build17scripts/check-*.ts and scripts/check-*.mjs in the marketing site repository
Translation key literals verified against the dictionary at build time1,557 across 470 filesnpm run guard:i18n output
Files checked for locale-aware navigation and animation budget294npm run guard:navigation output
Languages served22messages/*.json in the marketing site repository
Translated strings validated for punctuation and ICU syntax, in every language86,496 across 22 localesnpm run guard:punctuation output
Maximum permitted entrance animation duration0.3s, with per-item delay capped at 0.15sscripts/check-client-navigation.mjs
Programmatic content pages generated from typed data132 (37 industries, 45 integrations, 9 comparisons, 41 glossary terms)app/lib collection directories

What building it taught us

Every agency says its sites are fast and well-built. The claim is unfalsifiable at the point of sale, which is why it is made so freely. We would rather be checkable: open the developer tools, run an audit, read the sitemap, switch the language, inspect the structured data. The site is the argument.

What makes it stay good is not care, it is enforcement. Care degrades; the sixth person to touch a codebase does not know the rules and no amount of documentation fixes that. So the rules are executable. Seventeen guard scripts run before the container image is built, and a failure stops the deployment. One guard walks the route folders and fails if a page exists that no sitemap lists — so a page cannot be quietly launched and never submitted to a search engine. Another resolves every translation key literal in the source against the English dictionary. Another scans for internal links that are not locale-aware, because one of those in a shared footer was causing a full document reload on every page of the site.

The performance guard is the one most worth stealing. Pages here previously shipped dozens of elements at zero opacity and faded them in on mount, with the delay multiplied by index — so the tenth card in a list finished arriving more than a second and a half after the click. The network was never the problem; the animation was deciding when the page looked ready. The guard now caps entrance duration and per-item delay, and exempts genuinely ambient loops. Nothing about that shows up in a build, a type check or a lint run.

The internationalisation is stricter than most sites that claim it. A page whose copy has not actually been translated into a language is served in English under that language's prefix, points its canonical tag at the English original, and is deliberately withheld from that language's sitemap — because submitting it would file it in search console as a duplicate that cannot be indexed. The rule is computed from the dictionary itself: a language counts as translated for a section only when it carries at least ninety per cent of that section's strings and fewer than thirty per cent of them are byte-identical to the English, which is how we detect a translation provider quietly echoing the source back.

Built with

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • next-intl
  • Content Security Policy
  • Trusted Types

What this qualifies us for

Marketing site design and buildThe site your business is judged by, built like softwarePerformance engineeringCore Web Vitals on real devices, held by a budgetAccessibility engineeringWCAG conformance tested with a keyboard, not just a scannerTechnical SEOMaking a site legible to search engines, at the source

Tell us what you are trying to do

A short conversation is usually enough to tell whether we are the right people. If we are not, we will say so and point you somewhere better.

Start a conversationI already use KamoCRMHow we quote