Skip to content
MITSelf-host anywhere

The API-first LMS for building learning systems.

Courses, progress, entitlements and multi-tenancy as a typed TypeScript API. Use the admin and student apps it ships with, or build any frontend you want.

Get started
$npm create headless-lms

MIT licensed · Typed SDK · MCP endpoint

admin · Courses / Design Systems 101
Admin back-office showing a course curriculum with modules and activities
CoursesProgress trackingEntitlementsMulti-tenant orgsTyped SDKOpenAPIMCP over OAuthSigned webhooksPluginsPostgresS3 · MinIOResend · SESHatchet workflowsBetter Auth
Platform

A complete LMS, exposed as a typed API.

The full domain of a learning platform behind one schema-first API. Compose the pieces you need and swap the ones you don't.

Read the architecture
Multi-tenant
One deployment serves many organizations. Every student, course and session is org-scoped.
Media and files
Object storage with presigned upload and download URLs, behind a swappable adapter.
Transactional email
Invitation and auth mail with React Email templates, sent through Resend or SES.
Plugins
Drop a folder into your installation's plugins directory and it's live at startup.
AI agents

Agents are first-class clients.

An MCP endpoint lets agents connect over OAuth and operate the LMS through the same domain layer as the SDK and the dashboards. One API, one set of rules, every client.

Admin back-office
SDK
Student portal
SDK
Your frontend
SDK or HTTP
AI agents
MCP · OAuth
One API for every client
Zod contract · OpenAPI · generated SDK
Domain core @headless-lms/core
Courses · Progress · Entitlements · Orgs
AdaptersResend · SESReact EmailMinIO · S3Hatchet

The admin and student apps are SDK consumers like any other frontend, built entirely on the public API.

How the layers fit
Apps

Ships with an admin and a student portal.

Two Next.js apps built on the public SDK, like any frontend you'd write. Run them as they are, change them, or read them as a reference.

See the project structure
admin
Admin back-office showing a course curriculum
student
Student portal library showing a course in progress

Admin back-office

Courses, students, entitlements, automations and reporting, for every organization you run.

Student portal

Where students sign in, pick up where they left off, and work through their courses.

Rich content editor

A Notion-style activity editor powered by Plate.js, shipped as a plugin you can replace.

Open source

Yours to read, run and change.

MIT licensed, with a framework-free domain core. Scaffold an installation with one command and deploy it anywhere Node and Postgres run.

MIT
Read it, change it, run it anywhere.
TypeScript
One language from domain core to SDK.
Node and Postgres
All you need to start. Add adapters as you go.
Secure by default
Org-scoped tenancy, encrypted credentials, validated I/O.
Questions

Asked often.

Something else? Open an issue on GitHub.

Is Headless LMS really open source?

Yes. It's MIT licensed and developed in public on GitHub. There is no hosted edition and no closed tier with extra features.

What do I need to run it?

Node and Postgres. The npm create headless-lms scaffolder can set up Postgres and MinIO for file storage with docker-compose, or point at ones you already run. Every adapter slot is optional, so you can start with nothing else configured.

Do I have to use the admin and student apps?

No. Both are built on the public SDK like any other frontend. Use them as they are, change them, or build your own against the same API.

Can I swap the email or storage provider?

Yes. Email, templates, storage and workflows are adapters behind ports in the core. Use a shipped adapter such as Resend, SES, MinIO, S3 or Hatchet, or implement the port yourself.

How do AI agents connect?

Through the MCP endpoint, authenticated with OAuth. Agents operate the LMS through the same domain layer as the SDK and the dashboards.

How do I extend it?

Drop a plugin folder into your installation and it's loaded at startup, or subscribe to the system's events with signed webhooks.

Spin up your own LMS in one command.

A standalone installation that owns its config and plugins, and deploys anywhere Node and Postgres run.

Get started
$npm create headless-lms