Inspiration
A preuniversitario in Chile costs between CLP 1,000,000 and 3,000,000 a year — roughly USD 1,000–3,200. What it sells is not content. Content is free and abundant. What it sells is knowing what to study tomorrow, and that is the part that decides the outcome.
I am 18, in Chile, and the PAES is the exam that decides where people my age end up. I could not buy that layer separately, and neither can anyone in my year. So I built it.
The structural claim: every preuniversitario sells a bundled year, and none of them can sell the "what do I study next" layer on its own without destroying the bundle that funds them. That is an economic barrier, not an engineering one. Ruta PAES sells only that layer, for CLP 9,990.
What it does
Upload the report from your last practice exam — the actual phone photo or PDF, not a form. Gemini reads it multimodally and diagnoses performance against the official DEMRE subject axes. Out comes a 14-day route — one focus and one 45–60 minute task per day, each with its reason — plus four original exam-format exercises with step-by-step solutions. A QA agent reviews every generated exercise against the official syllabus before the student ever sees it.
The same engine serves four countries with their own syllabus, currency, exam countdown and dialect: PAES (Chile), ICFES Saber 11 (Colombia), EXANI-II (Mexico), Peruvian admission exams. Adding a country is one entry in a config file.
How we built it
Next.js 14 on Vercel. Gemini API for every LLM call. GitHub's API as the operations log. Ten separable pipelines, each able to fail and be inspected on its own — listed in the AI section below.
Challenges we ran into
All three had the same shape: the interface showed less than the system actually held.
The paid product was missing most of the time. Measured against production, five runs with identical input: 13 days/0 exercises, 14/2, 10/0, 11/0, 14/2. Three of five packs arrived with zero exercises — exactly what the price buys. The model truncates its output and a tolerant JSON parser was repairing it silently. It stayed invisible because the page only ever rendered 5 of the 14 days. Fix: exercises now serialise before the long route, so truncation costs the tail of the plan and never the paid content. After the fix: five consecutive complete runs. The paywall was decorative. The API sent all 14 days and both solutions to the browser and the page covered them with a CSS blur. Anyone who opened the network tab had the product. Gating moved server-side; a visitor now receives 8 days and one solution, and what was not paid for never leaves the server. The fallback chain ended in a model the API key could not call. A real PDF upload returned 403 PERMISSION_DENIED in English, on the user's screen. The last link of the chain was a model this key has no access to, and 403 was not classed as retryable so it aborted instead of trying the next one.
Accomplishments that we're proud of
The thing I am proudest of is not a feature. It is that the system refuses.
A QA agent — a second Gemini call with its own rubric — reviews every exercise the generator produces, against the official DEMRE syllabus, before any student sees it. In production it has reviewed 426 generated items and rejected 32 of them. One rejection, verbatim from the public log: "El contenido de homotecia no forma parte del temario oficial de M1 (corresponde a M2)" — a well-formed geometry problem that belonged to a different exam. An AI overruled another AI, and the student never saw the bad item.
Second: everything is auditable by a stranger. Every run appends a JSON line to a public branch — model used, weak axes detected, QA verdicts, pack completeness, latency. 183 runs, 179 successful, across 6 days. A judge can verify the pipeline without any access to my accounts by calling /api/health?full=1, which executes the whole thing live and returns per-stage timings.
Third: four countries — Chile, Colombia, Mexico, Peru — each with its own official syllabus, currency, exam countdown and dialect, from one engine. Adding a country is one entry in a config file.
And fourth, the one that took the longest to earn: the paywall is real. Unpaid content never leaves the server. It started as a CSS blur over data the browser already had, which is not a paywall at all.
What we learned
A tolerant parser is a silent-failure machine unless it reports what it repaired. Any interface that renders less than it receives will hide backend defects indefinitely. And when an external service owns the final screen of a flow — Mercado Pago never returns the buyer to your site — any instruction living on your own page after that point does not exist.
Built with: gemini · google-ai-studio · nextjs · react · vercel · javascript · github-api · whatsapp · mercado-pago · playwright
What's next for Ruta PAES
Get customers. I built the machine and ran out of window before I ran out of build. Revenue is zero and I am not going to dress that up. The next step is not a feature, it is the hour a day spent talking to delegadas de curso — one class delegate reaches thirty families, and that channel costs nothing but time.
Prove the outcome, not just the output. Today I can measure that the pipeline runs and that the QA agent rejects bad items. I cannot yet measure whether a student's score moves. The measurement is simple and unbuilt: ask each buyer for their next practice-exam score and compare movement on the axes the route targeted. That is the only number that matters and I do not have it.
Automate delivery. Fulfilment is manual — a human still generates the pack and sends it on WhatsApp. It works for the first customers and breaks at thirty. Delivery on payment confirmation is the obvious next build.
A real domain. vercel.app is rejected as a link by TikTok and reads as a demo rather than a business.
The exam calendar is the roadmap. PAES is 30 November, ICFES has two windows a year, EXANI runs continuously. Four countries mean demand is staggered rather than a single annual spike.
Built With
- gemini
- github-api
- google-ai-studio
- javascript
- mercado-pago
- nextjs
- playwright
- react
- vercel
Log in or sign up for Devpost to join the conversation.