Radar College is a quiz platform for French middle school students preparing for the "Brevet" exam. React, localStorage, SVG radar chart, gamification — the thing worked well. Until I added the 12th quiz file and started running into silent bugs. A duplicated SUBJECT.id across three files. A new Date(x) - new Date(y) returning NaN in edge cases. Props passed to components that no longer existed. Classic JavaScript, in other words.

The obvious fix: add TypeScript. Except the project has three constraints that rule out any bundler whatsoever. And that's where things get interesting.

Three constraints that change everything

Radar College isn't a "normal" project. Three decisions made at the start dictate the entire architecture:

1. Zero infrastructure. Deployment is an scp to shared PHP hosting. No Node on the server, no CI/CD pipeline, no Vercel. One index.html and two PHP files for optional sync.