Inspiration
Most people carry a list of subjects they keep meaning to learn properly: how machine learning actually works, enough Japanese to read a manga, the music theory behind songs they love. The usual options pull in two directions. A ready-made course starts from someone else's idea of where you are and where you want to go. A chat with a model is fast and friendly, but it explains things to you; it rarely makes you do the work that turns an explanation into skill, and it forgets what you managed last time.
I wanted the experience of a good private tutor instead: someone who first listens to what you want, reads up on the subject, shows you a plan you can argue with, and then gives you exercises that make you think, checks your answers against clear criteria and remembers what you have demonstrated.
What it does
You start with a conversation. You describe your goal in your own words, together with what you already know and the language you want to study in. Unfurl replies, searches the web, reads the sources and shows in the chat what it read. It then drafts a course program beside the conversation: outcomes, prerequisites, modules and an estimate of study time. You can edit the program or ask for changes, and nothing is built until you approve one exact saved version.
After approval the build continues in the same chat. Each section is researched, its coverage of the approved outcomes is checked, lessons are planned, reading material is written and activities are created. Every activity is tested with a correct answer, an alternative correct answer and a meaningfully wrong one before it can be released. Only validated content becomes a course version a learner can open.
Learning happens through practice that fits the subject. Unfurl defines 29 activity families, from state tracing and procedure reconstruction to relational mapping, experiments and argument and rebuttal, and the generator picks the ones the material actually needs. Answers are saved and evaluated on the server against explicit criteria, Python tasks run in an isolated sandbox, and XP is awarded only when an answer meets the criteria. Each learner keeps their own progress in a shared course version. A course can stay private, be shared through a revocable link, or be published once the author reaches the required level. One conversation can produce several courses, and the library keeps courses and enrollments separate from chats.
The featured course, AI Engineering: From Foundations to Working Systems, was produced by the same service and can be opened from the Try page.
How we built it
Unfurl is a Next.js 16 and React 19 application written in TypeScript and deployed on Vercel. Supabase Auth and PostgreSQL store accounts, conversations, course versions, attempts, evaluations and progress; every mutation checks the current user, ownership, revision and an idempotency key. Course construction runs as durable jobs on Vercel Workflow, so a build continues when the browser is closed, saves the result of each step and recovers after a failure without repeating paid model calls. Typed events reconnect that work to the conversation.
Model inference and web search go through OpenRouter. Gemini 3.8 Flash handles structured authoring and course content, and Kimi K2.6 handles search and rubric evaluation. Web pages and PDFs are read with their original page numbers; long PDFs are stored in parts, and a partial extract is never treated as a full read. Python activities run in Vercel Sandbox with no network access and strict limits. Zod schemas and server validators enforce data shapes, source provenance, outcome coverage and allowed state transitions, so the interface can neither award XP nor declare a build complete on its own.
The work was planned before it was coded. A learner profile, a scope document, a PRD, a technical spec and a checklist of acceptance slices (all in the devpost/ folder) defined the product, and the implementation followed those slices with AI coding agents.
Challenges we ran into
The hardest part was long-running generation. Building a course takes many model calls and several minutes, far longer than a single serverless request. We had to make every step durable, record each provider call before using its result, retry without duplicating work, and keep the chat truthful about what was finished, what was still running and what had failed.
The second challenge was honesty about quality. A model will happily produce something that looks complete. We added coverage checks against the approved outcomes, required source evidence for claims, refused to count a partial PDF extract as reading the document, and tested every generated exercise against valid, alternative-valid and wrong answers before release.
There were also smaller races that matter to a real user: approving a program while the agent is still revising it, two browser tabs editing the same course, a slow provider returning after the user has moved on. Each of these needed an explicit rule, such as approval binding one saved revision and waiting until authoring has finished.
Accomplishments that we're proud of
A complete course was created, approved, built, validated and published through the ordinary product, without hand-written lessons, and anyone can open it. Grading happens on the server, so XP and progress reflect what a learner actually demonstrated. The 29 activity families have their own response formats and evaluators instead of being variations of a multiple-choice quiz. And the product feels warm and calm to use, with its own identity, rather than like another AI dashboard.
What we learned
Writing the plan first paid off. Most of the architecture came from questions the planning documents forced us to answer early, such as what a course is, who owns it and when it may change. Feedback during testing changed the model in important ways: a chat is not a course, so one conversation can now hold several courses, and the library lists courses rather than chats. We also learned that the quality of learning depends far more on the design of the activity and its criteria than on how polished the explanatory text is, and that durable execution is a product feature, because users notice immediately when long work is lost or silently restarted.
What's next for Unfurl
More published courses beyond AI, built and reviewed through the same pipeline. Measuring whether learners actually improve, not just whether they finish. Richer personal routes that respond to the evidence from each answer. Study groups that share one course while keeping individual progress. And more interface languages, starting with Russian and Kazakh, since a course can already be generated in the learner's language.
Built With
- css
- eslint
- gemini
- html
- kimi-k2
- lucide
- next.js
- node.js
- openrouter
- postgresql
- python
- radix-ui
- react
- supabase
- typescript
- unpdf
- vercel
- vercel-sandbox
- vercel-workflow
- vitest
- zod
Log in or sign up for Devpost to join the conversation.