For the engineers and curious minds out there, here's a look at the technology behind Spylled.
We use Next.js 14 with the App Router. The quiz game itself is a client component (it needs interactivity, timers, and real-time state), but the landing page, blog, and informational pages are server-rendered for SEO and performance.
We chose Next.js because it gives us the best of both worlds: fast server-rendered pages for Google crawlers and a rich interactive experience for players.
Our API is built with tRPC, which gives us end-to-end type safety between the server and client. When we add a new field to a quiz question, TypeScript catches any mismatches at build time. This has saved us from countless bugs.
All our data lives in PostgreSQL hosted on Supabase. We use Prisma as our ORM for schema management and type-safe queries. The quiz questions, user submissions, leaderboard scores, and historical data all live in the same database.
We recently migrated from Lucia to Better Auth for our authentication system. Better Auth gives us email/password login with an admin plugin for role-based access. The admin panel for managing daily questions is protected behind an admin role check.
The site is deployed on Vercel with automatic deployments from our GitHub repository. Every push to main triggers a production build. Vercel's edge network means fast load times globally.
Spylled supports English and Danish using next-intl. All UI text is stored in JSON translation files, and questions in the database have locale-specific fields for both languages.
We deliberately avoided over-engineering. No microservices, no message queues, no Kubernetes. A monolithic Next.js app with a PostgreSQL database handles everything we need. We can always add complexity later if scale demands it, but right now simplicity means we ship features fast and debug issues in minutes, not days.