Documentation
Technology Stack
FutureContent combines a server-rendered web application with a Postgres-backed assessment workflow. Managed providers are kept behind application-owned boundaries so stored results remain stable and explainable.
Web application
- Next.js 16 App Router for server-rendered pages, API routes, and background continuation
- React 19 and TypeScript 6 for the application and its typed domain boundaries
- Tailwind CSS 4 and Lucide icons for the interface system
Data and identity
- Supabase Postgres for workspaces, scans, immutable assessment results, and operational state
- Postgres Row Level Security and server-authorized functions for tenant and role isolation
- Supabase Auth for email Magic Links and Google sign-in, plus Realtime for scan progress signals
Hosting and operations
- Vercel for deployments, Next.js Functions, Cron recovery, Analytics, and BotID protection
- Vercel Sandbox for isolated mobile-rendered SEO evidence
- Separate Preview and Production environments with independent credentials and Supabase projects
Assessment services
- Google PageSpeed Insights and Lighthouse for mobile page-experience evidence
- OpenAI moderation and structured qualitative analysis for bounded content assessment
- FutureContent-owned retrieval, normalization, scoring, and versioned assessment rules
Communication and abuse protection
- Resend for transactional Workspace invitation email
- hCaptcha and Supabase Auth rate limits at authentication boundaries
- Vercel Firewall controls and privacy-preserving request limits for Guest Scans
Quality engineering
- Vitest and Testing Library for unit and integration coverage
- Playwright for browser journeys and the Supabase CLI for local database verification
- ESLint, Prettier, strict TypeScript, production builds, and GitHub Actions as merge gates
A versioned result, not a live provider response
Provider output is normalized before it becomes evidence. Each saved Page Scan retains the Evaluation Version and assessment result that produced it; a later framework change does not silently recalculate historical results.