Skip to content

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-lms
app/lib/lms.ts
import {
  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.
Admin back-office showing a course curriculum with modules and lessons
Student portal library showing enrolled courses with progress

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

DatabaseStorageEmailAuth

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.

bash
npm create headless-lms