All Work
MEDICAL AESTHETIC / NL

Noor Clinics.

A skin clinic that needed to read premium, with a treatment catalog large enough that hand-maintaining two languages by hand would have meant a blank page somewhere within a month.

Web Designi18nStatic Generation
Role
Design + Build
Timeline
2026-05-18 to 2026-05-29
Live URL
noorclinics.nl ↗
Noor Clinics homepage

01 / THE REQUEST

Look likethe premium tier.

A skin clinic in the Netherlands needed a site that read as premium as the treatments it sells, in Dutch and English, covering a full treatment catalog with per-service pages, not a five-page brochure site.

02 / THE PROBLEM

A missing stringis a blank page.

A treatment catalog this size, hand-translated with loose string keys, fails quietly: a missing Dutch key doesn't throw, it just renders nothing where a sentence should be, and nobody notices until a patient sees it. That failure mode needed to be structural, not caught by proofreading.

03 / THE CHALLENGE

A typed catalog,no CMS.

Instead of a CMS, the treatment catalog is a 960-line typed content model (src/data/services.ts:27-41), feeding generateStaticParams so every treatment page is statically generated in both Dutch and English (src/app/nl/service/[slug]/page.tsx:10-12). No database, no admin panel to maintain, just a typed source file that the build reads once.

UI copy is typed with TypeScript's satisfies operator (src/lib/i18n.ts:31-58), so a Dutch translation key that doesn't match the English shape is a compile error, not a runtime blank. The failure this replaces is exactly the one that matters for a clinic: silent missing copy on a live patient-facing page.

There is no backend at all. The contact form doesn't post to an API, it composes a WhatsApp deeplink with the form fields pre-filled (src/components/contact/ContactForm.tsx:45-51), so a lead reaches the clinic's existing WhatsApp Business number with zero server infrastructure to maintain.

04 / THE SOLUTION

What gotbuilt.

Typed content model

A 960-line typed catalog stands in for a CMS, feeding static generation for every treatment in both languages.

Compile-time translation safety

satisfies-typed UI strings turn a missing Dutch key into a build failure, not a blank patient-facing page.

Zero-backend contact

The contact form composes a WhatsApp deeplink. No API route, no server to keep running.

Full bilingual static site

Every treatment page pre-rendered in Dutch and English via generateStaticParams.

05 / THE RESULT

Shipped inunder two weeks.

BUILT WITH

Next.js 15.5.18React 19TailwindFramer Motion

Need a site that reads premium?

Next project

Yusuf Kebab