Web
Concept, design and build
Bilingual café, Leipzig
A German and English concept site for a café and cake shop in Leipzig, on Next.js 15 locale routing with a typed translation contract.
Stack: Next.js, React, TypeScript, Tailwind CSS, Motion, GSAP

Problem
Two languages usually means two copies that drift apart. Here a missing translation fails the build instead of shipping.
What I built
- /[locale] routing with generateStaticParams, a redirect from / to /de, and hreflang with x-default.
- 16 statically prerendered product pages for cakes and coffee.
- Shared data (prices in cents, hours, address) split from German and English prose, typed with satisfies so a missing string fails the build.
- Hours stored once and fed to both the contact section and the JSON-LD.
- Eight sections with no two sharing a layout family, including a GSAP pinned horizontal pan.
- Hero entrance in CSS so a failed bundle still paints; a hand-rolled euro formatter avoids a hydration mismatch.
Proof
- 16 statically prerendered detail pages
Stack
- Next.js
- React
- TypeScript
- Tailwind CSS
- Motion
- GSAP
Share this case
