Concurse
Turns public-exam syllabi into AI-generated study tracks.

[ The project ]
Gamified study platform for Brazilian civil-service exams. Built solo, end to end: product, data modeling, backend, frontend, AI pipeline, payments and acquisition. Multitenancy with Row Level Security on every table, plus CI with typecheck and automated tests.
[ stack ]
- Next.js 16
- React 19
- TypeScript
- Tailwind v4
- Supabase
- Postgres + RLS
- DeepSeek
- ts-fsrs
- pdf-parse
- Zod
- AbacatePay
- Meta CAPI
- Vercel
- GitHub Actions
[ Technical decisions ]
- 01
The AI pipeline runs offline, in command-line workers, never in user runtime: it extracts the syllabus structure straight from the PDF, generates questions in each exam board's style (true/false for Cebraspe, multiple choice for FGV) and validates in batches of ten before publishing. Costs cents per syllabus and nobody waits on an LLM.
- 02
The system prompt is deliberately kept stable across calls so the prefix hits DeepSeek's context cache and bills at roughly a tenth of the price. Every call has its cost estimated and logged.
- 03
Curation as a state machine — draft, validated, published or rejected — with the verdict and reasoning stored for audit. Every model output passes a Zod schema and structural invariants before it touches the database.
- 04
Deduplication by Jaccard similarity over normalized tokens, threshold 0.85. A deliberate call: it solves the actual MVP problem without embedding infrastructure, which comes when volume justifies it.
- 05
Learning engine with spaced repetition (FSRS) and a session mixer that composes each 15-question session from 35% overdue review, 55% new content and 10% challenge, with a 40% per-topic cap and interleaving that prevents two consecutive questions on the same subject.
- 06
Wave-based progression: the next wave only unlocks once every topic in the current one reaches minimum mastery — and locks again if mastery decays.
- 07
Score prediction with Bayesian shrinkage and a pessimistic prior, modeling Cebraspe's real rules: 120 questions across three blocks, wrong answers cancelling right ones, per-block net score floored at zero, elimination below the minimum. Inflating the number would destroy the trust of someone betting a year on it.
- 08
The same workers also feed flashcards, generated readings, mock exams, statute drilling, streaks and leaderboards — one pipeline behind six study formats.
- 09
Idempotent subscription webhooks: the decision logic is an isolated pure function, HMAC-validated, backed by a unique-key event table and payload parsing tolerant to gateway variations.
- 10
Server-side acquisition tracking with browser/server deduplication by event_id, an adblocker-resistant first-party route, SHA-256 hashed PII and purchase events emitted only from the webhook — no phantom conversions.