Stack
Mainstream, typed, testable.
The default per layer, then what each system actually runs on so you can judge maintainability. Client systems are applications, so they get Next.js and NestJS; this portfolio is a static content site, so it is built with Astro and Svelte — the fastest tool for that job.
Defaults
What a new system gets
- API
- NestJS · Prisma or Drizzle · PostgreSQL · class-validator or zod DTOs · Swagger in development
- Web
- Next.js 16 · React 19 · TypeScript strict · Tailwind v4 or scoped CSS · TanStack Query / Table · next-intl for FR/EN/AR with RTL
- Mobile & field
- Expo / React Native for store apps · installable PWAs for kiosks, drivers and offline field tools
- Auth
- better-auth or httpOnly cookie sessions · separate device credentials for kiosks · permission tokens per resource · audit logs
- Storage & messaging
- Cloudflare R2 / S3 · Resend · Twilio · Pusher · Expo Push · WhatsApp deep links
- Hosting
- Vercel for web · Coolify on a VPS you own for API + Postgres · Supabase where it fits · multi-instance from one codebase
- Quality
- Jest / Vitest / supertest against a real Postgres · GitHub Actions · Sentry · PostHog · Groundwork docs (ADRs, RFCs, feature specs, status board)
Stack × system
What each system runs on
| System | Web | Mobile | API | Database | Hosting & CI | Testing |
|---|---|---|---|---|---|---|
| WageWizard | Next.js 16.3 · React 19.3 · TypeScript 5.9 | No native app by decision | NestJS 11.2 · TypeScript 5.7 · better-auth 1.7.4 | PostgreSQL · Prisma 7.10 with @prisma/adapter-pg · 26 SQL migrations | No Dockerfile, CI workflow or hosting config on disk · Deploy notes · Temporary split-domain deploy: Next rewrite `/backend/:path*` → API_PROXY_TARGET keeps the session cookie first-party | Backend unit: Jest 30, 25 spec files, 480 tests — executed 2026-09-12, all passing · Backend API: 18 supertest e2e specs against a real local Postgres · Frontend: Vitest 5 + Testing Library/jsdom, 31 test files |
| Ultimate Fitness | Next.js 16 · React 19 · Tailwind CSS v4 | Expo SDK 57 · expo-router · React Native 0.86 | NestJS 12 · Express 5 · Better Auth 1.7 | PostgreSQL 17 · 74 tables / 31 enums · 31 committed SQL migrations with drift gate | Turborepo 2.5 monorepo · Docker multi-stage API image via turbo prune · Vercel config for web | Vitest unit specs · 32 API integration spec files · Playwright E2E: 5 journey specs, 18 tests |
| Viandes Metropolitain | Next.js 13 · React 18 · TypeScript | Driver-facing PWA inside the dashboard | NestJS 10 · Node 20 · Prisma 6 | PostgreSQL · pg_trgm GIN indexes · Prisma migrations | Storefront on Vercel · Backend containers + Postgres on Coolify · Sentry with sourcemap upload in the build script | Jest · vitest + Testing Library · supertest |
| Sell My Vehicle | Next.js 16 · React 19 · TypeScript | No native app. Mobile evaluator portal is a Next.js route group app/(mobile)/mobile-eval with camera capture, browser-image-compression, guided video capture | Next.js route handlers · next/server after() for background side-effects · Supabase JS + @supabase/ssr | Supabase Postgres · 169 tables + 3 views · Postgres CHECK-constraint state machines with conditional invariants | Vercel · Production migrations run inside the Vercel build under a Postgres advisory lock; preview builds skip them · GitHub Actions: `npm test` on push to main and on PRs in both repos | Vitest in both repos: CRM 141 *.test.ts files · No DB, no network: suite runs in about a second so the pre-commit hook can run it · Static guard tests in crm/tests/guards |
| Islamona Academy | Next.js 16 · React 19 · TypeScript 5 | — | NestJS 11 · TypeScript · Prisma 7 with PrismaPg driver adapter | PostgreSQL · 32 Prisma models, 34 enums, 44 migrations · DATABASE_SCHEMA.md kept in the same change as every migration | Vercel · Coolify · Cloudflare R2 | Jest 118 suites / 1,595 tests · Vitest 71 files / 961 tests · Playwright learner journey |
| SuiteChannel | Next.js 15 · React 19 · TypeScript | — | NestJS 11 · TypeScript · Prisma 7 + @prisma/adapter-pg | PostgreSQL · 35 Prisma models, 11 enums, 62 migrations · partial unique indexes as the sync concurrency guard | Coolify · Vercel-style Next.js host at the dealer portal · same-site cookies on nu-toneco.com | Jest 35 suites / 472 tests · check:i18n message-key audit · QA test report round 1 + remediation programme |
| Beit Al Kateb | Next.js 16 · React 19 · TypeScript 5.7 | — | NestJS 11 · Prisma 7 + @prisma/adapter-pg · better-auth 1.3 | PostgreSQL · Prisma schema: 45 models, 39 enums, 114 migrations · pg_trgm GIN trigram index on Book.searchText | Vercel · Coolify + Nixpacks · Cloudflare in front of Vercel | Backend only: Jest 30 + ts-jest unit specs with mocked Prisma · No frontend tests |
| BrandPlus | Next.js 16 · TypeScript · Tailwind CSS 4 | — | NestJS 11 · Prisma 7 with @prisma/adapter-pg · Better Auth 1.3 | PostgreSQL 17 · 24 Prisma models, 7 enums, 15 numbered migrations + 7 archived legacy migrations | Client-owned netcup VPS · Nixpacks build with `prisma migrate deploy` in the build script · Vercel | Jest + ts-jest: 17 backend *.spec.ts · Vitest + Testing Library + jsdom: 11 frontend test files · Supertest is installed but not imported by any spec |
| Ishtirak Hara | Next.js 16.1 · React 19 · TypeScript 5 | PWA · Serwist 9 service worker · navigator.storage.persist() for IndexedDB durability | Supabase · Postgres triggers · 5 legacy plpgsql aggregate RPCs | PostgreSQL on Supabase · Dexie 4 / IndexedDB local mirror · localStorage | Vercel · GitHub · No CI workflow | Vitest 4 · @testing-library/react + jest-dom + user-event · jsdom 28 |
| Telipos | Next.js 16 · React 19 · TypeScript 5 | — | NestJS 11 · TypeScript · MongoDB Node driver 7 with multi-document transactions | MongoDB Atlas · ~110 collections incl. event and ledger collections · index sync + migration scripts | Vercel · Coolify · MongoDB Atlas | Vitest 143 files / 1,290 tests on the client · Jest 325 spec files / 2,745 test cases on the server · 18 shell specs for the backup runner |
| NO-Homeschooling | Next.js 16 · React 19 · TypeScript 5 | — | NestJS 11 · TypeScript · Prisma 7 + @prisma/adapter-pg | PostgreSQL with pgvector · 35 Prisma models, 22 enums, 33 migrations · DATABASE_SCHEMA.md | Vercel · Docker image for the API · Cloudflare R2 | Jest 4 suites / 41 tests · LLM-as-judge evals: ~30 curated cases across six dimensions against the live /ai/ask endpoint |
| FastFeast | Next.js 14.0.1 · React 18 · TanStack Query 5.90 | Expo SDK 52 / React Native 0.76.5 · TypeScript 5 · React Navigation 6 | Next.js API routes · Prisma 7.5 with @prisma/adapter-pg and generated client in dashboard/generated/prisma · jsonwebtoken 9 | PostgreSQL · Prisma schema: 10 models | Vercel · EAS Build · EAS Submit | — |
| Quran Khatmiya | Expo 57 · expo-router 57 · TanStack Query 5 | Expo Go and web verified; expo run:ios / run:android configured but blocked by toolchain · KFGQPC Uthmanic Hafs font bundled via expo-font · QCF v2 page fonts present in assets | NestJS 11 · Node 22 via tsx · Better Auth 1.7 | PostgreSQL · Drizzle ORM 0.45 + drizzle-kit push | npm workspaces + Turborepo 2 · GitHub Actions CI with Postgres 17 service · bash dev orchestration | node:test: 71 tests, all executed and passing during this verification · tsc --noEmit typecheck on every workspace in CI · No mobile tests, no e2e |