Skip to main content

Tech stack

Status: Scaffolded 2026-09-24

Runtimes and frameworks​

LayerChoiceVersion policyWhy
Node24 LTS.nvmrc in every repoCurrent LTS on the dev box; The Trick Book's Node 20 line hit a jsonwebtoken crash on 24, which we avoid by not using that library
APIExpress 5, TypeScript, ESMExact pins in package.json, Dependabot weeklyThe Trick Book pattern, typed
ORMMongoose 9Schemas with declared indexes, the single biggest debt fix over The Trick Book's schema-less collections
ValidationzodRoute-boundary validation with typed inference
Loggingpino, pino-httpJSON logs with redaction
RealtimeSocket.IO 4Namespaces and rooms, same shape as The Trick Book
WebNext 15 (App Router), React 19, Tailwind 4, shadcn/ui, next-themesExact next pin; Amplify supports 12 to 15SSR for public pages, SEO for places and events
Maps (web)maplibre-glNo Google SDK, no key
MobileExpo SDK 57, expo-router, React Native, TypeScriptUpgrade one SDK at a timeCurrent Expo, same navigation model as The Trick Book v2
Maps (mobile)@maplibre/maplibre-react-nativeNeeds a dev client; Expo Go will not load it
State (mobile)zustand (auth only), TanStack Query (server data)The Trick Book mounted Query and never used it; here it is the only fetch path
DocsPokeDocs preset on Docusaurus 3.10Build-time mermaid, one-config branding, llms.txt and .md twins for agents
Lint and formatBiome 2.5Exact pin, schema pinnedOne tool, fast, same config in four repos
Testsvitest, supertest, mongodb-memory-server (API); Playwright (web)
Secrets hygienesecretlint (pre-commit), gitleaks (CI), GitHub push protectionSee ADR-0009

Services​

NeedServiceNotes
DatabaseMongoDB Atlas M0Free tier, 512 MB, allowlisted to the API host's IP (ADR-0008)
API hostingEC2 t4g.micro, Ubuntu 24.04 arm64, PM2, nginx, certbotADR-0002
Web hostingAWS Amplify Hosting (WEB_COMPUTE)Auto-deploys main
ImagesS3 (private bucket) + CloudFrontPresigned PUT, public read through the CDN
VideoBunny StreamTUS upload, HLS playback, signed URLs for non-public posts (ADR-0013)
EmailSES SMTPMagic links and account mail
PushExpo push service
Map tilesOpenFreeMap public instanceNo key, no cookies, no personal data (ADR-0006)
CompanionAnthropic APIStreaming, model from config (ADR-0012)
SSOSign in with Apple, Google IdentityEmail from the verified token only
DNS and certsRoute 53, ACM (Amplify), certbot (API)
Mobile buildsEAS Build free tier30 builds a month
Docs hostingAWS Amplify Hosting (static)Same account and region as the web app

Design tokens​

The same values live in the web CSS, the mobile tokens.ts, and this site's custom.css.

TokenValueUse
--vg-bg#0B0F0CDark background, near-black with a green cast
--vg-surface#121A15Cards and panels
--vg-text#E6F2EABody text on dark
--vg-muted#8FA89ASecondary text
--vg-primary-dark#3DFF8ANeon green, primary in dark mode
--vg-primary-light#0E7C3ADeep green, primary in light mode
--vg-accent#FF2BD6Magenta, sparingly
--vg-accent-2#22E5FFCyan, links and focus rings
--vg-danger#FF4D4DErrors

Fonts are the system UI stack for body and the system monospace stack for labels, badges, and headings that carry the cyberpunk feel. No third-party font or icon CDN anywhere: fonts are a tracking vector and an availability dependency, and the system stacks look right on every platform.

Deliberately absent​

Google Maps SDK, PostHog, Google Analytics, Sentry with PII, Stripe, any LLM router that spreads prompts across providers, Docker Desktop on the dev box, and a monorepo tool. Each absence is a decision, most of them recorded in the ADRs.