Relink — Devpost Project Story

🚀 Inspiration

Lena Park is sixteen. Nine days out with the flu, first night back in Algebra 2, and tonight's worksheet uses three moves the teacher covered while she was gone. The page literally will not parse:

$$x^2 + 6x + 9 = (x+3)^2$$

That step looks like magic to her. So does (\sqrt{-1}). So does (i), once (\sqrt{-1}) shows up inside problem 2. Nobody hid these ideas from her — she just wasn't in the room when they were named.

The existing tools fail her in opposite ways. Khan Academy restarts the entire unit, nine days of review she doesn't need. A chatbot will finish problems 2 and 3 for her, which gets tonight done and teaches nothing. Both leave her locked out of tomorrow's class.

Homework help today restarts units or finishes problems. Nothing in between links the missing references.

We built Relink because one of us has sat in class unable to parse the board.

💡 What it does

Relink treats a homework page like broken code. A compiler doesn't re-teach you the language when a symbol is undefined — it names the symbol and where it's used:

error[E0425]: 3 undefined references
  --> Algebra2/4.3.rs: Lena Park, 16

So does Relink. Three rust-colored marks sit on Lena's actual worksheet. Tap one and you get exactly that reference: why this page needs it, taught in the page's own notation — the completing-the-square move,

$$ax^2 + bx + c = a\left(x+\tfrac{b}{2}\right)^2 + c - \tfrac{b^2}{4a}$$

then (\sqrt{-1} = i), so (i^2 = -1) becomes usable rather than exotic. Then you must apply it on problem 2 yourself — wrong answers get a hint, never the answer. When all three resolve, the page reads clean and you write the next line yourself: (x^2 + 8x = (x+4)^2 - 16).

Relink never does the homework. No account. No model on the demo path.

🔧 How we built it

Next.js 14 (App Router), TypeScript, Tailwind CSS. The seeded lesson lives in typed data (lib/lena.ts); the worksheet renderer draws lines, rust waves, and handwritten-style margin notes without any heavyweight math library — Newsreader italics plus Unicode carry the algebra. /open lets a student bring their own page: PDF, DOCX, or photo ingest client-side via pdfjs-dist, mammoth, and tesseract.js. An optional paste-your-page route can call an LLM (Groq, Featherless fallback), but the key stays server-side behind an arm switch that ships OFF; without it, the API degrades honestly to a pointer at the seeded path instead of pretending. One codebase deploys two ways: static export to GitHub Pages and full-server to Vercel, which serves the judge path at relink-two.vercel.app.

🧱 Challenges we ran into

Voice was harder than code. Re-entry cards drift toward shame ("you should already know…") unless policed. So pedagogy is enforced by CI: check-copy fails the build on banned phrases. The product's kindness is a test, not a promise.

One repo, two hosts. Static Pages needs output: "export", a basePath, and no server; the LLM route needs a server. We made the config branch on STATIC_EXPORT=1 so both targets ship from the same commit.

Math without KaTeX. Bundling a math renderer for three expressions was wrong; hand-set typography kept the paper feeling like paper.

Honest AI. It was tempting to fake the model path. Instead it returns a real failure state that routes judges to the thing that always works.

🏆 Accomplishments that we're proud of

The whole loop runs offline, login-free, model-free — and still feels alive: lamplight follows your cursor, rust waves breathe until resolved, margin notes appear like ink being written, and finishing stamps the page ALL REFERENCES DEFINED. The barrier and the fix are visible on one screen in ninety seconds.

📚 What we learned

Constraint is a design tool. Naming the smallest possible gap — one page, three references — beat every instinct to build a tutor. And tone is engineering: the difference between "you missed this" and "this import isn't defined yet" is enforced by a failing test, and it changes how the product feels within seconds.

⏭️ What's next

Arm the paste-route LLM behind its switch, add teacher-authored pages via /open, and grow the reference library beyond Unit 4.3 — always as links, never as lectures.

Built With

Share this project:

Updates