[{"data":1,"prerenderedAt":1367},["ShallowReactive",2],{"footer-categories":3,"app-search-categories":227,"category-xapi-cmi5":237,"mdc--njfeuo-key":1323},[4,30,55,80,105,130,155,180,205],{"id":5,"title":6,"extension":7,"faq":8,"icon":21,"intro":22,"meta":23,"name":24,"order":25,"slug":26,"stem":27,"tagline":28,"__hash__":29},"categories\u002Fcategories\u002Fauthoring-tools.yml","SCORM authoring tools and course frameworks","yml",[9,12,15,18],{"q":10,"a":11},"Which authoring tools publish cmi5?","Far fewer than claim to. cmi5 needs the full AU lifecycle — launch, session identifier, moveOn rules — not just an xAPI endpoint. The standards matrix on each listing shows what we could verify and where the claim came from; the cmi5 hub page lists the tools together.\n",{"q":13,"a":14},"Do I need a paid authoring tool at all?","Not necessarily. If your courses are text, images and simple assessment, an open-source framework or a markdown-to-SCORM converter produces a perfectly conformant package. Paid suites earn their money on complex interactions, branching simulation, review workflows and support.\n",{"q":16,"a":17},"What is the difference between SCORM 1.2 and 2004 output?","1.2 is simpler, universally supported, and limited: one completion status, a coarse data model. 2004 adds sequencing and navigation, a separate success\u002Fcompletion distinction, and richer objectives — at the cost of LMSs implementing it inconsistently. Publish 1.2 unless something specific requires 2004.\n",{"q":19,"a":20},"Can I move a course between authoring tools?","Rarely without rework. Published packages are portable; source projects generally are not. That lock-in is the strongest argument for the code-first frameworks in this category, where the source is plain text you own.\n","i-lucide-pen-tool","The authoring tool decides what standard your course speaks, long before anyone uploads it. That makes\n\"which standards does it publish?\" the first question worth asking, and the one vendor comparison pages\nanswer least clearly — plenty of tools advertise xAPI support that turns out to mean a statement endpoint\nrather than a conformant launch.\n\nThree quite different things live in this category. **GUI authoring tools** are the familiar commercial\nsuites: you assemble slides, interactions and quizzes, then publish a package. **Code-first frameworks**\nhand you a build pipeline instead, which is the right shape when courses are versioned in git and reviewed\nlike software. **Markdown and document converters** sit between the two, turning writing into a package\nwith the least ceremony.\n\nTwo practical notes. Publishing SCORM 1.2 remains the safest default for reaching old LMSs, and most tools\nstill offer it alongside 2004 — check which edition. And accessibility varies enormously between tools that\nclaim WCAG conformance; if that matters to your client, test the published output rather than trusting the\nbrochure.\n",{},"Authoring tools & course frameworks","1","authoring-tools","categories\u002Fauthoring-tools","Where the course gets made — and where its SCORM output is decided.","CkWCyRM7Yrc2GVdbc65rAQjKCeNcgRzCqKcYYXPQVQk",{"id":31,"title":32,"extension":7,"faq":33,"icon":46,"intro":47,"meta":48,"name":49,"order":50,"slug":51,"stem":52,"tagline":53,"__hash__":54},"categories\u002Fcategories\u002Fconverters-migration.yml","SCORM converters and migration tools",[34,37,40,43],{"q":35,"a":36},"How do I convert PowerPoint to SCORM?","Either with a self-serve converter that wraps the exported slides in a player and manifest, or by rebuilding the deck in an authoring tool. The first is minutes and cheap; the second gives you real interactions, narration and accessibility. Both appear in this directory.\n",{"q":38,"a":39},"Does converting a deck preserve animations and narration?","It depends entirely on the export path. Tools that go through PDF or images lose both. Tools that drive PowerPoint itself can keep timings and audio. Check the listing, and test with your most complicated slide rather than your simplest.\n",{"q":41,"a":42},"Can I convert an existing SCORM package to xAPI?","Partly. Wrappers exist that intercept SCORM API calls and re-emit them as xAPI statements, which preserves completion and score. What they cannot do is give you the richer verbs that make xAPI worth having — that needs authoring for xAPI in the first place.\n",{"q":44,"a":45},"Is SCORM 1.2 to 2004 conversion safe?","Structurally, usually. Behaviourally, test it. 2004's stricter data model rejects values 1.2 tolerated, and sequencing defaults can change how a multi-SCO course navigates.\n","i-lucide-repeat","Most SCORM work does not start from a blank canvas. It starts with a PowerPoint deck that has been through\nfour rounds of review, a folder of MP4s, an H5P activity, or a course built for a platform the client has\nsince left. The tools here move that content across the gap.\n\nThey divide by what goes in. **Document and deck converters** wrap slides into a package, usually adding a\nplayer shell, navigation and a completion rule. **Video and media wrappers** do the same for a single asset,\nwhere the only real question is what counts as \"complete\". **Format bridges** move between the standards\nthemselves — SCORM to xAPI, SCORM 1.2 to 2004, H5P to SCORM — and are the fiddliest, because the two ends\ndisagree about what a result means.\n\nThe honest caveat for the whole category: a converter can guarantee a conformant package, but it cannot\ninvent instructional design. A converted deck is a deck in an LMS. That is often exactly what a compliance\nmodule needs, and rarely what a flagship course needs — worth being clear about before the budget is set.\n",{},"Converters & migration","2","converters-migration","categories\u002Fconverters-migration","Turning what you already have — decks, video, H5P, old packages — into something an LMS accepts.","l5wpzElL1rBxqlsmtpMVsuvZRxfSFas4hwwMc2CXT5o",{"id":56,"title":57,"extension":7,"faq":58,"icon":71,"intro":72,"meta":73,"name":74,"order":75,"slug":76,"stem":77,"tagline":78,"__hash__":79},"categories\u002Fcategories\u002Fplayers-runtimes-debuggers.yml","SCORM players, runtimes and debuggers",[59,62,65,68],{"q":60,"a":61},"What is the difference between a SCORM player and a SCORM runtime?","A runtime is a library that implements the SCORM API surface a course calls; a player is a whole application that loads a package, hosts it in an iframe and provides that runtime. Every player contains a runtime, but you can embed a runtime without a player.\n",{"q":63,"a":64},"Do I need a full LMS just to check a package works?","No. An in-browser debugger will unzip the package locally, serve it, and show you every API call it makes. That catches the majority of packaging faults — missing manifest entries, wrong SCORM version, completion never being set — in a minute rather than a deployment cycle.\n",{"q":66,"a":67},"Why does my course work in one player but not in an LMS?","Usually one of three things: the LMS enforces the data-model constraints the player relaxes (string lengths, vocabularies, read-only elements), the LMS restricts cross-origin access to the API object, or the course relies on a sequencing behaviour the LMS implements differently. Tools with LMS quirk profiles exist specifically to reproduce these differences.\n",{"q":69,"a":70},"Which JavaScript runtime should I embed in a new project?","Look for one that supports both SCORM 1.2 and 2004, is still receiving commits, and has an explicit persistence interface so you can decide where learner state goes. The listings here show the standards matrix and the last commit date for exactly that comparison.\n","i-lucide-play-circle","A SCORM package is inert until something gives it an API to talk to. That something is a runtime: the\nJavaScript object a course looks for on `window.API` (SCORM 1.2) or `window.API_1484_11` (SCORM 2004),\nwhich answers `LMSInitialize`, `GetValue`, `SetValue` and `Commit` and persists the data model somewhere.\n\nThe tools here fall into three groups that are easy to confuse. **Runtimes and API wrappers** are libraries\nyou embed — either in a course, to talk to whatever LMS it lands in, or in your own application, to play the\nrole of the LMS. **Players** are complete applications that unzip a package, serve it, and drive it end to\nend. **Debuggers** are players with the lid off: they show the API call transcript, the current CMI data\nmodel, suspend data, sequencing decisions and the moment something returns error 101.\n\nIf you are testing whether a package works before it reaches a client's LMS, start with a debugger. If you\nare building a product that must host SCORM content, start with a runtime and read its persistence adapter\ncarefully — that is where most integrations go wrong.\n",{},"Players, runtimes & debuggers","3","players-runtimes-debuggers","categories\u002Fplayers-runtimes-debuggers","Run a SCORM package outside an LMS — and watch what it actually does.","hcDF7H9nETO_B5A3g2eWnh5kzICgufiyMse4cjh7gHk",{"id":81,"title":82,"extension":7,"faq":83,"icon":96,"intro":97,"meta":98,"name":99,"order":100,"slug":101,"stem":102,"tagline":103,"__hash__":104},"categories\u002Fcategories\u002Ftesting-validation-conformance.yml","SCORM testing, validation and conformance tools",[84,87,90,93],{"q":85,"a":86},"How do I test a SCORM package without an LMS?","Use an in-browser debugger or a local test harness: both provide the SCORM API, record every call, and show you the resulting data model. For automated checks, a harness that can be scripted lets you assert on completion and score in CI.\n",{"q":88,"a":89},"Is there an official SCORM conformance test?","Yes — ADL publishes conformance test suites for SCORM 1.2 and SCORM 2004, and a separate suite for xAPI. They are the reference for whether an implementation is conformant. They are exacting and slow, which is why lighter validators exist for day-to-day work.\n",{"q":91,"a":92},"What should be in a SCORM QA checklist?","At minimum: the package imports cleanly, the correct SCORM version is declared, initialise and terminate are called, completion and success statuses are set as intended, score is reported in the right range, suspend data survives a resume, and the package behaves when the LMS returns an error. Testing against more than one LMS catches the rest.\n",{"q":94,"a":95},"Why does the same package pass one validator and fail another?","Validators differ in strictness and in which optional parts of the specification they enforce. A package can be schema-valid and still break in an LMS that applies stricter data-model rules — which is why manifest validation and runtime testing are two different jobs.\n","i-lucide-check-check","Most SCORM failures are found late, by the wrong person, in production. The course was signed off, uploaded\nto the client's LMS, and then learners' completions did not record — and now the problem is a support ticket\nrather than a build step.\n\nThe tools in this category move that discovery earlier. **Manifest validators** check `imsmanifest.xml`\nagainst the schema and the common packaging mistakes (missing resources, wrong `scormType`, broken hrefs,\nidentifiers that collide). **Test harnesses** drive a package programmatically and assert on what it sent —\nuseful in CI, where a regression in a course template can otherwise ship silently. **Conformance test\nsuites**, notably ADL's, are the formal article: they exercise the full data model and sequencing behaviour\na conformant implementation must support. **Test packages** are the inverse — known-good and known-bad\ncontent you fire at an LMS to find out what *it* actually implements.\n\nA note on the word \"certified\": conformance certification is granted by the bodies that own the\nspecifications, not by tools and not by us. Where a product appears in an official registry we link to it\nand mark the fact `registry-verified`; everything else is a vendor's own claim or our own check.\n",{},"Testing, validation & conformance","4","testing-validation-conformance","categories\u002Ftesting-validation-conformance","Prove a package is correct before a client's LMS proves it isn't.","NiGuliqtBVM9lTcU49a0WOVt0jMaZ2d1QAI3sJyZhdY",{"id":106,"title":107,"extension":7,"faq":108,"icon":121,"intro":122,"meta":123,"name":124,"order":125,"slug":126,"stem":127,"tagline":128,"__hash__":129},"categories\u002Fcategories\u002Fpackagers-sdks-libraries.yml","SCORM packagers, SDKs and libraries for developers",[109,112,115,118],{"q":110,"a":111},"Which JavaScript SCORM library should I use?","Look for one supporting SCORM 1.2 and 2004, still receiving commits, with an explicit persistence interface. The listings show licence, stars and last commit so you can judge maintenance rather than guess. Several long-abandoned wrappers still rank well in search — the badges here say plainly which.\n",{"q":113,"a":114},"Do I need a library, or can I call the SCORM API directly?","You can call it directly; it is not a large API. What libraries buy you is the tedious part — finding the API object across nested frames, handling initialisation order, normalising the differences between 1.2 and 2004, and coping with LMSs that return errors in creative ways.\n",{"q":116,"a":117},"What is the difference between a packager and an authoring tool?","A packager takes content you have already built and wraps it conformantly. An authoring tool creates the content. If you have a web app and need it to run in an LMS, you want a packager.\n",{"q":119,"a":120},"Are these production-ready?","Some are used in thousands of courses; some are a weekend project with three stars. The maintenance badge and the metrics panel on each listing exist precisely so you can tell which is which.\n","i-lucide-package","This is the developer end of the directory, and the part no other directory covers — general software\nindexes exclude libraries and CLIs, and e-learning listings only track products with a pricing page.\n\n**Packagers and CLIs** take a built web app and emit a conformant zip: manifest, resource declarations,\nthe right SCORM version, sensible identifiers. Several are bundler plugins, so a course built with Vite or\nwebpack produces a package as a build artefact rather than a manual step. **API wrappers** live on the\ncontent side and give your application a sane interface over the raw SCORM API — initialise, get, set,\ncommit, terminate — while handling the LMS quirks that make raw integration miserable. **Manifest tooling**\nparses and validates `imsmanifest.xml`, which is where a surprising share of import failures originate.\n**Framework integrations** wrap all of that for React, Vue, Angular, Svelte, Unity and Godot.\n\nWhat to look at before adopting one: does it support both SCORM 1.2 and 2004, does it expose a persistence\nboundary you can control, and is it still maintained? Every listing here carries the licence, the last\ncommit date and an honest maintenance badge, because a wrapper abandoned in 2019 can still be the right\nanswer — but you should know that going in.\n",{},"Packagers, SDKs & libraries","5","packagers-sdks-libraries","categories\u002Fpackagers-sdks-libraries","The pieces you build with when the course is an application, not a slide deck.","3KvCkFwRNYzh9-fZmEfQdmLiSCT3pp7bsS3eQcBnG6c",{"id":131,"title":132,"extension":7,"faq":133,"icon":146,"intro":147,"meta":148,"name":149,"order":150,"slug":151,"stem":152,"tagline":153,"__hash__":154},"categories\u002Fcategories\u002Flms-and-plugins.yml","Learning management systems with SCORM support",[134,137,140,143],{"q":135,"a":136},"Which LMSs support cmi5?","Genuine cmi5 support is still uncommon, and considerably rarer than the marketing suggests. The cmi5 standards page groups every listing we could verify, and flags which claims are vendor-stated rather than checked.\n",{"q":138,"a":139},"Why does my package work in one LMS and not another?","Usually strictness. A permissive LMS accepts data-model values the specification forbids; a stricter one rejects them, and the course silently stops recording. Sequencing and cross-origin access to the API object are the other two common causes.\n",{"q":141,"a":142},"Is an open-source LMS good enough for SCORM?","Often better than the alternatives, because the implementation is inspectable and its bugs are public. Moodle's SCORM module in particular has been exercised by more courses than most commercial engines.\n",{"q":144,"a":145},"Do I need an LMS at all to deliver SCORM?","No. Distribution and licensing platforms in this directory host the content and report back without a full LMS, which suits publishers selling courses into clients' own systems.\n","i-lucide-graduation-cap","Every SCORM package eventually meets an LMS, and the LMS decides whether the standard is honoured or\nmerely claimed. That gap is why this category exists in a tools directory: not to rank platforms on\nfeatures, but to record what each one actually does with a package.\n\nIncluded here are **open-source platforms** whose SCORM implementation you can read, **commercial platforms**\nwhose support you have to take on trust or test, and **plugins** that add or replace SCORM handling in a\nplatform that ships with something weaker. The plugins matter more than they look: a good deal of real-world\nSCORM behaviour on any given installation comes from a module rather than core.\n\nThe facts worth comparing are narrow and specific. Which SCORM version, and which 2004 edition. Whether\nsequencing is implemented or quietly ignored. How suspend data is stored and how much of it survives.\nWhether xAPI and cmi5 are genuinely supported or approximated. Each listing carries these with provenance,\nbecause vendor marketing and vendor documentation frequently disagree with each other.\n",{},"LMS & LMS plugins","6","lms-and-plugins","categories\u002Flms-and-plugins","Where the package finally has to run — and how well each platform actually implements the spec.","xW4Pab08lObiEGf6iWf0S-QGh8jj2jJWV3vWoKcRrFU",{"id":156,"title":157,"extension":7,"faq":158,"icon":171,"intro":172,"meta":173,"name":174,"order":175,"slug":176,"stem":177,"tagline":178,"__hash__":179},"categories\u002Fcategories\u002Fxapi-cmi5.yml","xAPI learning record stores and cmi5 tooling",[159,162,165,168],{"q":160,"a":161},"What is the difference between xAPI and cmi5?","xAPI is a statement format and a store API — deliberately unopinionated. cmi5 is a profile of xAPI that specifies how a course is launched, how a session is identified, and how completion is determined. If you need SCORM-like accountability with xAPI's reach, you need cmi5, not xAPI alone.\n",{"q":163,"a":164},"Do I need an LRS?","Only if you are using xAPI or cmi5. SCORM reports to the LMS and needs nothing extra. Once statements leave the LMS, something has to store them, and that something is an LRS.\n",{"q":166,"a":167},"Is xAPI replacing SCORM?","Not in practice, and not soon. SCORM remains what procurement asks for and what every LMS imports. xAPI is additive — it captures what SCORM cannot — and most real deployments run both.\n",{"q":169,"a":170},"How do I know an LRS is conformant?","ADL publishes a conformance test suite and maintains a list of adopters. We link that registry rather than certifying anything ourselves; listings backed by it carry the Verified chip.\n","i-lucide-share-2","SCORM records what happened inside a course, in a course's own terms, to the LMS that launched it. xAPI\nbreaks all three assumptions: any activity, anywhere, reported to any record store. cmi5 then puts the\ndiscipline back — it is an xAPI profile that restores the parts of SCORM an administrator actually needs,\na defined launch, a session, and rules for what counts as completion.\n\nThis category holds the infrastructure. **Learning record stores** receive, validate and serve statements;\nthey are ordinary databases with a specific API and specific conformance expectations, and several good\nopen-source ones exist. **Client libraries** send statements from courses and applications. **cmi5 tooling**\ncovers players, assignable-unit runtimes and the conformance test suite that decides whether an\nimplementation is real.\n\nA caution worth stating plainly, because it is the fact this directory most often has to correct: an xAPI\nendpoint is not cmi5 support. Receiving statements is the easy half. Honouring the AU lifecycle, the\nsession identifier and the moveOn rules is what makes a completion mean something — and it is what we\ncheck before recording cmi5 as supported.\n",{},"xAPI & cmi5","7","xapi-cmi5","categories\u002Fxapi-cmi5","The standards after SCORM — and the tools that actually implement them.","Z08AoeVOVPwRcuEk4GxjtdqYuXVacfkkSSQMb14CEP4",{"id":181,"title":182,"extension":7,"faq":183,"icon":196,"intro":197,"meta":198,"name":199,"order":200,"slug":201,"stem":202,"tagline":203,"__hash__":204},"categories\u002Fcategories\u002Fdistribution-licensing.yml","SCORM distribution, licensing and hosting platforms",[184,187,190,193],{"q":185,"a":186},"What is SCORM dispatch?","A small SCORM package that acts as a pointer rather than the content. The LMS imports and launches it normally; the package fetches the real course from a hosting platform and relays tracking back. The client's LMS sees an ordinary course; you keep the file.\n",{"q":188,"a":189},"Why not just send the client a zip?","You can, and for a one-off it is fine. What you lose is control of updates, any visibility of usage, and any ability to time-limit access — which is precisely what a licensing arrangement needs.\n",{"q":191,"a":192},"Does dispatch work in every LMS?","Not quite. Some LMSs sandbox course content in ways that break the proxy's connection back to its origin, and some corporate networks block the content domain. Any serious platform in this category publishes a tested-LMS list; ask for it before committing.\n",{"q":194,"a":195},"What happens when a licence expires?","Platform-dependent, and worth testing. The good implementations fail politely with a message; weaker ones leave a blank frame and an LMS recording an incomplete attempt.\n","i-lucide-send","If you sell courses, you have the publisher's problem: the client wants the content inside their own LMS,\nand the moment you hand over a zip you have handed over the asset. Every update becomes a redistribution\nexercise, and you cannot tell how many people took the course or when the licence should end.\n\nThe tools here solve it the same way. The client installs a small proxy package — a few kilobytes, a\nmanifest and a launcher — which streams the real content from the platform at run time and reports tracking\nback. The course never leaves your control, updates take effect without anyone re-importing anything, and\nlicences can carry seat counts, expiry dates and domain locks.\n\nThe vocabulary varies: dispatch, distribution, licensing, content delivery. What differentiates them in\npractice is narrower than the marketing suggests — whether the proxy works in restrictive LMSs that block\ncross-origin access, what happens when the licence expires mid-session, how tracking is reconciled if the\nconnection drops, and whether you can white-label the whole thing for your own clients.\n",{},"Distribution, licensing & hosting","8","distribution-licensing","categories\u002Fdistribution-licensing","Getting a course into someone else's LMS without giving away the course.","nkIpVD2NvqBC7m2F3MZ57C3AjDoCZ0eJjUNGd2oE9ZI",{"id":206,"title":207,"extension":7,"faq":208,"icon":218,"intro":219,"meta":220,"name":221,"order":222,"slug":223,"stem":224,"tagline":225,"__hash__":226},"categories\u002Fcategories\u002Fanalytics-tracking.yml","SCORM and xAPI analytics and tracking tools",[209,212,215],{"q":210,"a":211},"Can I get analytics from SCORM without moving to xAPI?","Yes, within limits. SCORM reports completion, score, time and a small data model — enough for drop-off and pass rates, not enough for fine-grained interaction analysis. Launch-tracking tools add a layer of their own without requiring you to re-author anything.\n",{"q":213,"a":214},"Do I need a separate analytics tool if I have an LRS?","Often, yes. Most record stores are built to store and serve statements correctly rather than to visualise them well. Some ship a reporting layer; the rest expect you to bring one.\n",{"q":216,"a":217},"What should I measure?","Start with completion rate, time to complete, and per-question failure. They are cheap, comparable across courses, and answer the question that actually gets asked — is this course working?\n","i-lucide-bar-chart-3","An LMS will tell you who completed a course. It is usually much less helpful about anything else: where\npeople dropped out, which question everybody fails, whether the course is worth its production cost, or\nwhat happened across the six systems your organisation actually uses.\n\nThe tools here fill that gap from two directions. **Statement analytics** sit on top of an xAPI record store\nand turn a stream of statements into dashboards, cohorts and reports — the natural pairing if you have\nalready adopted xAPI. **Launch and delivery tracking** works at the package level instead, recording when\nand where a course was opened and how far it got, which is the pragmatic option when the content is SCORM\nand always will be.\n\nOne thing to settle early, because it is a data-protection question and not just a technical one: how much\nof this is personally identifiable, how long it is kept, and who can see it. Learner-level analytics are\ngenuinely useful and genuinely sensitive, and the answer should be written down before the dashboard is\nbuilt rather than after someone asks.\n",{},"Analytics & tracking","9","analytics-tracking","categories\u002Fanalytics-tracking","Turning completion records into something worth reading.","eGUFwQLbgbMeYmVcG_VLX1KbidUQxzBPyNR2G2IyenU",[228,229,230,231,232,233,234,235,236],{"slug":26,"name":24},{"slug":51,"name":49},{"slug":76,"name":74},{"slug":101,"name":99},{"slug":126,"name":124},{"slug":151,"name":149},{"slug":176,"name":174},{"slug":201,"name":199},{"slug":223,"name":221},{"category":238,"categories":245,"tools":308},{"id":156,"title":157,"extension":7,"faq":239,"icon":171,"intro":172,"meta":244,"name":174,"order":175,"slug":176,"stem":177,"tagline":178,"__hash__":179},[240,241,242,243],{"q":160,"a":161},{"q":163,"a":164},{"q":166,"a":167},{"q":169,"a":170},{},[246,253,260,267,274,281,288,295,302],{"id":5,"title":6,"extension":7,"faq":247,"icon":21,"intro":22,"meta":252,"name":24,"order":25,"slug":26,"stem":27,"tagline":28,"__hash__":29},[248,249,250,251],{"q":10,"a":11},{"q":13,"a":14},{"q":16,"a":17},{"q":19,"a":20},{},{"id":31,"title":32,"extension":7,"faq":254,"icon":46,"intro":47,"meta":259,"name":49,"order":50,"slug":51,"stem":52,"tagline":53,"__hash__":54},[255,256,257,258],{"q":35,"a":36},{"q":38,"a":39},{"q":41,"a":42},{"q":44,"a":45},{},{"id":56,"title":57,"extension":7,"faq":261,"icon":71,"intro":72,"meta":266,"name":74,"order":75,"slug":76,"stem":77,"tagline":78,"__hash__":79},[262,263,264,265],{"q":60,"a":61},{"q":63,"a":64},{"q":66,"a":67},{"q":69,"a":70},{},{"id":81,"title":82,"extension":7,"faq":268,"icon":96,"intro":97,"meta":273,"name":99,"order":100,"slug":101,"stem":102,"tagline":103,"__hash__":104},[269,270,271,272],{"q":85,"a":86},{"q":88,"a":89},{"q":91,"a":92},{"q":94,"a":95},{},{"id":106,"title":107,"extension":7,"faq":275,"icon":121,"intro":122,"meta":280,"name":124,"order":125,"slug":126,"stem":127,"tagline":128,"__hash__":129},[276,277,278,279],{"q":110,"a":111},{"q":113,"a":114},{"q":116,"a":117},{"q":119,"a":120},{},{"id":131,"title":132,"extension":7,"faq":282,"icon":146,"intro":147,"meta":287,"name":149,"order":150,"slug":151,"stem":152,"tagline":153,"__hash__":154},[283,284,285,286],{"q":135,"a":136},{"q":138,"a":139},{"q":141,"a":142},{"q":144,"a":145},{},{"id":156,"title":157,"extension":7,"faq":289,"icon":171,"intro":172,"meta":294,"name":174,"order":175,"slug":176,"stem":177,"tagline":178,"__hash__":179},[290,291,292,293],{"q":160,"a":161},{"q":163,"a":164},{"q":166,"a":167},{"q":169,"a":170},{},{"id":181,"title":182,"extension":7,"faq":296,"icon":196,"intro":197,"meta":301,"name":199,"order":200,"slug":201,"stem":202,"tagline":203,"__hash__":204},[297,298,299,300],{"q":185,"a":186},{"q":188,"a":189},{"q":191,"a":192},{"q":194,"a":195},{},{"id":206,"title":207,"extension":7,"faq":303,"icon":218,"intro":219,"meta":307,"name":221,"order":222,"slug":223,"stem":224,"tagline":225,"__hash__":226},[304,305,306],{"q":210,"a":211},{"q":213,"a":214},{"q":216,"a":217},{},[309,402,459,522,580,638,692,745,798,851,905,952,1012,1069,1119,1164,1216,1273],{"id":310,"title":311,"addedAt":312,"alternatives":313,"body":314,"categories":355,"checkedAt":312,"claimed":356,"description":357,"docs":358,"editorsPick":359,"extension":360,"faq":361,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":356,"license":369,"listing":370,"logo":356,"meta":371,"name":324,"navigation":372,"openSource":372,"path":373,"platforms":374,"pricing":376,"registries":378,"repo":379,"seo":380,"standards":381,"status":392,"stem":393,"tagline":394,"tags":395,"vendor":399,"website":400,"__hash__":401},"tools\u002Ftools\u002Fxapi-cmi5-library.md","Xapi Cmi5 Library","2026-08-24",[],{"type":315,"value":316,"toc":351},"minimark",[317,342,345,348],[318,319,320,321,325,326,329,330,333,334,337,338,341],"p",{},"cmi5's difficulty is not the statements, it is the launch. An assignable unit is handed a set of URL parameters, has to exchange a fetch URL for an auth token, and must then send a specific sequence of statements with specific context activities and extensions or the LMS will not record the session correctly. ",[322,323,324],"code",{},"@xapi\u002Fcmi5"," does that for you: construct the class, call ",[322,327,328],{},"initialize()",", and issue ",[322,331,332],{},"pass()",", ",[322,335,336],{},"complete()"," or ",[322,339,340],{},"waive()"," at the right moments.",[318,343,344],{},"It is aimed at developers building custom or bespoke content — a JavaScript simulation, a React app, a game — that needs to run as a cmi5 AU. Strongly typed throughout, with interfaces for launch parameters, move-on conditions and performance criteria, so the compiler catches the shape errors that would otherwise appear as an LMS silently not registering completion. Four runtime dependencies, and a companion demo repository.",[318,346,347],{},"It will not help you author a package, validate cmi5.xml, or test without an LMS, and it does nothing for SCORM. If your content also has to run on a SCORM-only platform you will be maintaining two integration paths regardless.",[318,349,350],{},"Maintenance is the caveat worth sizing correctly. Twenty-three stars, five open issues, last release October 2024, last substantive commit before that. For a specification that has been stable since 2016 this is closer to \"finished\" than \"abandoned\", and the code is small enough to read in an afternoon and fork if needed. But if you need a fix, plan on making it yourself.",{"title":352,"searchDepth":353,"depth":353,"links":354},"",2,[],[176],null,"cmi5's difficulty is not the statements, it is the launch. An assignable unit is handed a set of URL parameters, has to exchange a fetch URL for an auth token, and must then send a specific sequence of statements with specific context activities and extensions or the LMS will not record the session correctly. @xapi\u002Fcmi5 does that for you: construct the class, call initialize(), and issue pass(), complete() or waive() at the right moments.","https:\u002F\u002Fwww.xapijs.dev\u002Fcmi5-profile-library\u002Fgetting-started",false,"md",[362,365],{"q":363,"a":364},"Does it build the cmi5 package for me?","No. This is the runtime half only — the code your assignable unit runs. You still have to author cmi5.xml and assemble the package, and you still need an LMS that can launch a cmi5 AU to test against.\n",{"q":366,"a":367},"How current is it?","The last published release is 1.4.0, October 2024, and the last commit on develop is August 2025 and was a badge removal. cmi5 Quartz has not moved either, so this is not obviously a problem — but it is not a project in active development.\n","library","MIT","full",{},true,"\u002Ftools\u002Fxapi-cmi5-library",[368,375],"web",{"model":377},"open-source",[],"https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fcmi5",{"description":357},{"cmi5":382,"xapi":386,"scorm12":389,"scorm2004":390},{"supported":372,"provenance":383,"checkedAt":312,"source":384,"note":385},"editor-checked","https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fcmi5\u002Fblob\u002Fdevelop\u002Fsrc\u002FAbstractCmi5.ts","Implements the AU side of the cmi5 handshake: it reads the launch parameters from the URL, POSTs the fetch URL for an auth token, and emits the defined statements — Initialized, Terminated, Passed, Failed, Completed, Waived — with the required context activities and extensions. The readme states compliance with the cmi5 Quartz 1st Edition specification; the statement and verb constants match it.\n",{"supported":372,"provenance":383,"checkedAt":312,"source":387,"note":388},"https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fcmi5\u002Fblob\u002Fdevelop\u002Fpackage.json","Statements are sent through @xapi\u002Fxapi, the same project's xAPI client. Statement shaping is cmi5-specific; arbitrary xAPI is possible via the allowed extension points.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"editions":391,"provenance":383,"checkedAt":312},[],"maintained","tools\u002Fxapi-cmi5-library","A typed JavaScript client that handles the cmi5 handshake for you inside a course",[396,397,398,368],"cmi5","typescript","javascript","xAPI.js","https:\u002F\u002Fwww.xapijs.dev\u002Fcmi5-profile-library","Gqa6_e4HQsAStNXkcm5AtdgBSsH0eBwRgv1qhgtbBJE",{"id":403,"title":404,"addedAt":312,"alternatives":405,"body":407,"categories":420,"checkedAt":312,"claimed":356,"description":411,"docs":421,"editorsPick":359,"extension":360,"faq":422,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":430,"license":431,"listing":370,"logo":356,"meta":432,"name":433,"navigation":372,"openSource":372,"path":434,"platforms":435,"pricing":437,"registries":438,"repo":439,"seo":440,"standards":441,"status":392,"stem":450,"tagline":451,"tags":452,"vendor":457,"website":439,"__hash__":458},"tools\u002Ftools\u002Fadl-lrs.md","Adl Lrs",[406],"sql-lrs",{"type":315,"value":408,"toc":418},[409,412,415],[318,410,411],{},"ADL wrote the Experience API, and this is their reference implementation of a learning record store: a Django application that accepts, validates and serves xAPI statements, with OAuth support and a Docker Compose installation path. It has been going since 2012 and was updated to xAPI 2.0 — that is, IEEE 9274.1.1 — which makes it one of the few implementations tracking the standard's move under IEEE stewardship.",[318,413,414],{},"Its value is as a reference rather than as infrastructure, and the project says so itself: stable, but intended to support a small number of users as a proof of concept. That is an unusually candid README, and it should be believed. If you are debugging whether your content's statements are well-formed, or arguing about how a particular part of the spec should behave, having ADL's own implementation to test against settles things quickly. If you need an LRS that will hold years of statements for thousands of learners, look at SQL LRS or a commercial product instead.",[318,416,417],{},"Maintenance reads as institutional rather than energetic. The last tagged release is v2.0.0 from June 2023, with commits continuing into November 2025 — attended to, not actively developed. For a reference implementation that is a reasonable state to be in; for a dependency it is a reason to look elsewhere.",{"title":352,"searchDepth":353,"depth":353,"links":419},[],[176],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FADL_LRS\u002Fwiki",[423,426],{"q":424,"a":425},"Should this be used in production?","The project's own README says the version is stable but intended to support only a small number of users as a proof of concept. Take that at face value. It is a reference and a test target, not a platform to run a training programme on.\n",{"q":427,"a":428},"Why does it still matter if it is not for production?","Because it comes from the body that wrote the specification. When two systems disagree about what the spec requires, an implementation by the spec's own authors is a useful thing to compare against.\n","self-hosted","US","Apache-2.0",{},"ADL LRS","\u002Ftools\u002Fadl-lrs",[436,375],"linux",{"model":377},[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FADL_LRS",{"description":411},{"xapi":442,"cmi5":445,"scorm12":447,"scorm2004":448},{"supported":372,"provenance":383,"checkedAt":312,"source":443,"note":444},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FADL_LRS\u002Fblob\u002Fmaster\u002Fadl_lrs\u002Fsettings.py","settings.py declares XAPI_VERSION 2.0.0 and accepts 1.0.0 through 1.0.3 as well, negotiated by the X-Experience-API-Version header. xAPI 2.0 is IEEE 9274.1.1.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":446},"Statement storage only. There is no cmi5 launch handling in the codebase.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"editions":449,"provenance":383,"checkedAt":312},[],"tools\u002Fadl-lrs","ADL's own open-source learning record store, now tracking xAPI 2.0",[453,454,455,456],"lrs","xapi","reference-implementation","python","Advanced Distributed Learning Initiative","UturZcjdfehbQq-jU-0QbKryL_FYzg7fW-b0CbgyeXI",{"id":460,"title":461,"addedAt":312,"alternatives":462,"body":463,"categories":495,"checkedAt":312,"claimed":356,"description":496,"docs":497,"editorsPick":359,"extension":360,"faq":498,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":356,"license":431,"listing":370,"logo":356,"meta":502,"name":503,"navigation":372,"openSource":372,"path":504,"platforms":505,"pricing":506,"registries":508,"repo":509,"seo":510,"standards":511,"status":515,"stem":516,"tagline":517,"tags":518,"vendor":457,"website":509,"__hash__":521},"tools\u002Ftools\u002Fadl-xapiwrapper.md","Adl Xapiwrapper",[],{"type":315,"value":464,"toc":493},[465,476,479,490],[318,466,467,468,471,472,475],{},"The reference JavaScript client for the Experience API, published by ADL — the same organisation that produced the specification. It handles the parts that are tedious to write again: building the endpoint URL, basic and session authentication, sending and querying statements, the state, activity profile and agent profile documents, and paging through ",[322,469,470],{},"more"," links. It ships with ADL Verbs and a statement helper in the same ",[322,473,474],{},"ADL"," object, and there is a self-contained minified build for dropping into a course.",[318,477,478],{},"It is the natural starting point for browser-side xAPI, and for anyone learning the specification it doubles as documentation you can step through. That, today, is its strongest use.",[318,480,481,482,485,486,489],{},"What it is not good for is a new production integration. The ",[322,483,484],{},"master"," branch has not had a substantive commit since July 2020, the last release is v1.11.0 from January 2020, and the version header is fixed at xAPI 1.0.1. The dependency story shows its age too — a bundled CryptoJS build, and a ",[322,487,488],{},"TextEncoder"," shim for old Edge. Around twenty issues sit open.",[318,491,492],{},"The provenance is the reason it is still the most-linked xAPI wrapper, and the reason it is worth listing honestly: it works against 1.0.x LRSs and it will not be fixed. For active work, prefer a maintained client and keep this one as the readable reference.",{"title":352,"searchDepth":353,"depth":353,"links":494},[],[176],"The reference JavaScript client for the Experience API, published by ADL — the same organisation that produced the specification. It handles the parts that are tedious to write again: building the endpoint URL, basic and session authentication, sending and querying statements, the state, activity profile and agent profile documents, and paging through more links. It ships with ADL Verbs and a statement helper in the same ADL object, and there is a self-contained minified build for dropping into a course.","https:\u002F\u002Fadlnet.github.io\u002FxAPIWrapper\u002F",[499],{"q":500,"a":501},"Does it support xAPI 2.0?","No. The wrapper hard-codes 1.0.1 as its version header. An LRS that accepts 1.0.x will work; one that requires 2.0 semantics will not, and nothing in the repository suggests an update is coming.\n",{},"ADL xAPIWrapper","\u002Ftools\u002Fadl-xapiwrapper",[375,368],{"model":377,"source":507},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FxAPIWrapper\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FxAPIWrapper",{"description":496},{"xapi":512},{"supported":372,"provenance":383,"checkedAt":312,"source":513,"note":514},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FxAPIWrapper\u002Fblob\u002Fmaster\u002Fsrc\u002Fxapiwrapper.js","`XAPIWrapper.prototype.xapiVersion` is set to \"1.0.1\" and that value is sent as the `X-Experience-API-Version` header on every request. The wrapper can optionally check the LRS `\u002Fabout` versions against it.\n","stale","tools\u002Fadl-xapiwrapper","ADL's own JavaScript wrapper for talking to an LRS, built against xAPI 1.0.1",[398,519,520],"lrs-client","adl","SJeYKmO1ACVUQfr47df0thZOGUk4N82BTDr3lH6CKSU",{"id":523,"title":524,"addedAt":312,"alternatives":525,"body":528,"categories":544,"checkedAt":312,"claimed":356,"description":532,"docs":545,"editorsPick":359,"extension":360,"faq":546,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":356,"license":553,"listing":370,"logo":356,"meta":554,"name":555,"navigation":372,"openSource":372,"path":556,"platforms":557,"pricing":558,"registries":560,"repo":561,"seo":562,"standards":563,"status":515,"stem":572,"tagline":573,"tags":574,"vendor":578,"website":561,"__hash__":579},"tools\u002Ftools\u002Fopenlrw.md","Openlrw",[526,406,527],"learning-locker","ralph-lrs",{"type":315,"value":529,"toc":542},[530,533,536,539],[318,531,532],{},"OpenLRW came out of the Apereo Learning Analytics Initiative as the storage tier for an open learning-analytics stack: a Spring Boot application over MongoDB that ingests xAPI statements, IMS Caliper events and OneRoster roster data into one multi-tenant store, so that dashboards and predictive models have somewhere to read from. The combination is the interesting part. Most open-source record stores handle one specification; OpenLRW was designed around the assumption that a university has learner records in several shapes and wants them side by side.",[318,534,535],{},"The problem is time. Master has not received a substantive commit since February 2020, and everything GitHub has recorded since is dependency-bump branches opened by bots. The project never left Apereo incubation, five issues sit open, and the Java and Spring Boot versions it targets are long out of support. Running it in 2026 means owning a security-patching burden for a stack nobody upstream is watching.",[318,537,538],{},"There is also a naming trap worth spelling out. \"Learning record warehouse\" is accurate and deliberate: this is not an LRS in the conformance sense, and a course built against a full LRS — one that uses the State resource to hold bookmark data, for example — will not work against it.",[318,540,541],{},"Read it for the multi-standard ingest design, and for the Caliper and OneRoster mappings, which are still hard to find elsewhere. For a store you intend to run in production, choose something maintained.",{"title":352,"searchDepth":353,"depth":353,"links":543},[],[176],"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW\u002Fblob\u002Fmaster\u002Fdocs\u002Findex.md",[547,550],{"q":548,"a":549},"Is OpenLRW a conformant LRS?","No, and it does not claim to be. It calls itself a learning record warehouse. The implemented xAPI surface is statements and About; there are no State or Profile resources, and we hold no registry entry for it.\n",{"q":551,"a":552},"What is the practical state of the project?","The last substantive commit to master is February 2020. The activity GitHub reports since then is dependency-bump branches, not development. Five issues are open and unanswered.\n","ECL-2.0",{},"Apereo OpenLRW","\u002Ftools\u002Fopenlrw",[436,375],{"model":377,"source":559},"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW",{"description":532},{"xapi":564,"cmi5":567,"scorm12":569,"scorm2004":570},{"supported":372,"provenance":383,"checkedAt":312,"source":565,"note":566},"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapereo\u002Fopenlrw\u002Fevents\u002Fxapi\u002Fendpoint\u002FXapiApiController.java","The xAPI surface is `\u002FxAPI\u002Fstatements` (POST and GET) plus an About controller and a header filter. The State, Activity Profile and Agent Profile resources are not implemented, so this is a statement store rather than a conformant LRS — do not expect a course written against a full LRS to work unchanged.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":568},"No cmi5 code or launch handling anywhere in the repository.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"editions":571,"provenance":383,"checkedAt":312},[],"tools\u002Fopenlrw","Java learning record warehouse for xAPI, Caliper and OneRoster data, dormant since 2020",[453,575,576,577],"java","caliper","learning-analytics","Apereo Foundation","5V4arQh2re2uY7GwRUCwt4lQVuZbyS0D8SvoJbCSg-I",{"id":581,"title":582,"addedAt":312,"alternatives":583,"body":585,"categories":605,"checkedAt":312,"claimed":356,"description":606,"docs":607,"editorsPick":359,"extension":360,"faq":608,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":430,"license":431,"listing":370,"logo":356,"meta":615,"name":616,"navigation":372,"openSource":372,"path":617,"platforms":618,"pricing":620,"registries":622,"repo":623,"seo":624,"standards":625,"status":631,"stem":632,"tagline":633,"tags":634,"vendor":457,"website":623,"__hash__":637},"tools\u002Ftools\u002Fcatapult.md","Catapult",[584],"cmi5-js",{"type":315,"value":586,"toc":603},[587,594,597,600],[318,588,589,590,593],{},"CATAPULT is the reference point for cmi5. It was funded by the US Department of Defense and built by ADL with Rustici, and it is the closest thing the specification has to an executable definition of itself: ",[322,591,592],{},"requirements\u002Frequirements.json"," maps every numbered requirement in the cmi5 specification to its wording, and the applications in the repository are all built against that index.",[318,595,596],{},"Those applications answer different questions. The player is a launching system you can embed in an LMS — import, validate, launch, session tracking, statement proxying to an external LRS. The Content Test Suite tells a content developer whether their AU behaves; the LMS Test Suite tells a platform developer whether their launching system does. The course examples are worked packages demonstrating masteryScore, moveOn variants and multi-AU structures, which is often the fastest way to understand a clause you have read three times.",[318,598,599],{},"The caveats are practical rather than technical. This is prototype-quality software published as a reference — Docker Compose deployments, a Vue 2 test-suite UI, and an issue list that reflects a project whose funding ended. Recent commits are dependency upgrades rather than features, with v1.0.8 in January 2026.",[318,601,602],{},"If you are shipping cmi5 in either direction, you should be testing against this. If you want a supported cmi5 player to run in production, buy one.",{"title":352,"searchDepth":353,"depth":353,"links":604},[],[176],"CATAPULT is the reference point for cmi5. It was funded by the US Department of Defense and built by ADL with Rustici, and it is the closest thing the specification has to an executable definition of itself: requirements\u002Frequirements.json maps every numbered requirement in the cmi5 specification to its wording, and the applications in the repository are all built against that index.","https:\u002F\u002Fadlnet.github.io\u002FCATAPULT\u002F",[609,612],{"q":610,"a":611},"Is CATAPULT an LRS?","No. The player needs an LRS behind it. It handles course import, validation, launch, session state and the cmi5 rules, and forwards xAPI traffic to whatever LRS you configure.\n",{"q":613,"a":614},"Which part do I need if I am building content rather than an LMS?","The Content Test Suite. It takes a cmi5 package, launches it, and reports which numbered requirements the AU satisfied or broke. The LMS Test Suite is the mirror image, for people implementing the launching side.\n",{},"CATAPULT","\u002Ftools\u002Fcatapult",[375,619,368],"cli",{"model":377,"currency":621,"freeTier":372},"USD",[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FCATAPULT",{"description":606},{"cmi5":626,"xapi":629},{"supported":372,"provenance":383,"checkedAt":312,"source":627,"note":628},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FCATAPULT\u002Fblob\u002Fmain\u002Frequirements\u002Frequirements.json","The repository ships a machine-readable index of the cmi5 specification's numbered requirements, a player that validates and launches courses against them, and two test suites. Read in source, August 2026.\n",{"supported":372,"provenance":383,"checkedAt":312,"note":630},"The player delegates xAPI handling to an external LRS rather than implementing one; it acts as a proxy enforcing the cmi5 requirements on statements passing through.\n","active","tools\u002Fcatapult","ADL's cmi5 player, content test suite and LMS test suite in one repository",[396,635,636],"conformance","player","RpMUXL-oa5c27fDJGO-y2LYEBIqzVV_Cncyd2vwITlo",{"id":639,"title":640,"addedAt":312,"alternatives":641,"body":642,"categories":658,"checkedAt":312,"claimed":356,"description":646,"docs":659,"editorsPick":359,"extension":360,"faq":660,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":356,"license":667,"listing":370,"logo":356,"meta":668,"name":669,"navigation":372,"openSource":372,"path":670,"platforms":671,"pricing":672,"registries":673,"repo":674,"seo":675,"standards":676,"status":515,"stem":685,"tagline":686,"tags":687,"vendor":690,"website":674,"__hash__":691},"tools\u002Ftools\u002Flearning-locker.md","Learning Locker",[527],{"type":315,"value":643,"toc":656},[644,647,650,653],[318,645,646],{},"Learning Locker is the LRS most people in e-learning can name. Started in 2014, GPL-3.0, Node and MongoDB, with a statement store, a query and aggregation layer, dashboards and visualisations, persona management and statement forwarding to downstream systems. For most of the last decade it was the default answer to \"we need somewhere to put xAPI statements that isn't a spreadsheet\", and the codebase still reads like a serious product rather than a demo.",[318,648,649],{},"Its strengths are the parts beyond the specification: the persona system that reconciles a learner's several xAPI identifiers into one person, the forwarding rules, and a usable dashboard layer. Those are the things you would otherwise build yourself on top of a bare statement store.",[318,651,652],{},"The reason to be careful is maintenance, and it is worth being precise rather than vague about it. Master has not moved since November 2021. Learning Pool's own product pages for the community edition now redirect away from it. Outside pull requests opened in 2026 were closed unmerged. The open issues that matter are not features — they are requests to support a MongoDB and Node version from this decade.",[318,654,655],{},"That leaves a specific decision. As a reference for how an LRS is put together, or as a system already running that you are not about to migrate, it remains genuinely useful. As a new deployment in 2026, you would be taking on a five-year-old dependency tree with no upstream, and Ralph or a hosted LRS is the more defensible choice.",{"title":352,"searchDepth":353,"depth":353,"links":657},[],[176],"https:\u002F\u002Flearninglocker.atlassian.net\u002Fwiki\u002Fspaces\u002FDOCS\u002Foverview",[661,664],{"q":662,"a":663},"Is the community edition still maintained?","On the evidence, no. The last commit on master is 16 November 2021, which is also the date of the last tagged release, v7.1.1. No branch in the repository carries a commit later than 2022, and three substantial pull requests raised by an outside contributor in July 2026 were closed without being merged. GitHub reports a 2024 push date, but that reflects a ref update rather than any change to the code.\n",{"q":665,"a":666},"What about the MongoDB and Node versions it pins?","That is the live problem. The open issues asking for MongoDB 8 and a current Node LTS on Ubuntu 24.04 have no maintainer response. Anyone deploying it today is deploying an unpatched 2021 dependency tree.\n","GPL-3.0",{},"Learning Locker (Community)","\u002Ftools\u002Flearning-locker",[375,436],{"model":377},[],"https:\u002F\u002Fgithub.com\u002FLearningLocker\u002Flearninglocker",{"description":646},{"xapi":677,"cmi5":680,"scorm12":682,"scorm2004":683},{"supported":372,"provenance":383,"checkedAt":312,"source":678,"note":679},"https:\u002F\u002Fgithub.com\u002FLearningLocker\u002Flearninglocker\u002Fblob\u002Fmaster\u002Flib\u002Fhelpers\u002FstatementForwarding.js","An xAPI 1.0.x LRS — statement, state, agent and activity profile endpoints, with statement forwarding defaulting to an X-Experience-API-Version of 1.0.3. Validation is handled by the project's own xapi-statements and xapi-validation packages.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":681},"No occurrence of cmi5 anywhere in the source. It can store statements a cmi5 course sends, but it does not implement the cmi5 launch or auth-token endpoints, so it cannot act as the cmi5 LMS.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"editions":684,"provenance":383,"checkedAt":312},[],"tools\u002Flearning-locker","The best-known open-source LRS, with no commit on master since November 2021",[453,688,689,429],"nodejs","mongodb","Learning Pool","Of15LGbsKXIgJHeXSN16YBVkP1NzOlvUzcx6xsyAJnQ",{"id":693,"title":694,"addedAt":312,"alternatives":695,"body":696,"categories":712,"checkedAt":312,"claimed":356,"description":700,"docs":713,"editorsPick":359,"extension":360,"faq":714,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":721,"license":369,"listing":370,"logo":356,"meta":722,"name":723,"navigation":372,"openSource":372,"path":724,"platforms":725,"pricing":726,"registries":727,"repo":728,"seo":729,"standards":730,"status":631,"stem":739,"tagline":740,"tags":741,"vendor":743,"website":713,"__hash__":744},"tools\u002Ftools\u002Fralph-lrs.md","Ralph Lrs",[526],{"type":315,"value":697,"toc":710},[698,701,704,707],[318,699,700],{},"Ralph is three things sharing a codebase: an xAPI 1.0.3 LRS served over FastAPI, a command-line tool for moving learning records between backends, and a Python library of Pydantic models for xAPI statements and Open edX tracking events. France Universite Numerique built it to run their own analytics, and it shows in the shape of the project — pluggable storage (Elasticsearch, MongoDB, ClickHouse), Basic and OIDC authentication, a Helm chart and published Docker images.",[318,702,703],{},"The model library is the undervalued part. Typed, validated Pydantic representations of xAPI statements — including profiles for virtual classroom, video and LMS activity — turn \"we receive statements\" into something you can test against.",[318,705,706],{},"It is not a product for a non-technical team. There is no dashboard, no report builder, no persona reconciliation; you get an API and the expectation that you will point your own analytics stack at the store. Nor is it a cmi5 LMS, despite being an LRS — the launch side of cmi5 is not implemented.",[318,708,709],{},"On maintenance, this is the healthier of the two open-source LRSs in this directory. Version 5.0.1, commits through August 2026, a public changelog and an active issue tracker. It is also small — forty-nine stars, one primary institutional sponsor — so the risk is not abandonment so much as a narrow community: expect to read source rather than find a Stack Overflow answer, and expect the roadmap to follow FUN's needs.",{"title":352,"searchDepth":353,"depth":353,"links":711},[],[176],"https:\u002F\u002Fopenfun.github.io\u002Fralph\u002F",[715,718],{"q":716,"a":717},"Which storage backends can it use?","Elasticsearch, MongoDB and ClickHouse for the LRS itself, with sync and async variants; the wider backend set adds filesystem, S3, Swift, OVH LDP and WebSocket sources for the CLI and library modes. Choose the store before you commit — the query characteristics differ substantially.\n",{"q":719,"a":720},"Does it ship a dashboard?","No. Ralph is an API server, a CLI and a library. Visualisation is someone else's job, which is the main practical difference between it and Learning Locker.\n","FR",{},"Ralph","\u002Ftools\u002Fralph-lrs",[375,619,368,436],{"model":377},[],"https:\u002F\u002Fgithub.com\u002Fopenfun\u002Fralph",{"description":700},{"xapi":731,"cmi5":734,"scorm12":736,"scorm2004":737},{"supported":372,"provenance":383,"checkedAt":312,"source":732,"note":733},"https:\u002F\u002Fgithub.com\u002Fopenfun\u002Fralph\u002Fblob\u002Fmain\u002Fsrc\u002Fralph\u002Fapi\u002Frouters\u002Fstatements.py","An xAPI 1.0.3 LRS built on FastAPI — the statements resource with the documented filters, plus Pydantic models for a wide set of xAPI profiles. The LRS data backend sends X-Experience-API-Version 1.0.3.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":735},"Ralph's xAPI models reference the cmi5 profile's session-id context extension, but there is no cmi5 launch or auth-token implementation. It can store what a cmi5 course sends; it cannot launch one.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"editions":738,"provenance":383,"checkedAt":312},[],"tools\u002Fralph-lrs","A Python xAPI LRS, CLI and data-pipeline toolbox from France Universite Numerique",[453,456,742,577],"fastapi","France Universite Numerique","ehCK9S-bMXPxjLEDcQDODPa8ZdIbUx7J8ikXcNfiavw",{"id":746,"title":747,"addedAt":312,"alternatives":748,"body":749,"categories":765,"checkedAt":312,"claimed":356,"description":753,"docs":356,"editorsPick":359,"extension":360,"faq":766,"firstParty":359,"foundedYear":356,"hosting":773,"hqCountry":430,"license":774,"listing":370,"logo":356,"meta":775,"name":776,"navigation":372,"openSource":372,"path":777,"platforms":778,"pricing":780,"registries":782,"repo":781,"seo":783,"standards":784,"status":631,"stem":791,"tagline":792,"tags":793,"vendor":796,"website":781,"__hash__":797},"tools\u002Ftools\u002Frapidcmi5.md","Rapidcmi5",[],{"type":315,"value":750,"toc":763},[751,754,757,760],[318,752,753],{},"RapidCMI5 is an open-source desktop authoring tool for cmi5 content, published by By Light and written for the US Department of Defense's Total Learning Architecture. It began as a player for MkDocs-derived markdown and grew into an Nx monorepo containing three pieces: the Electron authoring application, the web player that renders the authored course, and a headless builder intended to package content inside a CI pipeline.",[318,755,756],{},"The pitch is a code-adjacent workflow. Course source is files you can put under version control and diff, while the visual editor keeps it approachable — a middle position between hand-writing cmi5 and using a closed WYSIWYG suite. The packaging chores that people most often get wrong, cmi5.xml structure and session handling, are done for you.",[318,758,759],{},"Two constraints matter. It is cmi5 only, so it is no help to anyone with a SCORM-bound LMS. And it is early: version 0.19.0 as of August 2026, first commit in November 2025, eleven stars, releases roughly monthly. Nothing suggests neglect — the release cadence is brisk and the test setup includes Moodle end-to-end runs — but there is no track record yet, and the roadmap is set by one contractor's programme needs.",[318,761,762],{},"Prebuilt Windows installers and a Linux AppImage are published, so evaluating it costs an afternoon rather than a build environment.",{"title":352,"searchDepth":353,"depth":353,"links":764},[],[176],[767,770],{"q":768,"a":769},"Does it produce SCORM as well?","No. There is no SCORM code in the repository at all. If you need to ship the same course to an LMS that only speaks SCORM, this is the wrong tool — it is cmi5 or nothing.\n",{"q":771,"a":772},"What does the AGPL mean for courses I author with it?","The copyleft attaches to the tool and to the bundled player, not to the course content you write. The player, however, is served to learners, which is exactly the scenario the AGPL's network clause addresses — if you modify it and host it, take advice.\n","desktop","AGPL-3.0",{},"RapidCMI5","\u002Ftools\u002Frapidcmi5",[779,436],"windows",{"model":377,"source":781},"https:\u002F\u002Fgithub.com\u002FByLightSDC\u002Frapidcmi5",[],{"description":753},{"cmi5":785,"xapi":788},{"supported":372,"provenance":383,"checkedAt":312,"source":786,"note":787},"https:\u002F\u002Fgithub.com\u002FByLightSDC\u002Frapidcmi5\u002Fblob\u002Fmain\u002Fpackages\u002Fcommon\u002Fsrc\u002Flib\u002FcourseBuilders\u002FgenerateCmi5Xml.ts","The monorepo generates a cmi5.xml course structure with AU definitions, and ships a matching player and a container-based builder for CI.\n",{"supported":372,"provenance":383,"checkedAt":312,"source":789,"note":790},"https:\u002F\u002Fgithub.com\u002FByLightSDC\u002Frapidcmi5\u002Fblob\u002Fmain\u002Fpackage.json","Statements are sent through @xapi\u002Fcmi5 1.4 on top of @xapi\u002Fxapi 3.0.2. xAPI here is the cmi5 transport, not a general-purpose LRS integration you configure yourself.\n","tools\u002Frapidcmi5","Desktop authoring tool that outputs cmi5 packages, aimed at TLA programmes",[794,773,795],"authoring","electron","By Light Professional IT Services","rfdlE35MHPOIJT9yq15Zz5OkJ1VnvrJv1QZ59j_A3p4",{"id":799,"title":800,"addedAt":312,"alternatives":801,"body":802,"categories":818,"checkedAt":312,"claimed":356,"description":806,"docs":819,"editorsPick":359,"extension":360,"faq":820,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":430,"license":431,"listing":370,"logo":356,"meta":827,"name":828,"navigation":372,"openSource":372,"path":829,"platforms":830,"pricing":832,"registries":833,"repo":834,"seo":835,"standards":836,"status":631,"stem":845,"tagline":846,"tags":847,"vendor":849,"website":834,"__hash__":850},"tools\u002Ftools\u002Fsql-lrs.md","Sql Lrs",[],{"type":315,"value":803,"toc":816},[804,807,810,813],[318,805,806],{},"SQL LRS is the sensible default for anyone who needs a learning record store and does not want to buy one. The design decision that distinguishes it is in the name: statements go into an ordinary SQL database — SQLite, Postgres, MySQL or MariaDB — rather than a document store or a proprietary engine. That means your existing backup, replication, monitoring and reporting practice applies unchanged, and any analyst who can write SQL can query the data without an API key.",[318,808,809],{},"It is well suited to two quite different jobs. As a development LRS it runs on SQLite from a single binary, which makes it practical to keep one on a laptop while building xAPI content. As a production store it deploys via Docker or a JAR, supports OIDC for admin authentication, and has documented AWS deployment patterns.",[318,811,812],{},"What it is not is an analytics product. There are no dashboards to speak of, no learner-facing reporting, and no course-authoring anything. Nor is it a cmi5 system: it will store cmi5 statements, but launching AUs is somebody else's code.",[318,814,815],{},"Maintenance is strong. v0.9.8 shipped in August 2026, and the project runs the ADL conformance suite against both xAPI 1.0.3 and 2.0.0 in its own CI — a level of self-verification that is rare here and the main reason to trust its standards claims.",{"title":352,"searchDepth":353,"depth":353,"links":817},[],[176],"https:\u002F\u002Fgithub.com\u002Fyetanalytics\u002Flrsql\u002Fblob\u002Fmain\u002Fdoc\u002Findex.md",[821,824],{"q":822,"a":823},"Which databases can it use?","SQLite as an embedded engine, plus Postgres 14–18, MariaDB 10.6–11.8 and MySQL 8.0–9.5. The SQLite mode is what makes it viable as a laptop LRS for development; the others are for anything with real volume.\n",{"q":825,"a":826},"Is it a full analytics platform?","No. It stores and serves statements, with a small admin UI, OIDC support and a Reactions feature for deriving new statements from incoming ones. Visualisation is left to whatever you point at the database — the docs demonstrate Apache Superset.\n",{},"SQL LRS","\u002Ftools\u002Fsql-lrs",[436,779,831,375],"macos",{"model":377},[],"https:\u002F\u002Fgithub.com\u002Fyetanalytics\u002Flrsql",{"description":806},{"xapi":837,"cmi5":840,"scorm12":842,"scorm2004":843},{"supported":372,"provenance":383,"checkedAt":312,"source":838,"note":839},"https:\u002F\u002Fgithub.com\u002Fyetanalytics\u002Flrsql\u002Fblob\u002Fmain\u002Fsrc\u002Ftest\u002Flrsql\u002Fconformance_test.clj","Supports xAPI 1.0.3 and 2.0.0, selected per request by the X-Experience-API-Version header. The repository's own test suite runs the ADL LRS conformance suite against a live instance for both versions, so the claim is checkable rather than asserted.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":841},"There is no cmi5 code in the repository. An LRS is a prerequisite for cmi5 and will happily store the statements a cmi5 course sends, but the launch side — fetch URL, AU session state, move-on evaluation — is not here and needs a separate cmi5 launcher.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"editions":844,"provenance":383,"checkedAt":312},[],"tools\u002Fsql-lrs","An xAPI learning record store that runs on SQLite or your existing SQL database",[453,454,429,848],"clojure","Yet Analytics, Inc.","m0IMz3Jxi7kbZMi4NAIoAgioNYYiyLR6-S_QP0v1PIY",{"id":852,"title":853,"addedAt":312,"alternatives":854,"body":855,"categories":875,"checkedAt":312,"claimed":356,"description":859,"docs":876,"editorsPick":359,"extension":360,"faq":877,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":721,"license":667,"listing":370,"logo":356,"meta":884,"name":885,"navigation":372,"openSource":372,"path":886,"platforms":887,"pricing":888,"registries":889,"repo":890,"seo":891,"standards":892,"status":392,"stem":898,"tagline":899,"tags":900,"vendor":902,"website":903,"__hash__":904},"tools\u002Ftools\u002Ftrax-lrs.md","Trax Lrs",[],{"type":315,"value":856,"toc":873},[857,860,867,870],[318,858,859],{},"TRAX LRS is a Learning Record Store written in Laravel by Sébastien Fraysse, now at version 3.1. Its defining quality is restraint. It receives, validates, stores and serves xAPI statements, with an admin interface for inspecting and filtering them, and it declines to be a dashboard, a reporting suite or a learning platform. For a team that already has analytics and needs a compliant store underneath, that narrowness is the point.",[318,861,862,863,866],{},"Practically, it is a conventional PHP deployment: Apache with mod_rewrite, PHP 8.2 or later, MySQL or PostgreSQL, Composer, and a document root pointed at ",[322,864,865],{},"public",". Anyone who has run a Laravel application will be finished in an hour. Multi-tenancy is present in the routing — clients and stores are path segments on the endpoint — which is useful if you serve several customers or environments from one instance.",[318,868,869],{},"Two things to weigh. Version 3.1 speaks xAPI 1.0.3, not 2.0. And upgrading from 3.0.x requires a fresh install of the application, database retained, which is a documented but manual step.",[318,871,872],{},"The repository sits at thirteen stars, last pushed December 2025, with a longer history under the 3.0 and 2.x repositories. This is a single-maintainer project with a commercial edition funding it — a healthier arrangement than a hobby project, but the dependency is on one person either way.",{"title":352,"searchDepth":353,"depth":353,"links":874},[],[176],"https:\u002F\u002Fwww.traxlrs.com\u002F",[878,881],{"q":879,"a":880},"Is the Starter Edition the whole product?","No. TRAX Core is dual-licensed — GPL-3.0, or a commercial licence for the Extended Edition. The Starter Edition on GitHub is genuinely usable and genuinely free; features held back for Extended are the reason the project has a business model at all. Check the licence page before planning around a specific feature.\n",{"q":882,"a":883},"Will it do learning analytics?","No, and the maintainer says so plainly in the README: it stores and manages learning data and stops there. Reporting is your problem, or another tool's.\n",{},"TRAX LRS","\u002Ftools\u002Ftrax-lrs",[375],{"model":377,"freeTier":372,"source":876},[],"https:\u002F\u002Fgithub.com\u002Ftrax-project\u002Ftrax3-starter-lrs",{"description":859},{"xapi":893,"cmi5":896},{"supported":372,"provenance":383,"checkedAt":312,"source":894,"note":895},"https:\u002F\u002Fgithub.com\u002Ftrax-project\u002Ftrax3-core","The gateway requires an X-Experience-API-Version header and answers 1.0.3. Statements, states, activity profiles and agent profiles are all implemented. There is no xAPI 2.0 handling in 3.1.\n",{"supported":359,"provenance":383,"checkedAt":312,"source":894,"note":897},"3.1 names a 'cmi5-token' auth guard and installs a cmi5\u002Ftokens table, but the guard falls through to Basic authentication and no cmi5 launch handling is implemented in trax3-core. Recorded as unsupported until a launch can be observed end to end.\n","tools\u002Ftrax-lrs","A deliberately minimal self-hosted xAPI Learning Record Store built on Laravel",[453,901,429],"php","Sébastien Fraysse","https:\u002F\u002Ftraxlrs.com","jrrVtYaE70vKH_6rMpl0N8pKleMLi25YtZJTPHoJH3I",{"id":906,"title":907,"addedAt":312,"alternatives":908,"body":909,"categories":925,"checkedAt":312,"claimed":356,"description":913,"docs":926,"editorsPick":359,"extension":360,"faq":927,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":356,"license":431,"listing":370,"logo":356,"meta":934,"name":935,"navigation":372,"openSource":372,"path":936,"platforms":937,"pricing":938,"registries":940,"repo":939,"seo":941,"standards":942,"status":515,"stem":948,"tagline":949,"tags":950,"vendor":356,"website":926,"__hash__":951},"tools\u002Ftools\u002Ftincanjs.md","Tincanjs",[],{"type":315,"value":910,"toc":923},[911,914,917,920],[318,912,913],{},"TinCanJS is the library most xAPI tutorials still import. Rustici Software wrote it alongside the specification itself, and it does the LRS-client job properly: statement, actor, verb, activity and result objects with sensible constructors, synchronous and asynchronous calls, state and activity-profile documents, IE-era cross-origin fallbacks, and multipart attachment support that works end to end in Node and modern browsers.",[318,915,916],{},"It is also finished, in the unhappy sense. The last commit on the default branch is from September 2016, matching the final npm release, 0.50.0. The version list in the source stops at xAPI 1.0.2 — before 1.0.3, and well before the IEEE 9274.1.1 revision — so a statement the newer specification allows but 1.0.2 does not is beyond it. Twenty-eight issues are open, the oldest from 2012. The repository is not archived, which is arguably the least helpful state: nothing signals to a newcomer that no fix is coming.",[318,918,919],{},"What it remains good for: reading, because the object model is a clear map of the specification; and maintaining existing content that already depends on it, where the risk of swapping the library exceeds the risk of leaving it.",[318,921,922],{},"What it is not good for: new work. Choose a library that has seen a commit since the specification last moved, and keep TinCanJS as a reference.",{"title":352,"searchDepth":353,"depth":353,"links":924},[],[176],"http:\u002F\u002Frusticisoftware.github.io\u002FTinCanJS\u002F",[928,931],{"q":929,"a":930},"Why does GitHub show activity in 2023 if the last commit is from 2016?","The repository's \"pushed\" timestamp reflects any branch. The default branch's last commit is 26 September 2016, the same day version 0.50.0 was published to npm, and nothing has landed on it since.\n",{"q":932,"a":933},"Can it talk to an xAPI 2.0 LRS?","Only if that LRS still accepts 1.0.x requests, which most do. The library negotiates the version from a fixed list ending at 1.0.2 and will refuse a version it does not know.\n",{},"TinCanJS","\u002Ftools\u002Ftincanjs",[368,375],{"model":377,"source":939},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002FTinCanJS",[],{"description":913},{"xapi":943,"cmi5":946},{"supported":372,"provenance":383,"checkedAt":312,"source":944,"note":945},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002FTinCanJS\u002Fblob\u002Fmaster\u002Fsrc\u002FTinCan.js","TinCan.versions() returns 1.0.2, 1.0.1, 1.0.0, 0.95 and 0.9. There is no 1.0.3 and no IEEE 9274.1.1 (xAPI 2.0) support.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":947},"It is an LRS client only — no cmi5 launch parameters, no AU lifecycle, no course structure handling.\n","tools\u002Ftincanjs","Rustici's original JavaScript xAPI library — still the most-linked, unchanged since 2016",[398,368,519],"2i3z40meMW-Nape_BHTV7naqlP9OGWyTrTzJYCqlmJw",{"id":953,"title":954,"addedAt":312,"alternatives":955,"body":956,"categories":984,"checkedAt":312,"claimed":356,"description":985,"docs":986,"editorsPick":359,"extension":360,"faq":987,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":356,"license":431,"listing":370,"logo":356,"meta":991,"name":992,"navigation":372,"openSource":372,"path":993,"platforms":994,"pricing":995,"registries":996,"repo":997,"seo":998,"standards":999,"status":1007,"stem":1008,"tagline":1009,"tags":1010,"vendor":457,"website":997,"__hash__":1011},"tools\u002Ftools\u002Fadl-cmi5-client-library.md","Adl Cmi5 Client Library",[],{"type":315,"value":957,"toc":982},[958,973,976,979],[318,959,960,961,964,965,968,969,972],{},"This is a small content-side library for cmi5: two scripts, ",[322,962,963],{},"cmi5Controller.js"," and ",[322,966,967],{},"cmi5Wrapper.js",", one worked example of an Assignable Unit, and a sample ",[322,970,971],{},"cmi5.xml"," course structure. Its job is the awkward part of cmi5 — reading the launch parameters, fetching the LMS launch data and learner preferences, and emitting the cmi5-defined statements with the right verbs, context activities and extensions at the right points in a session.",[318,974,975],{},"Its value is pedagogical. cmi5 is the standard people most often report as supported without having implemented it correctly, and this code shows what correct looks like in about the smallest possible space: launch mode enforcement, the moveOn category, the mastery score and progress extensions, all annotated with the specification section they satisfy. If you are writing an AU or reviewing someone else's claim of cmi5 support, an hour with these files is well spent.",[318,977,978],{},"It is not a dependency. ADL archived the repository, the last commit was August 2021, and it has thirteen stars and three issues frozen open. GitHub also records it as a fork of Art Werkenthin's AU Simulator, which the README credits — so this is a published copy of someone else's demonstration rather than an independent implementation.",[318,980,981],{},"Read it, then build on something maintained.",{"title":352,"searchDepth":353,"depth":353,"links":983},[],[176],"This is a small content-side library for cmi5: two scripts, cmi5Controller.js and cmi5Wrapper.js, one worked example of an Assignable Unit, and a sample cmi5.xml course structure. Its job is the awkward part of cmi5 — reading the launch parameters, fetching the LMS launch data and learner preferences, and emitting the cmi5-defined statements with the right verbs, context activities and extensions at the right points in a session.","https:\u002F\u002Fgithub.com\u002FAICC\u002FCMI-5_Spec_Current",[988],{"q":989,"a":990},"Should I build an AU on this today?","No. It is archived and read-only, with no releases and no issue triage. Use it to understand the launch and statement flow, then build against a cmi5 client library that is still accepting commits.\n",{},"cmi5 Client Library (ADL)","\u002Ftools\u002Fadl-cmi5-client-library",[368,375],{"model":377},[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002Fcmi5-Client-Library",{"description":985},{"cmi5":1000,"xapi":1003,"scorm12":1005,"scorm2004":1006},{"supported":372,"provenance":383,"checkedAt":312,"source":1001,"note":1002},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002Fcmi5-Client-Library\u002Fblob\u002Fmaster\u002FExamples\u002FScripts\u002Fcmi5Wrapper.js","The wrapper builds cmi5-defined statements, honours launchMode by restricting non-normal sessions to Initialized and Terminated, sets the moveOn category and the masteryScore and progress extensions, and cites spec sections 9.5.2 and 9.5.3 inline. A sample cmi5.xml course structure is included.\n",{"supported":372,"provenance":383,"checkedAt":312,"note":1004},"Statements are sent through ADL's xapiwrapper, bundled in the repository. cmi5 sits on xAPI, so this is a dependency rather than a separate feature.\n",{"supported":359,"provenance":383,"checkedAt":312},{"supported":359,"provenance":383,"checkedAt":312},"archived","tools\u002Fadl-cmi5-client-library","ADL's archived JavaScript wrapper and example AU for the content side of cmi5",[396,398,455],"b9v2IBbn95x0Bc13X9vuxNt-UMagLySEMFZNf68aJjg",{"id":1013,"title":1014,"addedAt":312,"alternatives":1015,"body":1017,"categories":1041,"checkedAt":312,"claimed":356,"description":1021,"docs":1042,"editorsPick":359,"extension":360,"faq":1043,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":430,"license":431,"listing":370,"logo":356,"meta":1050,"name":1051,"navigation":372,"openSource":372,"path":1052,"platforms":1053,"pricing":1054,"registries":1055,"repo":1042,"seo":1056,"standards":1057,"status":515,"stem":1063,"tagline":1064,"tags":1065,"vendor":1067,"website":1042,"__hash__":1068},"tools\u002Ftools\u002Fcmi5-js.md","Cmi5 Js",[1016],"catapult",{"type":315,"value":1018,"toc":1039},[1019,1022,1033,1036],[318,1020,1021],{},"cmi5.js is the small, specific piece of the cmi5 puzzle that content developers actually need. When an LMS launches an assignable unit it passes an endpoint, an auth token, an activity ID, a registration and a fetch URL on the query string; the AU then has to exchange the fetch URL for credentials, retrieve LMS LaunchData, respect the launch mode, and emit a precisely shaped sequence of statements ending in Terminated. This library does all of that behind an API of a dozen methods.",[318,1023,1024,1025,1028,1029,1032],{},"The details it handles are exactly the ones people get wrong by hand: refusing to send Completed, Passed or Failed statements outside Normal launch mode, attaching the ",[322,1026,1027],{},"moveon"," context category, carrying ",[322,1030,1031],{},"masteryScore"," as the documented extension, and merging the LMS-supplied context template into every statement.",[318,1034,1035],{},"It is published by Rustici, who wrote much of cmi5, and it is Apache-2.0. It has not been touched since July 2023, sitting at version 3.2.0 with six stars — a low count for a library published by the specification's own authors. Nothing has broken — the specification has not moved and the code has no runtime dependencies — but nothing will be fixed either, and it ships as a webpack bundle with no type definitions, which is friction in a TypeScript codebase.",[318,1037,1038],{},"Reasonable to use today. Read it before you do, and expect to maintain your own copy.",{"title":352,"searchDepth":353,"depth":353,"links":1040},[],[176],"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fcmi5.js",[1044,1047],{"q":1045,"a":1046},"Does this let me build a cmi5 LMS?","No. It is the AU half only — the code that runs inside the launched content. For the launching side you need a cmi5 player; ADL's CATAPULT is the open reference implementation.\n",{"q":1048,"a":1049},"Is it safe to use given the 2023 last commit?","The specification it targets has not changed, and the library is a few files of dependency-free JavaScript, so it does not rot the way a framework would. The risk is that a bug you find is a bug you fix.\n",{},"cmi5.js","\u002Ftools\u002Fcmi5-js",[368,375],{"model":377,"currency":621,"freeTier":372},[],{"description":1021},{"cmi5":1058,"xapi":1061},{"supported":372,"provenance":383,"checkedAt":312,"source":1059,"note":1060},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fcmi5.js\u002Fblob\u002F3.x\u002Fsrc\u002Findex.js","Implements the AU side: parses the launch query string, fetches LMS LaunchData and the learner preferences state, and sends the Initialized, Completed, Passed, Failed and Terminated statements with the cmi5 moveOn context category and masteryScore extension. Read in source, August 2026.\n",{"supported":372,"provenance":383,"checkedAt":312,"source":1059,"note":1062},"Sends X-Experience-API-Version 1.0.3 on every request. It talks to an LRS only through the cmi5 statement flow, so it is not a general xAPI client.\n","tools\u002Fcmi5-js","Rustici's JavaScript runtime for the assignable-unit side of a cmi5 course",[396,398,1066],"runtime","Rustici Software","M-luPAvqXhX9Fa8eDiHw4TQZF6W8PkqzkpxTaR763tU",{"id":1070,"title":1071,"addedAt":312,"alternatives":1072,"body":1073,"categories":1089,"checkedAt":312,"claimed":356,"description":1077,"docs":1090,"editorsPick":359,"extension":360,"faq":1091,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":430,"license":431,"listing":370,"logo":356,"meta":1098,"name":1099,"navigation":372,"openSource":372,"path":1100,"platforms":1101,"pricing":1103,"registries":1105,"repo":1104,"seo":1106,"standards":1107,"status":631,"stem":1112,"tagline":1113,"tags":1114,"vendor":1117,"website":1104,"__hash__":1118},"tools\u002Ftools\u002Fmoodle-mod-cmi5launch.md","Moodle Mod Cmi5launch",[],{"type":315,"value":1074,"toc":1087},[1075,1078,1081,1084],[318,1076,1077],{},"This is the reference way to get cmi5 content into Moodle, published by the ADL Initiative — the body that authored the specification. It adds a course activity type: a teacher uploads a cmi5 package, learners launch it, and results flow into the Moodle gradebook while the underlying statements land in a Learning Record Store.",[318,1079,1080],{},"Its architecture is the thing to understand before adopting it. The plugin does not launch content itself. It brokers between Moodle, the ADL CATAPULT prototype player and an LRS, which means a working deployment is three services rather than one, and CATAPULT is explicitly a prototype rather than a supported product. Anyone comparing this with Moodle's built-in SCORM module — one component, no external dependencies — should price that difference honestly.",[318,1082,1083],{},"It is well-suited to organisations that have already committed to xAPI and an LRS and want Moodle as one delivery surface among several. It is a poor fit for a school or small provider who wants cmi5 to feel like SCORM did.",[318,1085,1086],{},"Maintenance is real: version 1.1.0, declared stable, commits into March 2026, and issues being closed. It is also a small project — nine stars, effectively one maintainer inside a funded programme. The lineage is respectable, being derived from the older tincanlaunch plugin, but the audience is narrow and the answers to questions will come from the specification community rather than a vendor.",{"title":352,"searchDepth":353,"depth":353,"links":1088},[],[176],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FMoodle-mod_cmi5launch#readme",[1092,1095],{"q":1093,"a":1094},"What do I need running before this works?","Moodle 4.3 or later with PHP 8, an LRS, and an instance of the CATAPULT cmi5 player. Three moving parts, two of which you must deploy and keep running yourself. This is the single biggest reason pilots stall.\n",{"q":1096,"a":1097},"Does it write to the Moodle gradebook?","Yes — it integrates with the Gradebook API, so cmi5 results appear alongside native Moodle activities rather than only in the LRS.\n",{},"cmi5launch for Moodle","\u002Ftools\u002Fmoodle-mod-cmi5launch",[1102],"lms-plugin",{"model":377,"source":1104},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FMoodle-mod_cmi5launch",[],{"description":1077},{"cmi5":1108,"xapi":1110},{"supported":372,"provenance":383,"checkedAt":312,"source":1104,"note":1109},"The module is a bridge, not a player. Launch, AU sequencing and satisfaction statements are delegated to a running instance of the ADL CATAPULT prototype player, which you host separately.\n",{"supported":372,"provenance":383,"checkedAt":312,"source":1104,"note":1111},"Statements are read back from an external LRS for the activity and session reports. The plugin stores no statements of its own; an LRS is a hard prerequisite.\n","tools\u002Fmoodle-mod-cmi5launch","ADL's Moodle activity module that launches cmi5 content via the CATAPULT player",[1115,1116,520],"moodle","plugin","ADL Initiative","JYwa_1WFcgt90_kW7nBeHKE19c17EsGcEFYUmsH4sag",{"id":1120,"title":1121,"addedAt":312,"alternatives":1122,"body":1123,"categories":1139,"checkedAt":312,"claimed":356,"description":1127,"docs":1140,"editorsPick":359,"extension":360,"faq":1141,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":356,"license":1145,"listing":370,"logo":356,"meta":1146,"name":1147,"navigation":372,"openSource":372,"path":1148,"platforms":1149,"pricing":1150,"registries":1151,"repo":1152,"seo":1153,"standards":1154,"status":392,"stem":1160,"tagline":1161,"tags":1162,"vendor":356,"website":1152,"__hash__":1163},"tools\u002Ftools\u002Flxhive.md","Lxhive",[],{"type":315,"value":1124,"toc":1137},[1125,1128,1131,1134],[318,1126,1127],{},"lxHive is a self-hosted Learning Record Store: a PHP application over MongoDB that accepts xAPI statements, validates them against the specification, stores them, and serves them back through the standard resources. It supports Basic authentication and OAuth 2.0 authorization code grant, and file storage is pluggable. Installation is a composer install and a setup wizard, documented step by step in the wiki.",[318,1129,1130],{},"It suits a team that wants an LRS they control, on infrastructure they already run, at a scale where MongoDB on one box is enough — a research project, a pilot, an internal analytics stack, or a course on how the xAPI resources fit together. The README's endpoint-by-endpoint table, with links into the specification sections, makes it unusually good reading for that last purpose.",[318,1132,1133],{},"It is not a competitive commercial LRS. There is no xAPI 2.0, the conformance figure is self-reported and short of a pass, the last release is 0.10.1, and the PHP and MongoDB version floors in the README are old enough that a current stack will need checking before you begin.",[318,1135,1136],{},"Maintenance is intermittent rather than dead: last pushed April 2025, eight issues open against seventy-eight stars. Reasonable for a side deployment; think hard before it sits under anything a customer pays for.",{"title":352,"searchDepth":353,"depth":353,"links":1138},[],[176],"https:\u002F\u002Fgithub.com\u002Fg3i\u002FlxHive\u002Fwiki",[1142],{"q":1143,"a":1144},"What licence is it actually under?","Check before you commit. The LICENSE file in the repository is GPL-2.0 and GitHub detects it as such, but the README's licence section says GPL v3, composer.json declares GPL-3.0, and the README badge says AGPL. Four statements, three answers. Ask the maintainers to resolve it if the distinction matters to your deployment.\n","GPL-2.0",{},"lxHive","\u002Ftools\u002Flxhive",[375,368],{"model":377},[],"https:\u002F\u002Fgithub.com\u002Fg3i\u002FlxHive",{"description":1127},{"xapi":1155,"cmi5":1158},{"supported":372,"provenance":383,"checkedAt":312,"source":1156,"note":1157},"https:\u002F\u002Fgithub.com\u002Fg3i\u002FlxHive#readme","Implements statements, activities, state, activity profile, agents and agent profile, documented endpoint by endpoint against xAPI 1.0.2 in the README. The project states support for the specification up to 1.0.3; there is no xAPI 2.0 support. Its self-reported score against the ADL lrs-conformance-test-suite is 86.02% — a published number, not a pass.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":1159},"An LRS only. cmi5 launch, session handling and the moveOn rules are the responsibility of whatever launches the AU.\n","tools\u002Flxhive","Small PHP and MongoDB Learning Record Store for xAPI 1.0.x",[453,901,689],"zvukFTg_FXko2QbDGmdq5CV6md9l9ei5MzGtf6nQwMY",{"id":1165,"title":1166,"addedAt":312,"alternatives":1167,"body":1168,"categories":1188,"checkedAt":312,"claimed":356,"description":1172,"docs":1189,"editorsPick":359,"extension":360,"faq":1190,"firstParty":359,"foundedYear":356,"hosting":429,"hqCountry":356,"license":667,"listing":370,"logo":356,"meta":1197,"name":1198,"navigation":372,"openSource":372,"path":1199,"platforms":1200,"pricing":1201,"registries":1202,"repo":1203,"seo":1204,"standards":1205,"status":631,"stem":1211,"tagline":1212,"tags":1213,"vendor":356,"website":1214,"__hash__":1215},"tools\u002Ftools\u002Fmoodle-logstore-xapi.md","Moodle Logstore Xapi",[],{"type":315,"value":1169,"toc":1186},[1170,1173,1176,1179],[318,1171,1172],{},"This plugin registers as a Moodle logstore, which means it sees the same event stream Moodle uses for its own logs, and translates the events it recognises into xAPI statements which it then posts to an LRS. The translation layer is a large map of per-event transformer functions — course viewed, quiz attempt submitted, assignment graded, forum post created and a few hundred more — and the map is a documented extension point, so adding your own event or reshaping an existing statement is a supported thing to do rather than a fork.",[318,1174,1175],{},"It is the default answer for anyone who needs Moodle activity in a learning record store without touching core. If you have bought an LRS and need Moodle to feed it, start here.",[318,1177,1178],{},"It is not a route to xAPI 2.0 (statements go out as 1.0.3), not a cmi5 implementation, and not a real-time pipe — dispatch runs on Moodle's scheduled task. The operational features are what distinguish it from a weekend script: failed statements are queued, inspectable and replayable, and historical events can be backfilled from before the plugin was installed.",[318,1180,1181,1182,1185],{},"One correction worth knowing: the widely circulated ",[322,1183,1184],{},"xAPI-vle"," URL now redirects. The repository lives under David Pesce's account and is actively maintained there, with commits this month against Moodle 5.2.",{"title":352,"searchDepth":353,"depth":353,"links":1187},[],[176],"https:\u002F\u002Fgithub.com\u002Fdavidpesce\u002Fmoodle-logstore_xapi\u002Ftree\u002Fmaster\u002Fdocs",[1191,1194],{"q":1192,"a":1193},"Which Moodle versions does it support?","version.php on master declares release 5.1.0, requires Moodle 4.5 or later, and names 4.5 through 5.2 as the supported range. That is unusually current for a community Moodle plugin.\n",{"q":1195,"a":1196},"Does it send statements in real time?","No. Events are queued and dispatched by a scheduled task, and failed statements land in a queue you can inspect and replay from the admin UI. Plan dashboards around minutes of latency, not seconds.\n",{},"moodle-logstore_xapi","\u002Ftools\u002Fmoodle-logstore-xapi",[1102,375],{"model":377},[],"https:\u002F\u002Fgithub.com\u002Fdavidpesce\u002Fmoodle-logstore_xapi",{"description":1172},{"xapi":1206,"cmi5":1209},{"supported":372,"provenance":383,"checkedAt":312,"source":1207,"note":1208},"https:\u002F\u002Fgithub.com\u002Fdavidpesce\u002Fmoodle-logstore_xapi\u002Fblob\u002Fmaster\u002Fsrc\u002Floader\u002Fmoodle_curl_lrs.php","The loader sends 'X-Experience-API-Version: 1.0.3'. This is a statement emitter only — it writes to an LRS and does not implement the read side of the specification.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":1210},"No cmi5 launch, session or state handling in the tree; statements are emitted from Moodle events, not from a cmi5 AU session.\n","tools\u002Fmoodle-logstore-xapi","Turns Moodle log events into xAPI statements and posts them to an LRS",[1115,453,1116],"https:\u002F\u002Fmoodle.org\u002Fplugins\u002Fview\u002Flogstore_xapi","Fbl3IZMQTsMY2Rg0HM6Y1uoLCrqJyEYnKwo5Ldz6pME",{"id":1217,"title":1218,"addedAt":312,"alternatives":1219,"body":1220,"categories":1244,"checkedAt":312,"claimed":356,"description":1245,"docs":356,"editorsPick":359,"extension":360,"faq":1246,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":1253,"license":431,"listing":370,"logo":356,"meta":1254,"name":1255,"navigation":372,"openSource":372,"path":1256,"platforms":1257,"pricing":1258,"registries":1260,"repo":1261,"seo":1262,"standards":1263,"status":631,"stem":1267,"tagline":1268,"tags":1269,"vendor":1271,"website":1261,"__hash__":1272},"tools\u002Ftools\u002Fxapi-java.md","Xapi Java",[],{"type":315,"value":1221,"toc":1242},[1222,1233,1236,1239],[318,1223,1224,1225,1228,1229,1232],{},"A Java library in two parts: a model of the xAPI data types with the specification's validation rules built in, and a client for sending statements and documents to a learning record store. Both use a fluent builder interface and immutable objects, and the client is a Spring ",[322,1226,1227],{},"WebClient"," wrapper with auto-configuration, so in a Spring Boot service the endpoint and credentials become three properties in ",[322,1230,1231],{},"application.yml",".",[318,1234,1235],{},"It suits back-end systems that generate learning records — an LMS, an assessment engine, a simulation that reports outcomes — and it suits them well, because validation happens at the model boundary rather than being discovered when an LRS rejects a batch. The escape hatch matters too: real-world activity providers break the rules constantly, and individual validation constraints can be switched off, with the README stating plainly that doing so violates the specification.",[318,1237,1238],{},"Two things to check before adopting. Java 25 for the current line is aggressive, and the 1.x fallback for Java 17 will not receive the same attention. And the Spring dependency is not incidental — outside Spring you are using the model and writing your own transport.",[318,1240,1241],{},"Maintenance looks genuinely healthy for a project this size: commits within the last week, v2.0.2 released in May 2026, one open issue, and CodeQL and SonarCloud gates on the pipeline. Nineteen stars understate it; this is a small vendor's working library, not a weekend project.",{"title":352,"searchDepth":353,"depth":353,"links":1243},[],[176],"A Java library in two parts: a model of the xAPI data types with the specification's validation rules built in, and a client for sending statements and documents to a learning record store. Both use a fluent builder interface and immutable objects, and the client is a Spring WebClient wrapper with auto-configuration, so in a Spring Boot service the endpoint and credentials become three properties in application.yml.",[1247,1250],{"q":1248,"a":1249},"Can I use the model without the client?","Yes. The repository is a monorepo with two published artefacts — `xapi-model` and `xapi-client` — so an LRS implementation or a service that only needs to parse and validate statements can take the model alone.\n",{"q":1251,"a":1252},"What Java version does it need?","The 2.x line requires Java 25 or newer. Projects on Java 17 have to stay on the 1.x line, which is a real constraint in enterprise estates.\n","GB",{},"xAPI Java","\u002Ftools\u002Fxapi-java",[368],{"model":377,"source":1259},"https:\u002F\u002Fgithub.com\u002FBerryCloud\u002Fxapi-java\u002Fblob\u002Fmain\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FBerryCloud\u002Fxapi-java",{"description":1245},{"xapi":1264},{"supported":372,"provenance":383,"checkedAt":312,"source":1265,"note":1266},"https:\u002F\u002Fgithub.com\u002FBerryCloud\u002Fxapi-java\u002Fblob\u002Fmain\u002Fxapi-client\u002Fsrc\u002Fmain\u002Fjava\u002Fdev\u002Flearning\u002Fxapi\u002Fclient\u002FXapiClient.java","`XapiClient` sets `X-Experience-API-Version` to 1.0.3 as a default header. The model carries the specification's validation rules, which can be relaxed individually for non-conformant activity providers.\n","tools\u002Fxapi-java","Immutable xAPI model and Spring-based LRS client for Java, actively released",[575,1270,519],"spring","BerryCloud","ERlaCwXIBsiAWmel2XcVmY2PxRDiqczcASbBbvr_8Fs",{"id":1274,"title":1275,"addedAt":312,"alternatives":1276,"body":1277,"categories":1297,"checkedAt":312,"claimed":356,"description":1298,"docs":1299,"editorsPick":359,"extension":360,"faq":1300,"firstParty":359,"foundedYear":356,"hosting":368,"hqCountry":356,"license":369,"listing":370,"logo":356,"meta":1306,"name":399,"navigation":372,"openSource":372,"path":1307,"platforms":1308,"pricing":1309,"registries":1310,"repo":1311,"seo":1312,"standards":1313,"status":631,"stem":1319,"tagline":1320,"tags":1321,"vendor":356,"website":1299,"__hash__":1322},"tools\u002Ftools\u002Fxapi-js.md","Xapi Js",[],{"type":315,"value":1278,"toc":1295},[1279,1286,1289,1292],[318,1280,1281,1282,1285],{},"xAPI.js is the library to reach for when you are writing xAPI code in TypeScript and want the compiler to catch malformed statements before an LRS does. It covers the Statement, State, Agent Profile and Activity Profile resources, ships helpers for the awkward parts — ISO 8601 duration calculation, parsing TinCan and xAPI launch parameters out of the query string, basic-auth encoding — and lets you swap the HTTP layer between ",[322,1283,1284],{},"fetch"," and axios.",[318,1287,1288],{},"The typing is the point of difference. Most xAPI wrappers hand you an object and hope; here the statement shape, the verb constants and the resource paths are all declared, so the common failure mode of a statement rejected for a missing or mis-nested field becomes a build error.",[318,1290,1291],{},"It stops at xAPI 1.0.x. The version union in the source runs 1.0.0 to 1.0.3 and nothing wider, and cmi5 is a separate package under the same organisation rather than part of this one. Neither is a defect — the scope is deliberate — but it does mean this is a Statement API client, not a cmi5 runtime.",[318,1293,1294],{},"Fifty-one stars is modest for how widely it is quietly used; releases are irregular, with 3.0.0 in September 2024 and 3.0.3 in April 2026. That cadence suits a library whose target specification has not moved. Safe to depend on.",{"title":352,"searchDepth":353,"depth":353,"links":1296},[],[176],"xAPI.js is the library to reach for when you are writing xAPI code in TypeScript and want the compiler to catch malformed statements before an LRS does. It covers the Statement, State, Agent Profile and Activity Profile resources, ships helpers for the awkward parts — ISO 8601 duration calculation, parsing TinCan and xAPI launch parameters out of the query string, basic-auth encoding — and lets you swap the HTTP layer between fetch and axios.","https:\u002F\u002Fwww.xapijs.dev\u002Fxapi-wrapper-library",[1301,1303],{"q":500,"a":1302},"Not as of version 3.0.3. The version constant in the source enumerates 1.0.0 through 1.0.3 only. In practice most LRSs still accept 1.0.3 traffic, but if you specifically need 2.0 semantics this is not the client.\n",{"q":1304,"a":1305},"Can I use it from Node as well as the browser?","Yes. It ships adapters for both fetch and axios and resolves whichever is available, so the same code runs server-side and in content.\n",{},"\u002Ftools\u002Fxapi-js",[368,375],{"model":377,"currency":621,"freeTier":372},[],"https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fxapi",{"description":1298},{"xapi":1314,"cmi5":1317},{"supported":372,"provenance":383,"checkedAt":312,"source":1315,"note":1316},"https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fxapi\u002Fblob\u002Fdevelop\u002Fsrc\u002Fconstants\u002FVersions.ts","src\u002Fconstants\u002FVersions.ts declares the supported values as \"1.0.0\" | \"1.0.1\" | \"1.0.2\" | \"1.0.3\", and the client sets X-Experience-API-Version accordingly. xAPI 2.0 is not among them. Read in source, August 2026.\n",{"supported":359,"provenance":383,"checkedAt":312,"note":1318},"Not in this package. The maintainers publish cmi5 support separately as @xapi\u002Fcmi5 in the github.com\u002Fxapijs\u002Fcmi5 repository, which is not covered by this listing.\n","tools\u002Fxapi-js","Strongly typed TypeScript client for the xAPI 1.0 Statement and State APIs",[454,397,519],"Nac6dh4boyhji9PkIV33VgxOBKoYbwz4fOgJzV_7nX0",{"data":1324,"body":1325},{},{"type":1326,"children":1327},"root",[1328,1335,1362],{"type":1329,"tag":318,"props":1330,"children":1331},"element",{},[1332],{"type":1333,"value":1334},"text","SCORM records what happened inside a course, in a course's own terms, to the LMS that launched it. xAPI\nbreaks all three assumptions: any activity, anywhere, reported to any record store. cmi5 then puts the\ndiscipline back — it is an xAPI profile that restores the parts of SCORM an administrator actually needs,\na defined launch, a session, and rules for what counts as completion.",{"type":1329,"tag":318,"props":1336,"children":1337},{},[1338,1340,1346,1348,1353,1355,1360],{"type":1333,"value":1339},"This category holds the infrastructure. ",{"type":1329,"tag":1341,"props":1342,"children":1343},"strong",{},[1344],{"type":1333,"value":1345},"Learning record stores",{"type":1333,"value":1347}," receive, validate and serve statements;\nthey are ordinary databases with a specific API and specific conformance expectations, and several good\nopen-source ones exist. ",{"type":1329,"tag":1341,"props":1349,"children":1350},{},[1351],{"type":1333,"value":1352},"Client libraries",{"type":1333,"value":1354}," send statements from courses and applications. ",{"type":1329,"tag":1341,"props":1356,"children":1357},{},[1358],{"type":1333,"value":1359},"cmi5 tooling",{"type":1333,"value":1361},"\ncovers players, assignable-unit runtimes and the conformance test suite that decides whether an\nimplementation is real.",{"type":1329,"tag":318,"props":1363,"children":1364},{},[1365],{"type":1333,"value":1366},"A caution worth stating plainly, because it is the fact this directory most often has to correct: an xAPI\nendpoint is not cmi5 support. Receiving statements is the easy half. Honouring the AU lifecycle, the\nsession identifier and the moveOn rules is what makes a completion mean something — and it is what we\ncheck before recording cmi5 as supported.",1789388511184]