Replies: 2 comments
|
Tracking issue: #1755. The remaining 1.2.0 work (M, G, E1–E4, F) lands on |
|
the server-first move is the right call, especially workstream C. centralizing model config means you now have one place where provider keys live, but that also means one place to get wrong. the GHSA-g87c fix you referenced (endpoint injection) is a symptom of keys and endpoints being passed around as plain config rather than being brokered. once you have server-side slots, consider a secrets backend where the key never materializes in env vars or request payloads, only a short-lived reference the server exchanges at call time. full disclosure: i work on 1Claw, which does exactly that for agent and server contexts via an HSM-backed vault, so i'm not a neutral party, but the pattern holds regardless of what tool you use. |
Uh oh!
There was an error while loading. Please reload this page.
Status: Draft · Release: 1.2.0 · Tracking: #1658, #1725 · Next: 1.3.0 material library (#1716)
Summary
What. In 1.2.0 the server becomes the only home for courses and media, identity, model configuration and course generation. The browser is a client. The classic user flow does not change.
Why. In 1.1.x most of this exists twice, in the browser and on the server. That split:
Why a breaking change, and why now. Keeping both halves as options keeps the split. The server side is mostly built and unreleased, so one release lets everyone migrate once, with automatic one-way imports. 1.3.0 builds on it.
Scope
main(#1710)main(#1669)openmaic.yml, settings)integration/provider-config(#1725){ requirement, materialIds }, saved to the owner's libraryintegration/provider-config(#1728, #1730)Where things live
localStorageE. Server-side generation runs
Today the browser drives classic generation step by step and hands state between pages through
sessionStorage; a separate server pipeline serves the API and has drifted from it. Closing the tab stops generation.Design. A run is an owner-scoped PostgreSQL record. A runner in every process executes its steps — the existing classic step logic, moved from the API routes into server functions — and commits a checkpoint after each step. If a process dies, another one takes over from the last checkpoint. The browser starts the run, subscribes to its events, and sends commands. The separate server pipeline is retired; the headless API becomes a view of a run.
requirement,materialIds,interactive,taskEngine,agents(auto, or agent ids: built-in from code, custom from the owner's registry), learner profile,outlineReview(waitfor the UI,autofor the API). No keys or models.preparing → outlining → awaiting_outline_confirmation → generating → completed, pluspausedandstopped{ outlineRevision, commandId }seq; snapshot +GET …/events?after=<seq>over SSE, polling fallback; outline tokens stream liveconfirm-outlineandretry, idempotent bycommandId, owner-checkedPOST /api/materials, extracted on the server; images stored as course assets, not inline base64Parity. Before browser orchestration is removed, these must match 1.1.x side by side, with screenshots: preview steps and labels; outline streaming; outline review (enabled, opened early, auto-continue, edits); agent choice and non-blocking agent cards; entering the classroom after the first scene; in-order scene progress; pause and Retry; media and its Retry; reload or another device rebuilding the same view. New: the course card appears from the start, and generation continues after leaving the page.
Pro mode
Classic runs, the headless API and the Pro agent's generation tools call the same step functions; only the orchestration differs (a fixed pipeline vs. an agent deciding). Runs execute on the agent runtime's infrastructure — leases, the event log,
NOTIFYwake-ups and the owner event stream — rather than a second runner. A course is read-only in the classroom editor and in Pro until its run completes; after that, the Pro agent can take over. Pro ignores the classic outline.G. Agent registry
Built-in agents stay in code (read-only, updated and translated with releases). Custom agents move from browser
localStorageto the owner's records in the database and are imported once, like other browser data. Runs reference agents by id.F. Deployment
A run needs a process that outlives requests, as the Pro runner and background jobs already do. 1.2.0 supports Docker /
docker composeorpnpm startwith PostgreSQL, andvercel.jsonis removed frommain. The README keeps a Vercel section that says serverless deployment is supported up to 1.1.x, with its Deploy button pointing at therelease/1.1.xbranch; data carries over when such a deployment later moves to a long-running host.Breaking changes
DATABASE_URLrequired;NEXT_PUBLIC_PERSISTENCEremoved; compose starts PostgreSQL in single-user mode; Vercel unsupported;MODEL_ROUTESmust be rewritten as slots inopenmaic.yml(fails at boot otherwise); keepOPENMAIC_SECRET_KEYor its secret file with the database; dev-token variables removedgenerate-classroomtakes{ requirement, materialIds };/api/classroomremoved; jobs and materials are owner-scoped (keep one cookie jar in anonymous mode);x-api-key/x-modelstyle headers deprecatedconfigure*calls require a store; no unscoped document store; auth methods and hooks registered once frominstrumentation.tsThe changelog's Unreleased section is the full list.
Upgrade
docker composeopenmaic.ymlor the Models page; rewriteMODEL_ROUTES; open the app once in each browser that has local coursespnpm start+ own PostgreSQLDATABASE_URL, an identity mode, andOPENMAIC_SECRET_KEYfor multiple instances; then as aboveopenmaicskill: upload, submit, poll as the same ownerNot in 1.2.0
Material library (#1716, 1.3.0); PDF naming cleanup (#621); provider P3 (two minors later); removing the temporary importers; stop/pause controls for runs; a Pro tool that starts a classic run; a container-platform one-click template.
Release plan
E and F land on one integration branch based on
integration/provider-config, which merges intomainonce; 1.2.0 is cut frommain.localStoragevercel.json; README Vercel section for 1.1.x; docs and changelogRelease candidate:
1.2.0-rc.1is cut frommainafter the merge and used for the upgrade rehearsal.Release criteria: CI green including the PostgreSQL contract suites; an upgrade rehearsal from 1.1.x on the release candidate (browser data and custom agents, legacy classrooms, env-only config,
MODEL_ROUTES, two instances); the parity checklist; real runs of classic generation, headless generation and a forced-restart takeover; complete changelog (the model configuration entries are still missing) and docs.Open questions
Appendix: prior art
Agent platforms keep execution on the backend and treat clients as entry points (OpenClaw Gateway, OpenHands Agent Server, Letta App Server). Long-artifact generators run on the server (Gamma API, NotebookLM Audio Overviews, open-notebook, DeepTutor). Plan approval inside a server run is a standard primitive (LangGraph
interrupt, used by Open Deep Research to approve a report plan; Inngest, Trigger.dev, Temporal). LobeHub removed its client database in January 2026 (lobehub#11123). The trap to avoid is "background" without durability: in-process tasks that fail on restart.All reactions