Tessera

A JavaScript framework for building eLearning courses.

Free and MIT licensed. Needs Node.js 24 or newer. Designed for AI-assisted authoring.

The wiring is standard. The design is yours.

Tessera handles what the LMS cares about: tracking, completion, scoring, navigation, and saved state. There is no required look, layout, or component set.

hazard-hotspot.svelte
<script>
  import { useQuestion } from 'tessera-learn';

  let clicked = $state([]);

  // registers with scoring, tracking, and resume
  const q = useQuestion({
    id: 'trip-hazards',
    response: () => ({ type: 'choice', response: clicked, correct: ['cable', 'box'] }),
    reset: () => (clicked = []),
    restore: (saved) => (clicked = saved),
  });
</script>

<!-- your markup, your styles -->
<button onclick={q.submit} disabled={q.submitted}>Check</button>

Built-in or custom, every component uses the same hooks. A drag-and-drop, hotspot, or branching scenario scores, tracks, and resumes exactly like a multiple-choice question.

Author with AI

Focus on the instructional design while your assistant handles the build. Describe what you want in plain English and it writes the pages, builds the quiz, and drops your assets in place. The preview in your browser updates as it goes.

Every workspace ships the authoring guide your assistant reads first.

Every build gets checked

Every build flags structure and accessibility problems, so they get fixed while you work.

terminal
# build it, render it, audit it
pnpm check product-101

# pass or fail against the ruleset you pick:
# WCAG 2.0 A, 2.0 AA, or 2.1 AA

The audit renders every page in a real browser and checks for accessibility and structural issues.

Keep every course in one workspace

One workspace holds every course, plus any components they share. It's all plain files, so you can version and collaborate on your courses with git and GitHub.

my-courses/
my-courses/
├── package.json        # one set of dependencies for every course
├── shared/             # your design system, shared across courses
├── courses/
│   ├── starter-course/ # each course is a self-contained folder
│   └── …               # add as many as you like
└── AGENTS.md           # points your assistant to the authoring guide

Each course is a self-contained folder that exports on its own. No proprietary format, no seat licence.

Send it to any LMS

Run pnpm export <course> and get a package you can upload today. One course, every standard.

Emit custom xAPI statements from any component when completion and score are not enough.

Start building

Run this in a terminal, then follow the three steps it prints.

pnpm create tessera@latest my-courses
View on GitHub →

Don't have Node.js or pnpm? Start with Getting started.

Copied