Inspiration

We started by building an AI that looks at one wrong answer and figures out why a student got it wrong. It worked, but the more we tested it the more something kept bugging us. A student would bomb a fractions question one week and a percentage question the next, and our early version would diagnose both perfectly, and then just forget. Two reports, no connection, even though anyone looking at both side by side could tell it was the same misunderstanding wearing two outfits.

That's the gap every tutoring app has. Khan Academy, Duolingo, none of them ask "has this kid made this exact kind of mistake before, just somewhere else?" ECHOFORGE is our answer to that question.

What it does

Every answer a student submits gets saved and tagged with the real Common Core standard behind it, not a guess. When a student gets something wrong, ECHOFORGE searches their whole history for past mistakes that are semantically close, even across different subjects. If it finds a real connection, it sends both mistakes to Claude, which explains the one misconception tying them together, streamed live onto a dashboard we call the Cognitive Gap Map.

How we built it

FastAPI backend. Every answer becomes a vector via Sentence-Transformers and gets stored in ChromaDB, which is what lets us search across a student's entire history instead of just one question. Matches get sent to Claude (claude-sonnet-4-6), streamed back over a WebSocket. React and Vite on the frontend, with a custom SVG timeline instead of a generic graph, since the whole point is that gaps persist across time.

The piece we're most proud of: curriculum_standards.py. We originally let people type free-text labels like "fractions - part of a whole," but two people can describe the same concept differently and the system would never realize it's the same thing. We replaced that with a small table mapping every concept to a real, hand-verified Common Core standard pulled from thecorestandards.org. Every diagnosis is grounded in something citable now, not something the AI made up.

Disclosure: Claude (Anthropic) was used both inside the app and as a coding assistant during development, alongside Cursor as our editor. All curriculum data is real Common Core State Standards; all demo student history is synthetic data we generated ourselves.

Challenges we ran into

Almost none of our bugs were AI logic, almost all were environment problems. A silently 32-bit Python install meant PyTorch couldn't install at all, with an error that never even said "32-bit." A pinned old Anthropic SDK clashed with a newer httpx version and threw a confusing TypeError. Our project folder living inside OneDrive caused the backend to randomly crash, since OneDrive's sync was fighting our file watcher and ChromaDB's writes. We also found a real bug where a discovered connection wasn't showing up on screen because its line was being drawn tall enough to get clipped off the visible canvas.

Accomplishments that we're proud of

Watching it find two real connections live, not scripted, including one from a question we wrote on the spot that wasn't in any seed data, and watching it correctly explain the actual misconception. That's the moment this stopped feeling like a demo and started feeling like it worked.

We're also proud we didn't stop at saying "a teacher should be able to review this." Every connection ECHOFORGE finds starts out unconfirmed, visibly dashed on the dashboard, and only counts as a real diagnosis once a teacher actually clicks approve. That's a real feature, not just a sentence about one.

What we learned

Real grounding matters more than we expected. Telling the AI "this is 9th grade" sounds like context but isn't. Tying every mistake to an actual published standard changed the quality of its reasoning. We also learned silent failures are worse than loud ones, a missing API key used to leave the dashboard stuck on "analyzing" forever with no explanation until we added a visible error state.

What's next for ECHOFORGE

Right now ECHOFORGE stops at "here's the root cause." The next step is closing the loop with a generated follow-up question targeting the actual misconception instead of just diagnosing it.

Built With

Share this project:

Updates

Submission history