Architecture
The whole stack. Nothing hidden.
Every dependency, every API, every choice. We're a small team shipping fast — there's no SOC2 yet, no audit log warehouse, no five layers of abstraction. Just a clean, modern, honest stack that does the job.
Frontend
| Framework | Next.js 15.5 App Router |
| React | React 19 |
| TypeScript | strict mode + noUncheckedIndexedAccess |
| Styles | Tailwind CSS v4 beta + custom .l-* design tokens |
| Bundler | Turbopack (default Next 15) |
| Fonts | Inter, Instrument Serif, JetBrains Mono via Google Fonts |
Data + AI
| AI primary | Google Gemini 2.5 Flash (vision + brief) |
| AI fallback 1 | OpenAI GPT-4o-mini |
| AI fallback 2 | Anthropic Claude Sonnet 4.6 |
| Aerial imagery | ESRI World Imagery (NAIP-quality, keyless) |
| Address autocomplete | Nominatim (OSM) with TX bbox filter |
| Permits | Dallas City Open Data (Socrata API) |
| Assessor | DCAD scrape (best-effort) + Collin/Tarrant coming |
| Comps | Mock today; MLS via Repliers/RentSpree pending |
Backend
| Runtime | Node.js 24 LTS on Vercel Fluid Compute |
| Database | Supabase Postgres 17 (us-west-1) |
| Auth | Supabase Auth (magic-link, SSR cookies) |
| Storage | Supabase Storage (appeal-briefs bucket) |
| Cache | Vercel edge cache + per-route Cache-Control headers |
| Cron | Vercel Cron (daily 0 6 UTC, refresh-stale) |
Payments + email
| Billing | Stripe (test mode + live webhook signature verify) |
| Resend (verified cortivex.ai domain) | |
| Email templates | inline HTML in lib/email.ts (no Tailwind compile, no MJML) |
Observability
| Web Analytics | @vercel/analytics |
| Speed Insights | @vercel/speed-insights |
| Health check | /api/health (live provider probes) |
| Error capture | Sentry pending — env-driven |
Deploy + infra
| Hosting | Vercel (agent-hub2 team, Fluid Compute, Pro plan) |
| Source | github.com/vQFGDspvFh/houseproof (private) |
| Monorepo | pnpm + turbo (apps/web, apps/admin, packages/*, workers/*) |
| Deployment | `vercel deploy --prod` per-app from CI |
| Custom domain | houseproof.ai (DNS pending) |
Want to dig in further? See the live /api/health probe, the /how-it-works data-sources breakdown, or just drop an address and watch every layer fire.