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.
- Role
- Design + Build
- Timeline
- 2026-05-18 to 2026-05-29
- Live URL
- noorclinics.nl ↗
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.
- Livenoorclinics.nl
- LanguagesDutch and English, fully static
- Build window2026-05-18 to 2026-05-29, derived from file history
- Handed offFull source and deployment access
- Owns the codeClient
BUILT WITH
Need a site that reads premium?
Next project
Yusuf Kebab