The API-first LMS for building learning systems
A headless, composable learning platform in modern TypeScript. Use it out-of-the-box or swap with your own adapters. Build whatever frontend you want.
$ npm create headless-lmsimport {
Content, Entitlements, Organizations, configureSdk,
} from "@headless-lms/sdk"
configureSdk({ baseUrl: "https://lms.acme.dev" })
// Fully typed against the OpenAPI spec
const course = await Content.createCourse({
title: "Intro to Distributed Systems",
})
const { rows: [student] } =
await Organizations.listStudents({ search: "ada" })
await Entitlements.grantEntitlement({
orgUserId: student.id,
contentId: course.id,
expiresAt: null,
})A complete learning platform, headless by design
The full domain of an LMS, exposed as a typed API. Compose the pieces you need and swap the ones you don't.
Domain
- Course builder
- Author structured course content; students work through it activity by activity.
- Progress tracking
- Per-student, per-activity completion, rolled up into course progress and reporting.
- Entitlements
- Grant and revoke student access to content with a first-class access model.
Platform
- Multi-tenant
- One deployment serves many orgs. Every student, course, and session is org-scoped.
- Media & file assets
- Object storage with presigned upload and download URLs, behind a swappable adapter.
- Transactional email
- Invitation and auth mail, swappable behind an adapter you control.
Interfaces
- Typed SDK & OpenAPI
- Routes validate against shared Zod schemas; the SDK is generated from the spec.
- MCP endpoint
- AI agents are first-class clients, connecting over OAuth.
- Plugins
- Drop a plugin folder into your installation and it's live at startup. Write your own.
Works out of the box
Ships with a Next.js admin back-office and student portal built on the public API, plus an MCP endpoint so AI agents are first-class clients.
- Admin back-office
- A Next.js dashboard for courses, students, entitlements, and reporting — built entirely on the public API.
- Rich course content builder
- Create engaging course content with our default content builder (powered by Plate.js).
- Student portal
- A Next.js app where students log in and take their courses, built on the typed SDK.
- MCP endpoint
- Agents authenticate and operate the LMS through the exact same domain layer as the SDK and dashboards.


Bring your own adapters
The backend ships as two libraries: @headless-lms/core, a framework-free domain, and @headless-lms/server, the Fastify layer that wires core to the adapters you choose.
- Layered by design
- A framework-free domain core allows you to use any tech stack you want.
- Composable installations
- An installation composes what it wants with sane defaults. Swap in your own storage, email, and auth adapters freely.
- Secure by default
- Authentication, org-scoped multi-tenancy, encrypted credential storage, and validated I/O throughout.
Your apps
Admin | Student portal | Your frontend | AI agents
One API for every client
OpenAPI · generated SDK
Domain core
Courses · Progress · Entitlements · Orgs
Swappable adapters
Spin up your own LMS in one command
Create a standalone installation that owns its config and plugins, and deploys anywhere Node and Postgres run.
npm create headless-lms