{"id":49754147,"url":"https://github.com/redmodd/tessera","last_synced_at":"2026-06-28T03:03:18.914Z","repository":{"id":356799117,"uuid":"1227966727","full_name":"redmodd/tessera","owner":"redmodd","description":"A toolkit for AI-assisted authoring of interactive courses. Design what you want: Tessera makes it work in any LMS (SCORM 1.2, SCORM 2004, xapi, or cmi5) or for a static website.","archived":false,"fork":false,"pushed_at":"2026-06-27T14:34:44.000Z","size":1600,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T16:15:54.527Z","etag":null,"topics":["cmi5","course","education","elearning","lms","scorm","scorm-1-2","scorm-2004","xapi"],"latest_commit_sha":null,"homepage":"https://tesseralearn.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/redmodd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-03T12:13:41.000Z","updated_at":"2026-06-27T14:34:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/redmodd/tessera","commit_stats":null,"previous_names":["redmodd/tessera"],"tags_count":39,"template":false,"template_full_name":null,"purl":"pkg:github/redmodd/tessera","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redmodd%2Ftessera","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redmodd%2Ftessera/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redmodd%2Ftessera/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redmodd%2Ftessera/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redmodd","download_url":"https://codeload.github.com/redmodd/tessera/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redmodd%2Ftessera/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34875366,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmi5","course","education","elearning","lms","scorm","scorm-1-2","scorm-2004","xapi"],"created_at":"2026-05-10T17:20:02.355Z","updated_at":"2026-06-28T03:03:18.908Z","avatar_url":"https://github.com/redmodd.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tessera\n\n[![CI](https://img.shields.io/github/actions/workflow/status/redmodd/tessera/ci.yml?branch=main\u0026label=CI)](https://github.com/redmodd/tessera/actions/workflows/ci.yml)\n[![tessera-learn on npm](https://img.shields.io/npm/v/tessera-learn?label=tessera-learn)](https://www.npmjs.com/package/tessera-learn)\n[![create-tessera on npm](https://img.shields.io/npm/v/create-tessera?label=create-tessera)](https://www.npmjs.com/package/create-tessera)\n[![Node.js \u003e=24](https://img.shields.io/node/v/tessera-learn?label=node)](https://nodejs.org)\n[![License: MIT](https://img.shields.io/github/license/redmodd/tessera)](./LICENSE)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md)\n\nTessera is a toolkit for building interactive online courses that play in any learning management system (LMS). **It's designed for AI-assisted authoring.**\n\nOpen your course in an AI coding assistant like [Claude Code](https://claude.com/code), [Codex](https://openai.com/codex), or any tool that reads `AGENTS.md`, and describe what you want in plain English. The assistant uses `AGENTS.md` (shipped at the root of every scaffolded project) to write properly-structured pages, build whatever components you need against the hooks API, wire up quizzes, and configure your LMS export. Built-in components (`Callout`, `Image`, `MultipleChoice`, etc.) are included as reference examples; the assistant uses them where they fit and writes new ones where they don't.\n\n**There's no required look, layout, or component set.** Tessera locks the LMS data contract (tracking, completion, scoring, navigation, persistence) and gets out of the way of the design. Anything that can be built with HTML, CSS, and Svelte, can be built with Tessera.\n\nWhen you're done, one command packages a course as SCORM 1.2, SCORM 2004, cmi5 (an xAPI profile for LMSs), xAPI 1.0.3 (\"Tin Can\"), or a static web bundle. Completion, scores, and bookmarking report back to the LMS automatically. The same source builds for every standard, so you don't maintain five versions.\n\n**One project, many courses.** A Tessera project is a _workspace_: a single package (one `package.json`, one `node_modules`) that holds as many courses as you like under `courses/\u003cname\u003e/`, plus a `shared/` design system any course can import as `$shared`. Each course still exports independently to its own LMS package. New workspaces seed one course to start; `pnpm tessera new \u003cname\u003e` adds more.\n\n_Under the hood:_ Tessera is a runtime built on Svelte and Vite. Pages are `.svelte` files. You can edit them directly in code; the AI assistance is there to do the heavy lifting.\n\n## Prerequisites\n\nTessera requires **Node.js 24 or later**. If you already have it, jump to [Quick start](#quick-start). Otherwise:\n\n- **macOS:** Download the macOS Installer (`.pkg`) from [nodejs.org/en/download](https://nodejs.org/en/download) and run it. The default options are fine.\n- **Windows:** Download the Windows Installer (`.msi`) from [nodejs.org/en/download](https://nodejs.org/en/download) and run it. The default options are fine.\n\nOpen a **new** Terminal (macOS) or PowerShell / Command Prompt (Windows) window after installing and confirm:\n\n```bash\nnode --version    # should print v24.x.x or higher\n```\n\n**Editor (optional):** While Tessera is designed for AI-assisted authoring, you can see and edit course files in any text editor, such as [Visual Studio Code](https://code.visualstudio.com/) which is a good free choice. Install the [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) extension for syntax highlighting on `.svelte` files.\n\n## Quick start\n\n```bash\npnpm create tessera@latest my-courses\ncd my-courses\npnpm install\npnpm dev starter-course      # local dev server at http://localhost:5173\npnpm export starter-course   # build + package the course for the configured standard\npnpm export starter-course --standard scorm2004 # override export.standard for this build\npnpm validate starter-course # check the course for structural errors, no server or build\npnpm tessera new intro # add another course at courses/intro/\npnpm tessera duplicate intro intro-v2 # copy an existing course\n```\n\nThis scaffolds a workspace with one seed course (`starter-course`). The root scripts forward to whichever course you name — `pnpm dev \u003ccourse\u003e` runs it, while a bare `pnpm dev` lists the available courses rather than guessing. You can also `cd courses/intro` and run `pnpm exec tessera dev`. Open the printed URL (e.g. `http://localhost:5173`) in your browser. The page hot-reloads as you edit course files. Stop the server with `Ctrl+C`.\n\nEvery scaffolded workspace ships with `AGENTS.md` at its root. Your agent will read this file for the full authoring guide (creating pages, components, hooks, quizzes, custom layouts, custom xAPI, and sharing a design system across courses via `$shared`). The code below is a basic example of a page. If you don't know what the code means, that's okay, your agent does.\n\n```svelte\n\u003cscript module\u003e\n  export const pageConfig = { title: 'Welcome' };\n\u003c/script\u003e\n\n\u003cscript\u003e\n  import { Callout } from 'tessera-learn';\n\u003c/script\u003e\n\n\u003ch1\u003eWelcome to the course\u003c/h1\u003e\n\u003cCallout type=\"tip\"\u003e\u003cp\u003eDrop in components for richer content.\u003c/p\u003e\u003c/Callout\u003e\n```\n\n## Updating an existing workspace\n\nUpdating is a plain dependency bump — from the workspace root, `pnpm add tessera-learn@latest`. The whole workspace shares the one dependency, so every course moves together, and the framework owns the build and the reserved scripts, so there's nothing else to reconcile. See [`packages/create-tessera/README.md`](./packages/create-tessera/README.md#updating-an-existing-workspace) for details.\n\n## Authoring with AI\n\nOnce your project is running, ask the agent for what you want:\n\n\u003e _\"Add a new section called 'Workplace Safety' with three lessons: an intro page, a video page using `safety-overview.mp4` from assets, and a quiz with five multiple-choice questions about hazard recognition.\"_\n\n`AGENTS.md` (at the root of your workspace) teaches the agent the conventions: how courses, pages, sections, and lessons are organized; how `pageConfig` and `course.config.js` work; which built-in components exist; how to share a design system across courses via `$shared`; and how to author new components against the hooks API (`useQuestion`, `useQuiz`, `useNavigation`, `useProgress`, `usePersistence`). Anything the built-ins do, an agent-authored component can do, with the same scoring, LMS reporting, and persistence.\n\nYou review the output, ask for changes, and iterate. The dev server hot-reloads as the agent writes, so you see each change immediately.\n\n## Troubleshooting\n\n**`command not found: pnpm`**: pnpm isn't installed. Install it via `npm install -g pnpm` or `corepack enable pnpm` (Node 24+ includes corepack). Then close and reopen your terminal.\n\n**`engine \"node\" is incompatible` or similar version errors**: your Node version is older than 24. Run `node --version` to check, then install the current version from [nodejs.org/en/download](https://nodejs.org/en/download).\n\n**`Port 5173 is already in use`**: another dev server is running. Either close it, or let Tessera pick the next port (it'll print the new URL; open that one).\n\n**`pnpm install` fails with network errors**: check your internet connection and retry. If you're behind a corporate proxy or firewall, pnpm needs proxy configuration (search \"pnpm proxy settings\" or ask your IT team).\n\n**Permission errors during `pnpm install`**: don't use `sudo`. See [pnpm's guide to resolving permission errors](https://pnpm.io/cli/install#--no-optional).\n\n**The browser shows a blank page after `pnpm dev \u003ccourse\u003e`**: open your browser's developer console (`F12` → Console tab) for the actual error. Common causes: a typo in a `.svelte` file, an unclosed tag, or a missing asset reference.\n\n## Documentation\n\nThe authoring guide (workspaces, components, hooks, quizzes, layouts, custom xAPI, the full `course.config.js` shape) lives in [`AGENTS.md`](./AGENTS.md), shipped at the root of every scaffolded workspace for both human authors and AI agents.\n\n## Contributing\n\nWant to contribute to Tessera itself (not author a course)? See [CONTRIBUTING.md](./CONTRIBUTING.md) for the repo layout, build commands, test setup, and release process.\n\n## License\n\nMIT © Derek Redmond\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredmodd%2Ftessera","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fredmodd%2Ftessera","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredmodd%2Ftessera/lists"}