Back to portfolio

Case Study

DigiCentres

digicentres.com

Multi-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

:3000
Public Site

landing/

Marketing site with search, booking flow, subdomain routing per branch, and full i18n (cs/en/de/sk).

Subdomain routingi18n × 4 langsBooking.com-style searchGeo-sorted results
:3001
Admin Panel

admin/

Full branch management, user admin, DNS control, property management, and database seeding scripts.

Branch CRUDDNS managementSeed scriptsSource-of-truth schema
:3002
Booking App

book/

Standalone appointment scheduling app per DigiCentre with real-time availability and slot management.

Schedule slotsReal-time availabilityPer-centre routing
:3003
Franchise Portal

partner/

Onboarding and management portal for franchise partners — profile, branch overview, auth flow.

Partner onboardingBranch overviewAuth (register/login)
:3004
Real Estate Portal

real/

Full real estate partner portal with property listings, locale routing, dashboard, and complete auth flow.

Listings managementLocale routingEmail verifyAdmin sub-panel
:3005
Property Browser

place/

Public-facing property listings browser with country/city routing and locale support.

Country/city routingLocale supportPublic listings
:3006
Internal Dashboard

hub/

Internal hub linking all apps together — deployment overview, lightweight with no auth or DB.

App linksDeployment statusNo DB / no auth
Shared Infrastructure

Supabase PostgreSQL

All 7 apps share one database via @prisma/adapter-pg — admin/ is the source-of-truth schema

UserBranchBranchScheduleSlotBookingUpcomingBranchFranchisePartnerPropertyPropertyRoomPropertyPhoto

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

Technologies used

Next.js 16×7 apps
TypeScriptall apps
SupabasePostgreSQL
Prisma 7ORM
Tailwind CSSstyling
Verceldeploy
i18ncs/en/de/sk
Haversinegeo-sort