Inspiration
Think about the last time you tried to learn something on your own. You had a long video in one tab, an article in another and notes somewhere else, with nobody beside you. Twenty minutes in, you picked up your phone.
Learning online has two problems. It's scattered and lonely, so it loses to apps built to keep you scrolling. And it rarely checks that anything landed. You can watch the tutorial, recognise the right answer and still freeze when someone asks you to explain it. Certificates show that you sat through a course, not that you understood it.
This matters beyond study habits. Alberta's unemployment rate was 7.3% in October 2026, against 6.7% for Canada (Statistics Canada), and people changing careers are told to "upskill" with no idea what to learn first or how to show they learned it.
So we built OryxLearn to put it all in one place. Name a topic, paste a job posting or upload a PDF, and you get a custom course: a map of small topics, foundations first. Each topic has a short lesson, flashcards, a quiz, quick videos and real resources, including YouTube videos, Wikipedia, books and podcasts. To unlock the next topic, you prove this one by explaining it in your own words.
How we built it
We built OryxLearn with Next.js 16, React 19 and TypeScript. The repository is organised by feature, and each feature has a small public API, so two people could work in parallel without colliding.
- AI: every model call goes through one chain of five routes (Cerebras, Groq, Vercel AI Gateway, Gemini and AWS Bedrock). If one fails, the next takes over, and every reply is validated in code.
- Grading: the model never gives a score. For each checkpoint, it must return an exact quote from the learner's answer. Code confirms the quote really appears there, then calculates:
$$ \text{score} = \max\left(0,\ \operatorname{round}\left(\frac{\text{met}}{\text{total}} \times 100\right) - 20 \cdot \text{errors}\right) $$
- Passing: a learner needs $\text{score} \geq 65$ and a passed live follow-up question about what they just wrote. Meeting 3 of 4 checkpoints gives 75, but one factual error drops that to 55, which fails.
- Resources: no model ever writes a link. Every URL comes from a source's own API, and videos play on the page with no recommendations pulling you away.
- Voice: learners can type or talk, with live speech-to-text through Deepgram. A spoken answer goes to the same grader as a typed one.
- Evidence: a public page with a QR code shows what you wrote, the verified quotes and the follow-up. Anyone can re-check the record without another AI call.
- Testing: 1,463 automated tests, plus checks in a real headless browser.
Challenges we faced
- AI grades too kindly. When we asked a model to "score this answer", fluent but empty explanations got 55 to 85 out of 100. With quotes checked by code, the same answers got 0 to 25.
- Free-tier limits. Some routes allow only about 5 requests a minute, and one YouTube search uses 100 of our 10,000 daily quota units. We generate content only when it's needed, save it once per topic, and cache resources for 7 days.
- Unreliable model output. Models sometimes return broken JSON or an empty reply. We added retries and fallbacks so a bad response shows the learner a plain message and a retry, never a raw error.
- Invented sources. A model can make up a requirement and cite it confidently. Now a citation only appears if code finds the quote in the posting or on the PDF page it names. Topic-only maps say plainly that they have no citations.
What we learned
- Let code decide what code can check. The model is useful for pointing at evidence, but it shouldn't be the one handing out the grade.
- Measure, and publish the limits. On our 71-case eval, the grader agreed with the labels on 70, passed 0 of the 48 answers that should fail, and failed 1 of the 23 that should pass. That sample is small, and an AI wrote the labels, not a human expert. Our trust page says so.
- Evidence isn't a guarantee. A chatbot that states the right facts can still fool the grader. We show signals like pasted text and typing time, and we don't claim to stop a determined cheater.
- Clear boundaries make AI-assisted teamwork faster. Written contracts between features let us move quickly without breaking each other's work.
Github Link: https://github.com/the-both-of-us/2026HTC
Built With
- amazon-bedrock
- auth0
- cerebras
- deepgram
- gnews-api
- google-books-api
- google-gemini
- groq
- next.js
- node.js
- playwright
- react
- react-flow
- statistics-canada-api
- taddy-api
- tailwindcss
- typescript
- vercel
- vercel-ai-gateway
- vercel-blob
- vitest
- wikipedia-api
- youtube-data-api
- zod