Inspiration
I was talking to a Academia friend who complained about how curriculum committees actually work. They use massive spreadsheets, endless email chains, and just hope nobody breaks a chain when they update a syllabus. It hit me: this is exactly what Git solved for code 15 years ago. Why are we still treating educational processes like a Word doc instead of a dependency graph? I wanted to build a compiler for curriculums—a place where you can't accidentally break a degree without the system screaming at you.
What it does
It’s basically GitHub for Academic Institutions. You get a visual node-graph of an entire program (modules, lessons, outcomes). If you want to move "Machine Learning" before "Data Structures," you don't just drag it. You open a "Pull Request."
The backend runs a Breadth-First Search on the prerequisite graph, realizes you're about to break three accreditation rules, and flags it as "High Risk" with a color-coded diff. If you approve it, it commits to the database. And if the committee hates it later? You hit the "Time Travel" button in the History tab, and it reverts the whole degree to last Tuesday's snapshot. It also uses GPT-5.6 to auto-generate exams based on the exact lessons sitting in the graph.
How we built it
FastAPI and Postgres on the backend, React Flow for the graph canvas. The real trick was the AI architecture. I didn't want the demo to crash if the OpenAI API timed out during the pitch, so I built what I call a "Demo Fortress." It’s a custom AI Gateway with a Provider pattern. If there's no API key, it falls back to a DemoProvider that uses string interpolation on the live Postgres data to fake a highly specific, context-aware AI response. Zero latency, zero crashes.
I used Codex as my pair-programmer to write the boring stuff (Alembic migrations, async SQLAlchemy sessions, regex parsers) while I architected the graph logic and enforced the constraints.
Challenges we ran into
The worst bug was the "Silent Swallow." My mutation engine had a try/except block that was catching errors, rolling back the database, but then silently continuing to save a new version of the unchanged graph. The UI would say "Success!" but nothing actually changed on the canvas. It took me three hours of staring at the History tab wondering if I was going crazy before I realized the backend was just lying to me. Forcing it to throw loud, ugly 400 errors was the best debugging decision I made all weekend.
Another nightmare was WSL file-sync. Codex would tell me "I fixed the endpoint," but the file on my Windows machine was completely untouched. I learned the hard way to never trust the agent's chat output and always verify the actual file on disk.
Accomplishments that we're proud of
- The BFS risk engine actually works. It's not just keyword matching; it's doing real topological math to count broken prerequisite edges.
- The Time Machine. Watching the React Flow graph organically rebuild itself from a JSON snapshot when you click "Revert" is genuinely magical.
- Surviving the "Pydantic ID-Stripping" trap. I spent hours debugging why new nodes wouldn't render, only to realize my API schema was silently dropping the database IDs before sending them to the frontend. Fixing that felt like defusing a bomb.
- Shipping a 3-course, 13-module SaaS platform with a full mutation engine in 48 hours without burning out.
What we learned
AI agents are incredible, but they are terrible at knowing when they've failed silently. If you don't force your backend to throw loud errors, the AI will just hallucinate a success state and you'll waste hours debugging a ghost.
I also learned that my job has changed. I am no longer just a "coder" but an architect. My job is to build strict architectural constraints and fallback patterns so the AI can run fast without driving the app off a cliff.
What's next for CurriculumOS
Right now, it's a single-player tool. Next, I want to build the "GitHub Dashboard" view where a Dean can sit down, see 15 pending curriculum PRs from different professors, and batch-approve them. I also want to add cross-course dependency mapping, so the Physics department can see exactly how their math prerequisites affect the Engineering degree.
Log in or sign up for Devpost to join the conversation.