
Client
My Office Asia — flex-office brokerage in Hong Kong working with operators of the WeWork / Regus / IWG / JustCo scale alongside independent boutique providers.
Industry
PropTech · commercial real estate · brokerage
Scope
Discovery → design system → development → production-readiness → client handover.
The client was running on a legacy site that read as a directory listing and did not communicate the actual service: a personal advisor, replies within two hours, free for the tenant.


Only one market is live (HK), but the architecture supports multiple markets and brands. Content data, brand tokens and SEO metadata are isolated from the component layer — adding Singapore or Taipei later doesn't require rewriting the UI. That's the foundation for the client's regional growth.
Hard stratification with no upward dependencies: domains/ (types and contracts) → server/ (business logic and DB adapters) → components/ (UI) → app/ (route composition only). Routes don't know about Supabase tables — everything goes through a provider boundary. Migrating from Supabase to direct Postgres or PlanetScale would not require UI changes.
App Router with Server Components wherever possible. Out of roughly 400 components only 83 are client components — each one justified by state or event handlers. This keeps the JS bundle small and improves time to interactive.
No external reCAPTCHA or Turnstile dependency: honeypot field, form-age check (instant replays rejected), per-IP rate limit, server-side Zod validation. Spam stays out without burdening the user.
After design sign-off we ran a nine-step CSS refactor: every colour, font size, radius, shadow, spacing and motion value became a semantic token. Result: zero hardcoded font-size declarations across 144 CSS modules. Any global change — accent colour, spacing scale — is a single edit in globals.css.
Instead of fixed breakpoints for horizontal padding we use a single clamp(24px, 5.55vw, 80px). Content scales smoothly from mobile to desktop and caps in the editorial 1600px range on ultra-wide screens (Apple / Stripe / Linear style) without splattering on 4K.

Before handover we ran an end-to-end audit.
Production build: ~5 seconds to compile, 71 statically generated pages, 0 TypeScript errors, 0 console.log in production.

| Frontend | Next.js 16 (App Router, React 19, Turbopack), TypeScript strict, CSS Modules |
|---|---|
| Backend | Supabase (PostgreSQL), Nodemailer (SMTP), Zod, Anthropic API (admin assistant) |
| Infra | Vercel-compatible, Edge runtime, sharp for image processing |
| Quality | ESLint, Prettier, Vitest, Playwright e2e, lint-staged, husky |
| Design | Fully custom DS, ~150 semantic tokens |
If you're sitting on a listing-style site that doesn't convert, or you want a regional platform with a real admin and a defensible design system — we can build it the same way.






