Case Study
DigiCentres
digicentres.comMulti-app SaaS platform built from scratch — 7 interconnected Next.js applications sharing a single Supabase PostgreSQL database, deployed independently on Vercel.
7
Next.js apps
1
Shared Supabase DB
4
Languages
1,657
Seeded world cities
Architecture
7 apps, 1 database
landing/
Marketing site with search, booking flow, subdomain routing per branch, and full i18n (cs/en/de/sk).
admin/
Full branch management, user admin, DNS control, property management, and database seeding scripts.
book/
Standalone appointment scheduling app per DigiCentre with real-time availability and slot management.
partner/
Onboarding and management portal for franchise partners — profile, branch overview, auth flow.
real/
Full real estate partner portal with property listings, locale routing, dashboard, and complete auth flow.
place/
Public-facing property listings browser with country/city routing and locale support.
hub/
Internal hub linking all apps together — deployment overview, lightweight with no auth or DB.
Supabase PostgreSQL
All 7 apps share one database via @prisma/adapter-pg — admin/ is the source-of-truth schema
Key Features
Engineering highlights
Subdomain routing per branch
Each DigiCentre branch gets its own subdomain (e.g. smichov.digicentres.com). Middleware intercepts requests and rewrites to /site/[subdomain]/[lang] with automatic language redirect. Local dev uses *.lvh.me.
i18n across all routes
4 languages (Czech, English, German, Slovak). All user-facing strings defined per-component in a local T constant. Language stored in LangContext, persisted via localStorage. URL structure mirrors: /[lang]/search/.
Geo-sorted city results
1,657 world cities seeded with lat/lng, local currency, and price-per-hour. Search results sorted by haversine distance — browser geolocation first, ip-api.com fallback. Paginated 48 items/page.
Shared DB — single source of truth
All apps connect to one Supabase DB via Prisma. admin/prisma/schema.prisma is the canonical schema. Critical rule: never run prisma db push from any app with a partial schema — it would drop missing tables.
Stack