Skip to content
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

A café page switching between German and English
Desktop
Mobile

Problem

Two languages usually means two copies that drift apart. Here a missing translation fails the build instead of shipping.

What I built

  1. /[locale] routing with generateStaticParams, a redirect from / to /de, and hreflang with x-default.
  2. 16 statically prerendered product pages for cakes and coffee.
  3. Shared data (prices in cents, hours, address) split from German and English prose, typed with satisfies so a missing string fails the build.
  4. Hours stored once and fed to both the contact section and the JSON-LD.
  5. Eight sections with no two sharing a layout family, including a GSAP pinned horizontal pan.
  6. 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