Chat-driven slide builder for the CUNY AI Lab. Create presentation decks through AI conversation and direct on-canvas editing. Three-panel UI: chat + outline (left), canvas (center), resources (right). Exports self-contained HTML decks matching the CUNY AI Lab deck framework.
pnpm install
cp .env.example .env
ln -s ../../.env apps/api/.env
pnpm db:push
pnpm db:seed
pnpm devOpen http://localhost:5173, log in with a seeded admin account, create a deck, and start chatting.
- Node.js 22.23.4
- pnpm 9.x (
corepack enable && corepack prepare pnpm@9.15.0 --activate)
-
Install dependencies
The pinned CAIL packages install from public npm with no token. The checked-in
.npmrcmaps the@cuny-ai-labscope toregistry.npmjs.org, so a user configuration that still points it at GitHub Packages does not redirect the install.pnpm install
-
Configure environment
cp .env.example .env ln -s ../../.env apps/api/.env # required — API loads env from its own CWDConfigure institutional identity and Gateway as described in the receiver guide. Local password sessions are development-only; production requires signed institutional identity and an operator-verified local account mapping. Provider keys are not used by Slide Maker.
-
Initialize the database
pnpm db:push # apply Drizzle schema to SQLite pnpm db:seed # seed templates, themes, and admin users
pnpm devStarts both services via Turborepo:
| Service | URL |
|---|---|
| Web (SvelteKit) | http://localhost:5173 |
| API (Hono) | http://localhost:3001 |
Chat and planning use the CAIL Gateway catalog and verified Gateway credentials. Gateway owns quota admission and accounting. Before serving an existing database with this version, run the additive identity migration and verify account mappings; see the operator and release guide.
Conversational slide creation with SSE streaming. The AI emits structured mutations (addSlide, updateBlock, setTheme, etc.) applied live during streaming. Upload PDFs and DOCX files for context. Select models per conversation via dropdown.
Rich text formatting in the chat input: bold, italic, links, lists.
Two-mode canvas (view / edit). Edit mode provides:
- Format toolbar (heading levels, font size, bold, italic, link, lists, alignment)
- Drag-and-drop reorder within and across zones (svelte-dnd-action)
- Corner-drag resize for images and artifacts (pointer capture, shift for aspect lock)
- Module picker overlay per zone
- Split-panel resize handle for
layout-split - Step-reveal ordering (1-5) per module
- Undo/redo (
Ctrl+Z/Ctrl+Shift+Z)
| Layout | Zones | Use |
|---|---|---|
title-slide |
hero | Cover slide |
layout-split |
content, stage | Two-column (resizable ratio) |
layout-content |
main | Full-width single column |
layout-grid |
main | Card grid |
layout-full-dark |
main | Dark background |
layout-divider |
hero | Section break |
closing-slide |
hero | Final slide |
heading text card label tip-box prompt-block image carousel comparison card-grid flow stream-list artifact video
Modules flow vertically within zones. TipTap rich text editing across all module renderers. 35 seeded templates across all layouts.
13 built-in artifacts rendered natively (no iframe):
A* Pathfinding, Boids, Flow Field, Harmonograph, Langton's Ant, Leaflet Map, Lorenz Attractor, Molnar, Nake, Rössler Attractor, Sprott Attractor, Timeline, Truchet Tiles
Each artifact has a configurable parameter schema (numbers, colors, selects). Artifacts auto-size with aspect ratio preservation.
/search <query> in chat searches the web (Tavily or Brave) and auto-downloads the first image into the active slide. Dedicated image search via Pexels for openly-licensed photos. SSRF protection on all URL downloads.
12 built-in themes in 6 light/dark families: Studio (Dark, Light), CUNY AI Lab (Default, Dark), Warm Academic (Light, Dark), Slate Minimal (Light, Dark), Midnight (Dark, Light), Forest (Light, Dark). Users can create custom themes and fork existing ones. Theme-driven rendering via CSS custom properties.
Exports a self-contained ZIP with:
index.html— full presentation with section nav, step reveals, carousel synccss/styles.css— framework layout and module stylesjs/engine.js— keyboard navigation, step system, scrubber, ARIA announcementsjs/artifacts.js— native artifact renderersassets/— bundled uploaded imagesartifacts/— extracted iframe-based artifact HTML (if any)
Production uses verified institutional JWTs mapped explicitly to existing local user IDs. Product roles and sharing remain local. Development retains Lucia password sessions.
User management and local product role assignment. Gateway owns current model quota; existing local usage records are historical.
apps/api/ — Hono API (Node, SQLite via better-sqlite3 + Drizzle, Lucia auth)
apps/web/ — SvelteKit frontend (Svelte 5 runes, TipTap editor)
packages/shared/ — Shared TypeScript types, constants, framework CSS
templates/ — Seeded slide and artifact template JSON (35 files)
tests/ — Vitest unit tests (695 tests, 20 files) + 8 shell check scripts
e2e/ — Playwright E2E tests (15 specs)
pnpm install # install all deps
pnpm dev # run API + web via Turborepo
pnpm build # production build
pnpm db:push # push Drizzle schema to SQLite
pnpm db:seed # seed templates, themes, admin users
pnpm seed:admin # seed admin users only
pnpm audit:a11y # WCAG AA/AAA contrast audit
pnpm test # run vitest + shell checks
pnpm test:e2e # run Playwright E2E tests
pnpm test:e2e:ui # Playwright UI mode
npx vitest run # run vitest only
npx vitest --watch # watch modeInstitutional integration is source-only until the receiver release and private reachability are reviewed. See the release proposal. Historical staging scripts are not authorization to deploy this branch.
See AGENTS.md for coding style, testing guidelines, and commit conventions.
Architecture proposals #11 and #12 are reconciled in the September 7 design review, which separates current behavior, proposed consolidation, and unresolved host/data decisions.