Mikasa
En vivoUna app web que genera cursos completos a partir de un tema y una meta, con un Tutor que responde preguntas y un Tailor que edita el curso.
Problema
Aprender bien un tema técnico necesita un curso construido para ti: tu contexto, tu profundidad, tu meta. Los cursos que existen son estáticos. Asumen una sola audiencia y no se doblan.
Generar uno con un modelo no es un prompt con botón. Un curso mezcla narración, código ejecutable y ejercicios, y las piezas tienen que sostenerse entre lecciones. Una sola llamada grande al modelo colapsa: pierde estructura, se desvía, y es cara justo donde falla. El problema difícil es ingeniarse la generación para que el curso se sostenga como un todo mientras cada lección sigue siendo buena por sí sola.
Decisiones
Generar el curso en dos fases
Elección
Primero un outline con un modelo por defecto, moldeado por el estudiante; las lecciones se generan bajo demanda con un modelo más potente.
La división sigue dónde viven el costo y la intención. El outline es barato de producir y es donde se fija la intención del estudiante, así que es la parte que vale la pena moldear a mano. Las lecciones son donde vive la calidad, y se piden de a una, así que el modelo más potente solo corre sobre material que alguien va a leer de verdad.
Descartado
- Una sola llamada para el curso completoLa calidad colapsa con la longitud, y pagas de una vez por lecciones que el estudiante quizá nunca abra.
- Generar todo antes de que el estudiante lea nadaEl estudiante espera, y cada corrección implica regenerar trabajo que ya estaba bien.
Manejar los agentes con el Vercel AI SDK
Elección
Un runtime de agente a través del AI Gateway, con dos niveles de modelo direccionados como string IDs.
La primera alternativa descartada deja rastro: la iteración anterior de este proyecto (github.com/andy-spike/dolphin, ahora archivado) planeaba la generación con harnesses de agentes de código corriendo en sandboxes de Daytona, y los ADRs lo decían con detalle. Escribí ese diseño, lo pensé bien, y reescribí en vez de construirlo. El diseño de harnesses resuelve un problema que la generación de cursos no tiene.
Descartado
- Harnesses de agentes de código en sandboxes en la nubeLa iteración anterior estaba diseñada así. Los harnesses están hechos para trabajar dentro de codebases, no para escribir material de curso, y una sandbox por curso es lenta y costosa para generar texto.
- Un SDK por proveedorCada cambio de proveedor significa pegamento nuevo. El Gateway mantiene una llave y una interfaz para ambos niveles.
Mantener el curso mutable después de generarlo
Elección
Un Tailor que propone planes de cambio que el estudiante aprueba cambio por cambio, con undo por cambio.
Dos agentes, un trabajo cada uno. El Tutor responde preguntas ancladas en el curso pero nunca lo cambia. El Tailor cambia el curso pero solo mediante un plan que el estudiante aprueba, un cambio a la vez. Ninguno puede hacer lo que hace el otro, y eso es lo que mantiene al estudiante al control de su propio curso.
Descartado
- Regenerar el curso en cada peticiónBotar lecciones que al estudiante ya le gustaban, y hacer que cada arreglo pequeño cueste una generación completa.
Reconstruir la app en Next.js
Elección
Next.js como una sola app en vez de un monorepo con un servicio en Workers.
La reescritura botó andamiaje, no diseño. Las decisiones de dominio sobrevivieron en CONTEXT.md y los ADRs; el monorepo, la división en servicios y la elección de base de datos no.
Descartado
- TanStack Start en Cloudflare WorkersLa primera iteración web. Buenos pedazos, la cantidad equivocada de infraestructura para un producto que aún no se ganaba un monorepo, un servicio en Workers y D1.
Resultado


Mikasa está terminado y funciona de punta a punta: generación en dos fases, lecciones bajo demanda, un Tutor anclado en el curso y un Tailor que edita mediante planes aprobados.
Grabaciones
Una app web que genera cursos completos a partir de un tema y una meta, con un Tutor que responde preguntas y un Tailor que edita el curso.