← All projects

Educational software

Course Authoring Systems

I’ve worked on two ways to turn source material into editable courses. An OpenStax importer creates drafts inside OLI Torus. A separate service, Course Studio, prepares courses for export to Torus or Canvas. The work covers source preservation, generated activities, author review, and recovery when an operation fails.

  • Elixir / Phoenix
  • Rust
  • TypeScript
  • React
  • PostgreSQL
  • MCP
My part
I developed the importer workflow and the standalone Course Studio implementation. Torus itself is a larger open-source platform to which I contribute.
In development
Both implementations have local verification records. Complete-book acceptance and hosted Course Studio use remain separate checks.

Course Studio workflow

  1. SourceBook / document
  2. Course modelReading + activities
  3. Author reviewApprove a revision
  4. ExportTorus / Canvas
Course Studio: source material passes through the course model and author review before export.

Two implementations

The OpenStax importer works inside Torus. It preserves selected textbook material in editable, unpublished lessons and manages generated questions and simulation additions alongside that material. A book draft can exist even when an addition still needs attention.

Course Studio takes the authoring workflow outside the LMS. It accepts source material, gives a connected assistant bounded authoring tasks, and lets the author review the outline and course before downloading a Torus or Canvas package. It has its own Rust and TypeScript codebase. It does not reuse the importer implementation or create simulations.

Source, review, export

In Course Studio, a Rust API owns projects, source snapshots, revisions, task state, and approvals. PostgreSQL stores the workflow. A thin TypeScript MCP service connects an assistant to the same API used by the review website.

The course model sits between source ingestion and export. OpenStax, Pressbooks, DOCX, Markdown, and HTML enter through source adapters. Torus and Canvas exporters then translate the approved course into the formats each platform supports.

  • Source snapshots retain reading order, attribution, and media references.
  • An assistant works on a claimed task with a specific revision; stale submissions cannot replace newer work.
  • Approvals refer to an exact course revision. Editing the course invalidates the approval for a new export.

Keeping the source intact

Asking a model to reproduce an entire textbook page creates an unnecessary opportunity to change it. Course Studio can instead hydrate a lesson from an immutable source section. Generated material is checked separately from the reading it accompanies.

The importer has a related recovery problem: an unsuccessful addition should not erase an otherwise useful draft. Failed additions retain their diagnostics and can be retried or explicitly removed. Revision checks prevent recovery from overwriting later author edits.

A missing chapter also has to stay visible as a failure. Course Studio rejects incomplete book ingestion rather than calling a shorter snapshot a complete import.

What happens to a branching lesson?

One course model does not make two LMSs interchangeable. A supported Advanced lesson can keep its branching structure in the Torus export. The Canvas export turns those branches into labeled, linear content and practice quizzes.

Media has a similar difference. Canvas can carry bundled images. Torus’s digest importer needs durable media URLs, so a private uploaded image can block that export. Course Studio reports the limitation instead of quietly making the file public.

What has been checked

The importer records include focused backend and frontend tests, draft-recovery checks, and a manually verified single-simulation insertion. That narrower check does not establish a successful full-book workflow.

Course Studio’s local checks cover source ingestion, ownership, task leases, stale revisions, approvals, package downloads, and checksums. A local HTTP MCP smoke test exercised the authoring transport. Package structure and schema checks do not establish that a real course imports and behaves correctly in both LMSs.

Still to check

The importer still needs complete-book acceptance under the intended workflow. Course Studio needs production sign-in checks, connections with the intended assistant clients, and actual Torus and Canvas imports. Full-book performance and backup recovery also need testing before hosted use.