Mikasa
LiveA web app that generates complete courses from a topic and a goal, with a Tutor that answers questions and a Tailor that edits the course.
Problem
Learning a technical topic properly needs a course built for you: your background, your depth, your goal. The courses that exist are static. They assume one audience and they do not bend.
Generating one with a model is not a prompt in a wrapper. A course mixes narration, runnable code, and exercises, and the pieces have to hold together across lessons. One large model call collapses under that: it drifts, it loses structure, and it is expensive exactly where it fails. The hard problem is engineering the generation so the course stays coherent as a whole while every lesson is still good on its own.
Decisions
Generate the course in two phases
Chose
An outline first on a default model, shaped by the learner; lessons generated on demand on a stronger model.
The split follows where the cost and the intent live. The outline is cheap to produce and it is where the learner’s intent gets fixed, so it is the part worth shaping by hand. Lessons are where quality lives, and they are requested one at a time, so the stronger model only runs on material someone will actually read.
Turned down
- One call for the whole courseQuality collapses with length, and you pay upfront for lessons the learner may never open.
- Generate everything before the learner reads anythingThe learner waits, and every correction means regenerating work that was already fine.
Drive the agents with the Vercel AI SDK
Chose
One agent runtime through the AI Gateway, with two model tiers addressed as string IDs.
The first rejected alternate has a paper trail: the previous iteration of this project (github.com/andy-spike/dolphin, now archived) planned generation through coding-agent harnesses running in Daytona sandboxes, and the ADRs said so in detail. I wrote that design, sat with it, and rewrote instead of building it. The harness design solves a problem course generation does not have.
Turned down
- Coding-agent harnesses in cloud sandboxesThe previous iteration was designed around this. Harnesses are built to work inside codebases, not to write course material, and a sandbox per course is slow and costly for text generation.
- A provider SDK per modelEvery provider swap means new glue. The Gateway keeps one key and one interface for both tiers.
Keep the course mutable after generation
Chose
A Tailor that proposes change plans the learner approves change by change, with per-change undo.
Two agents, one job each. The Tutor answers questions grounded in the course but never changes it. The Tailor changes the course but only through a plan the learner approves, one change at a time. Neither can do what the other does, which is what keeps the learner in control of their own course.
Turned down
- Regenerate the course on every requestIt throws away lessons the learner already liked, and it makes every small fix cost a full generation.
Rebuild the app on Next.js
Chose
Next.js as one app instead of a monorepo with a Workers service.
The rewrite threw away scaffolding, not design. The domain decisions survived into CONTEXT.md and the ADRs; the monorepo, the service split, and the database choice did not.
Turned down
- TanStack Start on Cloudflare WorkersThe first web iteration. Good pieces, wrong amount of infrastructure for a product that had not earned a monorepo, a Workers service, and D1.
Result


Mikasa is done and working end to end: two-phase generation, lessons on demand, a Tutor grounded in the course, and a Tailor that edits through approved plans.
Casts
A web app that generates complete courses from a topic and a goal, with a Tutor that answers questions and a Tailor that edits the course.