All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
- Agent workbench (Pro mode) — chat-first course building from the home page: the collapsible workspace shell #1206, the agent chat surface #1205, and the client data layer #1204, with Pro entry points that preserve mode-transition semantics #1208; owner-scoped folder routes, stage-metadata viewer surfaces, and the material upload contract #1215, plus stage and material HTTP routes #1203; the Pro workbench flag now implies the MAIC Editor gate #1223
- Durable agent runtime — server-backed course-building sessions: the driver model contract and stage route dialect #1165, the runtime foundations on the agent-session store #1167, a background session runner #1169, agent session and owner event streams #1170, and session lifecycle routes #1171 — sessions survive restarts, accept follow-up steering and cancellation, and stream a replayable event transcript; the runtime configuration surface is documented #1176
- Agent tools and skills — validated, provider-neutral course tools: neutral tool foundation libraries #1184, a
web_searchtool on the session runner #1185, session materials with afetch_urltool behind the URL trust gate #1190, material read/search #1192, stage read/patch #1194, page generation and deck editing #1198, roster and voice registration #1201, folder organisation #1202, image/video/PPTX import #1211, and the material extraction lifecycle #1212; a skills system #1189 with Feynman and spiral curriculum methods #1240, reference tools and skills ported in a parity audit #1241, and real skill management in Settings — list, download, delete, and upload #1244 - Provider-neutral server capabilities — image, video, and ASR models resolved from server config #1175, uniform capability force-off with a consistent missing-key contract #1181, startup validation of model routing config #1182, silent-behavior fixes from the provider audit #1196, and provider force-off enforced in agent tools with vendor identity scrubbed from tool results #1231
- Pluggable persistence — an agent-session store with a PostgreSQL backend over layered contracts #1163, an ownership scope on stage documents #1191, a per-session URL trust gate #1186, per-scene monotonic revisions via database triggers #1214, owner materials migrated to
oss_keywith the legacyasset_iddropped #1250, and per-owner quota reservations serialized with crashed uploads reclaimable #1232 - Materials and the asset byte model — uploaded sources ingested into the asset pool and extracted by id #1154, derived assets with lineage and an extraction cache #1164, a material library manifest with id-addressed generation images #1168, inline base64 images converted to pool assets on load #1172, legacy references converted to allocated asset ids #1101, media and materials moved onto the reference byte model with the asset-registry wiring retired #1242, a standardized asset manifest with converged export paths #1117 over one shared stored-bytes resolver #1116, opt-in indirect asset byte egress #1100, and an optional local ffmpeg/ffprobe media extractor #1213
- Editor: float the insert toolbar in the outer frame with collapse #1246; port the timeline TTS preview single-flight and voice-all state latching #1235
- Whiteboard and Pi Native Child: destructive whiteboard runtime operations #1173; Native Child whiteboard tools #1152 and additive whiteboard tools #1156, web search #1133, and a native child runtime with scoped Spotlight #1111
- Qwen TTS voice cloning #1160
- Download the narration script as Markdown or DOCX on export #1144
- A document lexical retrieval foundation for RAG #1078
- Video export: a bounded local chunk executor #1115
- German (de-DE) localization #1128
- OpenClaw skill: a secondary-development flow #1119
- Workbench: restore editor chrome, mode transition, streaming, materials, mentions, and folders #1229; restore the attach entry and add the rail settings entry, pinning all three entry points #1221; list PG-mode home courses via owner stages while keeping the interrupted terminal course card #1218; send the opening session message exactly once with references intact #1234; show newly created folders in the sidebar without a reload #1254; single-source the chat gutter so the timeline and composer share a left edge #1255 #1247; lock the pane-embedded classroom to edit mode #1256; label the extraction lifecycle tools on the timeline
- Agent runtime: control-plane routes answer 404, not 500, without a database, and the runtime reports itself unusable without one #1207; abort in-flight TTS on cancel and bound every provider request with a timeout #1217; bound every tool call with a timeout and never resurrect a cancelled session #1226; fence durable tool writes and consume cancel requests atomically #1230; fence session claims while an ask_user question is outstanding #1248; settle-time rescue tracks real delivery instead of a count offset #1249; repair orphaned and late tool results across interruption boundaries #1180; wake SSE tails and the runner on durable deltas for streaming fidelity #1222; carry reasoning through the completions dialect so the thinking strip renders #1239; revoke deleted-session URL authority and reject private ISATAP endpoints #1199
- Editor: complete element referencing with the renderer DOM contract and GenUI picking aligned to the reference #1238; resolve dock-bar i18n keys, remove the dock height drag, and wire element referencing #1233; allow dragging selected lines #1166; allow multi-tab edit mode by dropping the cross-tab edit lock #1161; align editable shape labels with text #1137; keep class roster cards from shrinking #1135
- Media: restore the reference classic media chain #1236; persist origin-independent classroom-media references from the agent runtime #1245
- Storage: asset writes no longer self-deadlock against pooled PostgreSQL #1225 #1227
- Importer: adapt the imported PPTX canvas size so decks render without overflow #1237
- Classroom: center adapted canvases in the stage and send navigation home during generation #1243
- Renderer: preserve literal text line breaks #1132
- Whiteboard: correct the inverted viewportRatio so boards render 16:9 landscape #1257
- Video export: make Cyrillic and Arabic Quiz fonts deterministic #1114; constrain GenUI iframe visibility #1125
- i18n: fix the Traditional Chinese translations in the importer #1127
- Docs: add the release version prefix to the README and drop the opt-in framing, surface the 1.0.0 user-guide badges at the top #1253, and a takeaway-style 1.0.0 announcement with bilingual guide links; announce 1.0.0 and refresh the feature overview #1216; document the agent runtime configuration surface #1176
- Tests: reconcile vendor-token debt counts with the integration line and after the main merge, mock both runtime gate exports in the control-plane route suites, and give material fixtures the extraction lifecycle fields; keep the PG contract suite order-independent #1200; cover indirect-egress CORS in Chromium #1138; wait for project cleanup instead of racing it in the render suite #1193; stop loading
.env.localinto unit tests by default #1162; guard the provider-neutral layers against vendor leakage #1197 - CI and build: cut wall-clock time and bound Playwright browser installs #1146; scope the Next typecheck to production sources #1179; add optional Docker mirrors and a pnpm cache #1139
- Workbench cleanup: retire the bookmark concept and the saved-courses drawer #1219; remove the in-editor agent panel #1210
- Storage: drop the unused active-stage API from the agent-session contract #1174
- Pi: simplify agent tool ownership and completion #1148
- Video export hardening — fidelity polish for spotlight geometry, video clips, formulas, and subtitles #952, deterministic Quiz/PBL cover cards #995, self-contained static interactive HTML capture #1086, deterministic Quiz question-list scrolling #1102, a stable RenderExecutor seam #1104, explicit CPU resource profiles #1105, and effective parallel capture in the render service #1042
- Server-backed persistence completion — learner-data cutover: quiz + playback onto RuntimeStore #955; document-persistence cutover: stage/scene/outline onto DocumentStore #965; server-backed documents over an HTTP contract with a Postgres backend and one reference server #979; a one-command server-backed stack (compose profile + embedded API + docs) #982; dirty-set incremental saves with operation-level flush #983; settings/user-profile persistence through KVStore #1001; the KV HTTP contract and clients promoted to main #1020; learner whiteboard RuntimeStore foundation #1075
- Asset registry — allocated asset ids over the content-addressed blob layer #1024, unified media asset reference types #1038, generated assets allocated through the registry #1039, a server asset registry over a pluggable byte layer #1077, and the asset backend wired into the app #1089
@openmaic/generationpackage — scaffolding with pipeline types and packaged prompt assets #1063; outline generation #1065 and scene generation + PBL single-call planning #1087 moved into the package; the app consumes the package everywhere andlib/generationis deleted #1090- SDK contract ownership — interactive and PBL content kinds promoted into
@openmaic/dsl#1070, app consumes the contract's interactive/widget types #1073 and PBL project types #1079, and the renderer decouples its editing UI from the app #1072 - Course folder grouping #1005 (by @CXuPercy)
- Local FunASR ASR provider #1044
- Claude (
claude search) as a web-search provider #393 (by @joseph-mpo-yeti) - Per-stage routing for
generate-classroominstead of one model #1048; evidence-aware Pi Director context runtime #971; optional playback canvas renderer #958 - Amazon Bedrock LLM provider #538 (by @littlebullGit), Atlas Cloud LLM provider #948 (by @binyangzhu000-sudo), latest Claude/Gemini/Kimi/Grok models #993, and Grok 4.6 #1113
- French (fr-FR) locale #1068 (by @momo2lajoie), Spanish (Mexico) locale #942 (by @davidmedel), Vietnamese (vi-VN) locale #1025 (by @niitbeo), and 432 reviewed zh-TW translations #526 (by @alvinets)
- Persistence: stop corrupting binary response bodies in the route adapter #1088; omit undefined object fields at persistence boundaries #992; bind default fetch to globalThis in both HTTP store clients #984
- Chat: harden runtime sync, legacy migration, and record validation #1050; add opt-in streaming chat compatibility #990
- Access code: refetch server providers after the code is accepted #1081
- Render service: make parallel capture effective #1042; keep the entrypoint LF so the image starts on Windows #1027
- i18n: load every Inter subset so non-Latin text keeps the UI font #1026; translate ASR provider names in the generation toolbar #1028; localize Pro mode right rail labels #1023
- Render whiteboard math via KaTeX instead of raw LaTeX text #938; keep arrowheads visible when toggling thumbnails #1045
- AI: omit zero SiliconFlow thinking budget #1035; harden shared Pi transport contracts #1108
- Importer: handle custom shapes without paths #1015
- Vocational mode: keep the toggle thumb within the track #1032
- Editor packages: add npm provenance metadata #1098
- Release: dedupe the published dsl and close two release-path blind spots #1019; hand published versions to the marker job #1076
- PBL: retire the v1 write path and dead UI, converge on v2 #1060; split the planner core from the loop with an injectable LLM call path #1069; pin single-call prompt goldens #1071; route runtime agents through the shared LLM entry point #1006
- Document transform pipeline foundation #920; choreography overlays driven from descriptors #947; single-source the generated agent roster on the stage document #994
- Publish validated package tarballs #1040; publish storage and enforce version bumps #998; publish the OpenMAIC skill to ClawHub #1056
- Docs refresh and synchronization #996; align the environment variable template #1107; stabilize the Hyperframes lint command #1097
- Video export (MP4) — Export a lesson as a rendered video: a
VideoTimelineIR with a pure compile pipeline #913, an L1 Hyperframes emitter with in-browser frame collection and ZIP export #931, and a service-backed MP4 render with in-app one-click export #937 (by @cosarah) — built on a shared orchestration spec inlib/choreography#890 (by @cosarah) and persisted TTS audio durations #862 (by @cosarah) - Server-backed runtime storage — A pluggable storage seam for classroom runtime state:
@openmaic/storageKV + asset primitives #858, a normalized DocumentStore #860, RuntimeStore sessions with append-only records #880, a DSL runtime envelope #870, device-anonymous learner identity #885, a runtime-event outbox with dual-write #893, cutovers for PBL learner state #902 #922 and chat sessions #926, and an HTTP backend contract with a Postgres backend and reference server #946 - Editor: direct manipulation — Select and drag slide elements #859, 8-point resize + rotate handles #881, marquee multi-select with multi-element drag #888, and a draggable insert toolbar #912, scaffolded as the
@openmaic/rendererv2 editing surface behind a machine-enforced import boundary #853 #855 - Edit with AI upgrades — Natural-language element edits through a typed EditIntent pipeline #896, validated JSON Patch element edits #927, and multi-session conversation history for the AI editor #801
- DSL self-ownership —
@openmaic/dslnow owns the Action playback verbs #787, ships JSON Schema artifacts with pure validators #817, activates the migration registry and runner #825, and owns element-level normalization and defaults wired into the generator #832 and the importer output boundary #845 - Document Parsing expansion — Multi-format course-material upload #741 and document bundles #844 (by @jackefn), audio/video media extraction with an AliDocMind provider #887 (by @yanpgwang), and a renamed Document Parsing surface with visible supported formats and extended MinerU support (by @yanpgwang)
- Add Azure OpenAI as an LLM provider #916 (by @hydraxman), SearXNG as a web-search provider #842 (by @PineSongCN), ComfyUI as an image provider #850 (by @PhillLittlewood), the GPT-5.6 model family #907, and an updated Doubao Seed model catalog #827
- Add one-click token-plan setup and a deployment usage dashboard #784 (by @yanpgwang)
- Add action-level playback navigation #843 (by @danishsshaikh)
- Redesign the narration timeline (action picker + inline insert) and enable it for interactive/PBL scenes #834
- Add in-editor authoring of classroom agents with a Stage-level roster #816
- Parallelize within-scene TTS generation #696 (by @ly-wang19)
- Feed the real HTML element inventory into interactive-action prompts #829 and add a postMessage listener contract to diagram/game/code widgets #872 (by @yanpgwang)
- Add an experimental Pi classroom runtime behind a flag #914
- Security: disable redirects in media connectivity probes #930 and harden provider redirect handling with ISATAP address detection #928 against SSRF (by @YizukiAme)
- Generation: strip reasoning blocks before JSON parsing #750 (by @yipwingtim), localize scene-generation errors #894 (by @wsun1), tolerate malformed generated slide data (by @yipwingtim), and honor outline node constraints in diagrams #911
- Editor: keep emptied or zero-action scenes playable, bind the outline by stable id, and surface incomplete content #814; show per-line loading while the batch "regenerate all TTS" runs #830
- Export: fix the unresponsive resource pack for interactive-only decks #933 (by @2046731121CC), compute SVG path bounding boxes via
getBounds()#656, keep sibling attributes when style is empty #683, and convert PPTX shadow offsets from px to pt #679 (by @ly-wang19) - Quiz: render formulas in quiz text #833 (by @dpersek); stop leaking questions on entry and pass results to the chat agent #823 (by @yanpgwang)
- Storage: store image files as array buffers #923 (by @YizukiAme) and accept image storage IDs containing underscores #918
- Chat: preserve message line breaks #908, and cap the roundtable non-presentation input height #917 (by @YizukiAme)
- TTS: respect string context when splitting the Doubao stream #677; web search: match Brave's current result-title markup #688 (by @ly-wang19)
- Stage: centralize the deck completion predicate #883 (by @dpersek)
- AI: close PROVIDERS/THINKING_CAPABILITIES metadata drift with a guard #809 (by @mvanhorn)
- Home: clarify the Interactive Mode selected state #901; lecture notes: render interactive-webpage widget actions #810
- Docker: fix the postinstall script failure in Docker builds #835 (by @Lee-Flier)
- mathml2omml: call
includes()instead of indexing it #681 (by @ly-wang19)
- Performance: dedupe editor alignment snap-lines in O(n) #692, diff code lines in O(n) via a prev-line map #706, and index assigned images by id in
fixElementDefaults#701 (by @ly-wang19) - Tests: cover
splitLongSpeechText/splitLongSpeechActions#694 (by @ly-wang19); settle dynamic imports #899 and drain debounced saves #897 before store-test teardown - Media providers: share the submit-poll task driver #900 and the auth probe across matching adapters #903, and remove the dead legacy pipeline chain #905 (by @YizukiAme)
- Packages: add repository metadata #813 and set
@openmaic/*package versions to 0.0.2 #812 (by @xuyuanwei678) - Docs: document the dev-server OOM workaround for large generations #808 (by @mvanhorn)
- Tighten GitHub issue intake #921
- Relicense the project from AGPL-3.0 to MIT
- Remove
allow-same-originfrom the interactivesrcDociframe sandbox for tighter isolation; interactive widgets that relied on same-origin access may need updates #726 (by @sebastiondev) - Restructure the slide DSL and renderer into standalone
@openmaic/*packages consumed by the app; the inline DSL shim is removed #707 #738
- Project-Based Learning (PBL) v2 — Add the PBL v2 core schema and generation path #795 (by @cosarah), runtime APIs with classroom UI #799 (by @cosarah), in-timeline discussion authoring #798, auto-retry for transient scene-generation failures #788 (by @YizukiAme), and a planner eval harness #803 #805 (by @cosarah)
- Edit with AI — Add a Pro-mode editor agent that edits generated slides from a chat prompt #777
@openmaic/*SDK on npm — Publish the DSL, renderer, and importer SDK family to npm #778 #780, introduce themaic-import/maic-rendererworkspace packages #668 (by @xuyuanwei678), and promote the Stage/Scene lesson skeleton into@maic/dsl#740- Add optional per-stage LLM model routing #745
- Add GLM-5.2 and Kimi K2.7 Code #774, and Qwen3.7 Plus and Qwen3.7 Max #753, to the model registry
- Add a vocational-learning task engine with procedural skill widgets #685 (by @jackefn)
- Add Korean (ko-KR) translation #733 (by @moduvoice)
- Improve TTS with per-agent auto-voice quality and stable timbre registration #670, and unify the provider-enablement model with browser-native TTS off by default #665
- Add opt-in parallel scene-content generation #660 (by @ly-wang19)
- Add a document extractor provider foundation #704 (by @jackefn)
- Infer concise course titles from outlines for more readable course names #756
- Refactor widget actions into the unified scene action pipeline #796
- Importer: port PPTX shape-restoration hotfixes #789 (by @xuyuanwei678), fix hanging-indent bullet rendering #727 (by @xuyuanwei678), and guard SVG export against arc-first paths #638 (by @ly-wang19)
- Generation: make outline type changes take effect so interactive/PBL outlines are no longer downgraded to slides #772, stop regenerating deleted slides on finished decks #769, show full key-point text in the outline editor #782, and linearize outline streaming and interactive post-processing for better performance #732
- Agent: respond to the user's turn before lecturing #699, and constrain action narration to a single teacher voice #671
- Editor: stop dumping the raw tool-failure blob in AI edit tool cards #785, persist AgentBar voice and mode selections across reloads #723, and keep the edit runtime alive across read-only scenes #802 (by @cosarah)
- Audio: gate the speech button on ASR availability #711, revoke blob URLs when playback is rejected #652 (by @ly-wang19), and surface TTS provider rate limits as HTTP 429 #644 (by @ly-wang19)
- Renderer: make the code entrance animation play line by line #724 (by @tongshu2023)
- Security: point the SSRF local-network rejection at the
ALLOW_LOCAL_NETWORKSescape hatch #667 (by @mvanhorn) - Networking: bypass the proxy for loopback hosts and honor
NO_PROXY#718 (by @tongshu2023) - Fix overlay layout shift on the home and classroom pages #690 (by @cosarah)
- Drop the dead
ThumbnailSlidepath and fix@maic/dslNode ESM resolution #736 - Docs: correct the stale i18n location and supported-language list #640 (by @ly-wang19)
- MAIC Editor (v0) — slide editing surface — A new Pro Mode toggle turns any generated slide into an editable canvas: select and edit text, insert text boxes and images, navigate and reorder slides from a thumbnail rail, with history-aware undo/redo. This is the first surface of the broader MAIC Editor framework (gated behind
NEXT_PUBLIC_MAIC_EDITOR_ENABLED) #615 - Editable outline before generation — The streaming course outline now morphs into an inline editor: review, edit, reorder, and add or delete scenes and bullet points, then confirm to generate the full course — so you catch structure problems before spending a full generation #558
- Offline-ready classroom export — Exported teaching resource packs and classroom ZIPs now inline external assets so interactive pages open fully offline, even when copied to another machine #613
- Add Claude Opus 4.8 and MiniMax M3 to the default model registry #635
- Add Gemini 3.5 Flash #584
- Add Xiaomi MiMo Token Plan support #578 (by @xuruiray)
- Add web search providers: Brave and Baidu #42 (by @YizukiAme), Bocha #524, and MiniMax #634
- Add Azure STT (Fast Transcription) as a speech-to-text provider #175 (by @ismailariyan)
- Add HappyHorse video adapter #509 (by @xuruiray) and Lemonade as an LLM provider #508
- Add OpenAI image generation environment-variable fallback #510 (by @xuruiray)
- Add generated-video manifest references so produced videos survive export/import #540
- Add Traditional Chinese (zh-TW) #517 (by @alvinets) and Brazilian Portuguese (pt-BR) #602 (by @hemanz) interface languages
- Server-configured providers are now admin-managed — providers set via server environment can no longer be overridden by client settings, preventing base-URL/key tampering on shared deployments #624; fixes server API-key fallback when the client echoes the provider base URL #533 (by @LooThao); auto-selects the server LLM model #577 (by @xuruiray); and enforces a "usable provider ⇒ concrete model" invariant #581
- Keep interactive scenes alive across remounts with an iframe keep-alive pool, so interactive content no longer reloads when navigating #629
- Restore the orchestration director's ability to answer the user's question and stop runaway turns (removed
maxTurns) #599; restore agent attribution in the director summary #554 (by @ashutoshrana) - Skip shapes with malformed SVG paths instead of aborting the whole PPTX export #505; prevent memory leaks and silent export failures #552 (by @arnow117)
- Add defensive checks in ChartElement to prevent crashes on malformed chart data #588 (by @tongshu2023)
- Let whiteboard code elements capture internal scroll/drag instead of the canvas #544 (by @cosarah)
- Preserve discussion triggers when importing classroom ZIPs #557 (by @cosarah)
- Fix generated video thumbnails #546
- Gate media snippets in the interactive-outlines prompt template #628
- Hide the unsupported MiniMax Hailuo fast text-to-video model #632; remove weak Lemonade recommended models #567 (by @cosarah)
- Fix Haiku 4.5 thinking controls #501
- Use an ESM import for TypeScript in the pptxgenjs rollup config #616
- Align zh-TW provider names with the rest of the locale set
- Add a Fumadocs-based documentation site #622
- Add a VoxCPM2 setup guide and tighten the README section #500 #502
- Fix the commercial licensing contact email #604 (by @DHQ1204)
- VoxCPM2 TTS provider with voice cloning — OpenMAIC adapts to user-managed VoxCPM backends (vLLM-Omni, Nano-VLLM, official Python API). Clone any voice from a reference audio clip you upload or record in the browser, or let Auto Voice generate a fitting voice from each agent's persona at synthesis time. Voice profiles are stored locally to keep the serverless setup model. The Agent Bar exposes a searchable, previewable voice picker that draws from the global VoxCPM voice pool #496
- Per-model thinking configuration — First-class metadata for each model's reasoning capability (effort levels, on/off toggle, adjustable budget, or fixed thinking) flows through chat and all generation paths and is mapped to the right provider-specific request fields (Anthropic
thinking, OpenAIreasoning, etc.). The model selector becomes a unified provider/model/thinking popover with compact search and a much smaller toolbar footprint #494 - End-of-course completion page with persistent quiz state — When the outline is fully materialized, students see a course-complete view with quiz score card, scene-type stat cards, and a (motion-respecting) confetti celebration. Quiz answers persist on submit and grading results persist on completion, so navigating away and back restores the reviewing state with AI feedback intact instead of resetting #484
- Add latest released models including GPT-5.5, DeepSeek-V4 (
-pro,-flash), Xiaomi MiMo (mimo-v2.5-pro,mimo-v2.5), Tencent Hy3, and OpenRouter as a multi-provider gateway #481 #487 - Add OpenAI image generation (GPT-Image-2) as a media provider #481
- Refresh built-in model registries across Anthropic, DeepSeek, Kimi, Qwen, MiniMax, Grok, OpenAI, GLM, SiliconFlow, and Ollama; persisted local settings now rehydrate in registry order so newly curated lists appear consistent without clearing state #481
- Add inline search for recent classrooms on the home page with deferred filtering by name and description, keyboard-driven open/clear/collapse #476
- Add Deep-Interactive badge on classroom thumbnails for sessions generated with Interactive Mode #478
- Replace always-included media instruction blocks in generation prompts with conditional snippet includes gated on
imageEnabled/videoEnabled— disabled capabilities are removed from the prompt entirely instead of relying on negative-override directives the model often ignored #490 (by @YizukiAme)
- Fix language drift between outline and scene generation by unifying the languageDirective across the pipeline so the same target language flows from outline planning through every per-scene call #474
- Refactor whiteboard role prompts to file-based markdown templates and add a geometry-conflict detector (overlap, line-through-bbox, canvas clipping) that surfaces problems back to the model. Eval (flash, repeat 3, gemini-3.1-pro scorer) shows overall quality 5.4 → 6.1 and overlap 6.3 → 8.1 from prompt + detector alone #485
- Migrate orchestration prompt builders (
buildStructuredPrompt,buildDirectorPrompt,buildPBLSystemPrompt) from inline TS template literals to file-based markdown templates underlib/prompts/, sharing the loader infrastructure with the generation pipeline.prompt-builder.ts890 → 314 lines; future content tweaks land as markdown edits #459
- Deep Interactive Mode — Generate hands-on interactive scenes (3D visualization, simulation, game, mind map/diagram, online programming) with an AI teacher who operates the UI to guide students. Fully responsive across desktop, tablet, and mobile #461
- Add code element support on the whiteboard — AI agents can write, display, and reference runnable code during lessons #385 (by @cosarah)
- Add Arabic (ar-SA) interface language #431 (by @YizukiAme)
- Add MinerU Cloud API as a PDF parsing provider, with a dedicated settings UI #438
- Add latest OpenAI models to the default config #416 (by @donghch)
- Add GLM-5.1 and GLM-5V-Turbo to GLM preset models #437
- Add international base URL shortcuts for GLM, Kimi, and MiniMax in provider settings #449
- Add anti-framing security headers (X-Frame-Options + CSP
frame-ancestors) with an optionalALLOWED_FRAME_ANCESTORSoverride #430 (by @YizukiAme) - Add i18n key alignment check to CI so missing or extra translation keys fail the build #447 (by @KanameMadoka520)
- Add whiteboard layout quality eval harness and unify it with the outline-language harness #425 #453
- Fix classroom ZIP export to use the latest classroom name from IndexedDB #435
- Fix spotlight cutout for text elements and add element-content variant for image/video #457
- Renew the README with Deep Interactive Mode showcase and visual assets #463 (by @Shirokumaaaa)
- Update Discord invite links across README, CONTRIBUTING, and issue templates
- Add inline language inference for outline and PBL generation, replacing manual language selector #412 (by @cosarah)
- Add ACCESS_CODE site-level authentication for shared deployments #411
- Add classroom export and import as ZIP #418
- Add custom OpenAI-compatible TTS/ASR provider support #409
- Add Ollama as built-in provider with keyless activation #94 (by @f1rep0wr)
- Add Japanese (ja-JP) locale #365 (by @YizukiAme)
- Add Russian (ru-RU) locale #261 (by @maximvalerevich)
- Migrate i18n infrastructure to i18next framework #331 (by @cosarah)
- Add MiniMax provider support #182 (by @Hi-Jiajun)
- Add Doubao TTS 2.0 (Volcengine) provider #283
- Add configurable model selection for TTS and ASR #108 (by @ShaojieLiu)
- Add context-aware Tavily web search when PDF is uploaded #258 (by @nkmohit)
- Add course rename #58 (by @YizukiAme)
- Add end-to-end generation happy path test #405
- Fix DNS rebinding bypass in SSRF validation #386 (by @YizukiAme)
- Add ALLOW_LOCAL_NETWORKS env var for self-hosted deployments #366
- Fix custom provider baseUrl not persisting on creation #417 (by @YizukiAme)
- Hide Ollama from model selector when not configured #420 (by @cosarah)
- Fix agent configs not persisting in server-generated classrooms #336 (by @YizukiAme)
- Fix action filtering logic and add safety improvements #163 (by @zky001)
- Fix modifier-key combos triggering single-key shortcuts #359 (by @YizukiAme)
- Fix agent mode selection for conditionally set generatedAgentConfigs #373 (by @YizukiAme)
- Unify TTS model selection to per-provider and fix ElevenLabs model_id #326
- Allow model-level test connection without client-side API key #309 (by @cosarah)
- Add structured request context to all API error logs #337 (by @YizukiAme)
- Fix breathing bar background color in roundtable #307
- Add missing Ollama and Doubao provider names for ru-RU #389 (by @cosarah)
- Update Ollama logo to official version #400 (by @cosarah)
- Remove deprecated Gemini 3 Pro Preview model #142 (by @Orinameh)
- Update expired Discord invite link
- Create SECURITY.md #281 (by @fai1424)
@f1rep0wr, @maximvalerevich, @Hi-Jiajun, @cosarah, @zky001, @Orinameh, @fai1424
The first tagged release of OpenMAIC, including all improvements since the initial open-source launch.
- Discussion TTS — Voice playback during discussion phase with per-agent voice assignment, supporting all TTS providers including browser-native #211
- Immersive Mode — Full-screen view with speech bubbles, auto-hide controls, and keyboard navigation #195 (by @YizukiAme)
- Discussion buffer-level pause — Freeze text reveal without aborting the AI stream #129 (by @YizukiAme)
- Keyboard shortcuts — Comprehensive roundtable controls: T/V/Esc/Space/M/S/C #256 (by @YizukiAme)
- Whiteboard enhancements — Pan, zoom, auto-fit #31, history and auto-save #40 (by @YizukiAme)
- New providers — ElevenLabs TTS #134 (by @nkmohit), Grok/xAI for LLM, image, and video #113 (by @KanameMadoka520)
- Server-side generation — Media and TTS generation on the server #75 (by @cosarah)
- 1.25x playback speed #131 (by @YizukiAme)
- OpenClaw integration — Generate classrooms from Feishu, Slack, Telegram, and 20+ messaging apps #4 (by @cosarah)
- Vercel one-click deploy #2 (by @cosarah)
- Fix SSRF and credential forwarding via client-supplied baseUrl #30 (by @Wing900)
- Use resolved API key in chat route instead of client-sent key #221
@YizukiAme, @nkmohit, @KanameMadoka520, @Wing900, @Bortlesboat, @JokerQianwei, @humingfeng, @tsinglua, @mehulmpt, @ShaojieLiu, @Rowtion