Problem
A bike repair shop needed a website that sells spare parts and accessories online, allows customer registration and order history, runs bilingually in Czech and English, and is fast to maintain.
Stack
┌──────────────────────────────────────────────────────────────────────────┐
│ FRONT → Next.js 16 (App Router, Turbopack, route-groups) │
│ STYLE → Tailwind v4 + framer-motion + lucide-react │
│ BACK → Medusa.js v2 (Postgres, JWT auth, publishable API key) │
│ SHOP → /shop, /cart, /checkout, /account (orders + addresses) │
│ PAYMENT→ Stripe (ready) + manual provider │
│ SHIPPING→ Zásilkovna pickup point, CZK pricing │
│ HOST → VPS, PM2 (web:3010 + medusa:9000) │
└──────────────────────────────────────────────────────────────────────────┘
Architecture
Two independent runtime applications in one monorepo: a Next.js 16 storefront and a Medusa.js v2 backend.
- Marketing homepage + service sections + e-shop route group
- CZ/EN language switch with JSON dictionaries
- Medusa backend handles catalog, orders, customers, shipping and payments
Results
- Live e-shop with cart, checkout and payment gateway
- Bilingual CZ/EN — full website including e-shop and customer zone
- < 1 s LCP on homepage and shop pages
- 1 monorepo, 2 processes, 0 external SaaS dependencies besides Stripe
- Owner manages catalog and orders through Medusa admin