Industry · Founding engineer
ImmersionED
ImmersionED is a learning platform where students learn by playing — negotiating with AI characters inside simulations instead of filling out worksheets. I built the teacher-facing side of that promise: an AI Course Creator that turns a one-sentence description into a full course of units, lessons, simulations, and assessments — and keeps the teacher in control of every change the AI proposes.
Below is a working replica of the real teacher workspace — sidebar, navigation, and the course creator itself. The AI responses are scripted so it runs entirely in your browser, but every interaction pattern — the clarifying questions, the hover-to-add dividers, the diff reviews — is the production UX.
Interactive demo · AI Course Creator
Try: send the suggested prompt, choose “Add more detail” to see the clarifying questions, then generate. Once the course exists, hover between items in the outline for the + add with AI dividers, or click any pencil to edit one item with natural language.
Untitled Course
Start with the AI chat
Use the chat on the right to describe the course you want to create. Once the AI generates an outline, your editable tree appears here and a student-view preview renders alongside it.
What’s underneath
The parts the demo can’t show
One planner, thirty parallel writers
Generation runs as an AWS Step Function. A single Claude Opus “planner” call sees the whole request and emits a course skeleton plus a content ledger — a per-lesson allocation of readings, topics, and simulation characters. Then up to 30 Claude Sonnet “leaf” calls write lesson content in parallel. The ledger is the load-bearing idea: because allocation is centralized, parallel writers can’t independently produce the same background reading twice.
Nothing lands without review
Every AI mutation is staged as a before/after diff — word-level highlights on text, add/remove/change badges on structure — and only writes to the course when the teacher applies it. Edits to existing courses are planned as sparse diffs and saved as new immutable versions, so there’s always a way back.
Focused edits skip the pipeline
The inline add and pencil-edit flows send a focus hint that bypasses the planner entirely — one scoped model call on one item, which is why they feel instant next to a full generation.
Two modes, one form
AI mode and the classic manual editor are two views bound to a single react-hook-form — mode is just a URL param. Switching never loses unsaved work, the AI’s output lands directly in the form fields the teacher can type into, and the AI mode’s settings panel reuses the manual editor’s components unchanged.
Jobs that survive a refresh
Generation is async: start a job, poll for status. The job id and chat history persist in session storage, so refreshing mid-generation resumes cleanly — and a guard prevents a stale completed job from re-applying itself. Saving is disabled while a generation is writing a new version, closing a race between the two.
Interactive demo · Teacher onboarding
I also built the onboarding system: a “Getting Started” tab docked to the right edge of every page — drag it up or down, click it to open the checklist, and each task’s Go → launches a guided spotlight tour over the real screen it teaches — all six flows, from the marketplace to the licensing walkthrough. Reset un-checks everything so teachers can practice a walkthrough again.
Good evening! 👋
Organization Dashboard
Active Licenses
12
of 20 total
Total Students
63
Enrolled across classes
Classes
3
Active classes
Pending Invoices
0
All settled
Billing Overview
Recent payments and invoice status
No payment history yet
Purchase LicensesOrganization Management
Stack
React 19 · TypeScript · react-hook-form · TanStack Query · Tailwind · shadcn/ui · AWS Lambda + Step Functions + DynamoDB (CDK) · Claude on Amazon Bedrock · Stability SD3.5 for imagery
This page is a self-contained re-creation built for my portfolio, not an exact copy of the shipped product — layouts, styling, and copy are approximated from memory, the AI responses are scripted, the course and people are fictional, and no ImmersionED code or data is used.