← back to portfolio

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.

immersionED

Untitled Course

AI Course Creator
AI Course Creator
Hello! I'm your AI course creation assistant. Describe the course you want to create, and I'll generate a complete course structure for you.

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.

immersionED

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 Licenses

Organization Management

Manage LicensesManage UsersView PaymentsSettings

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.