[{"data":1,"prerenderedAt":5900},["ShallowReactive",2],{"app-search-categories":3,"footer-categories":31,"tools-all":237},[4,7,10,13,16,19,22,25,28],{"slug":5,"name":6},"authoring-tools","Authoring tools & course frameworks",{"slug":8,"name":9},"converters-migration","Converters & migration",{"slug":11,"name":12},"players-runtimes-debuggers","Players, runtimes & debuggers",{"slug":14,"name":15},"testing-validation-conformance","Testing, validation & conformance",{"slug":17,"name":18},"packagers-sdks-libraries","Packagers, SDKs & libraries",{"slug":20,"name":21},"lms-and-plugins","LMS & LMS plugins",{"slug":23,"name":24},"xapi-cmi5","xAPI & cmi5",{"slug":26,"name":27},"distribution-licensing","Distribution, licensing & hosting",{"slug":29,"name":30},"analytics-tracking","Analytics & tracking",[32,56,79,102,125,148,171,194,217],{"id":33,"title":34,"extension":35,"faq":36,"icon":49,"intro":50,"meta":51,"name":6,"order":52,"slug":5,"stem":53,"tagline":54,"__hash__":55},"categories\u002Fcategories\u002Fauthoring-tools.yml","SCORM authoring tools and course frameworks","yml",[37,40,43,46],{"q":38,"a":39},"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":41,"a":42},"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":44,"a":45},"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":47,"a":48},"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",{},"1","categories\u002Fauthoring-tools","Where the course gets made — and where its SCORM output is decided.","CkWCyRM7Yrc2GVdbc65rAQjKCeNcgRzCqKcYYXPQVQk",{"id":57,"title":58,"extension":35,"faq":59,"icon":72,"intro":73,"meta":74,"name":9,"order":75,"slug":8,"stem":76,"tagline":77,"__hash__":78},"categories\u002Fcategories\u002Fconverters-migration.yml","SCORM converters and migration tools",[60,63,66,69],{"q":61,"a":62},"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":64,"a":65},"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":67,"a":68},"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":70,"a":71},"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",{},"2","categories\u002Fconverters-migration","Turning what you already have — decks, video, H5P, old packages — into something an LMS accepts.","l5wpzElL1rBxqlsmtpMVsuvZRxfSFas4hwwMc2CXT5o",{"id":80,"title":81,"extension":35,"faq":82,"icon":95,"intro":96,"meta":97,"name":12,"order":98,"slug":11,"stem":99,"tagline":100,"__hash__":101},"categories\u002Fcategories\u002Fplayers-runtimes-debuggers.yml","SCORM players, runtimes and debuggers",[83,86,89,92],{"q":84,"a":85},"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":87,"a":88},"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":90,"a":91},"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":93,"a":94},"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",{},"3","categories\u002Fplayers-runtimes-debuggers","Run a SCORM package outside an LMS — and watch what it actually does.","hcDF7H9nETO_B5A3g2eWnh5kzICgufiyMse4cjh7gHk",{"id":103,"title":104,"extension":35,"faq":105,"icon":118,"intro":119,"meta":120,"name":15,"order":121,"slug":14,"stem":122,"tagline":123,"__hash__":124},"categories\u002Fcategories\u002Ftesting-validation-conformance.yml","SCORM testing, validation and conformance tools",[106,109,112,115],{"q":107,"a":108},"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":110,"a":111},"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":113,"a":114},"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":116,"a":117},"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",{},"4","categories\u002Ftesting-validation-conformance","Prove a package is correct before a client's LMS proves it isn't.","NiGuliqtBVM9lTcU49a0WOVt0jMaZ2d1QAI3sJyZhdY",{"id":126,"title":127,"extension":35,"faq":128,"icon":141,"intro":142,"meta":143,"name":18,"order":144,"slug":17,"stem":145,"tagline":146,"__hash__":147},"categories\u002Fcategories\u002Fpackagers-sdks-libraries.yml","SCORM packagers, SDKs and libraries for developers",[129,132,135,138],{"q":130,"a":131},"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":133,"a":134},"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":136,"a":137},"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":139,"a":140},"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",{},"5","categories\u002Fpackagers-sdks-libraries","The pieces you build with when the course is an application, not a slide deck.","3KvCkFwRNYzh9-fZmEfQdmLiSCT3pp7bsS3eQcBnG6c",{"id":149,"title":150,"extension":35,"faq":151,"icon":164,"intro":165,"meta":166,"name":21,"order":167,"slug":20,"stem":168,"tagline":169,"__hash__":170},"categories\u002Fcategories\u002Flms-and-plugins.yml","Learning management systems with SCORM support",[152,155,158,161],{"q":153,"a":154},"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":156,"a":157},"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":159,"a":160},"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":162,"a":163},"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",{},"6","categories\u002Flms-and-plugins","Where the package finally has to run — and how well each platform actually implements the spec.","xW4Pab08lObiEGf6iWf0S-QGh8jj2jJWV3vWoKcRrFU",{"id":172,"title":173,"extension":35,"faq":174,"icon":187,"intro":188,"meta":189,"name":24,"order":190,"slug":23,"stem":191,"tagline":192,"__hash__":193},"categories\u002Fcategories\u002Fxapi-cmi5.yml","xAPI learning record stores and cmi5 tooling",[175,178,181,184],{"q":176,"a":177},"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":179,"a":180},"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":182,"a":183},"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":185,"a":186},"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",{},"7","categories\u002Fxapi-cmi5","The standards after SCORM — and the tools that actually implement them.","Z08AoeVOVPwRcuEk4GxjtdqYuXVacfkkSSQMb14CEP4",{"id":195,"title":196,"extension":35,"faq":197,"icon":210,"intro":211,"meta":212,"name":27,"order":213,"slug":26,"stem":214,"tagline":215,"__hash__":216},"categories\u002Fcategories\u002Fdistribution-licensing.yml","SCORM distribution, licensing and hosting platforms",[198,201,204,207],{"q":199,"a":200},"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":202,"a":203},"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":205,"a":206},"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":208,"a":209},"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",{},"8","categories\u002Fdistribution-licensing","Getting a course into someone else's LMS without giving away the course.","nkIpVD2NvqBC7m2F3MZ57C3AjDoCZ0eJjUNGd2oE9ZI",{"id":218,"title":219,"extension":35,"faq":220,"icon":230,"intro":231,"meta":232,"name":30,"order":233,"slug":29,"stem":234,"tagline":235,"__hash__":236},"categories\u002Fcategories\u002Fanalytics-tracking.yml","SCORM and xAPI analytics and tracking tools",[221,224,227],{"q":222,"a":223},"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":225,"a":226},"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":228,"a":229},"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",{},"9","categories\u002Fanalytics-tracking","Turning completion records into something worth reading.","eGUFwQLbgbMeYmVcG_VLX1KbidUQxzBPyNR2G2IyenU",{"tools":238,"categories":5837},[239,337,430,502,576,633,687,748,801,861,918,973,1030,1087,1158,1221,1280,1334,1403,1468,1529,1581,1645,1694,1765,1829,1894,1966,2031,2093,2159,2220,2279,2338,2401,2447,2499,2548,2619,2689,2762,2821,2900,2976,3045,3114,3174,3233,3297,3349,3414,3467,3536,3583,3644,3716,3775,3833,3888,3936,4016,4072,4128,4191,4254,4302,4347,4400,4458,4510,4591,4640,4692,4750,4797,4861,4920,5003,5056,5119,5189,5252,5326,5400,5456,5511,5558,5624,5682,5737,5787],{"id":240,"title":241,"addedAt":242,"alternatives":243,"body":246,"categories":292,"checkedAt":242,"claimed":293,"description":294,"docs":293,"editorsPick":295,"extension":296,"faq":297,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":307,"name":255,"navigation":308,"openSource":308,"path":309,"platforms":310,"pricing":312,"registries":315,"repo":316,"seo":317,"standards":318,"status":329,"stem":330,"tagline":331,"tags":332,"vendor":293,"website":316,"__hash__":336},"tools\u002Ftools\u002Fgamestdio-scorm.md","Gamestdio Scorm","2026-08-24",[244,245],"pipwerks-scorm-api-wrapper","scorm-again",{"type":247,"value":248,"toc":288},"minimark",[249,279,282],[250,251,252,256,257,260,261,260,264,260,267,270,271,274,275,278],"p",{},[253,254,255],"code",{},"@gamestdio\u002Fscorm"," is a small SCORM 1.2 \u002F 2004 run-time wrapper for JavaScript and TypeScript projects. It does one job: find the LMS API object in the frame chain, then expose ",[253,258,259],{},"initialize",", ",[253,262,263],{},"get",[253,265,266],{},"set",[253,268,269],{},"commit"," and ",[253,272,273],{},"terminate"," as an importable module rather than a global. Its stated reason for existing, in 2017, was that no SCORM wrapper had a modern module build — a real gap at the time, when the alternative was a script tag and a global ",[253,276,277],{},"pipwerks"," object.",[250,280,281],{},"That gap has since closed. The repository's last commit is February 2019 and the last npm release, 0.1.3, is from the same month. It is not archived, but seven years without a change to a library this small means what it says: nothing will be fixed. It still gets around a thousand npm downloads a month, which is a fair sign that it works — the underlying pipwerks algorithm has been stable since 2008 and there is very little surface to rot.",[250,283,284,285,287],{},"Use it if you want a dependency-free ES module and are content to own any problems yourself. Do not reach for it if you need the SCORM 2004 data model checked for you, error-code handling beyond a debug log, or a maintainer to file an issue with — ",[253,286,245],{}," covers that ground and is actively developed. As a compact, readable reference for how API discovery works, it remains a good file to open.",{"title":289,"searchDepth":290,"depth":290,"links":291},"",2,[],[17],null,"@gamestdio\u002Fscorm is a small SCORM 1.2 \u002F 2004 run-time wrapper for JavaScript and TypeScript projects. It does one job: find the LMS API object in the frame chain, then expose initialize, get, set, commit and terminate as an importable module rather than a global. Its stated reason for existing, in 2017, was that no SCORM wrapper had a modern module build — a real gap at the time, when the alternative was a script tag and a global pipwerks object.",false,"md",[298,301],{"q":299,"a":300},"How does it differ from the pipwerks wrapper it is based on?","Mainly in packaging. The README says the implementation is \"highly based on\" pipwerks, and the API-discovery code is recognisably the same algorithm rewritten in TypeScript with an ES module export. The behaviour you get at run time is the pipwerks behaviour.\n",{"q":302,"a":303},"Are the CMI element names type-checked?","No. `scorm.set()` and `scorm.get()` take plain strings, so a typo in `cmi.core.lesson_status` is still a run-time error. The TypeScript here buys you module ergonomics, not data-model safety.\n","library","MIT","full",{},true,"\u002Ftools\u002Fgamestdio-scorm",[304,311],"web",{"model":313,"source":314},"open-source","https:\u002F\u002Fgithub.com\u002Fgamestdio\u002Fscorm\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fgamestdio\u002Fscorm",{"description":294},{"scorm12":319,"scorm2004":323,"xapi":326,"cmi5":327,"aicc":328},{"supported":308,"provenance":320,"checkedAt":242,"source":321,"note":322},"editor-checked","https:\u002F\u002Fgithub.com\u002Fgamestdio\u002Fscorm\u002Fblob\u002Fmaster\u002Fsrc\u002Findex.ts","The API finder walks parent and opener windows for `window.API` and sets the detected version to `1.2`; the data-model calls are passed through untyped, so `cmi.core.*` element names are the caller's responsibility.\n",{"supported":308,"editions":324,"provenance":320,"checkedAt":242,"source":321,"note":325},[],"Finds `window.API_1484_11` and prefers it over the 1.2 API when both are present. Nothing in the code distinguishes 2004 editions — the run-time signature is identical across them and sequencing is left to the LMS.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"stale","tools\u002Fgamestdio-scorm","A TypeScript port of the pipwerks wrapper, published once in 2019 and untouched since",[333,334,335],"typescript","javascript","wrapper","vy_R2KLRiChKTg0UDhq7t4bDeqNg3LG8a7UljUhCbcM",{"id":338,"title":339,"addedAt":242,"alternatives":340,"body":341,"categories":398,"checkedAt":242,"claimed":293,"description":399,"docs":400,"editorsPick":295,"extension":296,"faq":401,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":405,"name":406,"navigation":308,"openSource":308,"path":407,"platforms":408,"pricing":409,"registries":411,"repo":410,"seo":412,"standards":413,"status":423,"stem":424,"tagline":425,"tags":426,"vendor":293,"website":410,"__hash__":429},"tools\u002Ftools\u002Fstudiolxd-scorm.md","Studiolxd Scorm",[],{"type":247,"value":342,"toc":396},[343,357,382,385],[250,344,345,346,270,349,352,353,356],{},"This is a content-side wrapper: the thing your course imports so it can talk to whatever LMS launched it. A framework-agnostic core locates the API object by walking ",[253,347,348],{},"window.parent",[253,350,351],{},"opener",", then exposes one typed session over either SCORM 1.2 or SCORM 2004, with thin adapters for React, Vue, Angular, Svelte, Web Components and a plain ",[253,354,355],{},"\u003Cscript>"," global.",[250,358,359,360,260,363,270,366,369,370,373,374,377,378,381],{},"The useful part is the abstraction over the two data models. Calls such as ",[253,361,362],{},"setComplete()",[253,364,365],{},"setScore()",[253,367,368],{},"setExit('suspend')"," map to ",[253,371,372],{},"cmi.core.lesson_status"," under 1.2 and ",[253,375,376],{},"cmi.completion_status"," \u002F ",[253,379,380],{},"cmi.success_status"," under 2004, so a course written once can be exported for either. Typed CMI path builders and mock drivers mean the whole integration can be developed and unit-tested without an LMS, and the repository carries a real test suite covering both drivers and every adapter.",[250,383,384],{},"What it is not: an LMS-side implementation, a packager, or a manifest generator. It will not build you a zip, and there is no xAPI or cmi5 path — this is SCORM only.",[250,386,387,388,391,392,395],{},"Judgement for someone choosing today: the code is careful and the API surface is well documented in six languages, but this is a new project by one studio, first published in February 2026, renamed from ",[253,389,390],{},"@studiolxd\u002Freact-scorm"," at v2.0.0 and carrying no community yet. The MIT licence file sits inside ",[253,393,394],{},"packages\u002Fscorm",", not the repository root, so GitHub reports the repo as unlicensed. Reasonable to adopt if you are prepared to read the source; too young to treat as infrastructure.",{"title":289,"searchDepth":290,"depth":290,"links":397},[],[17],"This is a content-side wrapper: the thing your course imports so it can talk to whatever LMS launched it. A framework-agnostic core locates the API object by walking window.parent and opener, then exposes one typed session over either SCORM 1.2 or SCORM 2004, with thin adapters for React, Vue, Angular, Svelte, Web Components and a plain \u003Cscript> global.","https:\u002F\u002Fgithub.com\u002Fstudiolxd\u002Fscorm\u002Fblob\u002Fmain\u002Fpackages\u002Fscorm\u002FREADME.md",[402],{"q":403,"a":404},"Can I develop against it without an LMS?","Yes. The package ships mock drivers (MockScorm12Api, MockScorm2004Api) that stand in for the LMS-supplied API object, so a course can be run and its calls exercised on a local dev server.\n",{},"@studiolxd\u002Fscorm","\u002Ftools\u002Fstudiolxd-scorm",[304,311],{"model":313,"source":410},"https:\u002F\u002Fgithub.com\u002Fstudiolxd\u002Fscorm",[],{"description":399},{"scorm12":414,"scorm2004":416,"xapi":421,"cmi5":422},{"supported":308,"provenance":320,"checkedAt":242,"source":415},"https:\u002F\u002Fgithub.com\u002Fstudiolxd\u002Fscorm\u002Fblob\u002Fmain\u002Fpackages\u002Fscorm\u002Fsrc\u002Fcore\u002Fscorm12-driver.ts",{"supported":308,"editions":417,"provenance":320,"checkedAt":242,"source":419,"note":420},[418],"4th","https:\u002F\u002Fgithub.com\u002Fstudiolxd\u002Fscorm\u002Fblob\u002Fmain\u002Fpackages\u002Fscorm\u002Fsrc\u002Ftypes\u002Fcommon.ts","The 2004 driver targets the window.API_1484_11 object and the 4th Edition RTE; earlier editions are not distinguished in code.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"active","tools\u002Fstudiolxd-scorm","Headless SCORM 1.2 and 2004 runtime with React, Vue, Angular, Svelte and Web Component adapters",[334,333,427,428],"runtime","content-side","PTJfy8djcv6kQ_HBa0T6ofG0PEF9nw_HHg9i9Ixkq7Y",{"id":431,"title":432,"addedAt":242,"alternatives":433,"body":434,"categories":478,"checkedAt":242,"claimed":293,"description":479,"docs":293,"editorsPick":295,"extension":296,"faq":480,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":481,"name":482,"navigation":308,"openSource":308,"path":483,"platforms":484,"pricing":485,"registries":487,"repo":486,"seo":488,"standards":489,"status":329,"stem":496,"tagline":497,"tags":498,"vendor":293,"website":486,"__hash__":501},"tools\u002Ftools\u002Fszenadam-scorm-api-wrapper.md","Szenadam Scorm Api Wrapper",[],{"type":247,"value":435,"toc":476},[436,459,466,469],[250,437,438,439,260,441,260,443,260,445,260,448,270,451,454,455,458],{},"This is a single TypeScript file — one class, roughly 300 lines — that finds the SCORM API object in a parent or opener window and gives you ",[253,440,259],{},[253,442,263],{},[253,444,266],{},[253,446,447],{},"status",[253,449,450],{},"save",[253,452,453],{},"quit"," over it. The README states plainly that it is a reimplementation of the widely-used pipwerks wrapper, and the repository keeps both of the original JavaScript files under ",[253,456,457],{},"references\u002F"," for comparison. It is not a fork: the logic was rewritten as a class with typed returns and private members, then tested with Jest.",[250,460,461,462,465],{},"The audience is narrow but real: a TypeScript project that wants the pipwerks behaviour without a ",[253,463,464],{},"declare module"," shim or a hand-written type file. If you do not need types, the original is better attended.",[250,467,468],{},"What it is not good for is anything beyond the run-time API. There is no packaging, no manifest generation, no sequencing, no offline queueing, and no handling of the LMS-specific quirks that make production SCORM integration awkward.",[250,470,471,472,475],{},"Weigh the maintenance state before adopting it. The last commit to ",[253,473,474],{},"master"," was a Dependabot merge in December 2022, npm shows version 1.1.1 from April 2022, and the project has eight stars and no open issues. Nothing here is broken, but nothing will be fixed either — treat it as source to read and vendor rather than a dependency to track.",{"title":289,"searchDepth":290,"depth":290,"links":477},[],[17],"This is a single TypeScript file — one class, roughly 300 lines — that finds the SCORM API object in a parent or opener window and gives you initialize, get, set, status, save and quit over it. The README states plainly that it is a reimplementation of the widely-used pipwerks wrapper, and the repository keeps both of the original JavaScript files under references\u002F for comparison. It is not a fork: the logic was rewritten as a class with typed returns and private members, then tested with Jest.",[],{},"@szenadam\u002Fscorm-api-wrapper","\u002Ftools\u002Fszenadam-scorm-api-wrapper",[304],{"model":313,"source":486},"https:\u002F\u002Fgithub.com\u002Fszenadam\u002Fscorm-api-wrapper",[],{"description":479},{"scorm12":490,"scorm2004":493},{"supported":308,"provenance":320,"checkedAt":242,"source":491,"note":492},"https:\u002F\u002Fgithub.com\u002Fszenadam\u002Fscorm-api-wrapper\u002Fblob\u002Fmaster\u002Fsrc\u002FScormApiWrapper.ts","The wrapper searches parent and opener windows for an `API` object and branches on a `1.2` case throughout get, set, status and commit.\n",{"supported":308,"editions":494,"provenance":320,"checkedAt":242,"source":491,"note":495},[],"Finds `API_1484_11` and branches on a `2004` case. The run-time API is the same across 2004 editions, so no edition is claimed here.\n","tools\u002Fszenadam-scorm-api-wrapper","A TypeScript reimplementation of the pipwerks SCORM wrapper, published to npm",[333,499,500],"api-wrapper","npm","zXUV-JIu1sG3A-3hwL-s9cQhY_Hq4rJP1Gp5yJ0Nj7g",{"id":503,"title":504,"addedAt":242,"alternatives":505,"body":506,"categories":541,"checkedAt":242,"claimed":293,"description":542,"docs":543,"editorsPick":295,"extension":296,"faq":544,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":551,"name":513,"navigation":308,"openSource":308,"path":552,"platforms":553,"pricing":554,"registries":555,"repo":556,"seo":557,"standards":558,"status":568,"stem":569,"tagline":570,"tags":571,"vendor":573,"website":574,"__hash__":575},"tools\u002Ftools\u002Fxapi-cmi5-library.md","Xapi Cmi5 Library",[],{"type":247,"value":507,"toc":539},[508,530,533,536],[250,509,510,511,514,515,518,519,260,522,525,526,529],{},"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. ",[253,512,513],{},"@xapi\u002Fcmi5"," does that for you: construct the class, call ",[253,516,517],{},"initialize()",", and issue ",[253,520,521],{},"pass()",[253,523,524],{},"complete()"," or ",[253,527,528],{},"waive()"," at the right moments.",[250,531,532],{},"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.",[250,534,535],{},"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.",[250,537,538],{},"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":289,"searchDepth":290,"depth":290,"links":540},[],[23],"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",[545,548],{"q":546,"a":547},"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":549,"a":550},"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",{},"\u002Ftools\u002Fxapi-cmi5-library",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fcmi5",{"description":542},{"cmi5":559,"xapi":562,"scorm12":565,"scorm2004":566},{"supported":308,"provenance":320,"checkedAt":242,"source":560,"note":561},"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":308,"provenance":320,"checkedAt":242,"source":563,"note":564},"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":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":567,"provenance":320,"checkedAt":242},[],"maintained","tools\u002Fxapi-cmi5-library","A typed JavaScript client that handles the cmi5 handshake for you inside a course",[572,333,334,304],"cmi5","xAPI.js","https:\u002F\u002Fwww.xapijs.dev\u002Fcmi5-profile-library","Gqa6_e4HQsAStNXkcm5AtdgBSsH0eBwRgv1qhgtbBJE",{"id":577,"title":578,"addedAt":242,"alternatives":579,"body":581,"categories":594,"checkedAt":242,"claimed":293,"description":585,"docs":595,"editorsPick":295,"extension":296,"faq":596,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":604,"license":605,"listing":306,"logo":293,"meta":606,"name":607,"navigation":308,"openSource":308,"path":608,"platforms":609,"pricing":611,"registries":612,"repo":613,"seo":614,"standards":615,"status":568,"stem":624,"tagline":625,"tags":626,"vendor":631,"website":613,"__hash__":632},"tools\u002Ftools\u002Fadl-lrs.md","Adl Lrs",[580],"sql-lrs",{"type":247,"value":582,"toc":592},[583,586,589],[250,584,585],{},"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.",[250,587,588],{},"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.",[250,590,591],{},"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":289,"searchDepth":290,"depth":290,"links":593},[],[23],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FADL_LRS\u002Fwiki",[597,600],{"q":598,"a":599},"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":601,"a":602},"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",[610,311],"linux",{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FADL_LRS",{"description":585},{"xapi":616,"cmi5":619,"scorm12":621,"scorm2004":622},{"supported":308,"provenance":320,"checkedAt":242,"source":617,"note":618},"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":295,"provenance":320,"checkedAt":242,"note":620},"Statement storage only. There is no cmi5 launch handling in the codebase.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":623,"provenance":320,"checkedAt":242},[],"tools\u002Fadl-lrs","ADL's own open-source learning record store, now tracking xAPI 2.0",[627,628,629,630],"lrs","xapi","reference-implementation","python","Advanced Distributed Learning Initiative","UturZcjdfehbQq-jU-0QbKryL_FYzg7fW-b0CbgyeXI",{"id":634,"title":635,"addedAt":242,"alternatives":636,"body":637,"categories":653,"checkedAt":242,"claimed":293,"description":641,"docs":293,"editorsPick":295,"extension":296,"faq":654,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":661,"name":662,"navigation":308,"openSource":308,"path":663,"platforms":664,"pricing":666,"registries":668,"repo":669,"seo":670,"standards":671,"status":329,"stem":680,"tagline":681,"tags":682,"vendor":631,"website":669,"__hash__":686},"tools\u002Ftools\u002Fadl-scorm-2004-test-suite.md","Adl Scorm 2004 Test Suite",[],{"type":247,"value":638,"toc":651},[639,642,645,648],[250,640,641],{},"This is the reference against which SCORM 2004 4th Edition conformance was defined: the LMS test, content package test, SCO test and manifest test written by ADL, the body that wrote the specification. Where every other testing tool in this directory represents somebody's interpretation of the standard, this one is the standard's own interpretation, which is why it is worth knowing about even if you never run it.",[250,643,644],{},"Running it is another matter. The repository was published in 2015 so that developers could adapt the source to their own environments, and it has not been touched since. The documented prerequisites are Internet Explorer 8 or older and the Java 6 applet runtime; building from source additionally wants Ant 1.7.1 and a code-signing certificate for the applets. Both browser plug-in Java and IE are gone from supported platforms, so this is a virtual-machine exercise for someone who has a specific reason — settling an argument about correct sequencer behaviour, or reproducing a historical certification result.",[250,646,647],{},"Two practical notes. ADL's own hosting for the suite did not respond when we checked on 24 August 2026, which makes the GitHub copy the dependable source. And the repository carries no LICENSE file, but the README reproduces the Apache 2.0 grant with a 2014 ADL copyright.",[250,649,650],{},"For day-to-day package validation, use a maintained tool. Keep this one for questions only the source of truth can answer.",{"title":289,"searchDepth":290,"depth":290,"links":652},[],[14],[655,658],{"q":656,"a":657},"Can this still be run on a current machine?","Not without effort. The README's stated prerequisites are Internet Explorer 8 \"or a lesser version\" and the Java 6 update 10 runtime, and building it needs the Java 6 JDK, Ant 1.7.1 and a code-signing keystore for the applets. Expect a virtual machine, not an afternoon.\n",{"q":659,"a":660},"Does passing it still mean anything?","It is still the definitive statement of what 4th Edition conformance means, and vendors' historical certification claims trace back to it. Treat a pass today as a self-test rather than a certificate: you are running the suite yourself, with no certifying body involved.\n",{},"ADL SCORM 2004 4th Edition Test Suite","\u002Ftools\u002Fadl-scorm-2004-test-suite",[665,311],"windows",{"model":313,"source":667},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-2004-4ed-Test-Suite#license",[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-2004-4ed-Test-Suite",{"description":641},{"scorm2004":672,"scorm12":676,"xapi":678,"cmi5":679},{"supported":308,"editions":673,"provenance":320,"checkedAt":242,"source":674,"note":675},[418],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-2004-4ed-Test-Suite#readme","The suite is the 4th Edition conformance test itself, published by ADL — the body that wrote the specification. It contains an LMS test, a content package test, a SCO test and a manifest test, plus a utility that checks a package against a content-package test log.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":677},"SCORM 1.2 had its own separate test suite; this repository does not contain it.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fadl-scorm-2004-test-suite","The official conformance suite for SCORM 2004 4th Edition, frozen in 2015 and built for IE8",[683,684,685],"conformance","java","reference","9_HKQNp4v2VnyRtf4QSXgVyaTMPT42A2D-0Z7X9wtr8",{"id":688,"title":689,"addedAt":242,"alternatives":690,"body":691,"categories":722,"checkedAt":242,"claimed":293,"description":723,"docs":724,"editorsPick":295,"extension":296,"faq":725,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":729,"name":730,"navigation":308,"openSource":308,"path":731,"platforms":732,"pricing":733,"registries":735,"repo":736,"seo":737,"standards":738,"status":329,"stem":742,"tagline":743,"tags":744,"vendor":631,"website":736,"__hash__":747},"tools\u002Ftools\u002Fadl-xapiwrapper.md","Adl Xapiwrapper",[],{"type":247,"value":692,"toc":720},[693,704,707,717],[250,694,695,696,699,700,703],{},"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 ",[253,697,698],{},"more"," links. It ships with ADL Verbs and a statement helper in the same ",[253,701,702],{},"ADL"," object, and there is a self-contained minified build for dropping into a course.",[250,705,706],{},"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.",[250,708,709,710,712,713,716],{},"What it is not good for is a new production integration. The ",[253,711,474],{}," 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 ",[253,714,715],{},"TextEncoder"," shim for old Edge. Around twenty issues sit open.",[250,718,719],{},"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":289,"searchDepth":290,"depth":290,"links":721},[],[23],"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",[726],{"q":727,"a":728},"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",[311,304],{"model":313,"source":734},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FxAPIWrapper\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FxAPIWrapper",{"description":723},{"xapi":739},{"supported":308,"provenance":320,"checkedAt":242,"source":740,"note":741},"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","tools\u002Fadl-xapiwrapper","ADL's own JavaScript wrapper for talking to an LRS, built against xAPI 1.0.1",[334,745,746],"lrs-client","adl","SJeYKmO1ACVUQfr47df0thZOGUk4N82BTDr3lH6CKSU",{"id":749,"title":750,"addedAt":242,"alternatives":751,"body":752,"categories":768,"checkedAt":242,"claimed":293,"description":756,"docs":769,"editorsPick":295,"extension":296,"faq":770,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":777,"listing":306,"logo":293,"meta":778,"name":750,"navigation":308,"openSource":308,"path":779,"platforms":780,"pricing":781,"registries":783,"repo":782,"seo":784,"standards":785,"status":423,"stem":793,"tagline":794,"tags":795,"vendor":798,"website":799,"__hash__":800},"tools\u002Ftools\u002Fadapt-authoring-tool.md","Adapt Authoring Tool",[],{"type":247,"value":753,"toc":766},[754,757,760,763],[250,755,756],{},"The Adapt Authoring Tool is the browser-based front end to the Adapt framework, the open-source project behind a large share of responsive, single-column e-learning built in the last decade. Authors assemble courses from components — text, media, questions, assessments — configure them through generated forms, upload assets, and publish a zip.",[250,758,759],{},"Its strengths are the framework's: genuinely responsive output, a substantial community plugin catalogue, and no per-author licence. For organisations producing high volumes of standard interactive content with in-house teams, it remains one of the few credible open alternatives to Storyline or Rise, and the only one with a comparable component ecosystem.",[250,761,762],{},"Two honest caveats. First, SCORM is not part of this repository; it arrives through the Spoor extension, which is the piece to inspect if you care about which editions you can ship. Second, operating it is a real commitment — Node.js, MongoDB, a plugin registry to keep coherent, and upgrades that touch both the tool and the framework.",[250,764,765],{},"Maintenance is steady but slower than the star count implies. Commits continue through 2026, yet the last tagged release, v0.11.5, was January 2025 and much community energy has moved to the framework itself. It is not abandoned; it is mature, and changing slowly. For a new project starting today, check that the components you need are still maintained before you commit.",{"title":289,"searchDepth":290,"depth":290,"links":767},[],[5],"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt_authoring\u002Fwiki",[771,774],{"q":772,"a":773},"Where does the SCORM output actually come from?","From adapt-contrib-spoor, a framework extension installed into the authoring tool's plugin set. The authoring tool builds the course and zips the output directory; Spoor is what puts a manifest and an API wrapper in it. If Spoor is not enabled for a course, the zip is a plain HTML5 site.\n",{"q":775,"a":776},"Is it usable by non-developers?","Authoring, yes — that is the point of it. Installing and operating it, no. Node.js, MongoDB, a build step per publish and a plugin registry to curate; most organisations put it behind an internal team or buy a hosted instance from a vendor in the Adapt ecosystem.\n","GPL-3.0",{},"\u002Ftools\u002Fadapt-authoring-tool",[311],{"model":313,"freeTier":308,"source":782},"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt_authoring",[],{"description":756},{"scorm12":786,"scorm2004":789},{"supported":308,"provenance":320,"checkedAt":242,"source":787,"note":788},"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt-contrib-spoor\u002Fblob\u002Fmaster\u002Fscorm\u002F1.2\u002Fimsmanifest.xml","Tracking comes from the adapt-contrib-spoor extension, not the authoring tool itself. Spoor ships a schemaversion 1.2 manifest and the 1.2 XSDs, and 1.2 is its default output.\n",{"supported":308,"editions":790,"provenance":320,"checkedAt":242,"source":791,"note":792},[418],"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt-contrib-spoor\u002Fblob\u002Fmaster\u002Fscorm\u002F2004\u002Fimsmanifest.xml","Spoor's 2004 manifest declares '2004 4th Edition'. Other editions require swapping the bundled schema files by hand — the extension's own documentation says so.\n","tools\u002Fadapt-authoring-tool","Self-hosted web UI for the Adapt framework, publishing responsive HTML5 courses",[796,603,797],"responsive","nodejs","Adapt Learning community","https:\u002F\u002Fwww.adaptlearning.org","-O2JKrvftbflht9_YhlBSZ2ExtDGI6EXhQtGZbxYKqU",{"id":802,"title":803,"addedAt":242,"alternatives":804,"body":805,"categories":824,"checkedAt":242,"claimed":293,"description":809,"docs":825,"editorsPick":295,"extension":296,"faq":826,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":777,"listing":306,"logo":293,"meta":833,"name":803,"navigation":308,"openSource":308,"path":834,"platforms":835,"pricing":837,"registries":839,"repo":840,"seo":841,"standards":842,"status":423,"stem":854,"tagline":855,"tags":856,"vendor":293,"website":799,"__hash__":860},"tools\u002Ftools\u002Fadapt-framework.md","Adapt Framework",[],{"type":247,"value":806,"toc":822},[807,810,813,816,819],[250,808,809],{},"Adapt builds single-file responsive HTML5 courses from JSON. You assemble a course from components — text, media, questions, assessments — configure them as data, and run a Grunt build that produces either a web-servable course or an LMS package. It has been going since 2013, is used widely in UK public-sector and corporate learning, and is one of the few open-source options a commercial e-learning team can credibly standardise on.",[250,811,812],{},"Its strongest claim is accessibility. The core components target WAI AA, right-to-left layouts and localisation are handled properly, and that work is visible in the codebase rather than asserted in marketing copy. Step locking, bookmarking, question banks and assessment feedback are all built in.",[250,814,815],{},"Tracking is deliberately not core. SCORM is the job of the Spoor plugin and xAPI of a separate plugin, which keeps the framework honest but means standards behaviour is configured a layer away from the course.",[250,817,818],{},"It is a poor fit for non-developers working alone: this is a Node toolchain, a JSON data model and a theme to write, not a drag-and-drop editor. Nor is it the right tool for a one-off five-slide module.",[250,820,821],{},"The project is plainly alive — commits this month, v5.56.2 in April 2026, an active plugin ecosystem and a governed core team.",{"title":289,"searchDepth":290,"depth":290,"links":823},[],[5],"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt_framework\u002Fwiki",[827,830],{"q":828,"a":829},"Is this the same thing as the Adapt authoring tool?","No. This repository is the framework — a command-line build that turns JSON course data and plugins into an HTML5 package. The browser-based authoring tool is a separate project, `adapt_authoring`, built on top of it. Developers generally want the framework; authors generally want the tool.\n",{"q":831,"a":832},"How do I test tracking without an LMS?","Spoor installs a `scorm_test_harness.html` that stores LMS state in a browser cookie, and `grunt server-scorm` serves the course through it. Holding d+e+v opens a window showing the SCORM calls being made.\n",{},"\u002Ftools\u002Fadapt-framework",[311,836],"cli",{"model":313,"source":838},"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt_framework\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt_framework",{"description":809},{"scorm12":843,"scorm2004":846,"xapi":850},{"supported":308,"provenance":320,"checkedAt":242,"source":844,"note":845},"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt-contrib-spoor\u002Ftree\u002Fmaster\u002Fscorm\u002F1.2","Emitted by the bundled Spoor plugin, which ships the SCORM 1.2 schema set and manifest and uses the pipwerks wrapper at run time. 1.2 is the default output.\n",{"supported":308,"editions":847,"provenance":320,"checkedAt":242,"source":848,"note":849},[418],"https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt-contrib-spoor\u002Ftree\u002Fmaster\u002Fscorm\u002F2004","Spoor ships one 2004 schema set, documented as 4th Edition, selected with `_scormVersion: \"2004\"`. Other editions require swapping the files in by hand.\n",{"supported":308,"provenance":851,"checkedAt":242,"source":852,"note":853},"vendor-stated","https:\u002F\u002Fgithub.com\u002Fadaptlearning\u002Fadapt_framework#features","Claimed in the framework README, delivered by the separate adapt-contrib-xapi plugin rather than the core. Not verified against an LRS here.\n","tools\u002Fadapt-framework","Responsive HTML5 course framework whose SCORM output is a bundled plugin",[857,858,859],"html5","accessibility","framework","ExXO-ldLWhEFFhJMASDxxYC0zeo927DkEBHcaXqOkwI",{"id":862,"title":863,"addedAt":242,"alternatives":864,"body":867,"categories":883,"checkedAt":242,"claimed":293,"description":871,"docs":884,"editorsPick":295,"extension":296,"faq":885,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":892,"listing":306,"logo":293,"meta":893,"name":894,"navigation":308,"openSource":308,"path":895,"platforms":896,"pricing":897,"registries":899,"repo":900,"seo":901,"standards":902,"status":329,"stem":911,"tagline":912,"tags":913,"vendor":916,"website":900,"__hash__":917},"tools\u002Ftools\u002Fopenlrw.md","Openlrw",[865,580,866],"learning-locker","ralph-lrs",{"type":247,"value":868,"toc":881},[869,872,875,878],[250,870,871],{},"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.",[250,873,874],{},"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.",[250,876,877],{},"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.",[250,879,880],{},"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":289,"searchDepth":290,"depth":290,"links":882},[],[23],"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW\u002Fblob\u002Fmaster\u002Fdocs\u002Findex.md",[886,889],{"q":887,"a":888},"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":890,"a":891},"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",[610,311],{"model":313,"source":898},"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FApereo-Learning-Analytics-Initiative\u002FOpenLRW",{"description":871},{"xapi":903,"cmi5":906,"scorm12":908,"scorm2004":909},{"supported":308,"provenance":320,"checkedAt":242,"source":904,"note":905},"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":295,"provenance":320,"checkedAt":242,"note":907},"No cmi5 code or launch handling anywhere in the repository.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":910,"provenance":320,"checkedAt":242},[],"tools\u002Fopenlrw","Java learning record warehouse for xAPI, Caliper and OneRoster data, dormant since 2020",[627,684,914,915],"caliper","learning-analytics","Apereo Foundation","5V4arQh2re2uY7GwRUCwt4lQVuZbyS0D8SvoJbCSg-I",{"id":919,"title":920,"addedAt":242,"alternatives":921,"body":923,"categories":943,"checkedAt":242,"claimed":293,"description":944,"docs":945,"editorsPick":295,"extension":296,"faq":946,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":604,"license":605,"listing":306,"logo":293,"meta":953,"name":954,"navigation":308,"openSource":308,"path":955,"platforms":956,"pricing":957,"registries":959,"repo":960,"seo":961,"standards":962,"status":423,"stem":968,"tagline":969,"tags":970,"vendor":631,"website":960,"__hash__":972},"tools\u002Ftools\u002Fcatapult.md","Catapult",[922],"cmi5-js",{"type":247,"value":924,"toc":941},[925,932,935,938],[250,926,927,928,931],{},"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: ",[253,929,930],{},"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.",[250,933,934],{},"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.",[250,936,937],{},"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.",[250,939,940],{},"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":289,"searchDepth":290,"depth":290,"links":942},[],[23],"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",[947,950],{"q":948,"a":949},"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":951,"a":952},"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",[311,836,304],{"model":313,"currency":958,"freeTier":308},"USD",[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FCATAPULT",{"description":944},{"cmi5":963,"xapi":966},{"supported":308,"provenance":320,"checkedAt":242,"source":964,"note":965},"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":308,"provenance":320,"checkedAt":242,"note":967},"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","tools\u002Fcatapult","ADL's cmi5 player, content test suite and LMS test suite in one repository",[572,683,971],"player","RpMUXL-oa5c27fDJGO-y2LYEBIqzVV_Cncyd2vwITlo",{"id":974,"title":975,"addedAt":242,"alternatives":976,"body":977,"categories":993,"checkedAt":242,"claimed":293,"description":981,"docs":994,"editorsPick":295,"extension":296,"faq":995,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":604,"license":1002,"listing":306,"logo":293,"meta":1003,"name":1004,"navigation":308,"openSource":308,"path":1005,"platforms":1006,"pricing":1007,"registries":1009,"repo":1008,"seo":1010,"standards":1011,"status":423,"stem":1022,"tagline":1023,"tags":1024,"vendor":1027,"website":1028,"__hash__":1029},"tools\u002Ftools\u002Fcanvas-lms.md","Canvas Lms",[],{"type":247,"value":978,"toc":991},[979,982,985,988],[250,980,981],{},"Canvas is the LMS with the largest open-source footprint in higher education, developed in the open by Instructure under AGPL-3.0 and pushed to daily. For a directory concerned with standards, the interesting question is not whether it is good software — it plainly is — but which standards the published code actually implements.",[250,983,984],{},"The answer is LTI, thoroughly. Both the legacy 1.1 signing path and the full 1.3 stack are present: OIDC login, JWK storage, deep linking, and LTI Advantage services including grade passback. If you are building a SCORM or cmi5 player and want it to appear inside a mainstream LMS, Canvas is one of the best-documented platforms to certify against.",[250,986,987],{},"SCORM is the gap, and it is a widely misreported one. Canvas identifies SCORM 1.1, 1.2 and 2004 manifests during content migration, then fails, because no converter is registered for them in the open-source tree. Content packaging support here means Common Cartridge, not SCORM.",[250,989,990],{},"For a buyer that distinction is the whole decision. Canvas plus a SCORM player registered over LTI is a normal, well-trodden architecture — but it is two products, two licences and two support relationships, and anyone who costed the deployment on the assumption that SCORM came in the box has costed it wrong.",{"title":289,"searchDepth":290,"depth":290,"links":992},[],[20],"https:\u002F\u002Fgithub.com\u002Finstructure\u002Fcanvas-lms\u002Fwiki",[996,999],{"q":997,"a":998},"So can Canvas run a SCORM course or not?","Not from this repository alone. The usual route is an LTI tool that hosts the package and reports a grade back — Instructure's own paid SCORM offering, or a third-party player registered as an external tool. Because Canvas is a capable LTI 1.3 platform, that route works well; it is simply not what \"open-source Canvas supports SCORM\" would imply.\n",{"q":1000,"a":1001},"Is self-hosting it realistic?","It is a large Rails application with Postgres, Redis and a background job tier, released continuously rather than in versions. Institutions do run it, but budget for a platform team; most Canvas users buy the hosted service.\n","AGPL-3.0",{},"Canvas LMS","\u002Ftools\u002Fcanvas-lms",[311],{"model":313,"freeTier":308,"source":1008},"https:\u002F\u002Fgithub.com\u002Finstructure\u002Fcanvas-lms",[],{"description":981},{"scorm12":1012,"scorm2004":1015,"lti":1016},{"supported":295,"provenance":320,"checkedAt":242,"source":1013,"note":1014},"https:\u002F\u002Fgithub.com\u002Finstructure\u002Fcanvas-lms\u002Fblob\u002Fmaster\u002Flib\u002Fcanvas\u002Fmigration\u002Fpackage_identifier.rb","The open-source code recognises a SCORM 1.1, 1.2 or 2004 manifest by namespace, but no converter plugin is registered for those types — only QTI, Moodle and Academic Benchmark are — so the import raises UnsupportedPackage. SCORM playback on Instructure's hosted Canvas is a separately licensed add-on and is not this repository.\n",{"supported":295,"provenance":320,"checkedAt":242,"source":1013},{"supported":308,"versions":1017,"provenance":320,"checkedAt":242,"source":1020,"note":1021},[1018,1019],"1.1","1.3","https:\u002F\u002Fgithub.com\u002Finstructure\u002Fcanvas-lms\u002Ftree\u002Fmaster\u002Flib\u002Flti","lib\u002Flti carries both a v1p1 signing path and the 1.3 stack — OIDC login, key storage, deep linking and LTI Advantage access tokens.\n","tools\u002Fcanvas-lms","Instructure's open-source LMS — a strong LTI platform, with no SCORM engine in the repo",[1025,603,1026],"lms","lti","Instructure, Inc.","https:\u002F\u002Fwww.instructure.com\u002Fcanvas","qP_nGCSZt85msNMAuvOE2etD-3EnjRl6kXwTyLgs9Vk",{"id":1031,"title":1032,"addedAt":242,"alternatives":1033,"body":1034,"categories":1050,"checkedAt":242,"claimed":293,"description":1038,"docs":1051,"editorsPick":295,"extension":296,"faq":1052,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":777,"listing":306,"logo":293,"meta":1056,"name":1057,"navigation":308,"openSource":308,"path":1058,"platforms":1059,"pricing":1061,"registries":1062,"repo":1063,"seo":1064,"standards":1065,"status":423,"stem":1080,"tagline":1081,"tags":1082,"vendor":1084,"website":1085,"__hash__":1086},"tools\u002Ftools\u002Fchamilo.md","Chamilo",[],{"type":247,"value":1035,"toc":1048},[1036,1039,1042,1045],[250,1037,1038],{},"Chamilo is a general-purpose learning management system — courses, sessions, gradebook, quizzes, attendance, certificates, surveys, e-commerce catalogue — maintained by the Chamilo Association and released under GPL-3.0. It has a large installed base in Latin America and in francophone education, and its sixty-plus fully translated interface languages, including RTL support, are a genuine differentiator against LMSs that treat localisation as an afterthought.",[250,1040,1041],{},"For standards buyers the relevant part is the learning path. Chamilo imports SCORM 1.2 and AICC packages and tracks them against its own runtime, and its LTI plugin lets a course launch external tools over both 1.1 and 1.3. What it does not appear to do, in the Chamilo 3 tree we read, is SCORM 2004 — there is no 1484.11 runtime in master. If your content library is 2004 with sequencing, this is the wrong platform.",[250,1043,1044],{},"It suits an institution that wants a self-hosted LMS with modest hosting requirements, strong translation coverage and no per-seat licence. It suits a team wanting a modern API-first admin surface less well: master is a Symfony and Vue rewrite still carrying a large amount of legacy PHP, and 452 open issues against 985 stars reflects a wide feature surface as much as neglect.",[250,1046,1047],{},"Development is unambiguously live — commits land daily, and CI runs Behat and PHPUnit.",{"title":289,"searchDepth":290,"depth":290,"links":1049},[],[20],"https:\u002F\u002Fdocs.chamilo.org",[1053],{"q":1054,"a":1055},"Is the master branch the version I would install?","Probably not. master is Chamilo 3, the Symfony and Vue rewrite; most production deployments still run the 1.11 line. If you are evaluating standards support, check it against the branch you actually intend to deploy, because the two trees differ considerably.\n",{},"Chamilo LMS","\u002Ftools\u002Fchamilo",[311,1060],"saas",{"model":313,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Fchamilo\u002Fchamilo-lms",{"description":1038},{"scorm12":1066,"scorm2004":1069,"aicc":1071,"xapi":1073,"lti":1076},{"supported":308,"provenance":320,"checkedAt":242,"source":1067,"note":1068},"https:\u002F\u002Fgithub.com\u002Fchamilo\u002Fchamilo-lms\u002Fblob\u002Fmaster\u002Fpublic\u002Fmain\u002Flp\u002FScormApi.php","The learning-path runtime (ScormApi.php, assets\u002Fvue\u002Fservices\u002FscormRuntimeApi.js) implements the SCORM 1.2 data model — lesson_status, core_exit, suspend data, interactions — and there is a SCORM export path for quizzes.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1070},"We found no SCORM 2004 runtime in the Chamilo 3 master tree: the learning-path API is 1.2-shaped and there is no API_1484_11 adapter or 2004 schema set. Treat 2004 packages as unsupported until the project says otherwise.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1072},"https:\u002F\u002Fgithub.com\u002Fchamilo\u002Fchamilo-lms\u002Fblob\u002Fmaster\u002Fpublic\u002Fmain\u002Flp\u002Faicc.class.php",{"supported":308,"provenance":851,"checkedAt":242,"source":1074,"note":1075},"https:\u002F\u002Fgithub.com\u002Fchamilo\u002Fchamilo-lms#readme","Claimed in the project README's feature list. The xAPI code we located in the master tree sits inside the bundled CStudio plugin rather than in core, so read this as plugin-level emission rather than a core LRS integration.\n",{"supported":308,"versions":1077,"provenance":320,"checkedAt":242,"source":1078,"note":1079},[1018,1019],"https:\u002F\u002Fgithub.com\u002Fchamilo\u002Fchamilo-lms\u002Ftree\u002Fmaster\u002Fpublic\u002Fplugin\u002FImsLti","The bundled ImsLti plugin ships OAuth1.php for the 1.1 flow and jwks.php plus platform key generation for 1.3. Chamilo acts as the LTI platform consuming external tools, not as a tool provider.\n","tools\u002Fchamilo","Full open-source LMS with SCORM 1.2 and AICC learning paths and a bundled LTI plugin",[1025,1083,603],"php","Chamilo Association","https:\u002F\u002Fchamilo.org","4-XJNNVCnO3dojYC3NNoPSK_6s0lSSS1klZX_mP0qw8",{"id":1088,"title":1089,"addedAt":242,"alternatives":1090,"body":1092,"categories":1119,"checkedAt":242,"claimed":293,"description":1120,"docs":1121,"editorsPick":295,"extension":296,"faq":1122,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":1002,"listing":306,"logo":293,"meta":1129,"name":1130,"navigation":308,"openSource":308,"path":1131,"platforms":1132,"pricing":1133,"registries":1135,"repo":1136,"seo":1137,"standards":1138,"status":423,"stem":1152,"tagline":1153,"tags":1154,"vendor":1155,"website":1156,"__hash__":1157},"tools\u002Ftools\u002Fclaroline.md","Claroline",[1091],"openolat",{"type":247,"value":1093,"toc":1117},[1094,1101,1111,1114],[250,1095,1096,1097,1100],{},"Claroline Connect is the Symfony and React rewrite of the long-standing Claroline project, developed by the Claroline Consortium. Its shape is workspace-centric: a workspace holds a resource tree, and everything — a text, a quiz built with the ",[253,1098,1099],{},"exo"," plugin, a file, a SCORM package — is a resource with the same permissions and tracking model. That consistency is its main strength and the reason it suits institutions that want to build course structures rather than upload finished modules.",[250,1102,1103,1104,525,1107,1110],{},"SCORM lives in a plugin with its own entities for SCOs and per-learner tracking, and it is the stronger half of the platform's standards story: both 1.2 and 2004 are handled, with the player exposing ",[253,1105,1106],{},"window.API",[253,1108,1109],{},"window.API_1484_11"," as appropriate. Import is strict about the manifest version string, which is worth knowing before you migrate a library.",[250,1112,1113],{},"The gap is everything else. There is no LTI, no xAPI and no cmi5 in the repository. If your integration plan involves launching external tools or forwarding statements to an LRS, this is not the platform.",[250,1115,1116],{},"Development is steady — 351 stars, active commits through August 2026, releases tagged — but it is a smaller ecosystem than Moodle or OpenOLAT, and the documentation is thinner than the codebase deserves. AGPL-3.0 is a real consideration for hosted use.",{"title":289,"searchDepth":290,"depth":290,"links":1118},[],[20],"Claroline Connect is the Symfony and React rewrite of the long-standing Claroline project, developed by the Claroline Consortium. Its shape is workspace-centric: a workspace holds a resource tree, and everything — a text, a quiz built with the exo plugin, a file, a SCORM package — is a resource with the same permissions and tracking model. That consistency is its main strength and the reason it suits institutions that want to build course structures rather than upload finished modules.","https:\u002F\u002Fclaroline.github.io\u002FClaroline",[1123,1126],{"q":1124,"a":1125},"Which SCORM packages will it refuse to import?","Anything whose manifest schemaversion is not exactly \"1.2\", \"2004 3rd Edition\" or \"2004 4th Edition\". That includes 2004 2nd Edition and any package with a non-standard version string, which some older authoring tools produce.\n",{"q":1127,"a":1128},"Does the AGPL matter for a hosted deployment?","Yes. AGPL-3.0 extends the copyleft to users reaching the software over a network, so a modified Claroline offered to learners as a service carries an obligation to make the modified source available.\n",{},"Claroline Connect","\u002Ftools\u002Fclaroline",[311,610],{"model":313,"currency":1134,"freeTier":308},"EUR",[],"https:\u002F\u002Fgithub.com\u002Fclaroline\u002FClaroline",{"description":1120},{"scorm12":1139,"scorm2004":1142,"lti":1147,"xapi":1150},{"supported":308,"provenance":320,"checkedAt":242,"source":1140,"note":1141},"https:\u002F\u002Fgithub.com\u002Fclaroline\u002FClaroline\u002Ftree\u002F15.0\u002Fsrc\u002Fplugin\u002Fscorm","The scorm plugin's ScormManager accepts a manifest schemaversion of \"1.2\", and its player exposes window.API with the LMS* method set. Read in source, August 2026.\n",{"supported":308,"editions":1143,"provenance":320,"checkedAt":242,"source":1145,"note":1146},[1144,418],"3rd","https:\u002F\u002Fgithub.com\u002Fclaroline\u002FClaroline\u002Fblob\u002F15.0\u002Fsrc\u002Fplugin\u002Fscorm\u002FManager\u002FScormManager.php","ScormManager matches the schemaversion string against exactly \"2004 3rd Edition\" and \"2004 4th Edition\" and throws InvalidScormArchiveException on anything else — so 2004 2nd Edition packages are rejected at import. The player exposes window.API_1484_11. Read in source, August 2026.\n",{"supported":295,"versions":1148,"provenance":320,"checkedAt":242,"note":1149},[],"No LTI plugin or class in the repository as of August 2026.",{"supported":295,"provenance":320,"checkedAt":242,"note":1151},"No xAPI or LRS code in the repository as of August 2026.","tools\u002Fclaroline","Symfony and React learning platform with a SCORM 1.2 and 2004 player plugin",[1025,1083,603],"Claroline Consortium","https:\u002F\u002Fwww.claroline.com","_1Jq4s4-NJYlx23CKWldZxfp9my6pVzCa5edtD4jHME",{"id":1159,"title":1160,"addedAt":242,"alternatives":1161,"body":1162,"categories":1178,"checkedAt":242,"claimed":293,"description":1166,"docs":1179,"editorsPick":295,"extension":296,"faq":1180,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":1187,"name":1188,"navigation":308,"openSource":308,"path":1189,"platforms":1190,"pricing":1191,"registries":1193,"repo":1194,"seo":1195,"standards":1196,"status":423,"stem":1214,"tagline":1215,"tags":1216,"vendor":293,"website":1219,"__hash__":1220},"tools\u002Ftools\u002Fcoursecode.md","Coursecode",[],{"type":247,"value":1163,"toc":1176},[1164,1167,1170,1173],[250,1165,1166],{},"CourseCode is a code-first authoring framework: a course is a directory of JavaScript slide files, a config file and a theme stylesheet, previewed locally and packaged from the command line. It targets the developer or technical instructional designer who would rather diff a course than click through a proprietary editor, and it leans hard into AI-assisted authoring via a bundled MCP server.",[250,1168,1169],{},"The standards coverage is the unusual part. Very few tools of any size emit SCORM 1.2, SCORM 2004 4th Edition, cmi5 and an LTI 1.3 tool configuration from one source, and the implementations are separate, readable drivers rather than a single fudge. The LTI driver in particular refuses to do browser-side JWT handling, which is the correct decision and one that plenty of larger products get wrong.",[250,1171,1172],{},"The caution is its age and size. First commit February 2026, version 0.1.61, two stars, one author. It is not a project you would put a multi-year content programme on without a plan for maintaining a fork. It is a strong candidate for a pilot, for a team already comfortable in a terminal, or as a reference implementation of multi-standard packaging.",[250,1174,1175],{},"Note also that Desktop and Cloud are paid products from the same author. The framework does not require them, but that is where the commercial incentive sits.",{"title":289,"searchDepth":290,"depth":290,"links":1177},[],[5],"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode#readme",[1181,1184],{"q":1182,"a":1183},"Do I need an AI assistant to use it?","No. It is an ordinary Node CLI — `coursecode create`, `coursecode preview` — and courses are plain JavaScript config and slide files. The MCP server is an optional extra entry point, not a dependency.\n",{"q":1185,"a":1186},"Is the open-source framework the whole thing?","The framework and CLI are MIT and stand alone. CourseCode Desktop and CourseCode Cloud are separate commercial products from the same author. Nothing in the repository requires them, but the roadmap is shaped by them.\n",{},"CourseCode","\u002Ftools\u002Fcoursecode",[836,304],{"model":313,"freeTier":308,"source":1192},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcoursecode",[],"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode",{"description":1166},{"scorm12":1197,"scorm2004":1200,"cmi5":1204,"xapi":1207,"lti":1210},{"supported":308,"provenance":320,"checkedAt":242,"source":1198,"note":1199},"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode\u002Fblob\u002Fmain\u002Flib\u002Fmanifest\u002Fscorm-12-manifest.js","A dedicated 1.2 manifest generator and a matching scorm-12-driver, with the 1.2 XSDs bundled in the repository.\n",{"supported":308,"editions":1201,"provenance":320,"checkedAt":242,"source":1202,"note":1203},[418],"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode\u002Fblob\u002Fmain\u002Flib\u002Fmanifest\u002Fscorm-2004-manifest.js","The generator hard-codes a '2004 4th Edition' schemaversion. Earlier editions are not offered.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1205,"note":1206},"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode\u002Fblob\u002Fmain\u002Flib\u002Fmanifest\u002Fcmi5-manifest.js","Generates a cmi5.xml with AU definitions and move-on criteria; a cmi5-remote variant points the AU at an absolute CDN URL.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1208,"note":1209},"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode\u002Fblob\u002Fmain\u002Fframework\u002Fjs\u002Fdrivers\u002Fcmi5-driver.js","xAPI is reached only through the cmi5 driver (@xapi\u002Fcmi5), including State API use for suspend data and bookmarks. There is no standalone \"send statements to my LRS\" output.\n",{"supported":308,"versions":1211,"provenance":320,"checkedAt":242,"source":1212,"note":1213},[1019],"https:\u002F\u002Fgithub.com\u002Fcourse-code-framework\u002Fcoursecode\u002Fblob\u002Fmain\u002Flib\u002Fmanifest\u002Flti-tool-config.js","Emits an LTI 1.3 tool configuration and implements a launch driver using AGS. The driver deliberately rejects raw JWT handling in the browser and expects a trusted server, so this is not a drop-in static deployment.\n","tools\u002Fcoursecode","Code-first course framework and CLI that packages to SCORM, cmi5 and LTI 1.3",[836,1217,1218],"mcp","local-first","https:\u002F\u002Fcoursecodeframework.com","6wXw-Sfs2i_vL0OWRQu7o4BtcB3k70lTs_YF6NGGEC0",{"id":1222,"title":1223,"addedAt":242,"alternatives":1224,"body":1225,"categories":1245,"checkedAt":242,"claimed":293,"description":1229,"docs":1246,"editorsPick":295,"extension":296,"faq":1247,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":1254,"license":305,"listing":306,"logo":293,"meta":1255,"name":1256,"navigation":308,"openSource":308,"path":1257,"platforms":1258,"pricing":1259,"registries":1261,"repo":1262,"seo":1263,"standards":1264,"status":568,"stem":1273,"tagline":1274,"tags":1275,"vendor":1278,"website":1262,"__hash__":1279},"tools\u002Ftools\u002Fescolalms-scorm.md","Escolalms Scorm",[],{"type":247,"value":1226,"toc":1243},[1227,1230,1237,1240],[250,1228,1229],{},"This is the SCORM component of EscolaLMS, an open-source Polish LMS built on Laravel, published separately on Packagist so it can be dropped into any Laravel application. It handles the unglamorous half of SCORM hosting: accept a zip, parse the manifest, unpack it to storage, expose a player endpoint, and persist per-learner tracking into three tables — package, SCO, and SCO tracking.",[250,1231,1232,1233,1236],{},"Parsing is delegated to ",[253,1234,1235],{},"devianl2\u002Flaravel-scorm","; the value added here is the API surface, the tracking strategies for 1.2 and 2004, the permission seeders and a Swagger definition. Two endpoints do the work, one to upload and one to play, and the player is returned as HTML wrapping an iframe, which makes it straightforward to embed in a decoupled front end.",[250,1238,1239],{},"Be clear about scope before adopting it. It is a backend component, not a product: there is no authoring, no conformance testing, no reporting beyond the tracking rows, and the maintainers' own README links two open issues admitting the package \"does not support all available scorm formats\". A 2004 2nd Edition manifest is simply refused.",[250,1241,1242],{},"Maintenance is quiet rather than dead. Thirteen stars, CI and coverage wired up, tests worth reading as documentation, but the last push was January 2025. Treat it as stable-and-parked: fine to build on, unlikely to gain features, and you should expect to maintain your own fork if you hit an edge case.",{"title":289,"searchDepth":290,"depth":290,"links":1244},[],[20],"https:\u002F\u002Fescolalms.github.io\u002FScorm\u002F",[1248,1251],{"q":1249,"a":1250},"Do I have to run the whole EscolaLMS platform?","No. It is an ordinary Composer package for any Laravel application, but it does pull in escolalms\u002Fcore and escolalms\u002Fauth, so you inherit that project's authentication and permission conventions rather than your own.\n",{"q":1252,"a":1253},"Which licence applies?","The LICENSE file says MIT; composer.json says Apache-2.0. Both are permissive and the discrepancy is almost certainly an oversight, but if your compliance process records licences per dependency, raise it with the maintainers before shipping.\n","PL",{},"EscolaLMS Scorm","\u002Ftools\u002Fescolalms-scorm",[311,304],{"model":313,"source":1260},"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fescolalms\u002Fscorm",[],"https:\u002F\u002Fgithub.com\u002FEscolaLMS\u002FScorm",{"description":1229},{"scorm12":1265,"scorm2004":1268,"xapi":1271,"cmi5":1272},{"supported":308,"provenance":320,"checkedAt":242,"source":1266,"note":1267},"https:\u002F\u002Fgithub.com\u002FEscolaLMS\u002FScorm\u002Fblob\u002Fmain\u002Fsrc\u002FServices\u002FScormService.php","ScormService maps a manifest schemaversion of '1.2' to the SCORM_12 constant, and Scorm12FieldStrategy handles the 1.2 tracking fields.\n",{"supported":308,"editions":1269,"provenance":320,"checkedAt":242,"source":1266,"note":1270},[1144,418],"The version switch accepts exactly '2004 3rd Edition' and '2004 4th Edition'. A 2nd Edition manifest falls through and is rejected as an invalid package.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fescolalms-scorm","Laravel package that stores, plays and tracks SCORM packages over a REST API",[1276,1083,1277],"laravel","api","EscolaSoft","yEVSQM88FQ7c4-yX68UuDd1r-ZDxSM0tlN855ShtePs",{"id":1281,"title":1282,"addedAt":242,"alternatives":1283,"body":1284,"categories":1308,"checkedAt":242,"claimed":293,"description":1288,"docs":293,"editorsPick":295,"extension":296,"faq":1309,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":1313,"listing":306,"logo":293,"meta":1314,"name":1315,"navigation":308,"openSource":308,"path":1316,"platforms":1317,"pricing":1318,"registries":1320,"repo":1321,"seo":1322,"standards":1323,"status":423,"stem":1329,"tagline":1330,"tags":1331,"vendor":293,"website":1319,"__hash__":1333},"tools\u002Ftools\u002Fforma-lms.md","Forma Lms",[],{"type":247,"value":1285,"toc":1306},[1286,1289,1300,1303],[250,1287,1288],{},"Forma LMS is a self-hosted PHP platform aimed at corporate training rather than schools: catalogues, classrooms, certificates, competency and reporting, with an e-commerce module for selling courses. It descends from the community edition of Docebo 4.0.5, forked in 2012 when that product moved to SaaS, and remains largely an Italian-speaking community project.",[250,1290,1291,1292,1295,1296,1299],{},"For this directory the relevant part is that it ships its own SCORM player rather than embedding someone else's. The run-time adapter reads the manifest's ",[253,1293,1294],{},"schemaversion"," and instantiates a 1.2 or a 2004 API object accordingly, storing tracking in dedicated ",[253,1297,1298],{},"learning_scorm_*"," tables, so both content generations run natively. There is a class named for xAPI in the same file, but no evidence of a working statement pipeline, so no xAPI or cmi5 claim is recorded here.",[250,1301,1302],{},"Where it fits: an organisation that wants a conventional, ledger-style corporate LMS on its own servers and does not want to run Moodle. Where it does not: anyone needing a modern deployment story. The install documentation still specifies PHP 8.0–8.1 and MySQL 5.7, and PHP 8.1 reached end of security support at the end of 2025 — a real consideration for a system holding staff records.",[250,1304,1305],{},"Maintenance is steady but small: commits through 2026, roughly forty stars, and this GitHub repository is described as a mirror, so issues and discussion happen on formalms.org rather than here.",{"title":289,"searchDepth":290,"depth":290,"links":1307},[],[20],[1310],{"q":1311,"a":1312},"Which licence does it actually carry?","GPL-2.0. The repository has no LICENSE file, so GitHub reports none, but the header of every PHP source file points at the GPL-2.0 text and records the project's descent from Docebo 4.0.5 CE.\n","GPL-2.0-only",{},"Forma LMS","\u002Ftools\u002Fforma-lms",[311,610],{"model":313,"source":1319},"https:\u002F\u002Fwww.formalms.org",[],"https:\u002F\u002Fgithub.com\u002Fformalms\u002Fformalms",{"description":1288},{"scorm12":1324,"scorm2004":1326},{"supported":308,"provenance":320,"checkedAt":242,"source":1325},"https:\u002F\u002Fgithub.com\u002Fformalms\u002Fformalms\u002Fblob\u002Fmaster\u002Fhtml\u002FappLms\u002Fviews\u002Fplayerscorm\u002Flib\u002FSCORM\u002FAPI.js",{"supported":308,"editions":1327,"provenance":320,"checkedAt":242,"source":1325,"note":1328},[1144,418],"The player dispatches on the manifest schemaversion and accepts \"1.2\", \"2004 3rd Edition\" and \"2004 4th Edition\"; anything else is rejected as an unsupported version.\n","tools\u002Fforma-lms","Corporate-focused PHP learning platform with its own SCORM 1.2 and 2004 player",[1083,603,1332],"corporate","axkymF6BNKWWZXCnKS2F_LHCLCR_Z9lzZNYzlDF8V4I",{"id":1335,"title":1336,"addedAt":242,"alternatives":1337,"body":1338,"categories":1374,"checkedAt":242,"claimed":293,"description":1342,"docs":1375,"editorsPick":295,"extension":296,"faq":1376,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":1002,"listing":306,"logo":293,"meta":1380,"name":1336,"navigation":308,"openSource":308,"path":1381,"platforms":1382,"pricing":1383,"registries":1385,"repo":1386,"seo":1387,"standards":1388,"status":423,"stem":1397,"tagline":1398,"tags":1399,"vendor":293,"website":1384,"__hash__":1402},"tools\u002Ftools\u002Ffrappe-learning.md","Frappe Learning",[],{"type":247,"value":1339,"toc":1372},[1340,1343,1366,1369],[250,1341,1342],{},"Frappe Learning is a full LMS — courses, batches, cohorts, assignments, quizzes, certificates, live classes — built on the Frappe framework and sharing an identity and database with ERPNext. It is the natural choice for an organisation already running that stack, and it is genuinely well maintained: thousands of stars, a large fork count, and commits most days.",[250,1344,1345,1346,270,1348,1350,1351,260,1354,1357,1358,1361,1362,1365],{},"Its SCORM support should be understood as a chapter type, not a runtime. Reading the player, both ",[253,1347,1106],{},[253,1349,1109],{}," are declared so content of either generation will find something and initialise. Beyond that the implementation is a stub: every function returns ",[253,1352,1353],{},"\"true\"",[253,1355,1356],{},"GetLastError"," always returns ",[253,1359,1360],{},"\"0\"",", and of the whole data model only completion status and ",[253,1363,1364],{},"cmi.suspend_data"," reach the server. Scores, interactions, objectives and timing are printed to the browser console and dropped.",[250,1367,1368],{},"For a lot of compliance work that is enough — the question being asked is whether someone finished the module, and bookmarking survives a reload. It is not enough where a score, an attempt history, question-level reporting or a regulator's evidence trail is required, and it is not the platform to test a package against if you want to know whether that package is correct.",[250,1370,1371],{},"Deciding today: adopt it for its own authoring and cohort features, treat imported SCORM as a secondary path, and test your specific package before committing.",{"title":289,"searchDepth":290,"depth":290,"links":1373},[],[20],"https:\u002F\u002Fdocs.frappe.io\u002Flearning",[1377],{"q":1378,"a":1379},"Will it record quiz scores from a SCORM package?","No. The adapter accepts every SetValue call and returns success, but only completion status and suspend data are written back to the server. A score set by the package is not stored, so \"completed\" is the only outcome you can report on.\n",{},"\u002Ftools\u002Ffrappe-learning",[311,1060],{"model":313,"freeTier":308,"source":1384},"https:\u002F\u002Ffrappe.io\u002Flearning",[],"https:\u002F\u002Fgithub.com\u002Ffrappe\u002Flms",{"description":1342},{"scorm12":1389,"scorm2004":1392,"xapi":1395,"cmi5":1396},{"supported":308,"provenance":320,"checkedAt":242,"source":1390,"note":1391},"https:\u002F\u002Fgithub.com\u002Ffrappe\u002Flms\u002Fblob\u002Fdevelop\u002Ffrontend\u002Fsrc\u002Fpages\u002FSCORMChapter.vue","A window.API object is exposed, but only cmi.core.lesson_status and cmi.suspend_data are persisted; every function returns \"true\" and LMSGetLastError always returns \"0\".\n",{"supported":308,"editions":1393,"provenance":320,"checkedAt":242,"source":1390,"note":1394},[],"window.API_1484_11 is exposed with the same minimal behaviour — completion status and suspend data only. Scores, interactions and objectives are logged to the browser console and discarded.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Ffrappe-learning","Open-source LMS from the Frappe stack, with a deliberately minimal SCORM chapter type",[630,1400,603,1401],"vue","frappe","lprNCqouqAr9vqZKZkNNr3ZAv3FvBgtDon8ZxNECF7Y",{"id":1404,"title":1405,"addedAt":242,"alternatives":1406,"body":1408,"categories":1432,"checkedAt":242,"claimed":293,"description":1433,"docs":1434,"editorsPick":295,"extension":296,"faq":1435,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":1442,"license":777,"listing":306,"logo":293,"meta":1443,"name":1444,"navigation":308,"openSource":308,"path":1445,"platforms":1446,"pricing":1447,"registries":1448,"repo":1449,"seo":1450,"standards":1451,"status":423,"stem":1460,"tagline":1461,"tags":1462,"vendor":1465,"website":1466,"__hash__":1467},"tools\u002Ftools\u002Fh5p.md","H5p",[1407],"lumi",{"type":247,"value":1409,"toc":1430},[1410,1421,1424,1427],[250,1411,1412,1413,1416,1417,1420],{},"This repository is H5P's framework core: the PHP classes that validate, store and serve ",[253,1414,1415],{},".h5p"," packages, plus the JavaScript that boots content in the browser and dispatches its events. It is not an application. It has no user interface, no installer and no authoring screen of its own — platforms implement ",[253,1418,1419],{},"H5PFrameworkInterface"," and the Moodle, WordPress and Drupal plugins are where an author actually meets it.",[250,1422,1423],{},"Its value to a directory reader is as the thing under the H5P you already use. If you are writing an integration for a platform H5P does not yet support, or debugging why a content type behaves differently on Moodle than on WordPress, this is the code that decides.",[250,1425,1426],{},"One correction matters more than the description. H5P is frequently described as having \"SCORM export paths\"; this repository has none, and the xAPI it emits stops at a JavaScript event. Both are the host platform's responsibility, and the answer differs by platform. If you want SCORM output from H5P, you want Lumi or an equivalent wrapper, and you will get SCORM 1.2.",[250,1428,1429],{},"Maintenance is solid: Joubel commit regularly, with the most recent push in August 2026. Eighty-eight open issues against 149 stars is normal for a library whose users mostly arrive through a plugin and never see the repository. Licensing is GPL-3.0 — the readme explains it is GPL because of the HTML purifier it embeds, which is worth knowing before you build a proprietary integration around it.",{"title":289,"searchDepth":290,"depth":290,"links":1431},[],[5],"This repository is H5P's framework core: the PHP classes that validate, store and serve .h5p packages, plus the JavaScript that boots content in the browser and dispatches its events. It is not an application. It has no user interface, no installer and no authoring screen of its own — platforms implement H5PFrameworkInterface and the Moodle, WordPress and Drupal plugins are where an author actually meets it.","https:\u002F\u002Fh5p.org\u002Fdevelopers",[1436,1439],{"q":1437,"a":1438},"Can H5P produce a SCORM package?","Not from this library. H5P content is embedded by a host platform — Moodle, WordPress, Drupal, Canvas — or wrapped by a separate tool. If you need a SCORM zip from an H5P activity, Lumi's SCORM export is the usual route, and it produces SCORM 1.2 only.\n",{"q":1440,"a":1441},"Where do the xAPI statements go?","Wherever the integration sends them. The library dispatches statement objects as JavaScript events; the Moodle, WordPress or Drupal plugin decides whether to forward them to an LRS, store them locally, or ignore them. Confirm this per platform rather than assuming it.\n","NO",{},"H5P (core PHP library)","\u002Ftools\u002Fh5p",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fh5p\u002Fh5p-php-library",{"description":1433},{"xapi":1452,"scorm12":1455,"scorm2004":1457,"cmi5":1459},{"supported":308,"provenance":320,"checkedAt":242,"source":1453,"note":1454},"https:\u002F\u002Fgithub.com\u002Fh5p\u002Fh5p-php-library\u002Fblob\u002Fmaster\u002Fjs\u002Fh5p-x-api-event.js","Content types build xAPI statement objects and dispatch them on H5P's own JavaScript event bus via triggerXAPI. The library contains no HTTP transport — there is no LRS client here. Getting statements to an LRS is the host platform integration's job, not this library's.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1456},"The string \"scorm\" does not appear in this repository. SCORM export for H5P content comes from separate tools, Lumi among them.\n",{"supported":295,"editions":1458,"provenance":320,"checkedAt":242},[],{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fh5p","The framework behind H5P interactive content — not, on its own, a SCORM tool",[1083,1463,859,1464],"interactive-content","moodle","Joubel","https:\u002F\u002Fh5p.org","MmUxQ662SDEPGRDyV1BKWzaGKhx3ihBc4F83L4BPvK0",{"id":1469,"title":1470,"addedAt":242,"alternatives":1471,"body":1472,"categories":1488,"checkedAt":242,"claimed":293,"description":1476,"docs":1489,"editorsPick":295,"extension":296,"faq":1490,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":1497,"license":777,"listing":306,"logo":293,"meta":1498,"name":1499,"navigation":308,"openSource":308,"path":1500,"platforms":1501,"pricing":1502,"registries":1504,"repo":1503,"seo":1505,"standards":1506,"status":423,"stem":1523,"tagline":1524,"tags":1525,"vendor":293,"website":1527,"__hash__":1528},"tools\u002Ftools\u002Filias.md","Ilias",[1464,1091],{"type":247,"value":1473,"toc":1486},[1474,1477,1480,1483],[250,1475,1476],{},"ILIAS is a PHP learning management system that has been developed at the University of Cologne and by a German-speaking association of universities, public bodies and companies since 1998. It is the platform of choice for a specific institutional profile: European public-sector and higher-education organisations that need a system they host themselves, with documentation and support in German, and with data-protection questions treated as first-class design constraints rather than configuration.",[250,1478,1479],{},"For standards work it is unusually well equipped. SCORM 1.2, SCORM 2004 and cmi5\u002FxAPI are separate repository object types in core, not plugins, and the SCORM 2004 component contains a real sequencer rather than a run-time shim. The cmi5 component's design — routing statements through ILIAS to an external LRS so identifying data can be stripped or deleted on the way — is a genuinely distinctive answer to the privacy problem that stops many European institutions adopting xAPI at all.",[250,1481,1482],{},"It is not a light system. The codebase is large, the release cadence is slow and deliberate, upgrades between major versions are projects in themselves, and the interface will feel institutional to anyone arriving from a commercial LXP. Nor is it the right choice if you want an LRS: ILIAS deliberately is not one.",[250,1484,1485],{},"Maintenance is not a concern. The repository is committed to daily, releases are regular, and the association behind it has outlasted most of its contemporaries.",{"title":289,"searchDepth":290,"depth":290,"links":1487},[],[20],"https:\u002F\u002Fdocu.ilias.de",[1491,1494],{"q":1492,"a":1493},"Does ILIAS store xAPI statements itself?","No. It sits between the content and an external Learning Record Store, which is the point of the design — data can be pseudonymised or dropped before it leaves the institution. You still have to run an LRS.\n",{"q":1495,"a":1496},"What happens to a SCORM 1.2 package on import?","The 2004 learning-module object converts it: `convert_1_2_to_2004()` applies an XSL transform to the manifest before the package is stored. Worth knowing if a package behaves differently in ILIAS than elsewhere.\n","DE",{},"ILIAS","\u002Ftools\u002Filias",[311],{"model":313,"source":1503},"https:\u002F\u002Fgithub.com\u002FILIAS-eLearning\u002FILIAS",[],{"description":1476},{"scorm12":1507,"scorm2004":1510,"cmi5":1514,"xapi":1517,"lti":1519},{"supported":308,"provenance":320,"checkedAt":242,"source":1508,"note":1509},"https:\u002F\u002Fgithub.com\u002FILIAS-eLearning\u002FILIAS\u002Ftree\u002Ftrunk\u002Fcomponents\u002FILIAS\u002FScormAicc","The `ScormAicc` component holds the SCORM 1.2 learning-module object, import parser and per-SCO tracking tables.\n",{"supported":308,"editions":1511,"provenance":320,"checkedAt":242,"source":1512,"note":1513},[1144,418],"https:\u002F\u002Fgithub.com\u002FILIAS-eLearning\u002FILIAS\u002Fblob\u002Ftrunk\u002Fcomponents\u002FILIAS\u002FScorm2004\u002Fclasses\u002Fclass.ilObjSCORM2004LearningModule.php","Import accepts manifests whose schemaversion is \"CAM 1.3\", \"2004 3rd Edition\" or \"2004 4th Edition\"; SCORM 1.2 packages are converted to 2004 on import by an XSL transform. A sequencer ships in the same component.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1515,"note":1516},"https:\u002F\u002Fgithub.com\u002FILIAS-eLearning\u002FILIAS\u002Fblob\u002Ftrunk\u002Fcomponents\u002FILIAS\u002FCmiXapi\u002FREADME.md","The `CmiXapi` component's own README states support for xAPI 1.0.3 and cmi5 \"provided that single assignable units are used\".\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1515,"note":1518},"ILIAS is not itself an LRS. Statements are proxied through ILIAS to an external LRS so that data can be pseudonymised and reduced on the way; some reporting queries are specific to Learning Locker.\n",{"supported":308,"versions":1520,"provenance":320,"checkedAt":242,"source":1521,"note":1522},[],"https:\u002F\u002Fgithub.com\u002FILIAS-eLearning\u002FILIAS\u002Ftree\u002Ftrunk\u002Fcomponents\u002FILIAS\u002FLTIConsumer","Both `LTIConsumer` and `LTIProvider` components are in the tree, and the consumer implements line items and grade services. We did not confirm which LTI versions are certified, so no version is claimed here.\n","tools\u002Filias","German open-source LMS carrying SCORM 1.2, SCORM 2004 and cmi5 objects in core",[1025,1083,1526],"higher-education","https:\u002F\u002Fwww.ilias.de","z68DduKVDlaKuG1OaVx7iiHmJGFTxeL55Ry1epAKJ8s",{"id":1530,"title":1531,"addedAt":242,"alternatives":1532,"body":1533,"categories":1549,"checkedAt":242,"claimed":293,"description":1537,"docs":1550,"editorsPick":295,"extension":296,"faq":1551,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":777,"listing":306,"logo":293,"meta":1558,"name":1559,"navigation":308,"openSource":308,"path":1560,"platforms":1561,"pricing":1562,"registries":1563,"repo":1564,"seo":1565,"standards":1566,"status":329,"stem":1575,"tagline":1576,"tags":1577,"vendor":1579,"website":1564,"__hash__":1580},"tools\u002Ftools\u002Flearning-locker.md","Learning Locker",[866],{"type":247,"value":1534,"toc":1547},[1535,1538,1541,1544],[250,1536,1537],{},"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.",[250,1539,1540],{},"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.",[250,1542,1543],{},"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.",[250,1545,1546],{},"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":289,"searchDepth":290,"depth":290,"links":1548},[],[23],"https:\u002F\u002Flearninglocker.atlassian.net\u002Fwiki\u002Fspaces\u002FDOCS\u002Foverview",[1552,1555],{"q":1553,"a":1554},"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":1556,"a":1557},"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",{},"Learning Locker (Community)","\u002Ftools\u002Flearning-locker",[311,610],{"model":313},[],"https:\u002F\u002Fgithub.com\u002FLearningLocker\u002Flearninglocker",{"description":1537},{"xapi":1567,"cmi5":1570,"scorm12":1572,"scorm2004":1573},{"supported":308,"provenance":320,"checkedAt":242,"source":1568,"note":1569},"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":295,"provenance":320,"checkedAt":242,"note":1571},"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":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":1574,"provenance":320,"checkedAt":242},[],"tools\u002Flearning-locker","The best-known open-source LRS, with no commit on master since November 2021",[627,797,1578,603],"mongodb","Learning Pool","Of15LGbsKXIgJHeXSN16YBVkP1NzOlvUzcx6xsyAJnQ",{"id":1582,"title":1583,"addedAt":242,"alternatives":1584,"body":1585,"categories":1611,"checkedAt":242,"claimed":293,"description":1589,"docs":293,"editorsPick":295,"extension":296,"faq":1612,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":1619,"license":777,"listing":306,"logo":293,"meta":1620,"name":1583,"navigation":308,"openSource":308,"path":1621,"platforms":1622,"pricing":1623,"registries":1624,"repo":1625,"seo":1626,"standards":1627,"status":568,"stem":1639,"tagline":1640,"tags":1641,"vendor":1643,"website":1625,"__hash__":1644},"tools\u002Ftools\u002Flearning-records-converter.md","Learning Records Converter",[],{"type":247,"value":1586,"toc":1609},[1587,1590,1603,1606],[250,1588,1589],{},"The Learning Records Converter comes out of Prometheus-X, the EU-funded data-space initiative for education and skills, and was built by Inokufu. Its purpose is normalisation: an institution holding tracking data in several formats cannot combine it, so everything is translated into xAPI and then conformed to the DASES profiles for LMS, forum and assessment activity.",[250,1591,1592,1593,260,1596,260,1599,1602],{},"The architecture is the interesting part. Input formats are declared as Pydantic models, and the actual translation lives in YAML mapping files — ",[253,1594,1595],{},"mapping_scorm2004_to_xapi.yml",[253,1597,1598],{},"mapping_imscaliper_1_1_to_xapi.yml",[253,1600,1601],{},"mapping_matomo_to_xapi.yml"," — where each rule names input fields and a switch of lambda conditions producing xAPI output. That makes adding a proprietary format a data exercise rather than a code one, and it makes the existing mappings auditable, which matters when the output is going into a shared data space.",[250,1604,1605],{},"Be clear about scope before adopting it. Only SCORM 2004 is covered, not 1.2; the output is always xAPI; and it operates on records, not packages. It is a FastAPI service with Docker Compose, so it is deployed rather than imported.",[250,1607,1608],{},"Four stars, last pushed August 2025, and the mappers still carry a French-language TODO about completion thresholds. That is the honest state: a funded project's deliverable, useful as a starting point for a migration and as a well-designed example of declarative record mapping, rather than a finished product with a community behind it.",{"title":289,"searchDepth":290,"depth":290,"links":1610},[],[8],[1613,1616],{"q":1614,"a":1615},"Will it convert my SCORM packages to xAPI courses?","No, and this is the most common misreading of the name. It converts learning *records* — the tracking data a SCORM 2004 runtime produced — into xAPI statements. The course content is untouched.\n",{"q":1617,"a":1618},"Can I add my own format?","Yes, and that is the intended extension point. Formats are declared as a Pydantic model plus a YAML mapping file with lambda conditions, and there is a custom-formats module kept separate from the core enumeration.\n","FR",{},"\u002Ftools\u002Flearning-records-converter",[304,836,311],{"model":313,"currency":1134,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002FPrometheus-X-association\u002Flearning-records-converter",{"description":1589},{"scorm2004":1628,"scorm12":1632,"xapi":1634,"cmi5":1637},{"supported":308,"editions":1629,"provenance":320,"checkedAt":242,"source":1630,"note":1631},[],"https:\u002F\u002Fgithub.com\u002FPrometheus-X-association\u002Flearning-records-converter\u002Fblob\u002Fmain\u002Fdata\u002Fmappers\u002Fmapping_scorm2004_to_xapi.yml","A SCORM_2004 input format with a Pydantic data model and a YAML mapper translating completion_status, entry, exit, learner identity, progress_measure, score.scaled, session_time and success_status to xAPI verbs and results. This converts runtime records, not packages, and no specific 2004 edition is distinguished. Read in source, August 2026.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1633},"The trace-format enumeration lists only SCORM_2004; there is no 1.2 data model or mapper.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1635,"note":1636},"https:\u002F\u002Fgithub.com\u002FPrometheus-X-association\u002Flearning-records-converter\u002Fblob\u002Fmain\u002Fapp\u002Fcommon\u002Fenums\u002Ftrace_formats.py","xAPI is the only output format, and a profile enricher validates and annotates statements against the DASES JSON-LD profiles. Read in source, August 2026.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1638},"The README states cmi5 is treated as an xAPI profile rather than a separate input format, and there is no cmi5 mapper in the repository.\n","tools\u002Flearning-records-converter","Python API that maps SCORM 2004, IMS Caliper and Matomo traces into xAPI",[628,630,1642],"data-migration","Inokufu","KTQztLY_Mc4SDYCXE9MPxx7K4emy5yeZMvMnVs_6gkM",{"id":1646,"title":1647,"addedAt":242,"alternatives":1648,"body":1649,"categories":1665,"checkedAt":242,"claimed":293,"description":1653,"docs":1666,"editorsPick":295,"extension":296,"faq":1667,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":1671,"name":1647,"navigation":308,"openSource":308,"path":1672,"platforms":1673,"pricing":1674,"registries":1675,"repo":1676,"seo":1677,"standards":1678,"status":423,"stem":1688,"tagline":1689,"tags":1690,"vendor":293,"website":1666,"__hash__":1693},"tools\u002Ftools\u002Flernkit.md","Lernkit",[],{"type":247,"value":1650,"toc":1663},[1651,1654,1657,1660],[250,1652,1653],{},"Lernkit is a framework for writing technical training as source code: lessons are MDX, the build produces a static course, and a packager wraps that course as SCORM. Its distinguishing idea is that runnable code is a first-class lesson element — Python through Pyodide, JavaScript through Sandpack, Robot Framework through an execution backend — so a course about a tool can let the learner drive the tool inside the page rather than watch a recording of it.",[250,1655,1656],{},"It is aimed at engineering-led training teams who already live in a repository and a CI pipeline, and who find WYSIWYG authoring tools an obstacle rather than a help. The architecture is unusually legible for a young project: architecture decision records in-repo explaining why SCORM 1.2 and cmi5 come before 2004, unit tests over the generated manifest and zip, and a documentation site that exists.",[250,1658,1659],{},"Be clear-eyed about its age. It was created in April 2026, has one contributor, zero stars, ten open issues and no releases, and the SCORM 1.2 packager is the only shipped output — the 2004, cmi5 and xAPI support named in the repository description is roadmap. That is not a criticism of the project, which says so itself; it is a reason not to put a course library on it this year.",[250,1661,1662],{},"Listed as one to watch, and as a well-documented reference for anyone building a packager of their own.",{"title":289,"searchDepth":290,"depth":290,"links":1664},[],[5],"https:\u002F\u002Fmanykarim.github.io\u002Flernkit\u002F",[1668],{"q":1669,"a":1670},"The repository description says SCORM 2004, cmi5 and xAPI. Are they there?","Not yet. The project's own Status section says Phase 1 is complete and Phase 1 is SCORM 1.2. The source agrees — one packager, one working tracker adapter, and a stub for xAPI. The description describes the destination, not the current state.\n",{},"\u002Ftools\u002Flernkit",[304,836,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fmanykarim\u002Flernkit",{"description":1653},{"scorm12":1679,"scorm2004":1682,"cmi5":1684,"xapi":1686},{"supported":308,"provenance":320,"checkedAt":242,"source":1680,"note":1681},"https:\u002F\u002Fgithub.com\u002Fmanykarim\u002Flernkit\u002Ftree\u002Fmain\u002Fpackages\u002Fpackagers\u002Fsrc\u002Fscorm12","packages\u002Fpackagers ships a scorm12 packager with manifest templates, the SCORM 1.2 XSD set, a bundled runtime and unit tests over the manifest and the zip. The maintainer reports packages importing into SCORM Cloud and PeopleFluent; we did not reproduce that.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1683},"Announced in the repository description and planned in ADR 0015, but packages\u002Fpackagers\u002Fsrc contains only scorm12 as of this check.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1685},"Prioritised in ADR 0003 and named in the repository description, but not implemented — no cmi5 packager or launch handling in the tree.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1687},"packages\u002Ftracker ships an XapiStubAdapter alongside the working SCORM 1.2 adapter. A stub, not an emitter.\n","tools\u002Flernkit","Code-first authoring from MDX with SCORM 1.2 export and runnable code as a lesson primitive",[1691,333,603,1692],"mdx","early-stage","u7ao00OFFdIw1s5uoPDdRx5i5FayQI59caMDMFVREBU",{"id":1695,"title":1696,"addedAt":242,"alternatives":1697,"body":1698,"categories":1727,"checkedAt":242,"claimed":293,"description":1728,"docs":1729,"editorsPick":295,"extension":296,"faq":1730,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":1737,"name":1738,"navigation":308,"openSource":308,"path":1739,"platforms":1740,"pricing":1741,"registries":1742,"repo":1743,"seo":1744,"standards":1745,"status":423,"stem":1758,"tagline":1759,"tags":1760,"vendor":293,"website":1729,"__hash__":1764},"tools\u002Ftools\u002Flxpack-lessonkit.md","Lxpack Lessonkit",[],{"type":247,"value":1699,"toc":1725},[1700,1719,1722],[250,1701,1702,1703,260,1706,260,1709,260,1712,260,1715,1718],{},"LessonKit answers a question that comes up whenever a team with real front-end skills is handed an authoring tool: why can we not just write this in React? It supplies course-shaped components — ",[253,1704,1705],{},"Course",[253,1707,1708],{},"Lesson",[253,1710,1711],{},"Quiz",[253,1713,1714],{},"BranchingScenario",[253,1716,1717],{},"InteractiveVideo"," — a telemetry layer with xAPI mapping, a theming system built on CSS custom properties, and a CLI that packages the resulting Vite app for SCORM 1.2, SCORM 2004, xAPI, cmi5 or standalone delivery. One codebase, several delivery targets, versioned in Git like anything else.",[250,1720,1721],{},"For a developer-led team building bespoke interactions that a WYSIWYG tool cannot express, that is a genuinely useful shape, and the packaging targets are backed by end-to-end launch tests rather than only documented.",[250,1723,1724],{},"The reason to be cautious is age and adoption, not design. First commit was May 2026, the repository has a single star, and it publishes eight interdependent npm packages that must all be pinned to the same version. Documentation quality is well ahead of what the star count would suggest, which is encouraging, but there is no user base to inherit fixes from and no second maintainer. Treat it as a promising bet for a project you control end to end, and read the LMS go-live guide before assuming a local preview means it will work in a client's platform.",{"title":289,"searchDepth":290,"depth":290,"links":1726},[],[5],"LessonKit answers a question that comes up whenever a team with real front-end skills is handed an authoring tool: why can we not just write this in React? It supplies course-shaped components — Course, Lesson, Quiz, BranchingScenario, InteractiveVideo — a telemetry layer with xAPI mapping, a theming system built on CSS custom properties, and a CLI that packages the resulting Vite app for SCORM 1.2, SCORM 2004, xAPI, cmi5 or standalone delivery. One codebase, several delivery targets, versioned in Git like anything else.","https:\u002F\u002Flessonkit.readthedocs.io\u002Fen\u002Flatest\u002F",[1731,1734],{"q":1732,"a":1733},"Is this an alternative to Storyline or Rise?","No, and the project says as much. There is no timeline, no drag-and-drop canvas and no non-developer path. It is a component library and a build step for teams who would rather write React than use a WYSIWYG tool.\n",{"q":1735,"a":1736},"What does the packaging step actually produce?","A Vite build wrapped for one of six targets — react-vite, scorm12, scorm2004, xapi, cmi5 or standalone — driven from a lessonkit.json manifest at the project root via the @lessonkit\u002Flxpack package.\n",{},"LessonKit","\u002Ftools\u002Flxpack-lessonkit",[304,836,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Feddiethedean\u002Flessonkit",{"description":1728},{"scorm12":1746,"scorm2004":1749,"xapi":1752,"cmi5":1755,"aicc":1757},{"supported":308,"provenance":320,"checkedAt":242,"source":1747,"note":1748},"https:\u002F\u002Fgithub.com\u002Feddiethedean\u002Flessonkit\u002Fblob\u002Fmain\u002Fpackages\u002Fcli\u002Fsrc\u002Flib\u002FtargetTypes.ts","scorm12 is one of six declared package targets in the CLI, with a corresponding launch test under e2e\u002Ftests\u002Fscorm12.\n",{"supported":308,"editions":1750,"provenance":320,"checkedAt":242,"source":1747,"note":1751},[],"A scorm2004 target exists and has its own launch test, but the repository does not state which 2004 edition the generated manifest declares, so no edition is recorded here.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1753,"note":1754},"https:\u002F\u002Fgithub.com\u002Feddiethedean\u002Flessonkit\u002Ftree\u002Fmain\u002Fpackages\u002Fxapi","A dedicated @lessonkit\u002Fxapi package handles statement mapping, batching, pluggable transports and a dead-letter queue, alongside an xapi package target.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1747,"note":1756},"cmi5 is a declared package target with an end-to-end launch test. Not verified against the cmi5 conformance suite by this directory.\n",{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Flxpack-lessonkit","Author courses as React components, then export SCORM, xAPI or cmi5 from the same codebase",[1761,333,1762,1763],"react","code-first","packaging","IRSkHi6wlTjhQ8tOVdWUBy9ciOU9jZZ8SeprGjLVWNk",{"id":1766,"title":1767,"addedAt":242,"alternatives":1768,"body":1771,"categories":1787,"checkedAt":242,"claimed":293,"description":1775,"docs":1788,"editorsPick":295,"extension":296,"faq":1789,"firstParty":295,"foundedYear":293,"hosting":1796,"hqCountry":293,"license":1797,"listing":306,"logo":293,"meta":1798,"name":1799,"navigation":308,"openSource":308,"path":1800,"platforms":1801,"pricing":1803,"registries":1805,"repo":1806,"seo":1807,"standards":1808,"status":423,"stem":1822,"tagline":1823,"tags":1824,"vendor":293,"website":1827,"__hash__":1828},"tools\u002Ftools\u002Fliascript.md","Liascript",[1769,1770],"node-scorm-packager","simple-scorm-packager",{"type":247,"value":1772,"toc":1785},[1773,1776,1779,1782],[250,1774,1775],{},"LiaScript is a Markdown dialect for interactive courses — quizzes, executable code blocks, text-to-speech, animations — that runs in a browser straight from a Git repository. The Exporter is the companion tool that converts one of those courses into something an LMS will accept: SCORM 1.2, SCORM 2004, IMS, xAPI, or a static web, PDF, ePub, DOCX or Android build.",[250,1777,1778],{},"It suits a particular author well: someone who wants course content to live in Git as plain text, be reviewed as diffs, and be rebuilt by CI, but who is required to deliver a SCORM package at the end. That is a common position in universities and in open-courseware projects, and it is poorly served by conventional authoring tools, which keep content in binary project files.",[250,1780,1781],{},"It is not a substitute for a WYSIWYG authoring suite. There is no visual editor, no template library and no built-in accessibility checking; you write Markdown and you own the result. The tracking model is also basic by design — completion and score, not the interaction-level reporting that a commercial tool emits.",[250,1783,1784],{},"Maintenance is healthy: the exporter was last released in July 2026, is available as a desktop app as well as a CLI and local web UI, and draws several thousand npm downloads a month. The one caution is version churn — 196 npm releases and a version scheme that pairs the exporter with a LiaScript build, so pin the version in any pipeline you rely on.",{"title":289,"searchDepth":290,"depth":290,"links":1786},[],[5],"https:\u002F\u002Fgithub.com\u002FLiaScript\u002FLiaScript-Exporter#readme",[1790,1793],{"q":1791,"a":1792},"Do I need the exporter at all to publish a LiaScript course?","No. The README says so itself: a course hosted in a Git repository can be opened directly through the LiaScript web player. You need the exporter when a course has to be tracked by an LMS, or handed over as a file.\n",{"q":1794,"a":1795},"Which export target should I pick for my LMS?","The README carries a recipe table with exact commands per platform, and mostly recommends SCORM 1.2 with `--scorm-iframe` or `--scorm-embed` rather than 2004 — Moodle 4 and some other platforms restrict dynamic loading of external resources, which the embed flag works around.\n","desktop","BSD-3-Clause",{},"LiaScript Exporter","\u002Ftools\u002Fliascript",[836,665,1802,610],"macos",{"model":313,"source":1804},"https:\u002F\u002Fgithub.com\u002FLiaScript\u002FLiaScript-Exporter\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FLiaScript\u002FLiaScript-Exporter",{"description":1775},{"scorm12":1809,"scorm2004":1812,"xapi":1816,"cmi5":1819,"aicc":1821},{"supported":308,"provenance":320,"checkedAt":242,"source":1810,"note":1811},"https:\u002F\u002Fgithub.com\u002FLiaScript\u002FLiaScript-Exporter\u002Fblob\u002Fmaster\u002Fsrc\u002Fexport\u002Fscorm12.ts","`-f scorm1.2` is a first-class export target with its own module; the README's per-LMS recipe table recommends it for Moodle 3–5, ILIAS and OPAL, with mastery score and iframe or embed options.\n",{"supported":308,"editions":1813,"provenance":320,"checkedAt":242,"source":1814,"note":1815},[418],"https:\u002F\u002Fgithub.com\u002FLiaScript\u002FLiaScript-Exporter\u002Fblob\u002Fmaster\u002Fsrc\u002Fexport\u002Fscorm2004.ts","The 2004 exporter hard-codes `version: '2004 4th Edition'` in the manifest configuration; no other edition is offered.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1817,"note":1818},"https:\u002F\u002Fgithub.com\u002FLiaScript\u002FLiaScript-Exporter\u002Fblob\u002Fmaster\u002Fsrc\u002Fexport\u002Fxapi.ts","`-f xapi` produces a tincan-style package. Statement coverage was not audited; treat the depth of tracking as unverified.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1820},"No cmi5 export target and no occurrence of cmi5 anywhere in the source.\n",{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fliascript","Turns a Markdown course into a SCORM 1.2, SCORM 2004, IMS or xAPI package from the command line",[1825,836,1826],"markdown","open-courseware","https:\u002F\u002Fliascript.github.io","GrKkYERSjXkOsNP4-UXe94Oe9Hn8xn_oBGk5sl1trcM",{"id":1830,"title":1831,"addedAt":242,"alternatives":1832,"body":1834,"categories":1856,"checkedAt":242,"claimed":293,"description":1857,"docs":1858,"editorsPick":295,"extension":296,"faq":1859,"firstParty":295,"foundedYear":293,"hosting":1796,"hqCountry":1497,"license":1002,"listing":306,"logo":293,"meta":1869,"name":1831,"navigation":308,"openSource":308,"path":1870,"platforms":1871,"pricing":1872,"registries":1873,"repo":1874,"seo":1875,"standards":1876,"status":423,"stem":1886,"tagline":1887,"tags":1888,"vendor":1891,"website":1892,"__hash__":1893},"tools\u002Ftools\u002Flumi.md","Lumi",[1833],"h5p",{"type":247,"value":1835,"toc":1854},[1836,1842,1848,1851],[250,1837,1838,1839,1841],{},"Lumi is an Electron desktop application that wraps the H5P editor and player so you can build interactive content — branching scenarios, interactive video, question sets — without a Moodle or WordPress install behind it. That alone makes it useful to freelancers and small teams. What earns it a place in a SCORM directory is the export menu: alongside ",[253,1840,1415],{}," and standalone HTML, it will produce a SCORM package.",[250,1843,1844,1845,1847],{},"The mechanics set the limits. Lumi bundles the content into a single HTML file with external media, drops in the pipwerks SCORM API wrapper and a small H5P-to-SCORM adaptor, and hands the folder to ",[253,1846,1770],{}," with the version fixed at 1.2. You get a single-SCO SCORM 1.2 package that reports completion and a score, with a mastery score set at export time. You do not get SCORM 2004, sequencing, multi-SCO structures, or any xAPI output.",[250,1849,1850],{},"That makes it a good fit for one job: turning a single interactive activity into something an LMS will accept and grade. It is a poor fit for course-length material, for anything needing 2004 features, or for teams wanting the analytics H5P is often bought for.",[250,1852,1853],{},"The project is alive but modest — last push July 2026, release 1.0.3 in May, 191 stars, and 112 open issues, which suggests demand well ahead of maintainer capacity. Reasonable to depend on for authoring; check each exported package in the target LMS rather than trusting the export blindly.",{"title":289,"searchDepth":290,"depth":290,"links":1855},[],[5],"Lumi is an Electron desktop application that wraps the H5P editor and player so you can build interactive content — branching scenarios, interactive video, question sets — without a Moodle or WordPress install behind it. That alone makes it useful to freelancers and small teams. What earns it a place in a SCORM directory is the export menu: alongside .h5p and standalone HTML, it will produce a SCORM package.","https:\u002F\u002Fdocs.lumi.education",[1860,1863,1866],{"q":1861,"a":1862},"What SCORM version does the export produce?","SCORM 1.2, and only that. The version is hard-coded where Lumi calls the packager. For most LMSs that is the right choice anyway, but if a client has specified 2004 you will need a different route.\n",{"q":1864,"a":1865},"Do I need an H5P account or server?","No. Lumi runs the H5P editor and player locally in an Electron app, so authoring, previewing and exporting all work offline. Content types are downloaded from the H5P hub the first time you use them.\n",{"q":1867,"a":1868},"Is the licence definite?","package.json declares AGPL-3.0, but the repository ships no LICENSE file, so GitHub reports no licence. Treat AGPL-3.0 as the intent and note the missing file if you are doing a formal review.\n",{},"\u002Ftools\u002Flumi",[665,1802,610],{"model":313,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002FLumieducation\u002FLumi",{"description":1857},{"scorm12":1877,"scorm2004":1880,"xapi":1883,"cmi5":1885},{"supported":308,"provenance":320,"checkedAt":242,"source":1878,"note":1879},"https:\u002F\u002Fgithub.com\u002FLumieducation\u002FLumi\u002Fblob\u002Fmaster\u002Fsrc\u002Fops\u002Fexport-h5p.ts","The export builds a self-contained HTML bundle, adds the pipwerks SCORM_API_wrapper plus an H5P-to-SCORM adaptor, and zips it with simple-scorm-packager against a hard-coded version of \"1.2\". Mastery score is settable in the export dialog.\n",{"supported":295,"editions":1881,"provenance":320,"checkedAt":242,"note":1882},[],"The SCORM version passed to the packager is fixed at 1.2; there is no 2004 option in the code or the export UI.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1884},"H5P content types emit xAPI events internally and the adaptor maps them onto SCORM calls, but Lumi has no LRS client and no xAPI output — no reference to xAPI or an LRS exists in its own source.\n",{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Flumi","A desktop H5P editor that exports a working SCORM 1.2 package offline",[1833,1796,1889,1890],"electron","offline","Lumi Education","https:\u002F\u002Flumi.education","1eOZXN-HMhA1IuyeTPBdcTMpO8XwE0mArxBeBfBWc54",{"id":1895,"title":1896,"addedAt":242,"alternatives":1897,"body":1898,"categories":1921,"checkedAt":242,"claimed":293,"description":1922,"docs":1923,"editorsPick":295,"extension":296,"faq":1924,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":1931,"license":1932,"listing":306,"logo":293,"meta":1933,"name":1896,"navigation":308,"openSource":308,"path":1934,"platforms":1935,"pricing":1936,"registries":1937,"repo":1938,"seo":1939,"standards":1940,"status":423,"stem":1959,"tagline":1960,"tags":1961,"vendor":1963,"website":1964,"__hash__":1965},"tools\u002Ftools\u002Fmoodle.md","Moodle",[],{"type":247,"value":1899,"toc":1919},[1900,1907,1910,1913,1916],[250,1901,1902,1903,1906],{},"Moodle matters to this directory for a reason that has little to do with its feature list: it is the LMS your content is most likely to land in, and ",[253,1904,1905],{},"mod_scorm"," is the de facto reference against which a great deal of SCORM content is informally tested. Whatever else you build for, you will end up building for this.",[250,1908,1909],{},"As a SCORM host it is genuinely capable. The activity module implements SCORM 1.2 and 2004 data models separately, handles AICC, tracks multiple attempts, and exposes reporting that most commercial platforms charge for. Because everything is inspectable PHP, when a course misbehaves you can read the code that decided it misbehaved — which is not a small advantage during a support call.",[250,1911,1912],{},"The honest caveat is SCORM 2004 sequencing. It is implemented, and it has diverged from the reference behaviour in edge cases for years. Content that depends on non-trivial sequencing rules should be tested here specifically rather than assumed to work; content that passes here should still be tested elsewhere.",[250,1914,1915],{},"It is also not an xAPI platform. Core's xAPI code serves H5P internally, and reaching an LRS means adding the separately maintained Logstore xAPI plugin. There is no cmi5 support at all.",[250,1917,1918],{},"Development is continuous — the main branch is 5.3dev with commits within the week — and the plugin ecosystem around it is the largest in the category.",{"title":289,"searchDepth":290,"depth":290,"links":1920},[],[20],"Moodle matters to this directory for a reason that has little to do with its feature list: it is the LMS your content is most likely to land in, and mod_scorm is the de facto reference against which a great deal of SCORM content is informally tested. Whatever else you build for, you will end up building for this.","https:\u002F\u002Fdocs.moodle.org",[1925,1928],{"q":1926,"a":1927},"If a package works in Moodle, will it work everywhere?","Not reliably, and the reverse trips people up more often. Moodle's SCORM 2004 sequencing has known divergences from the reference behaviour, so content that leans on sequencing can pass here and fail elsewhere, or the other way round. Treat Moodle as one target among several, not as a conformance test.\n",{"q":1929,"a":1930},"Can Moodle send xAPI to an external LRS?","Not out of the box. The core xAPI code handles statements from H5P activities internally. Sending to an LRS is the job of the Logstore xAPI plugin, which is maintained separately from core.\n","AU","GPL-3.0-or-later",{},"\u002Ftools\u002Fmoodle",[311,610],{"model":313,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle",{"description":1922},{"scorm12":1941,"scorm2004":1944,"aicc":1948,"lti":1950,"xapi":1954,"cmi5":1957},{"supported":308,"provenance":320,"checkedAt":242,"source":1942,"note":1943},"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Ftree\u002Fmain\u002Fpublic\u002Fmod\u002Fscorm\u002Fdatamodels","mod_scorm ships separate scorm_12 and scorm_13 data models plus a sequencing handler; SCORM 1.2 is the better-exercised of the two.\n",{"supported":308,"editions":1945,"provenance":320,"checkedAt":242,"source":1946,"note":1947},[1144,418],"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Fblob\u002Fmain\u002Fpublic\u002Fmod\u002Fscorm\u002Fdatamodels\u002Fscormlib.php","scormlib.php accepts a schemaversion matching '2004 3rd Edition' or '2004 4th Edition'. Sequencing and navigation are implemented but have long-standing gaps; complex sequencing trees are where Moodle most often diverges from a commercial LMS.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":1949},"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Fblob\u002Fmain\u002Fpublic\u002Fmod\u002Fscorm\u002Fdatamodels\u002Faicclib.php",{"supported":308,"versions":1951,"provenance":320,"checkedAt":242,"source":1952,"note":1953},[1018,1019],"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Fblob\u002Fmain\u002Fpublic\u002Fmod\u002Flti\u002Flang\u002Fen\u002Flti.php","mod_lti covers LTI 1.0\u002F1.1 and 2.0 under OAuth 1.0a and LTI 1.3 Advantage under JWT. Moodle can act as both consumer and publisher of tools.\n",{"supported":295,"provenance":320,"checkedAt":242,"source":1955,"note":1956},"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Ftree\u002Fmain\u002Fpublic\u002Flib\u002Fxapi","Core ships an internal xAPI subsystem, but it exists to receive statements from H5P content inside Moodle. Core cannot launch an xAPI package or forward statements to an external LRS; that needs the separate Logstore xAPI plugin.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":1958},"There is no cmi5 activity module in core — the activity list runs scorm, imscp, lti, h5pactivity and so on, with nothing for cmi5.\n","tools\u002Fmoodle","The most widely deployed open-source LMS, and the SCORM behaviour most content gets tested against",[1025,603,1083,1962],"mod-scorm","Moodle Pty Ltd","https:\u002F\u002Fmoodle.org","f-reXiVaJTR3s73DYQU8uKELvzFMpYN4oUbHjiWOGuY",{"id":1967,"title":1968,"addedAt":242,"alternatives":1969,"body":1970,"categories":1996,"checkedAt":242,"claimed":293,"description":1997,"docs":1998,"editorsPick":295,"extension":296,"faq":1999,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":1932,"listing":306,"logo":293,"meta":2006,"name":2007,"navigation":308,"openSource":308,"path":2008,"platforms":2009,"pricing":2011,"registries":2012,"repo":2013,"seo":2014,"standards":2015,"status":423,"stem":2027,"tagline":2028,"tags":2029,"vendor":293,"website":1998,"__hash__":2030},"tools\u002Ftools\u002Fmoodle-mod-scorm.md","Moodle Mod Scorm",[],{"type":247,"value":1971,"toc":1994},[1972,1978,1988,1991],[250,1973,1974,1975,1977],{},"Not a product but a core Moodle activity module, and worth a listing precisely because of that. Moodle's installed base means ",[253,1976,1905],{}," is the runtime most SCORM content meets after leaving the authoring tool, so its behaviour has become the de facto second opinion — if a package works in SCORM Cloud and in Moodle, it usually works.",[250,1979,1980,1981,260,1984,1987],{},"What it does: unpack a package interchange file, parse the manifest, present the organisation as a table of contents, run each SCO in a frame or new window, and persist tracking per attempt with reporting, grade integration and a debug window that logs API calls when an administrator enables it. Both data models are implemented in full (",[253,1982,1983],{},"scorm_12.php",[253,1985,1986],{},"scorm_13.php","), AICC HACP survives as an optional legacy path, and mobile clients are supported through web services.",[250,1989,1990],{},"Its limits are worth knowing before you blame your content. The manifest parser only recognises 2004 3rd and 4th Edition strings and silently treats anything else as 1.2. Sequencing and navigation exist but are partial, which is where 2004 packages most often diverge between Moodle and commercial platforms.",[250,1992,1993],{},"You cannot lift the player out — it is bound to Moodle's database, file and permission layers. Maintenance is not in question: this is core code in a project with paid maintainers, a fixed release cadence and a security process.",{"title":289,"searchDepth":290,"depth":290,"links":1995},[],[11],"Not a product but a core Moodle activity module, and worth a listing precisely because of that. Moodle's installed base means mod_scorm is the runtime most SCORM content meets after leaving the authoring tool, so its behaviour has become the de facto second opinion — if a package works in SCORM Cloud and in Moodle, it usually works.","https:\u002F\u002Fdocs.moodle.org\u002Fen\u002FSCORM_activity",[2000,2003],{"q":2001,"a":2002},"Where does the code live in the repository?","Since Moodle 5.0 the application moved under a public\u002F directory, so the module is at public\u002Fmod\u002Fscorm. Older instructions pointing at mod\u002Fscorm still describe the same plugin, just a pre-5.0 tree.\n",{"q":2004,"a":2005},"Why do packages behave differently in Moodle than elsewhere?","Most often the manifest. If the schemaversion is not exactly \"2004 3rd Edition\" or \"2004 4th Edition\", Moodle runs the package under the SCORM 1.2 data model, and 2004-only elements then fail.\n",{},"Moodle SCORM activity (mod_scorm)","\u002Ftools\u002Fmoodle-mod-scorm",[311,2010],"lms-plugin",{"model":313,"source":1964},[],"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Ftree\u002Fmain\u002Fpublic\u002Fmod\u002Fscorm",{"description":1997},{"scorm12":2016,"scorm2004":2018,"aicc":2021,"xapi":2024,"cmi5":2026},{"supported":308,"provenance":320,"checkedAt":242,"source":2017},"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Fblob\u002Fmain\u002Fpublic\u002Fmod\u002Fscorm\u002Fdatamodels\u002Fscorm_12.php",{"supported":308,"editions":2019,"provenance":320,"checkedAt":242,"source":1946,"note":2020},[1144,418],"The manifest parser matches the schemaversion against \"2004 3rd Edition\" or \"2004 4th Edition\" and only then switches to the 1.3 data model; any other value is handled as SCORM 1.2. Sequencing is implemented but partial.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":2022,"note":2023},"https:\u002F\u002Fgithub.com\u002Fmoodle\u002Fmoodle\u002Fblob\u002Fmain\u002Fpublic\u002Fmod\u002Fscorm\u002Fsettings.php","AICC HACP and direct AICC URLs are still shipped, but both are disabled by default and must be enabled by an administrator.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":2025},"Nothing in mod_scorm emits xAPI. Moodle sites that send xAPI do so through the separate logstore_xapi plugin.\n",{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fmoodle-mod-scorm","The SCORM player inside Moodle — the most exercised open-source runtime there is",[1083,1464,2010,603],"c7KY01RjMcT5BxFit35jrnj2m1CZMss0J9riE18-IOg",{"id":2032,"title":2033,"addedAt":242,"alternatives":2034,"body":2035,"categories":2059,"checkedAt":242,"claimed":293,"description":2039,"docs":2060,"editorsPick":295,"extension":296,"faq":2061,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":2068,"license":605,"listing":306,"logo":293,"meta":2069,"name":2033,"navigation":308,"openSource":308,"path":2070,"platforms":2071,"pricing":2072,"registries":2074,"repo":2075,"seo":2076,"standards":2077,"status":423,"stem":2085,"tagline":2086,"tags":2087,"vendor":2091,"website":2073,"__hash__":2092},"tools\u002Ftools\u002Fnumbas.md","Numbas",[],{"type":247,"value":2036,"toc":2057},[2037,2040,2051,2054],[250,2038,2039],{},"Numbas is an e-assessment system built at Newcastle University for mathematics and cognate subjects, and it is the strongest open-source option in that niche by some distance. Questions are randomised from parameterised templates, answers are marked by algorithms rather than pattern matching, and the whole exam runs client-side, which makes it viable for formative practice at scale as well as summative tests.",[250,2041,2042,2043,2046,2047,2050],{},"For this directory the relevant fact is what the compiler emits. A Numbas exam builds into a SCORM 2004 3rd Edition package with sequencing schemas included, mapping questions to ",[253,2044,2045],{},"cmi.objectives"," and parts to ",[253,2048,2049],{},"cmi.interactions"," — genuinely detailed reporting, not just a final score. What it does not emit is SCORM 1.2, and that is worth confirming against your LMS before committing, because a good deal of corporate LMS estate is still 1.2-only.",[250,2052,2053],{},"It is not a general authoring tool. Nobody should choose Numbas to build compliance modules; the interaction vocabulary is mathematical, and the effort goes into marking algorithms rather than presentation.",[250,2055,2056],{},"Maintenance is as good as open source in education gets: version 10.0 released June 2026, a fifteen-year history, institutional backing, an issue tracker with labelled first issues, and a documented ecosystem of editor, extensions and LTI provider. The main adoption cost is deciding which pieces of that ecosystem you intend to host.",{"title":289,"searchDepth":290,"depth":290,"links":2058},[],[5],"https:\u002F\u002Fdocs.numbas.org.uk\u002Fen\u002Flatest\u002F",[2062,2065],{"q":2063,"a":2064},"Is this repository the thing I install?","Usually not. This is the Python compiler and JavaScript runtime; most people author through the separate web editor, either the free public instance at numbas.mathcentre.ac.uk or their own. Install this directly only if you are scripting exam generation or embedding the runtime.\n",{"q":2066,"a":2067},"What if my LMS only speaks SCORM 1.2?","Then Numbas packages will not track. The alternative route is the separate numbas-lti-provider, which runs exams as an LTI tool and keeps its own attempt records — a heavier deployment, but it sidesteps SCORM entirely.\n","GB",{},"\u002Ftools\u002Fnumbas",[836,311],{"model":313,"freeTier":308,"source":2073},"https:\u002F\u002Fwww.numbas.org.uk",[],"https:\u002F\u002Fgithub.com\u002Fnumbas\u002FNumbas",{"description":2039},{"scorm2004":2078,"scorm12":2082},{"supported":308,"editions":2079,"provenance":320,"checkedAt":242,"source":2080,"note":2081},[1144],"https:\u002F\u002Fgithub.com\u002Fnumbas\u002FNumbas\u002Fblob\u002Fmaster\u002Fscormfiles\u002Fimsmanifest.xml","The bundled manifest declares '2004 3rd Edition' and includes the IMS Simple Sequencing schemas. The runtime binds to window.API_1484_11 with the pipwerks wrapper pinned to version '2004'.\n",{"supported":295,"provenance":320,"checkedAt":242,"source":2083,"note":2084},"https:\u002F\u002Fgithub.com\u002Fnumbas\u002FNumbas\u002Fblob\u002Fmaster\u002Fruntime\u002Fscripts\u002Fscorm-storage.js","There is no 1.2 code path. scorm-storage.js sets the wrapper version to 2004 unconditionally, so an LMS that only offers the 1.2 API will not connect.\n","tools\u002Fnumbas","Browser-based maths e-assessment system that compiles exams to SCORM 2004",[2088,2089,2090],"assessment","mathematics","university","Newcastle University","6HHDxDmxLiv9JCqgPoPdqWnIVkeE-yZ2mf6-M7fE0Ks",{"id":2094,"title":2095,"addedAt":242,"alternatives":2096,"body":2098,"categories":2119,"checkedAt":242,"claimed":293,"description":2120,"docs":2121,"editorsPick":295,"extension":296,"faq":2122,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":1002,"listing":306,"logo":293,"meta":2129,"name":2130,"navigation":308,"openSource":308,"path":2131,"platforms":2132,"pricing":2133,"registries":2134,"repo":2135,"seo":2136,"standards":2137,"status":423,"stem":2152,"tagline":2153,"tags":2154,"vendor":2156,"website":2157,"__hash__":2158},"tools\u002Ftools\u002Fopen-edx.md","Open Edx",[2097],"openedx-scorm-xblock",{"type":247,"value":2099,"toc":2117},[2100,2111,2114],[250,2101,2102,2103,2106,2107,2110],{},"Open edX is the platform behind edx.org and a long list of university and government deployments — Studio for authoring, an LMS for delivery, and an XBlock plugin architecture that most of its standards support hangs off. The repository is one of the larger open-source education codebases in existence: over eight thousand stars, four thousand forks, and daily commits under Axim Collaborative's stewardship. Note that ",[253,2104,2105],{},"openedx\u002Fedx-platform"," now redirects to ",[253,2108,2109],{},"openedx\u002Fopenedx-platform",".",[250,2112,2113],{},"Its relevance here is as a destination rather than a tool. If you are shipping SCORM courseware to an organisation that runs Open edX, what you are really shipping to is the SCORM XBlock, and its limits — no sequencing, no rollup, no edition-specific 2004 behaviour — are your limits. If you are choosing a platform and standards support is the axis, understand that SCORM, xAPI and LTI each arrive as a separately versioned package with its own maintainers and its own release cadence.",[250,2115,2116],{},"It is a poor fit for a small team wanting a course online this quarter. The install is a substantial Django estate; Tutor makes it tractable but does not make it small. Against that, the licence is AGPL-3.0 with no seat charges, the codebase is genuinely alive, and the community edition is the same software the large deployments run — which is not true of every open-core LMS in this directory.",{"title":289,"searchDepth":290,"depth":290,"links":2118},[],[20],"Open edX is the platform behind edx.org and a long list of university and government deployments — Studio for authoring, an LMS for delivery, and an XBlock plugin architecture that most of its standards support hangs off. The repository is one of the larger open-source education codebases in existence: over eight thousand stars, four thousand forks, and daily commits under Axim Collaborative's stewardship. Note that openedx\u002Fedx-platform now redirects to openedx\u002Fopenedx-platform.","https:\u002F\u002Fdocs.openedx.org",[2123,2126],{"q":2124,"a":2125},"Does Open edX support SCORM out of the box?","Not in the core platform. It supports SCORM through the openedx-scorm-xblock plugin, which is bundled by default in official Tutor releases — so on a Tutor install it is effectively out of the box, and on a hand-rolled deployment it is a pip install and a config change.\n",{"q":2127,"a":2128},"Is it realistic to self-host?","With Tutor, yes for a technically capable team; without it, this is a large Django estate with a substantial service footprint. Budget for an operator, not just a server.\n",{},"Open edX","\u002Ftools\u002Fopen-edx",[311,610],{"model":313,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Fopenedx\u002Fedx-platform",{"description":2120},{"scorm12":2138,"scorm2004":2141,"xapi":2144,"cmi5":2147,"lti":2148},{"supported":308,"provenance":320,"checkedAt":242,"source":2139,"note":2140},"https:\u002F\u002Fgithub.com\u002Foverhangio\u002Fopenedx-scorm-xblock","Not in edx-platform itself. SCORM comes from the separate openedx-scorm-xblock (AGPL-3.0), which its readme says ships bundled in official Tutor releases — Tutor being the standard distribution.\n",{"supported":308,"editions":2142,"provenance":320,"checkedAt":242,"source":2139,"note":2143},[],"Same plugin, same caveats: no sequencing or rollup, and editions are not distinguished.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":2145,"note":2146},"https:\u002F\u002Fgithub.com\u002Fopenedx\u002Fevent-routing-backends","Provided by openedx\u002Fevent-routing-backends, which ships xAPI transformers that convert platform tracking events into statements and forward them to an LRS. The package's readme still describes this as work in progress; the transformer code is present and shipped.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":308,"versions":2149,"provenance":320,"checkedAt":242,"source":2150,"note":2151},[1018,1019],"https:\u002F\u002Fgithub.com\u002Fopenedx\u002Fxblock-lti-consumer","As a consumer, through openedx\u002Fxblock-lti-consumer — LTI 1.1 with Basic Outcomes, and LTI 1.3 with Advantage services.\n","tools\u002Fopen-edx","The large self-hosted learning platform, with SCORM and xAPI arriving via plugins",[1025,603,630,2155],"django","Open edX \u002F Axim Collaborative","https:\u002F\u002Fopenedx.org","j5BVBh_lC1wuzcyIU9hZgSWbeAcxISh-rO9myY_UHUs",{"id":2160,"title":2161,"addedAt":242,"alternatives":2162,"body":2164,"categories":2184,"checkedAt":242,"claimed":293,"description":2185,"docs":2186,"editorsPick":295,"extension":296,"faq":2187,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":1002,"listing":306,"logo":293,"meta":2194,"name":2195,"navigation":308,"openSource":308,"path":2196,"platforms":2197,"pricing":2198,"registries":2199,"repo":2139,"seo":2200,"standards":2201,"status":423,"stem":2213,"tagline":2214,"tags":2215,"vendor":2218,"website":2139,"__hash__":2219},"tools\u002Ftools\u002Fopenedx-scorm-xblock.md","Openedx Scorm Xblock",[2163],"open-edx",{"type":247,"value":2165,"toc":2182},[2166,2173,2176,2179],[250,2167,2168,2169,2172],{},"This is the block that makes Open edX able to hold SCORM content at all. You add a Scorm module in Studio, upload a zip with an ",[253,2170,2171],{},"imsmanifest.xml"," at its root, and the package is extracted to the platform's storage backend and rendered in an iframe with a Python-backed API shim behind it. Learner state persists on the block, the score feeds the normal Open edX grading machinery including rescoring, and staff get a full data report of the stored CMI elements.",[250,2174,2175],{},"It is for Open edX operators who have bought or inherited SCORM courseware and need it inside an existing programme. The Django Storages integration is what makes it viable at scale — packages land on S3 or a configured bucket, and the storage function is overridable per organisation.",[250,2177,2178],{},"What it does not do is behave like a dedicated SCORM runtime. There is no sequencing or rollup, editions of SCORM 2004 are not distinguished, and complex multi-SCO packages built around navigation rules will disappoint. Test a specific package before promising a client it will work.",[250,2180,2181],{},"Maintenance is good by the standards of this category: Overhang.IO maintain it as part of the Tutor ecosystem, the last push was August 2026, and version 19.0.4 in June 2026 decoupled the block's version from the Open edX release train — which means you can now upgrade the block without waiting for a platform release. Sixty-three forks against thirty-eight stars is the usual signature of a plugin people patch for their own deployment.",{"title":289,"searchDepth":290,"depth":290,"links":2183},[],[20],"This is the block that makes Open edX able to hold SCORM content at all. You add a Scorm module in Studio, upload a zip with an imsmanifest.xml at its root, and the package is extracted to the platform's storage backend and rendered in an iframe with a Python-backed API shim behind it. Learner state persists on the block, the score feeds the normal Open edX grading machinery including rescoring, and staff get a full data report of the stored CMI elements.","https:\u002F\u002Fpypi.org\u002Fproject\u002Fopenedx-scorm-xblock\u002F",[2188,2191],{"q":2189,"a":2190},"Do I need to install it if I run Tutor?","No. The block's readme states it ships bundled in official Tutor releases, so on a Tutor platform you only need to add \"scorm\" to the course's Advanced Module List. On other deployments, install the PyPI package and set X_FRAME_OPTIONS to SAMEORIGIN in lms.yml and studio.yml.\n",{"q":2192,"a":2193},"Can I migrate from the older Raccoon Gang xblock?","Not directly — the readme is explicit that old blocks cannot simply be migrated. Both can run side by side on the same platform, which is the intended transition path.\n",{},"Open edX SCORM XBlock","\u002Ftools\u002Fopenedx-scorm-xblock",[2010,311],{"model":313},[],{"description":2185},{"scorm12":2202,"scorm2004":2205,"xapi":2209,"cmi5":2211,"aicc":2212},{"supported":308,"provenance":320,"checkedAt":242,"source":2203,"note":2204},"https:\u002F\u002Fgithub.com\u002Foverhangio\u002Fopenedx-scorm-xblock\u002Fblob\u002Fmaster\u002Fopenedxscorm\u002Fscormxblock.py","The block reads schemaversion from imsmanifest.xml and treats \"1.2\" as SCORM 1.2, storing cmi.core.* elements and mapping cmi.core.lesson_status to the Open edX grade.\n",{"supported":308,"editions":2206,"provenance":320,"checkedAt":242,"source":2207,"note":2208},[],"https:\u002F\u002Fgithub.com\u002Foverhangio\u002Fopenedx-scorm-xblock\u002Fblob\u002Fmaster\u002Fopenedxscorm\u002Fstatic\u002Fjs\u002Fsrc\u002Fscorm.js","Anything whose schemaversion is not \"1.2\" is handled as SCORM 2004 and served an API_1484_11 object; completion_status, success_status, score.scaled and progress_measure are persisted. Editions are not distinguished, and sequencing is not implemented — a multi-SCO package with sequencing rules will not behave as it would in a full LMS.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":2210},"Not in this block. Open edX emits xAPI through the separate event-routing-backends package.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fopenedx-scorm-xblock","Upload a SCORM package into an Open edX course and grade it like any other block",[2163,2216,2217,630],"xblock","tutor","Overhang.IO","NTPKTADH-d0CRtakTZnD97NXyyNVeRyfrkxXDKygy0k",{"id":2221,"title":2222,"addedAt":242,"alternatives":2223,"body":2224,"categories":2240,"checkedAt":242,"claimed":293,"description":2228,"docs":2241,"editorsPick":295,"extension":296,"faq":2242,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":2249,"license":605,"listing":306,"logo":293,"meta":2250,"name":2251,"navigation":308,"openSource":308,"path":2252,"platforms":2253,"pricing":2254,"registries":2256,"repo":2257,"seo":2258,"standards":2259,"status":423,"stem":2273,"tagline":2274,"tags":2275,"vendor":2276,"website":2277,"__hash__":2278},"tools\u002Ftools\u002Fopenolat.md","Openolat",[],{"type":247,"value":2225,"toc":2238},[2226,2229,2232,2235],[250,2227,2228],{},"OpenOLAT is the continuation of the OLAT platform begun at the University of Zurich, now developed by frentix in Switzerland. It is a full LMS in the university sense rather than the corporate one: course authoring by assembling a tree of typed course nodes, strong QTI 2.1 assessment support, curriculum and lecture management, appointments, portfolios. Where most open-source LMSs treat assessment as a plugin, here it is the centre of gravity.",[250,2230,2231],{},"For standards work the picture is specific. SCORM support is a first-class course-node type with a server-side runtime and a result archiver, but it is SCORM 1.2 and only 1.2 — the content-packaging classes in the tree are named for that version and there is no 2004 API endpoint. LTI is the opposite story: both Basic LTI and a properly built LTI 1.3 implementation with deep linking, and OpenOLAT can act as platform as well as tool. There is no xAPI or cmi5 anywhere in the codebase.",[250,2233,2234],{},"Maintenance is not in doubt — 437 stars understates it, since the real activity is commits, and those run daily through August 2026 with a paid team behind them. Deployment is a Java and PostgreSQL affair; budget accordingly.",[250,2236,2237],{},"Choose it for assessment-heavy academic or regulated training, and for LTI integration. Look elsewhere if your course library is SCORM 2004 or your reporting strategy is xAPI.",{"title":289,"searchDepth":290,"depth":290,"links":2239},[],[20],"https:\u002F\u002Fdocs.openolat.org",[2243,2246],{"q":2244,"a":2245},"Is it really free, given the membership programme?","The code is Apache-2.0 and you can run it without paying anyone. frentix sells hosting, support and a community membership that funds development. Nothing in the repository is gated behind that membership.\n",{"q":2247,"a":2248},"Can it run SCORM 2004 packages?","Not as shipped. The runtime is SCORM 1.2. Many 2004 packages will fail import outright, and a 2004 package that happens to degrade will lose its sequencing. Test before committing a course library to it.\n","CH",{},"OpenOLAT","\u002Ftools\u002Fopenolat",[311,610],{"model":313,"currency":1134,"freeTier":308,"source":2255},"https:\u002F\u002Fwww.openolat.com\u002Fopen-source\u002F",[],"https:\u002F\u002Fgithub.com\u002FOpenOLAT\u002FOpenOLAT",{"description":2228},{"scorm12":2260,"scorm2004":2263,"lti":2266,"xapi":2270,"cmi5":2272},{"supported":308,"provenance":320,"checkedAt":242,"source":2261,"note":2262},"https:\u002F\u002Fgithub.com\u002FOpenOLAT\u002FOpenOLAT\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Folat\u002Fmodules\u002Fscorm","A full SCORM course-node type plus a server-side runtime under org.olat.modules.scorm, with SCORM12_Core and SCORM12_DocumentHandler doing the content-package parsing. Read in source, August 2026.\n",{"supported":295,"editions":2264,"provenance":320,"checkedAt":242,"note":2265},[],"The SCORM module contains only 1.2 content-packaging classes and no API_1484_11 endpoint anywhere in the tree. Checked against the full repository file listing, August 2026.\n",{"supported":308,"versions":2267,"provenance":320,"checkedAt":242,"source":2268,"note":2269},[1018,1019],"https:\u002F\u002Fgithub.com\u002FOpenOLAT\u002FOpenOLAT\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Folat\u002Fims\u002Flti13","org.olat.ims.lti implements Basic LTI launches with outcomes; org.olat.ims.lti13 implements LTI 1.3 with deep linking, JWKS key handling and both tool and platform roles. Read in source, August 2026.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":2271},"No xAPI, LRS or TinCan code in the repository. If you need statement forwarding you are writing it or buying it from a partner.\n",{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fopenolat","Long-running Swiss open-source LMS with SCORM 1.2, QTI 2.1 and LTI 1.3 built in",[1025,684,603],"frentix GmbH","https:\u002F\u002Fwww.openolat.com","qJCQJ5M35y7rf2A11FgGI0_AA6fdIBp1Z1UvxBFtFtk",{"id":2280,"title":2281,"addedAt":242,"alternatives":2282,"body":2283,"categories":2306,"checkedAt":242,"claimed":293,"description":2287,"docs":2307,"editorsPick":295,"extension":296,"faq":2308,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":2249,"license":2312,"listing":306,"logo":293,"meta":2313,"name":2314,"navigation":308,"openSource":308,"path":2315,"platforms":2316,"pricing":2317,"registries":2318,"repo":2319,"seo":2320,"standards":2321,"status":423,"stem":2331,"tagline":2332,"tags":2333,"vendor":2335,"website":2336,"__hash__":2337},"tools\u002Ftools\u002Fopigno.md","Opigno",[],{"type":247,"value":2284,"toc":2304},[2285,2288,2291,2294],[250,2286,2287],{},"Opigno is a Drupal distribution rather than a standalone application: a curated set of modules, configuration and a theme that turn Drupal into a learning platform with training paths, classes, certificates, badges, live meetings and H5P-based activities. It is maintained by the Swiss agency Connect-i, which also sells hosted and enterprise editions alongside the free Community release.",[250,2289,2290],{},"The case for it is straightforward. If an organisation already runs Drupal — with its content model, user management, translation handling and access control in place — Opigno makes training another part of the same site rather than a second system to integrate. The learning-path model is more flexible than the usual course-and-module hierarchy.",[250,2292,2293],{},"The case against it is equally clear. You inherit Drupal's operational reality: major-version upgrades, module compatibility, and PHP hosting that has to be maintained properly. SCORM support lives in a bolt-on module whose stated ceiling is 2004 3rd Edition, which is enough for most published content but not the deep sequencing implementation a purpose-built player offers. There is no cmi5 claim, and we would not infer one.",[250,2295,2296,2297,270,2300,2303],{},"Maintenance is healthy — the distribution page was updated in August 2026 and the 3.2 branch reports over a thousand reported installs — but note that ",[253,2298,2299],{},"opigno_scorm",[253,2301,2302],{},"opigno_tincan_api"," are updated on their own, slower cadence.",{"title":289,"searchDepth":290,"depth":290,"links":2305},[],[20],"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fopigno_lms",[2309],{"q":2310,"a":2311},"Where is the source, if not on GitHub?","On drupal.org. The canonical repository is git.drupalcode.org\u002Fproject\u002Fopigno_lms, and the SCORM and xAPI pieces are separate projects — `opigno_scorm` and `opigno_tincan_api`. GitHub copies of Opigno are third-party mirrors and forks.\n","GPL-2.0-or-later",{},"Opigno LMS","\u002Ftools\u002Fopigno",[311,2010],{"model":313,"source":2307},[],"https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fopigno_lms",{"description":2287},{"scorm12":2322,"scorm2004":2325,"xapi":2328},{"supported":308,"provenance":851,"checkedAt":242,"source":2323,"note":2324},"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fopigno_scorm","The Opigno SCORM module's project page states compliance with SCORM 1.2. Taken from that page; not confirmed against a conformance suite here.\n",{"supported":308,"editions":2326,"provenance":851,"checkedAt":242,"source":2307,"note":2327},[1144],"The distribution's own page says Opigno 3.x is \"SCORM compliant (1.2 and 2004 v3)\". The module page says only \"SCORM 2004\" without an edition.\n",{"supported":308,"provenance":851,"checkedAt":242,"source":2329,"note":2330},"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fopigno_tincan_api","Provided by the separate Opigno TinCan API module, which emits statements to an external LRS. Its page names Learning Locker and Watershed as the LRSs it was tested against.\n","tools\u002Fopigno","Drupal distribution turned LMS, with SCORM and xAPI handled by its own modules",[2334,1083,1025],"drupal","Connect-i","https:\u002F\u002Fwww.opigno.org","i-rJVEMmiBprx-H298PCGP68NC38rTYlxrhtVQsRKxk",{"id":2339,"title":2340,"addedAt":242,"alternatives":2341,"body":2342,"categories":2362,"checkedAt":242,"claimed":293,"description":2346,"docs":2363,"editorsPick":295,"extension":296,"faq":2364,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":2371,"name":2372,"navigation":308,"openSource":308,"path":2373,"platforms":2374,"pricing":2375,"registries":2377,"repo":2378,"seo":2379,"standards":2380,"status":423,"stem":2396,"tagline":2397,"tags":2398,"vendor":293,"website":2378,"__hash__":2400},"tools\u002Ftools\u002Fprism-wcag-audit.md","Prism Wcag Audit",[],{"type":247,"value":2343,"toc":2360},[2344,2347,2350,2357],[250,2345,2346],{},"Prism is a Node.js command-line tool that takes an e-learning package, works out what kind it is, unpacks it, and runs accessibility checks over the HTML inside — producing an HTML, Markdown and JSON report per package and a rollup across a whole library. Underneath it is axe-core, with Playwright for checks that need a rendered page and its own rule modules named after WCAG success criteria. There is also an optional rebuild mode that applies mechanical fixes and writes a patched zip, with the more speculative transforms staged behind an explicit approval step.",[250,2348,2349],{},"The idea is sound and the gap is real. Accessibility tooling assumes a URL; e-learning content arrives as a zip full of frames, and auditing a library of a few hundred legacy packages by hand is genuinely expensive. Detecting SCORM 1.2, SCORM 2004, AICC, cmi5 and xAPI packages and iterating their pages is the right shape for that problem.",[250,2351,2352,2353,2356],{},"Judge the maturity honestly, though. The repository was created in April 2026, has around three dozen commits, no stars, no forks and no tagged releases, and its README is written around one firm's consulting workflow — engagement folders, consultant-hour scope estimates, a named house compliance baseline. That is a single-author tool shared publicly, not a community project. The MIT licence is declared in ",[253,2354,2355],{},"package.json"," rather than a LICENSE file.",[250,2358,2359],{},"Worth reading if you are building your own package auditing; worth trialling on a copy of a real library before you would depend on its numbers.",{"title":289,"searchDepth":290,"depth":290,"links":2361},[],[14],"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism#readme",[2365,2368],{"q":2366,"a":2367},"Which WCAG version does it actually test against?","The README sets the default baseline at WCAG 2.1 AA plus Section 508, with 2.2 as an opt-in, while the repository description says 2.2 AA. The checks directory does contain the 2.2 additions — focus not obscured, dragging movements, target size, consistent help, accessible authentication — so the capability is there; set the level explicitly.\n",{"q":2369,"a":2370},"Can automated checks establish accessibility conformance?","No, and that is not this tool's fault. Automated rules catch a minority of WCAG failures — missing labels, contrast, structure — and say nothing about whether alt text is meaningful or a sequence makes sense to a screen-reader user. Use it to triage a library, then test manually.\n",{},"Prism","\u002Ftools\u002Fprism-wcag-audit",[836],{"model":313,"source":2376},"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism\u002Fblob\u002Fmain\u002Fpackage.json",[],"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism",{"description":2346},{"scorm12":2381,"scorm2004":2384,"aicc":2387,"cmi5":2390,"xapi":2393},{"supported":308,"provenance":320,"checkedAt":242,"source":2382,"note":2383},"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism\u002Fblob\u002Fmain\u002Fsrc\u002Fparser\u002Fdetect.js","Package-type detection reads `imsmanifest.xml` and infers 1.2 from the schema version and namespaces. Support here means the package is parsed and its pages audited — no run-time API is implemented.\n",{"supported":308,"editions":2385,"provenance":320,"checkedAt":242,"source":2382,"note":2386},[],"Distinguished from 1.2 by a schemaversion containing \"2004\" or by the `adlcp_v1p3`\u002F`imsss` namespaces. Editions are not differentiated.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":2388,"note":2389},"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism\u002Fblob\u002Fmain\u002Fsrc\u002Fparser\u002Faicc.js","Detected by the presence of a `.crs` file, with its own parser module.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":2391,"note":2392},"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism\u002Fblob\u002Fmain\u002Fsrc\u002Fparser\u002Fcmi5.js","Detected from a `cmi5.xml` at the package root. Note that the repository description omits cmi5 while the parser supports it.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":2394,"note":2395},"https:\u002F\u002Fgithub.com\u002Fdavenguyen87\u002FPrism\u002Fblob\u002Fmain\u002Fsrc\u002Fparser\u002Fxapi.js","Detected from a `tincan.xml` at the package root.\n","tools\u002Fprism-wcag-audit","Unzips a SCORM, AICC, cmi5 or xAPI package and runs axe-core over every page in it",[858,2399,836,797],"wcag","UlJ99COKmvQ9gKrhYcUTwVzPftNT0LA9jCUHS49FNgQ",{"id":2402,"title":2403,"addedAt":242,"alternatives":2404,"body":2405,"categories":2421,"checkedAt":242,"claimed":293,"description":2409,"docs":2422,"editorsPick":295,"extension":296,"faq":2423,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":2424,"name":2425,"navigation":308,"openSource":308,"path":2426,"platforms":2427,"pricing":2428,"registries":2429,"repo":2430,"seo":2431,"standards":2432,"status":329,"stem":2441,"tagline":2442,"tags":2443,"vendor":293,"website":2430,"__hash__":2446},"tools\u002Ftools\u002Frescorm.md","Rescorm",[],{"type":247,"value":2406,"toc":2419},[2407,2410,2413,2416],[250,2408,2409],{},"RESCORM is a project skeleton rather than a library: clone it and you get a React application wired to Redux, React Router, i18n, SASS, Jest and Enzyme, with SCORM communication already plumbed in and a webpack build that produces something an LMS can launch. Its documentation lives in the repository wiki rather than the README.",[250,2411,2412],{},"The idea is sound and still uncommon — most SCORM front-end work involves bolting a tracking wrapper onto an app that was never designed for it, and starting from a template that already knows about launch, resume and commit removes a genuinely fiddly day of work.",[250,2414,2415],{},"The problem is the vintage. The pinned stack is React 16.0, React Router 4 and webpack 3, and the last commit was December 2022. Adopting it today means adopting a 2017-era toolchain and then migrating it yourself, which is more work than lifting the SCORM layer out and dropping it into a current React setup. Twenty-one issues are open against forty-nine stars.",[250,2417,2418],{},"Read it for the tracking plumbing and the packaging build, which are the parts that age well. Do not treat it as a starting template for new work, and note that we are relying on the README for its standards claims rather than a run against a conformance suite.",{"title":289,"searchDepth":290,"depth":290,"links":2420},[],[17],"https:\u002F\u002Fgithub.com\u002Fagordillo\u002FRESCORM\u002Fwiki",[],{},"RESCORM","\u002Ftools\u002Frescorm",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fagordillo\u002FRESCORM",{"description":2409},{"scorm12":2433,"scorm2004":2436,"xapi":2439,"cmi5":2440},{"supported":308,"provenance":851,"checkedAt":242,"source":2434,"note":2435},"https:\u002F\u002Fgithub.com\u002Fagordillo\u002FRESCORM#features","Listed in the project README's feature table. We read the README and the repository layout but did not run a package against an LMS.\n",{"supported":308,"editions":2437,"provenance":851,"checkedAt":242,"source":2434,"note":2438},[418],"The README states \"SCORM 1.2 and SCORM 2004 4th Edition support\". Not confirmed against the running code.\n",{"supported":295,"provenance":851,"checkedAt":242},{"supported":295,"provenance":851,"checkedAt":242},"tools\u002Frescorm","React boilerplate that ships SCORM tracking alongside the application code",[1761,2444,2445],"boilerplate","redux","DKDhFrjkjeKYWk_T9gKN2zygFQPkXauCxtxvXeTJWIk",{"id":2448,"title":2449,"addedAt":242,"alternatives":2450,"body":2451,"categories":2467,"checkedAt":242,"claimed":293,"description":2455,"docs":2468,"editorsPick":295,"extension":296,"faq":2469,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":1619,"license":305,"listing":306,"logo":293,"meta":2476,"name":2477,"navigation":308,"openSource":308,"path":2478,"platforms":2479,"pricing":2480,"registries":2481,"repo":2482,"seo":2483,"standards":2484,"status":423,"stem":2493,"tagline":2494,"tags":2495,"vendor":2497,"website":2468,"__hash__":2498},"tools\u002Ftools\u002Fralph-lrs.md","Ralph Lrs",[865],{"type":247,"value":2452,"toc":2465},[2453,2456,2459,2462],[250,2454,2455],{},"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.",[250,2457,2458],{},"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.",[250,2460,2461],{},"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.",[250,2463,2464],{},"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":289,"searchDepth":290,"depth":290,"links":2466},[],[23],"https:\u002F\u002Fopenfun.github.io\u002Fralph\u002F",[2470,2473],{"q":2471,"a":2472},"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":2474,"a":2475},"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",{},"Ralph","\u002Ftools\u002Fralph-lrs",[311,836,304,610],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fopenfun\u002Fralph",{"description":2455},{"xapi":2485,"cmi5":2488,"scorm12":2490,"scorm2004":2491},{"supported":308,"provenance":320,"checkedAt":242,"source":2486,"note":2487},"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":295,"provenance":320,"checkedAt":242,"note":2489},"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":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":2492,"provenance":320,"checkedAt":242},[],"tools\u002Fralph-lrs","A Python xAPI LRS, CLI and data-pipeline toolbox from France Universite Numerique",[627,630,2496,915],"fastapi","France Universite Numerique","ehCK9S-bMXPxjLEDcQDODPa8ZdIbUx7J8ikXcNfiavw",{"id":2500,"title":2501,"addedAt":242,"alternatives":2502,"body":2503,"categories":2519,"checkedAt":242,"claimed":293,"description":2507,"docs":293,"editorsPick":295,"extension":296,"faq":2520,"firstParty":295,"foundedYear":293,"hosting":1796,"hqCountry":604,"license":1002,"listing":306,"logo":293,"meta":2527,"name":2528,"navigation":308,"openSource":308,"path":2529,"platforms":2530,"pricing":2531,"registries":2533,"repo":2532,"seo":2534,"standards":2535,"status":423,"stem":2542,"tagline":2543,"tags":2544,"vendor":2546,"website":2532,"__hash__":2547},"tools\u002Ftools\u002Frapidcmi5.md","Rapidcmi5",[],{"type":247,"value":2504,"toc":2517},[2505,2508,2511,2514],[250,2506,2507],{},"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.",[250,2509,2510],{},"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.",[250,2512,2513],{},"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.",[250,2515,2516],{},"Prebuilt Windows installers and a Linux AppImage are published, so evaluating it costs an afternoon rather than a build environment.",{"title":289,"searchDepth":290,"depth":290,"links":2518},[],[23],[2521,2524],{"q":2522,"a":2523},"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":2525,"a":2526},"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",{},"RapidCMI5","\u002Ftools\u002Frapidcmi5",[665,610],{"model":313,"source":2532},"https:\u002F\u002Fgithub.com\u002FByLightSDC\u002Frapidcmi5",[],{"description":2507},{"cmi5":2536,"xapi":2539},{"supported":308,"provenance":320,"checkedAt":242,"source":2537,"note":2538},"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":308,"provenance":320,"checkedAt":242,"source":2540,"note":2541},"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",[2545,1796,1889],"authoring","By Light Professional IT Services","rfdlE35MHPOIJT9yq15Zz5OkJ1VnvrJv1QZ59j_A3p4",{"id":2549,"title":2550,"addedAt":242,"alternatives":2551,"body":2552,"categories":2585,"checkedAt":242,"claimed":293,"description":2586,"docs":2587,"editorsPick":295,"extension":296,"faq":2588,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":2595,"name":2596,"navigation":308,"openSource":308,"path":2597,"platforms":2598,"pricing":2599,"registries":2601,"repo":2602,"seo":2603,"standards":2604,"status":329,"stem":2614,"tagline":2615,"tags":2616,"vendor":2617,"website":2602,"__hash__":2618},"tools\u002Ftools\u002Freact-scorm-provider.md","React Scorm Provider",[244,245],{"type":247,"value":2553,"toc":2583},[2554,2565,2568],[250,2555,2556,2557,2560,2561,2564],{},"React SCORM Provider is a two-part library from the US agency S4 NetQuest: a ",[253,2558,2559],{},"ScormProvider"," component that opens the LMS connection once near the root of the tree, and a ",[253,2562,2563],{},"withScorm"," higher-order component that injects the connection state and setters into any child. Underneath it is the pipwerks wrapper; the value added is React-shaped — learner name, completion status, score and suspend data arrive as props rather than as calls you have to sequence yourself against a component lifecycle.",[250,2566,2567],{},"For a single-SCO React module this is a sensible amount of structure, and the README is unusually honest about the boundary: it is not a packager, it assumes one SCO, and it expects suspend data to be JSON. Those constraints match how most React courses are actually built.",[250,2569,2570,2571,2574,2575,2578,2579,2582],{},"The caveat is age. The last commit is January 2023, the last npm release, 0.2.4, is from April 2020, and the provider is still a class component that pulls in ",[253,2572,2573],{},"react-autobind",". It does use ",[253,2576,2577],{},"React.createContext"," and exports the context object, so you can call ",[253,2580,2581],{},"useContext"," on it yourself, but no hook ships with the library. It draws around 500 npm downloads a month against 67 stars and 23 forks. Nothing is broken — the pipwerks code beneath it has been stable for years — but nothing is being fixed either. Treat it as a well-shaped reference to copy from rather than a dependency to carry for the life of a project.",{"title":289,"searchDepth":290,"depth":290,"links":2584},[],[17],"React SCORM Provider is a two-part library from the US agency S4 NetQuest: a ScormProvider component that opens the LMS connection once near the root of the tree, and a withScorm higher-order component that injects the connection state and setters into any child. Underneath it is the pipwerks wrapper; the value added is React-shaped — learner name, completion status, score and suspend data arrive as props rather than as calls you have to sequence yourself against a component lifecycle.","https:\u002F\u002Fs4-netquest.github.io\u002Freact-scorm-provider",[2589,2592],{"q":2590,"a":2591},"Does it package my React build as a SCORM zip?","No, and the README is explicit about it. It only makes API calls from inside your app; producing an `imsmanifest.xml` and a zip is a separate step, for which the project points at simple-scorm-packager.\n",{"q":2593,"a":2594},"What does it assume about suspend data?","That it is a JSON object. The provider stores `cmi.suspend_data` as a stringified object and parses it back on load, so a course that writes a bare string to suspend data will not round-trip through this library.\n",{},"React SCORM Provider","\u002Ftools\u002Freact-scorm-provider",[304,311],{"model":313,"source":2600},"https:\u002F\u002Fgithub.com\u002FS4-NetQuest\u002Freact-scorm-provider\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FS4-NetQuest\u002Freact-scorm-provider",{"description":2586},{"scorm12":2605,"scorm2004":2608,"xapi":2611,"cmi5":2612,"aicc":2613},{"supported":308,"provenance":320,"checkedAt":242,"source":2606,"note":2607},"https:\u002F\u002Fgithub.com\u002FS4-NetQuest\u002Freact-scorm-provider\u002Fblob\u002Fmaster\u002Fsrc\u002Flib\u002FScormProvider.js","`ScormProvider` imports `pipwerks-scorm-api-wrapper` and branches on the detected version, reading `cmi.core.student_name` and writing `cmi.core.score.*` when the connection is 1.2.\n",{"supported":308,"editions":2609,"provenance":320,"checkedAt":242,"source":2606,"note":2610},[],"The same component reads `cmi.learner_name` and writes `cmi.score.*` on a 2004 connection. The `version` prop accepts only '1.2' or '2004'; no 2004 edition is distinguished.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Freact-scorm-provider","A React context and higher-order component over the pipwerks SCORM wrapper",[1761,334,335],"S4 NetQuest","HtZF2_aRGjZ7Y76ATNQNE6nv331einRrtr_ro6AqI_s",{"id":2620,"title":2621,"addedAt":242,"alternatives":2622,"body":2623,"categories":2654,"checkedAt":242,"claimed":293,"description":2655,"docs":2656,"editorsPick":295,"extension":296,"faq":2657,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":2663,"listing":306,"logo":293,"meta":2664,"name":2665,"navigation":308,"openSource":308,"path":2666,"platforms":2667,"pricing":2668,"registries":2670,"repo":2669,"seo":2671,"standards":2672,"status":423,"stem":2683,"tagline":2684,"tags":2685,"vendor":2686,"website":2687,"__hash__":2688},"tools\u002Ftools\u002Fscobot.md","Scobot",[],{"type":247,"value":2624,"toc":2652},[2625,2639,2646,2649],[250,2626,2627,2628,270,2631,2634,2635,2638],{},"SCOBot is a JavaScript wrapper that sits between courseware and the SCORM run-time API, so that content authors write ",[253,2629,2630],{},"setInteraction()",[253,2632,2633],{},"setBookmark()"," rather than hand-building ",[253,2636,2637],{},"cmi.interactions.3.learner_response"," strings. It has been maintained by Cybercussion since 2009 and reached version 5 as a rewrite in ES modules with a Vite build, ESM and UMD bundles, and Vitest tests.",[250,2640,2641,2642,2645],{},"Its distinguishing feature is the polyfill layer. The same course code runs against SCORM 1.2 and 2004 because the library translates the data model in both directions — response encoding, latency and timestamp formats, single ",[253,2643,2644],{},"lesson_status"," versus split completion and success. If you ship one course to clients on different LMS generations, that is the reason to choose it over a thinner wrapper.",[250,2647,2648],{},"It is not a packager, a player or a test harness. It produces no manifest, and the bundled mock LMS is for development rather than conformance checking. Nor is it a good fit if you only ever target 2004 and are comfortable with the raw API; the abstraction is then overhead.",[250,2650,2651],{},"Maintenance is healthy for a single-vendor project: commits through 2026, CI running, an active companion player. The licence is the thing to check first — CC-BY-SA-4.0 is a content licence applied to code, and its ShareAlike terms are not what most procurement processes expect.",{"title":289,"searchDepth":290,"depth":290,"links":2653},[],[17],"SCOBot is a JavaScript wrapper that sits between courseware and the SCORM run-time API, so that content authors write setInteraction() and setBookmark() rather than hand-building cmi.interactions.3.learner_response strings. It has been maintained by Cybercussion since 2009 and reached version 5 as a rewrite in ES modules with a Vite build, ESM and UMD bundles, and Vitest tests.","https:\u002F\u002Fgithub.com\u002Fcybercussion\u002FSCOBot\u002Fwiki",[2658,2660],{"q":403,"a":2659},"Yes. Setting `use_standalone: true` falls back to a bundled mock API_1484_11 backed by localStorage, so the course runs, persists and resumes on a plain web server. It is a development convenience, not a conformance test — an LMS will still disagree with it about edge cases.\n",{"q":2661,"a":2662},"Is CC-BY-SA a problem for commercial courseware?","It is unusual for code and worth reading before you commit. ShareAlike applies to derivative works of the library, and attribution is required. Using the built bundle inside a course is normal practice, but if your legal team expects an OSI-approved licence, this one is not.\n","CC-BY-SA-4.0",{},"SCOBot","\u002Ftools\u002Fscobot",[304,311],{"model":313,"source":2669},"https:\u002F\u002Fgithub.com\u002Fcybercussion\u002FSCOBot",[],{"description":2655},{"scorm12":2673,"scorm2004":2676,"xapi":2681,"cmi5":2682},{"supported":308,"provenance":320,"checkedAt":242,"source":2674,"note":2675},"https:\u002F\u002Fgithub.com\u002Fcybercussion\u002FSCOBot\u002Fblob\u002Fmain\u002Fsrc\u002Fcore\u002FSCOBot.js","The runtime branches on getAPIVersion() === '1.2' throughout SCOBot.js — interaction encoding, latency and timestamp formats, status persistence.\n",{"supported":308,"editions":2677,"provenance":320,"checkedAt":242,"source":2679,"note":2680},[2678,1144,418],"2nd","https:\u002F\u002Fgithub.com\u002Fcybercussion\u002FSCOBot\u002Fblob\u002Fmain\u002Fsrc\u002Fconnector\u002FSCOBotBase.js","findAPI() discovers window.API_1484_11 and the 2004 data model is the library's native target. The specific list of editions (2nd, 3rd, 4th) is the README's claim; the code does not branch per edition.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscobot","SCORM 1.2 and 2004 content wrapper with a mock LMS for working offline",[334,335,304],"Cybercussion Interactive, LLC","https:\u002F\u002Fcybercussion.com\u002Fscobot","RX6fbni4wpqsONuYUsqZoQaRmIXdJyyYRwKzYaas5jQ",{"id":2690,"title":2691,"addedAt":242,"alternatives":2692,"body":2693,"categories":2732,"checkedAt":242,"claimed":293,"description":2733,"docs":293,"editorsPick":295,"extension":296,"faq":2734,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":1619,"license":305,"listing":306,"logo":293,"meta":2741,"name":2742,"navigation":308,"openSource":308,"path":2743,"platforms":2744,"pricing":2745,"registries":2746,"repo":2747,"seo":2748,"standards":2749,"status":423,"stem":2756,"tagline":2757,"tags":2758,"vendor":2760,"website":2747,"__hash__":2761},"tools\u002Ftools\u002Fscol-r.md","Scol R",[],{"type":247,"value":2694,"toc":2730},[2695,2710,2724,2727],[250,2696,2697,2698,2701,2702,2705,2706,2709],{},"SCOL-R — Shareable Cross-Origin Learning Resources — solves a narrow problem well. A SCORM package must be uploaded to the LMS, but content that is really a web application wants to live on its own server and be updated without redistribution. SCOL-R packages a stub SCO whose ",[253,2699,2700],{},"index.html"," loads a remote URL in an iframe and relays the SCORM API across the origin boundary by ",[253,2703,2704],{},"postMessage",", so the remote application can call ",[253,2707,2708],{},"LMSSetValue"," as if it were inside the package.",[250,2711,2712,2713,2716,2717,260,2720,2723],{},"The SCORM adapter is the substantial part: around 500 lines of TypeScript with unit tests, detecting SCORM 1.2 or 2004 at runtime and translating a single set of method names onto whichever API it found. It handles the awkward cases — already-initialised error codes differing between versions, ",[253,2714,2715],{},"cmi.core.student_id"," versus ",[253,2718,2719],{},"cmi.learner_id",[253,2721,2722],{},"cmi.progress_measure"," having no 1.2 equivalent — rather than pretending the two versions are the same.",[250,2725,2726],{},"It is Didask's production plumbing published as MIT, and the tell is the scope: bilingual English and French learner-facing error messages, but a README of a dozen lines and no published npm package. You are expected to read the source and build the zip yourself.",[250,2728,2729],{},"Fourteen stars, a handful of open issues, and commits through August 2026. Small, but alive and used in anger — reasonable to depend on if cross-origin hosting is the thing you need, and unnecessary complexity if it is not.",{"title":289,"searchDepth":290,"depth":290,"links":2731},[],[17],"SCOL-R — Shareable Cross-Origin Learning Resources — solves a narrow problem well. A SCORM package must be uploaded to the LMS, but content that is really a web application wants to live on its own server and be updated without redistribution. SCOL-R packages a stub SCO whose index.html loads a remote URL in an iframe and relays the SCORM API across the origin boundary by postMessage, so the remote application can call LMSSetValue as if it were inside the package.",[2735,2738],{"q":2736,"a":2737},"Why would I want the content on a different domain?","Because the course is a hosted application rather than a folder of files — updated centrally, not re-uploaded to every LMS. SCOL-R lets the package in the LMS stay a stub while the real content lives on your own server.\n",{"q":2739,"a":2740},"Does it commit on every SetValue?","Not since v1.0.0. Commits are debounced at 500ms and the release notes flag this as a breaking change: if you relied on a commit after each write for offline resilience, you now have to trigger it yourself.\n",{},"SCOL-R","\u002Ftools\u002Fscol-r",[304,311],{"model":313,"currency":958,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002FDidask\u002Fscol-r",{"description":2733},{"scorm12":2750,"scorm2004":2753},{"supported":308,"provenance":320,"checkedAt":242,"source":2751,"note":2752},"https:\u002F\u002Fgithub.com\u002FDidask\u002Fscol-r\u002Fblob\u002Fmaster\u002Fsrc\u002FSCORMAdapter.ts","SCORMAdapter detects window.API and calls LMSInitialize \u002F LMSSetValue on cmi.core.*; the shipped manifest declares schemaversion 1.2. Read in source, August 2026.\n",{"supported":308,"editions":2754,"provenance":320,"checkedAt":242,"source":2751,"note":2755},[],"The same adapter detects window.API_1484_11 and switches to Initialize \u002F Terminate and the 2004 data model, including cmi.progress_measure. The edition is whatever you put in the manifest's schemaversion, so no specific edition is claimed here.\n","tools\u002Fscol-r","A thin SCORM shell that proxies the API to content hosted on another domain",[335,2759,333],"cross-origin","Didask","b87d5NLwFFGX90QObDQXiVpn0Y2UaLD7hML-EKEjIus",{"id":2763,"title":2764,"addedAt":242,"alternatives":2765,"body":2766,"categories":2782,"checkedAt":242,"claimed":293,"description":2770,"docs":2783,"editorsPick":295,"extension":296,"faq":2784,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":2791,"name":2792,"navigation":308,"openSource":308,"path":2793,"platforms":2794,"pricing":2795,"registries":2797,"repo":2798,"seo":2799,"standards":2800,"status":423,"stem":2812,"tagline":2813,"tags":2814,"vendor":2818,"website":2819,"__hash__":2820},"tools\u002Ftools\u002Fscorm-cloud-api-clients.md","Scorm Cloud Api Clients",[],{"type":247,"value":2767,"toc":2780},[2768,2771,2774,2777],[250,2769,2770],{},"Six client libraries — Java, JavaScript, .NET, PHP, Python and Ruby — generated by Swagger Codegen from the SCORM Cloud REST API v2 specification and published by Rustici Software under Apache 2.0. They cover course import and dispatch, registration and launch, learner records, reporting, invitations and the xAPI endpoints.",[250,2772,2773],{},"Their value is mostly time saved and mistakes avoided. The models are exhaustive because they are generated, so the shape of every request and response is legible in the type system rather than guessed from documentation. The same property is the drawback: generated code is verbose, the ergonomics are whatever Swagger produced, and there is little hand-written convenience on top.",[250,2775,2776],{},"This is a listing to read with the conflict clearly in view. The code is open; the service it talks to is a paid product from the company that also sets much of the tooling agenda in this market. Adopting the client is a decision to host content with Rustici, not a decision about a library.",[250,2778,2779],{},"On maintenance, judge per language rather than by the family. PHP, Python, .NET and Ruby all shipped v5.0 releases in 2026. The Java and JavaScript clients last saw a real commit in February 2024, at v4.0 — recent repository activity on those two is branch and tag traffic, not development. If you are starting in Java today, expect to regenerate from the specification yourself at some point.",{"title":289,"searchDepth":290,"depth":290,"links":2781},[],[17],"https:\u002F\u002Fcloud.scorm.com\u002Fdocs\u002Fv2\u002Freference\u002F",[2785,2788],{"q":2786,"a":2787},"The library is open source — is the service free?","No. These are Apache-licensed clients for a commercial hosted service, and the licence tells you nothing about what SCORM Cloud costs. Check Rustici's pricing before building against them.\n",{"q":2789,"a":2790},"Which language client should I pick?","All six are generated from the same specification, but they are not on the same version. PHP, Python, .NET and Ruby moved to v5.0 during 2026; Java and JavaScript are still on the v4.0 release from February 2024.\n",{},"SCORM Cloud API v2 clients","\u002Ftools\u002Fscorm-cloud-api-clients",[304],{"model":313,"source":2796},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fscormcloud-api-v2-client-java\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fscormcloud-api-v2-client-java",{"description":2770},{"scorm12":2801,"scorm2004":2804,"aicc":2806,"cmi5":2807,"xapi":2809},{"supported":308,"provenance":320,"checkedAt":242,"source":2802,"note":2803},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fscormcloud-api-v2-client-java\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Frusticisoftware\u002Fcloud\u002Fv2\u002Fclient\u002Fmodel\u002FCourseSchema.java","The generated `CourseLearningStandardEnum` includes SCORM11, SCORM12 and the three 2004 editions, so the API reports these back per course.\n",{"supported":308,"editions":2805,"provenance":320,"checkedAt":242,"source":2802},[2678,1144,418],{"supported":308,"provenance":320,"checkedAt":242,"source":2802},{"supported":308,"provenance":320,"checkedAt":242,"source":2802,"note":2808},"CMI5 is a value of the course learning-standard enum. Checked in the client's model only — we have not launched a cmi5 course end to end against the service.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":2810,"note":2811},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fscormcloud-api-v2-client-java\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Frusticisoftware\u002Fcloud\u002Fv2\u002Fclient\u002Fapi\u002FXapiApi.java","A full `XapiApi` plus statement, activity, agent and credential models are generated, covering the LRS endpoints SCORM Cloud exposes.\n","tools\u002Fscorm-cloud-api-clients","Rustici's generated client libraries for the SCORM Cloud REST API, in six languages",[2815,2816,2817],"api-client","scorm-cloud","generated","Rustici Software","https:\u002F\u002Fcloud.scorm.com","r9VbvOwfgJOkK3Aeg0Zd61NKtSzr1te5q7gNfCAhY5Q",{"id":2822,"title":2823,"addedAt":242,"alternatives":2824,"body":2825,"categories":2864,"checkedAt":242,"claimed":293,"description":2865,"docs":2866,"editorsPick":295,"extension":296,"faq":2867,"firstParty":308,"foundedYear":293,"hosting":1060,"hqCountry":2068,"license":2874,"listing":306,"logo":293,"meta":2875,"name":2876,"navigation":308,"openSource":295,"path":2877,"platforms":2878,"pricing":2879,"registries":2882,"repo":293,"seo":2883,"standards":2884,"status":423,"stem":2892,"tagline":2893,"tags":2894,"vendor":2898,"website":2866,"__hash__":2899},"tools\u002Ftools\u002Fscorm-lab.md","Scorm Lab",[],{"type":247,"value":2826,"toc":2862},[2827,2843,2849,2852,2855],[250,2828,2829,2830,260,2833,260,2836,270,2839,2842],{},"SCORM Lab is a debugger rather than a player. You drop a SCORM 1.2 or 2004 package onto the page and it runs against a real runtime while showing you the transcript: every ",[253,2831,2832],{},"Initialize",[253,2834,2835],{},"GetValue",[253,2837,2838],{},"SetValue",[253,2840,2841],{},"Commit"," the course makes, the current state of the CMI data model, the sequencing decisions being taken, and the moment something returns an error code instead of a value.",[250,2844,2845,2846,2848],{},"That transcript is the point. Most SCORM failures are discovered late, in a client's LMS, by someone who cannot see what the course was trying to do — the module simply does not record a completion and nobody can say why. Seeing the call sequence usually makes the cause obvious within a minute: a course that never calls ",[253,2847,2832],{},", a completion status written to the wrong element, suspend data exceeding what the LMS will store.",[250,2850,2851],{},"Nothing is uploaded. The package is unzipped in the browser and served locally through a service worker, which means unreleased client material stays on your machine — a practical requirement for agency work, and the reason the tool is usable at all under most confidentiality terms.",[250,2853,2854],{},"It is free and needs no account, though an email is requested. There is a native macOS build in preparation with session replay and LMS quirk profiles; it is not listed here until it is actually purchasable.",[250,2856,2857,2861],{},[2858,2859,2860],"strong",{},"Disclosure:"," built by LOST END FOUND, which publishes this directory. It is listed under the same rules as everything else, is never an editor's pick, and never occupies a paid slot.",{"title":289,"searchDepth":290,"depth":290,"links":2863},[],[11,14],"SCORM Lab is a debugger rather than a player. You drop a SCORM 1.2 or 2004 package onto the page and it runs against a real runtime while showing you the transcript: every Initialize, GetValue, SetValue and Commit the course makes, the current state of the CMI data model, the sequencing decisions being taken, and the moment something returns an error code instead of a value.","https:\u002F\u002Fscorm-lab.com",[2868,2871],{"q":2869,"a":2870},"Is the package uploaded anywhere?","No. The zip is unpacked in the browser and served locally through a service worker, so the content never leaves the machine. That matters when the course you are debugging is a client's unreleased material.\n",{"q":2872,"a":2873},"Does it replace testing in a real LMS?","No, and it is not meant to. It catches packaging and data-model faults before they reach an LMS — wrong SCORM version, completion never set, suspend data that does not survive a resume. Platform-specific behaviour still needs the platform.\n","proprietary",{},"SCORM Lab","\u002Ftools\u002Fscorm-lab",[311],{"model":2880,"currency":2881,"freeTier":308,"source":2866},"free","GBP",[],{"description":2865},{"scorm12":2885,"scorm2004":2886,"xapi":2888,"cmi5":2889,"aicc":2890,"lti":2891},{"supported":308,"provenance":851,"source":2866},{"supported":308,"editions":2887,"provenance":851,"source":2866},[2678,1144,418],{"supported":295,"provenance":851,"source":2866},{"supported":295,"provenance":851,"source":2866},{"supported":295},{"supported":295},"tools\u002Fscorm-lab","Drop a package in the browser and watch every API call it makes",[2895,2896,2897],"debugger","browser","no-upload","LOST END FOUND LTD","-VF8EF41y3ncUzo8elv-BhKnq-g1GeULk6N9LxkQVXU",{"id":2901,"title":2902,"addedAt":242,"alternatives":2903,"body":2904,"categories":2945,"checkedAt":242,"claimed":293,"description":2946,"docs":293,"editorsPick":295,"extension":296,"faq":2947,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":2951,"name":2952,"navigation":308,"openSource":308,"path":2953,"platforms":2954,"pricing":2955,"registries":2956,"repo":2957,"seo":2958,"standards":2959,"status":423,"stem":2969,"tagline":2970,"tags":2971,"vendor":293,"website":2957,"__hash__":2975},"tools\u002Ftools\u002Fscorm-validator.md","Scorm Validator",[],{"type":247,"value":2905,"toc":2943},[2906,2931,2934,2940],[250,2907,2908,2909,2911,2912,270,2915,2918,2919,2922,2923,2926,2927,2930],{},"This is a couple of hundred lines of Python behind a Streamlit upload form. You give it a package zip and it tells you whether the archive is intact, whether ",[253,2910,2171],{}," is at the root and parses, whether ",[253,2913,2914],{},"\u003Corganizations>",[253,2916,2917],{},"\u003Cresources>"," are present and populated, whether every file the manifest references actually exists in the zip, whether resources carry ",[253,2920,2921],{},"adlcp:scormType",", and whether SCOs have a launch ",[253,2924,2925],{},"href",". It also flags ",[253,2928,2929],{},"__MACOSX"," folders, which is a small thing that has broken a genuinely large number of uploads.",[250,2932,2933],{},"Those are the right checks. Missing referenced files and manifests packaged one directory too deep account for a large share of \"the LMS rejected my course\" tickets, and catching them before upload is worth the two minutes it takes to run.",[250,2935,2936,2937,2939],{},"Its ceiling is equally clear. It is a static structural check, not a conformance suite and not a runtime. It cannot detect that a course never calls ",[253,2938,2832],{}," or writes completion to the wrong element, and it does not distinguish SCORM 2004 editions.",[250,2941,2942],{},"The maintenance picture deserves plain statement: four commits, all on 9 June 2026, and nothing since. It is a competent weekend project with a readable test suite — useful as a reference implementation or something to fork and extend, not as a tool you would build a QA process around.",{"title":289,"searchDepth":290,"depth":290,"links":2944},[],[14],"This is a couple of hundred lines of Python behind a Streamlit upload form. You give it a package zip and it tells you whether the archive is intact, whether imsmanifest.xml is at the root and parses, whether \u003Corganizations> and \u003Cresources> are present and populated, whether every file the manifest references actually exists in the zip, whether resources carry adlcp:scormType, and whether SCOs have a launch href. It also flags __MACOSX folders, which is a small thing that has broken a genuinely large number of uploads.",[2948],{"q":2949,"a":2950},"Is this a conformance test?","No. It reads the manifest and checks the zip is internally consistent. It never launches the content, so it cannot tell you whether the course initialises, reports completion, or survives a resume. A package can pass every check here and still fail in an LMS.\n",{},"SCORM Validator","\u002Ftools\u002Fscorm-validator",[311,836],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fswdmartinez\u002FSCORM-Validator",{"description":2946},{"scorm12":2960,"scorm2004":2963,"aicc":2966,"xapi":2967,"cmi5":2968},{"supported":308,"provenance":320,"checkedAt":242,"source":2961,"note":2962},"https:\u002F\u002Fgithub.com\u002Fswdmartinez\u002FSCORM-Validator\u002Fblob\u002Fmain\u002Fvalidator\u002Fmanifest_parser.py","Packaging-level checks only: manifest presence, well-formed XML, required elements, referenced files present, adlcp:scormType set, SCO launch href. Nothing about run-time behaviour is examined.\n",{"supported":308,"editions":2964,"provenance":320,"checkedAt":242,"source":2961,"note":2965},[],"detect_version distinguishes 1.2 from 2004 by the content-packaging namespace on the manifest root, not by the declared schemaversion, so it cannot tell 2004 editions apart and does not attempt to.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscorm-validator","A small Streamlit app that opens a package zip and reports structural faults",[2972,630,2973,2974],"validator","streamlit","manifest","yE3lbIQZFeYVxmn8wgMTVWwbXmmQ-freo_hSI-eFQmM",{"id":2977,"title":2978,"addedAt":242,"alternatives":2979,"body":2980,"categories":3017,"checkedAt":242,"claimed":293,"description":3018,"docs":293,"editorsPick":295,"extension":296,"faq":3019,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":3023,"name":3024,"navigation":308,"openSource":308,"path":3025,"platforms":3026,"pricing":3027,"registries":3029,"repo":3028,"seo":3030,"standards":3031,"status":423,"stem":3039,"tagline":3040,"tags":3041,"vendor":293,"website":3028,"__hash__":3044},"tools\u002Ftools\u002Fscorm-lms-dhodges47.md","Scorm Lms Dhodges47",[],{"type":247,"value":2981,"toc":3015},[2982,2998,3001,3012],[250,2983,2984,2985,260,2988,260,2991,260,2994,2997],{},"An open-source demonstration LMS: register, upload a package, launch it in a built-in player, and see per-learner tracking. It is a Razor Pages application over Entity Framework Core and SQL Server, and its value is that the whole SCORM path is visible in a few files — a JavaScript adapter, one API controller, and a set of entity classes named directly after the CMI model (",[253,2986,2987],{},"cmi_core",[253,2989,2990],{},"cmi_objectives",[253,2992,2993],{},"cmi_interactions",[253,2995,2996],{},"cmi_student_preference",").",[250,2999,3000],{},"That makes it a good way to learn what an LMS actually has to store, and a plausible starting point for an in-house .NET system where buying a platform is disproportionate. The author frames it that way too, and the framing is honest.",[250,3002,3003,3004,3007,3008,3011],{},"Treat the SCORM 2004 claim with care. The adapter registers an ",[253,3005,3006],{},"API_1484_11"," object, but the 2004 methods are aliases onto the 1.2 implementations, so 2004 content will initialise and talk while the model beneath it stays 1.2. There is no sequencing, no navigation model, no multi-tenancy, and the repository carries vendored ",[253,3009,3010],{},"bower_components"," including a full Font Awesome, so a clone is heavier than the code it contains.",[250,3013,3014],{},"Maintenance is real but light: 184 stars, a steady trickle of community pull requests, and a migration to .NET 8 in January 2026 contributed by a user. A useful reference implementation; not a product, and not a substitute for testing against the LMS your learners will use.",{"title":289,"searchDepth":290,"depth":290,"links":3016},[],[11],"An open-source demonstration LMS: register, upload a package, launch it in a built-in player, and see per-learner tracking. It is a Razor Pages application over Entity Framework Core and SQL Server, and its value is that the whole SCORM path is visible in a few files — a JavaScript adapter, one API controller, and a set of entity classes named directly after the CMI model (cmi_core, cmi_objectives, cmi_interactions, cmi_student_preference).",[3020],{"q":3021,"a":3022},"What does it need to run?","ASP.NET Core with Entity Framework Core and SQL Server. The project was migrated to .NET 8 in January 2026, though the README still describes .NET Core 2.1 — read the csproj rather than the README.\n",{},"SCORM-LearningManagementSystem","\u002Ftools\u002Fscorm-lms-dhodges47",[311,665],{"model":313,"source":3028},"https:\u002F\u002Fgithub.com\u002Fdhodges47\u002FSCORM-LearningManagementSystem",[],{"description":3018},{"scorm12":3032,"scorm2004":3035},{"supported":308,"provenance":320,"checkedAt":242,"source":3033,"note":3034},"https:\u002F\u002Fgithub.com\u002Fdhodges47\u002FSCORM-LearningManagementSystem\u002Fblob\u002Fmaster\u002FOpenSourceSCORMLMS\u002Fwwwroot\u002Fjs\u002FOutermostLMSV5.js","All eight 1.2 functions are implemented client-side and persisted through an API controller into cmi_core, cmi_objectives and cmi_interactions tables.\n",{"supported":308,"editions":3036,"provenance":851,"checkedAt":242,"source":3037,"note":3038},[],"https:\u002F\u002Fgithub.com\u002Fdhodges47\u002FSCORM-LearningManagementSystem#readme","The README claims \"some support for SCORM 2004\". In the adapter an API_1484_11 object is registered and the 2004 method names are aliased onto the 1.2 implementations, so 2004 content initialises against a 1.2-shaped data model. Not independently confirmed with 2004 content.\n","tools\u002Fscorm-lms-dhodges47","A small .NET SCORM LMS and player you can read end to end",[3042,3043,603,629],"dotnet","csharp","kcK5BfQzJ1Y6Nlt31NHrenJ2E-PpX00vmRd2vUN-aUQ",{"id":3046,"title":3047,"addedAt":242,"alternatives":3048,"body":3049,"categories":3082,"checkedAt":242,"claimed":293,"description":3083,"docs":293,"editorsPick":295,"extension":296,"faq":3084,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":3088,"listing":306,"logo":293,"meta":3089,"name":3090,"navigation":308,"openSource":308,"path":3091,"platforms":3092,"pricing":3093,"registries":3094,"repo":3095,"seo":3096,"standards":3097,"status":329,"stem":3108,"tagline":3109,"tags":3110,"vendor":3112,"website":3095,"__hash__":3113},"tools\u002Ftools\u002Fpipwerks-scorm-manifests.md","Pipwerks Scorm Manifests",[],{"type":247,"value":3050,"toc":3080},[3051,3060,3071,3077],[250,3052,3053,3054,3056,3057,3059],{},"Two directories, each containing an ",[253,3055,2171],{}," and the ADL schemas it references: one for SCORM 1.2, one for SCORM 2004 4th Edition. Both are written for a single-SCO course whose entry point is ",[253,3058,2700],{},", and the readme lists the five or six strings you need to change — course identifier, version, organisation code, and the two title elements.",[250,3061,3062,3063,3066,3067,3070],{},"The useful detail is structural. The XSDs live in a ",[253,3064,3065],{},"SCORM-schemas\u002F"," subfolder with ",[253,3068,3069],{},"xsi:schemaLocation"," adjusted accordingly, rather than being dumped at the root of the zip as most examples do. A SCORM 2004 package carries about a dozen schema files, and pushing them out of the root makes it readable without upsetting LMSs that validate against them.",[250,3072,3073,3074,3076],{},"Who it is for: anyone assembling a package by hand or scripting one, who wants a manifest that is known-good rather than one reverse-engineered from an authoring tool's output. It is not a packager — nothing zips, validates or checks that your ",[253,3075,2925],{}," values exist — and it does not cover multi-SCO organisations, sequencing rules or metadata, which is where manifests actually get difficult.",[250,3078,3079],{},"Maintenance state is unambiguous: last commit March 2017, fourteen stars, no open issues. That matters less than it usually would, because the SCORM 1.2 and 2004 4th Edition content packaging schemas have not changed since 2009. Treat it as a stable reference rather than a dependency, copy the two files into your own repo, and do not expect anyone to answer an issue.",{"title":289,"searchDepth":290,"depth":290,"links":3081},[],[17],"Two directories, each containing an imsmanifest.xml and the ADL schemas it references: one for SCORM 1.2, one for SCORM 2004 4th Edition. Both are written for a single-SCO course whose entry point is index.html, and the readme lists the five or six strings you need to change — course identifier, version, organisation code, and the two title elements.",[3085],{"q":3086,"a":3087},"What licence is it under?","None is stated. There is no LICENSE file and the readme does not grant one, so strictly the templates are all-rights-reserved. In practice they are a handful of boilerplate XML elements largely dictated by the ADL schemas, but if your organisation audits licences, note the gap.\n","none",{},"SCORM-Manifests","\u002Ftools\u002Fpipwerks-scorm-manifests",[304],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002FSCORM-Manifests",{"description":3083},{"scorm12":3098,"scorm2004":3101,"xapi":3105,"cmi5":3106,"aicc":3107},{"supported":308,"provenance":320,"checkedAt":242,"source":3099,"note":3100},"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002FSCORM-Manifests\u002Fblob\u002Fmaster\u002FSCORM%201.2%20Manifest\u002Fimsmanifest.xml","Manifest declares schema \"ADL SCORM\" \u002F schemaversion \"1.2\" and ships the four SCORM 1.2 XSDs in a SCORM-schemas subfolder.\n",{"supported":308,"editions":3102,"provenance":320,"checkedAt":242,"source":3103,"note":3104},[418],"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002FSCORM-Manifests\u002Fblob\u002Fmaster\u002FSCORM%202004%20Manifest\u002Fimsmanifest.xml","schemaversion is literally \"2004 4th Edition\"; the adlseq, adlnav and imsss namespaces are declared and the matching schemas are bundled. No 2nd or 3rd Edition variant is provided.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fpipwerks-scorm-manifests","Boilerplate imsmanifest.xml files for single-SCO SCORM 1.2 and 2004 packages",[2974,2444,3111],"templates","Philip Hutchison","Lf07ximFS_rZBONWgXpLgWmVy1cm8zMKI6EBy1WP7c0",{"id":3115,"title":3116,"addedAt":242,"alternatives":3117,"body":3118,"categories":3141,"checkedAt":242,"claimed":293,"description":3142,"docs":293,"editorsPick":295,"extension":296,"faq":3143,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":3088,"listing":306,"logo":293,"meta":3150,"name":3151,"navigation":308,"openSource":308,"path":3152,"platforms":3153,"pricing":3154,"registries":3156,"repo":3155,"seo":3157,"standards":3158,"status":3169,"stem":3170,"tagline":3171,"tags":3172,"vendor":631,"website":3155,"__hash__":3173},"tools\u002Ftools\u002Fscorm-to-xapi-wrapper.md","Scorm To Xapi Wrapper",[],{"type":247,"value":3119,"toc":3139},[3120,3127,3130,3136],[250,3121,3122,3123,3126],{},"A migration aid from ADL, from the period when organisations were being encouraged to move from SCORM to xAPI without reauthoring their content. You replace the standard ",[253,3124,3125],{},"APIWrapper.js"," in each SCO with ADL's modified copy, add two script tags, and every run-time call the course makes is mirrored into an LRS as an xAPI statement following the draft xAPI SCORM Profile.",[250,3128,3129],{},"For a library of legacy SCORM courses that must keep working in an existing LMS while feeding a new analytics store, the idea is still the right one, and the mapping is worth reading if you are implementing that translation yourself.",[250,3131,3132,3133,3135],{},"As deployable code it has aged badly, and its own repository says so. The archive flag was set by ADL, the last commit to ",[253,3134,474],{}," was March 2017, the SCORM 1.2 wrapper carries an unresolved out-of-date warning, the profile it implements never left draft, and LRS credentials sit in a file shipped to the browser. There is no licence file, which rules it out of client work regardless of the technical state.",[250,3137,3138],{},"Ninety-nine stars mean it remains the first result people find. Treat it as documentation of an approach — read the mapping, then implement it against a maintained xAPI client.",{"title":289,"searchDepth":290,"depth":290,"links":3140},[],[8],"A migration aid from ADL, from the period when organisations were being encouraged to move from SCORM to xAPI without reauthoring their content. You replace the standard APIWrapper.js in each SCO with ADL's modified copy, add two script tags, and every run-time call the course makes is mirrored into an LRS as an xAPI statement following the draft xAPI SCORM Profile.",[3144,3147],{"q":3145,"a":3146},"Where do the LRS credentials live?","In a `config` object inside APIWrapper.js, shipped in the course package — endpoint, username and password in plain JavaScript the learner can read. That was normal in 2014 and is not acceptable now; anything using this approach today needs a server-side proxy or scoped credentials.\n",{"q":3148,"a":3149},"Does it replace the LMS's own SCORM tracking?","No, it duplicates it. SCORM calls still go to the LMS; xAPI statements go to your LRS in addition. The README warns explicitly that learner data will start arriving in the LRS as soon as it is installed.\n",{},"SCORM-to-xAPI Wrapper","\u002Ftools\u002Fscorm-to-xapi-wrapper",[311,304],{"model":313,"source":3155},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-to-xAPI-Wrapper",[],{"description":3142},{"scorm12":3159,"scorm2004":3162,"xapi":3166},{"supported":308,"provenance":320,"checkedAt":242,"source":3160,"note":3161},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-to-xAPI-Wrapper\u002Ftree\u002Fmaster\u002FSCORM1.2","A SCORM1.2 wrapper is present, but the README states in capitals that this version is out of date and directs readers to the 2004 wrapper instead. That warning has stood since the repository was archived.\n",{"supported":308,"editions":3163,"provenance":320,"checkedAt":242,"source":3164,"note":3165},[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-to-xAPI-Wrapper\u002Ftree\u002Fmaster\u002FSCORM2004","The 2004 wrapper is the maintained-as-of-archival path. No edition is specified in the repository.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":3167,"note":3168},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FSCORM-to-xAPI-Wrapper\u002Fblob\u002Fmaster\u002FSCORMToXAPIFunctions.js","Statements follow the xAPI SCORM Profile, which the README itself describes as being in draft. Sending requires the ADL xAPIWrapper and an LRS endpoint configured in the file.\n","archived","tools\u002Fscorm-to-xapi-wrapper","ADL's drop-in APIWrapper.js that re-emits SCORM calls as xAPI statements",[746,334,3169],"tBBRiGU6uEb95plBR-dfuTc88Egc4WanvWelqbS_mBc",{"id":3175,"title":3176,"addedAt":242,"alternatives":3177,"body":3178,"categories":3199,"checkedAt":242,"claimed":293,"description":3182,"docs":293,"editorsPick":295,"extension":296,"faq":3200,"firstParty":308,"foundedYear":293,"hosting":1060,"hqCountry":2068,"license":2874,"listing":306,"logo":293,"meta":3207,"name":3208,"navigation":308,"openSource":295,"path":3209,"platforms":3210,"pricing":3211,"registries":3216,"repo":293,"seo":3217,"standards":3218,"status":423,"stem":3226,"tagline":3227,"tags":3228,"vendor":2898,"website":3215,"__hash__":3232},"tools\u002Ftools\u002Fscormbridge.md","Scormbridge",[],{"type":247,"value":3179,"toc":3197},[3180,3183,3186,3189,3192],[250,3181,3182],{},"If you sell courses rather than build them in-house, handing over a zip hands over the asset. SCORMBridge is the standard answer to that: the client installs a few-kilobyte proxy package in their own LMS, and at launch it streams the real course from the platform and relays tracking back.",[250,3184,3185],{},"The consequences are the ones publishers care about. Updates ship without anyone re-importing anything. Licences carry seat counts, expiry dates and domain locks, so a twelve-month agreement actually ends after twelve months. And you can see how much the course is being used, which is normally invisible once content is inside someone else's system.",[250,3187,3188],{},"Plans run from a free tier — a couple of courses and organisations, enough to trial the mechanism — through £49, £149 and £449 per month, to custom arrangements. The tiers are mostly about volume of courses, client organisations and learners rather than feature gates.",[250,3190,3191],{},"The comparison worth making against Rustici's Content Controller and similar dispatch platforms is narrow: whether the proxy survives LMSs that restrict cross-origin access to the API object, how tracking reconciles after a dropped connection, and whether white-labelling extends to the domain the content is served from.",[250,3193,3194,3196],{},[2858,3195,2860],{}," built by LOST END FOUND, which publishes this directory, and listed alongside direct competitors under identical rules.",{"title":289,"searchDepth":290,"depth":290,"links":3198},[],[26],[3201,3204],{"q":3202,"a":3203},"How is this different from sending a zip?","The client installs a small proxy package instead of the course. The content streams from SCORMBridge at launch, so updates take effect without a re-import, licences can expire, and you keep the file.\n",{"q":3205,"a":3206},"What happens when a licence expires mid-course?","The launch is refused with a message rather than a blank frame. Worth testing against your own client's LMS, because how gracefully that failure reads is the main practical difference between platforms in this category.\n",{},"SCORMBridge","\u002Ftools\u002Fscormbridge",[311,1060],{"model":3212,"priceFrom":3213,"currency":2881,"period":3214,"freeTier":308,"source":3215},"freemium",49,"month","https:\u002F\u002Fscormbridge.app",[],{"description":3182},{"scorm12":3219,"scorm2004":3220,"xapi":3222,"cmi5":3223,"aicc":3224,"lti":3225},{"supported":308,"provenance":851,"source":3215},{"supported":308,"editions":3221,"provenance":851,"source":3215},[2678,1144,418],{"supported":295},{"supported":295},{"supported":295},{"supported":295},"tools\u002Fscormbridge","License your SCORM course into a client's LMS without handing over the file",[3229,3230,3231],"dispatch","licensing","publishers","TAhuwZWsAqOcIBsYsR6_Fm4AY7bh6jhAyHRGz7fyuMY",{"id":3234,"title":3235,"addedAt":242,"alternatives":3236,"body":3237,"categories":3270,"checkedAt":242,"claimed":293,"description":3271,"docs":293,"editorsPick":295,"extension":296,"faq":3272,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":3276,"name":3277,"navigation":308,"openSource":308,"path":3278,"platforms":3279,"pricing":3280,"registries":3281,"repo":3282,"seo":3283,"standards":3284,"status":329,"stem":3291,"tagline":3292,"tags":3293,"vendor":3295,"website":3282,"__hash__":3296},"tools\u002Ftools\u002Fscormify.md","Scormify",[244,245],{"type":247,"value":3238,"toc":3268},[3239,3255,3258,3265],[250,3240,3241,3242,3244,3245,3248,3249,270,3252,3254],{},"SCORMify is about as small as a SCORM wrapper gets: a manifest, an ",[253,3243,2700],{},", and roughly sixty lines of JavaScript that find the LMS API object, call ",[253,3246,3247],{},"LMSInitialize",", and expose two helpers for writing ",[253,3250,3251],{},"cmi.core.score.raw",[253,3253,372],{},". You drop your own HTML, CSS, video and scripts into the folder, zip it, and upload.",[250,3256,3257],{},"That minimalism is the appeal. If you have hand-built web content and need it to register a completion in an LMS, this is a fifteen-minute job rather than an authoring-tool purchase, and the code is short enough to read in full before you trust it. Litmos published it in 2012 and it remains one of the more widely forked starting points on GitHub.",[250,3259,3260,3261,3264],{},"What it is not is a runtime. There is no suspend-data handling, no bookmarking, no interaction reporting, no error-code checking, and no retry if ",[253,3262,3263],{},"LMSCommit"," fails — all of which real courses eventually need. It has not been touched since 2017, so anything you find wrong is yours to fix.",[250,3266,3267],{},"Treat it as a template you copy and extend, not a dependency you install. If you want an actively maintained wrapper with a full data model, look at pipwerks SCORM-API-wrapper or SCORM Again instead; if you only need a completion flag, SCORMify is genuinely enough.",{"title":289,"searchDepth":290,"depth":290,"links":3269},[],[17],"SCORMify is about as small as a SCORM wrapper gets: a manifest, an index.html, and roughly sixty lines of JavaScript that find the LMS API object, call LMSInitialize, and expose two helpers for writing cmi.core.score.raw and cmi.core.lesson_status. You drop your own HTML, CSS, video and scripts into the folder, zip it, and upload.",[3273],{"q":3274,"a":3275},"Will it work in an LMS that expects SCORM 2004?","No. The manifest is SCORM 1.2 and the JavaScript only ever looks for the 1.2 API object. Most LMSs accept 1.2 packages regardless, but if you need 2004 sequencing or the richer completion model, start somewhere else.\n",{},"SCORMify","\u002Ftools\u002Fscormify",[304,311],{"model":313,"currency":958,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002FLitmos\u002FSCORMify",{"description":3271},{"scorm12":3285,"scorm2004":3288},{"supported":308,"provenance":320,"checkedAt":242,"source":3286,"note":3287},"https:\u002F\u002Fgithub.com\u002FLitmos\u002FSCORMify\u002Fblob\u002Fmaster\u002Fsrc\u002Fimsmanifest.xml","The bundled manifest declares schemaversion 1.2 and scormify.js calls LMSInitialize, LMSSetValue on cmi.core.* and LMSFinish. Verified by reading the source, August 2026.\n",{"supported":295,"editions":3289,"provenance":320,"checkedAt":242,"note":3290},[],"No API_1484_11 lookup and no 2004 data-model elements anywhere in the source.","tools\u002Fscormify","Sixty lines of JavaScript that turn a folder of HTML into a SCORM 1.2 package",[335,334,3294],"scorm-1-2","Litmos","jLPP_aw2ui0YHdDoASdD_HcVJzNGuoDgUpcy3DFjR0w",{"id":3298,"title":3299,"addedAt":242,"alternatives":3300,"body":3301,"categories":3317,"checkedAt":242,"claimed":293,"description":3305,"docs":3318,"editorsPick":295,"extension":296,"faq":3319,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":604,"license":605,"listing":306,"logo":293,"meta":3326,"name":3327,"navigation":308,"openSource":308,"path":3328,"platforms":3329,"pricing":3330,"registries":3331,"repo":3332,"seo":3333,"standards":3334,"status":423,"stem":3343,"tagline":3344,"tags":3345,"vendor":3347,"website":3332,"__hash__":3348},"tools\u002Ftools\u002Fsql-lrs.md","Sql Lrs",[],{"type":247,"value":3302,"toc":3315},[3303,3306,3309,3312],[250,3304,3305],{},"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.",[250,3307,3308],{},"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.",[250,3310,3311],{},"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.",[250,3313,3314],{},"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":289,"searchDepth":290,"depth":290,"links":3316},[],[23],"https:\u002F\u002Fgithub.com\u002Fyetanalytics\u002Flrsql\u002Fblob\u002Fmain\u002Fdoc\u002Findex.md",[3320,3323],{"q":3321,"a":3322},"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":3324,"a":3325},"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",[610,665,1802,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fyetanalytics\u002Flrsql",{"description":3305},{"xapi":3335,"cmi5":3338,"scorm12":3340,"scorm2004":3341},{"supported":308,"provenance":320,"checkedAt":242,"source":3336,"note":3337},"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":295,"provenance":320,"checkedAt":242,"note":3339},"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":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":3342,"provenance":320,"checkedAt":242},[],"tools\u002Fsql-lrs","An xAPI learning record store that runs on SQLite or your existing SQL database",[627,628,603,3346],"clojure","Yet Analytics, Inc.","m0IMz3Jxi7kbZMi4NAIoAgioNYYiyLR6-S_QP0v1PIY",{"id":3350,"title":3351,"addedAt":242,"alternatives":3352,"body":3353,"categories":3380,"checkedAt":242,"claimed":293,"description":3357,"docs":3381,"editorsPick":295,"extension":296,"faq":3382,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":892,"listing":306,"logo":293,"meta":3389,"name":3351,"navigation":308,"openSource":308,"path":3390,"platforms":3391,"pricing":3392,"registries":3394,"repo":3395,"seo":3396,"standards":3397,"status":423,"stem":3409,"tagline":3410,"tags":3411,"vendor":293,"website":3412,"__hash__":3413},"tools\u002Ftools\u002Fsakai.md","Sakai",[],{"type":247,"value":3354,"toc":3378},[3355,3358,3369,3372],[250,3356,3357],{},"Sakai is a Java learning management system built for universities, developed in the open since the early 2000s by a consortium of institutions rather than a single vendor. It covers the academic case in depth — assignments, gradebook, assessments through Samigo, lessons, rosters, rubrics, plagiarism review — and is deployed at real scale by universities that want to own their teaching platform outright.",[250,3359,3360,3361,3364,3365,3368],{},"For a standards audience the interesting part is ",[253,3362,3363],{},"scormplayer",", a module in the main repository rather than a third-party add-on. It is descended from the ADL reference implementation: the package names are still ",[253,3366,3367],{},"org.adl",", and there is a genuine sequencer, not just a run-time API shim. That is more SCORM machinery than most open-source LMSs carry.",[250,3370,3371],{},"It is not a light option. This is a Tomcat-hosted Java application with a substantial operations burden, and it is a poor fit for anyone who wants to host a handful of compliance courses. The SCORM tool's own README is candid about a history of unfinished work and installation caveats, and xAPI amounts to a kernel-level event bridge rather than a supported LRS integration — do not choose Sakai for xAPI.",[250,3373,3374,3375,3377],{},"Maintenance is not in doubt, but the shape of it is worth understanding. Sakai 25.2 was tagged in June 2026, commits land most working days, and around fifteen named contributors have touched the tree in the past year — a consortium project's normal rhythm, not a vendor's roadmap. That also sets the real risk: nothing here rots, but priorities follow whichever member institutions have staff to spare, so a fix you need in ",[253,3376,3363],{}," specifically may wait unless you contribute it.",{"title":289,"searchDepth":290,"depth":290,"links":3379},[],[20],"https:\u002F\u002Fgithub.com\u002Fsakaiproject\u002Fsakai\u002Fwiki",[3383,3386],{"q":3384,"a":3385},"Is the SCORM player part of core Sakai?","Yes — `scormplayer` is a module in the main repository and ships with the release, which is unusual among open-source LMSs. It is still a distinct tool that has to be enabled per site.\n",{"q":3387,"a":3388},"What is the history of the SCORM tool?","Its own README says it was started at UC Davis and never finished or deployed there, and was later picked up and stabilised by EDIA, who added gradebook synchronisation. That inheritance explains both the ADL-derived code and the long tail of SCO-prefixed issues.\n",{},"\u002Ftools\u002Fsakai",[311,2010],{"model":313,"source":3393},"https:\u002F\u002Fgithub.com\u002Fsakaiproject\u002Fsakai\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fsakaiproject\u002Fsakai",{"description":3357},{"scorm12":3398,"scorm2004":3401,"lti":3405},{"supported":308,"provenance":320,"checkedAt":242,"source":3399,"note":3400},"https:\u002F\u002Fgithub.com\u002Fsakaiproject\u002Fsakai\u002Ftree\u002Fmaster\u002Fscormplayer\u002Fscorm-api\u002Fsrc\u002Fjava\u002Forg\u002Fadl\u002Fapi\u002Fecmascript","The bundled `scormplayer` module implements `SCORM12APIInterface` alongside the ADL data-model classes it was derived from.\n",{"supported":308,"editions":3402,"provenance":320,"checkedAt":242,"source":3403,"note":3404},[1144],"https:\u002F\u002Fgithub.com\u002Fsakaiproject\u002Fsakai\u002Ftree\u002Fmaster\u002Fscormplayer\u002Fscorm-impl\u002Fadl\u002Fsrc\u002Fjava\u002Forg\u002Fadl\u002Fsequencer\u002Fimpl","`SCORM13APIInterface`, `SCORM_2004_DM` and a full `ADLSequencer` are present; the conformance package committed as a test fixture is a SCORM 2004 3rd Edition PITE test.\n",{"supported":308,"versions":3406,"provenance":320,"checkedAt":242,"source":3407,"note":3408},[1018,1019],"https:\u002F\u002Fgithub.com\u002Fsakaiproject\u002Fsakai\u002Ftree\u002Fmaster\u002Flti","The `lti` module carries both the legacy Basic LTI code and an `org.sakaiproject.lti13` package implementing LTI 1.3 Advantage services.\n","tools\u002Fsakai","Higher-education LMS with an in-tree SCORM player built on the ADL reference code",[1025,684,1526],"https:\u002F\u002Fwww.sakailms.org","qfs4afiI1sPCTQYm53Hp_GaKdNUUsn0gxnb2rbfX7iA",{"id":3415,"title":3416,"addedAt":242,"alternatives":3417,"body":3418,"categories":3438,"checkedAt":242,"claimed":293,"description":3422,"docs":3439,"editorsPick":295,"extension":296,"faq":3440,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":1619,"license":777,"listing":306,"logo":293,"meta":3447,"name":3448,"navigation":308,"openSource":308,"path":3449,"platforms":3450,"pricing":3451,"registries":3452,"repo":3453,"seo":3454,"standards":3455,"status":568,"stem":3461,"tagline":3462,"tags":3463,"vendor":3464,"website":3465,"__hash__":3466},"tools\u002Ftools\u002Ftrax-lrs.md","Trax Lrs",[],{"type":247,"value":3419,"toc":3436},[3420,3423,3430,3433],[250,3421,3422],{},"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.",[250,3424,3425,3426,3429],{},"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 ",[253,3427,3428],{},"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.",[250,3431,3432],{},"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.",[250,3434,3435],{},"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":289,"searchDepth":290,"depth":290,"links":3437},[],[23],"https:\u002F\u002Fwww.traxlrs.com\u002F",[3441,3444],{"q":3442,"a":3443},"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":3445,"a":3446},"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",[311],{"model":313,"freeTier":308,"source":3439},[],"https:\u002F\u002Fgithub.com\u002Ftrax-project\u002Ftrax3-starter-lrs",{"description":3422},{"xapi":3456,"cmi5":3459},{"supported":308,"provenance":320,"checkedAt":242,"source":3457,"note":3458},"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":295,"provenance":320,"checkedAt":242,"source":3457,"note":3460},"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",[627,1083,603],"Sébastien Fraysse","https:\u002F\u002Ftraxlrs.com","jrrVtYaE70vKH_6rMpl0N8pKleMLi25YtZJTPHoJH3I",{"id":3468,"title":3469,"addedAt":242,"alternatives":3470,"body":3471,"categories":3500,"checkedAt":242,"claimed":293,"description":3501,"docs":3502,"editorsPick":295,"extension":296,"faq":3503,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":3510,"name":3469,"navigation":308,"openSource":308,"path":3511,"platforms":3512,"pricing":3513,"registries":3515,"repo":3514,"seo":3516,"standards":3517,"status":423,"stem":3529,"tagline":3530,"tags":3531,"vendor":293,"website":3534,"__hash__":3535},"tools\u002Ftools\u002Ftessera.md","Tessera",[],{"type":247,"value":3472,"toc":3498},[3473,3489,3492,3495],[250,3474,3475,3476,260,3479,260,3482,260,3485,3488],{},"Tessera is a code-first authoring framework rather than a library you bolt onto an existing course. A project is a pnpm workspace holding one or more courses; pages are Svelte components, quizzes are built against a hooks API (",[253,3477,3478],{},"useQuestion",[253,3480,3481],{},"useQuiz",[253,3483,3484],{},"useCompletion",[253,3486,3487],{},"usePersistence","), and one command packages the result for a target standard.",[250,3490,3491],{},"The reason it belongs in this directory is the export matrix, and it holds up in the source. The exporter emits SCORM 1.2 and SCORM 2004 4th Edition manifests, a cmi5 course structure, an xAPI 1.0.3 bundle or a plain static site, and the repository carries conformance-style tests for the 1.2 and 2004 runtime adapters rather than only a happy-path build test. The xAPI version is deliberately pinned to 1.0.3 with the reasoning written down in the code — a level of care that is unusual at this size.",[250,3493,3494],{},"Who it suits: a team that already works in git and wants a course to be reviewable, diffable and rebuildable for several LMSs from one source. Who it does not: anyone expecting a WYSIWYG editor, a template gallery, or a migration path from an existing authoring tool. Node 24 is a hard requirement.",[250,3496,3497],{},"Maintenance state matters here. The repository was created in May 2026, has a single maintainer and a handful of stars. The engineering is more disciplined than the star count suggests, but a course you cannot rebuild is a course you cannot fix — budget for reading the framework yourself if you ship on it.",{"title":289,"searchDepth":290,"depth":290,"links":3499},[],[17],"Tessera is a code-first authoring framework rather than a library you bolt onto an existing course. A project is a pnpm workspace holding one or more courses; pages are Svelte components, quizzes are built against a hooks API (useQuestion, useQuiz, useCompletion, usePersistence), and one command packages the result for a target standard.","https:\u002F\u002Ftesseralearn.dev\u002Fdocs\u002F",[3504,3507],{"q":3505,"a":3506},"Do I have to use an AI assistant to author with it?","No. Pages are ordinary .svelte files and can be written by hand. The AGENTS.md file and the authoring guide exist so a coding agent can do the typing, but nothing in the build depends on one.\n",{"q":3508,"a":3509},"Can it import an existing Storyline or Rise package?","No. Tessera is an authoring framework, not a converter. Courses are written as source in its own project layout; there is no import path for an existing SCORM package.\n",{},"\u002Ftools\u002Ftessera",[304,836,311],{"model":313,"source":3514},"https:\u002F\u002Fgithub.com\u002Fredmodd\u002Ftessera",[],{"description":3501},{"scorm12":3518,"scorm2004":3520,"xapi":3523,"cmi5":3526},{"supported":308,"provenance":320,"checkedAt":242,"source":3519},"https:\u002F\u002Fgithub.com\u002Fredmodd\u002Ftessera\u002Fblob\u002Fmain\u002Fpackages\u002Ftessera-learn\u002Fsrc\u002Fplugin\u002Fexport.ts",{"supported":308,"editions":3521,"provenance":320,"checkedAt":242,"source":3519,"note":3522},[418],"The exporter writes \u003Cschemaversion>2004 4th Edition\u003C\u002Fschemaversion>; 2nd and 3rd Edition manifests are not offered.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":3524,"note":3525},"https:\u002F\u002Fgithub.com\u002Fredmodd\u002Ftessera\u002Fblob\u002Fmain\u002Fpackages\u002Ftessera-learn\u002Fsrc\u002Fruntime\u002Fxapi\u002Fversion.ts","Pinned to xAPI 1.0.3. The source states the choice explicitly and does not implement IEEE 9274.1.1 (xAPI 2.0).\n",{"supported":308,"provenance":320,"checkedAt":242,"source":3527,"note":3528},"https:\u002F\u002Fgithub.com\u002Fredmodd\u002Ftessera\u002Fblob\u002Fmain\u002Fpackages\u002Ftessera-learn\u002Fsrc\u002Fruntime\u002Fadapters\u002Fcmi5.ts","Exports a cmi5 course structure XML and implements the AU lifecycle over the xAPI 1.0.3 client. Editor-checked in source, not against the cmi5 test suite.\n","tools\u002Ftessera","Author a course as Svelte pages, then export the same source as SCORM, cmi5 or xAPI",[334,3532,3533,1762],"svelte","packager","https:\u002F\u002Ftesseralearn.dev","195x-qN4w1g7NPQa78OtQdnkYOLyXk8uZmRkKLnGokE",{"id":3537,"title":3538,"addedAt":242,"alternatives":3539,"body":3540,"categories":3556,"checkedAt":242,"claimed":293,"description":3544,"docs":3557,"editorsPick":295,"extension":296,"faq":3558,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":3565,"name":3566,"navigation":308,"openSource":308,"path":3567,"platforms":3568,"pricing":3569,"registries":3571,"repo":3570,"seo":3572,"standards":3573,"status":329,"stem":3579,"tagline":3580,"tags":3581,"vendor":293,"website":3557,"__hash__":3582},"tools\u002Ftools\u002Ftincanjs.md","Tincanjs",[],{"type":247,"value":3541,"toc":3554},[3542,3545,3548,3551],[250,3543,3544],{},"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.",[250,3546,3547],{},"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.",[250,3549,3550],{},"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.",[250,3552,3553],{},"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":289,"searchDepth":290,"depth":290,"links":3555},[],[23],"http:\u002F\u002Frusticisoftware.github.io\u002FTinCanJS\u002F",[3559,3562],{"q":3560,"a":3561},"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":3563,"a":3564},"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",[304,311],{"model":313,"source":3570},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002FTinCanJS",[],{"description":3544},{"xapi":3574,"cmi5":3577},{"supported":308,"provenance":320,"checkedAt":242,"source":3575,"note":3576},"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":295,"provenance":320,"checkedAt":242,"note":3578},"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",[334,304,745],"2i3z40meMW-Nape_BHTV7naqlP9OGWyTrTzJYCqlmJw",{"id":3584,"title":3585,"addedAt":242,"alternatives":3586,"body":3587,"categories":3604,"checkedAt":242,"claimed":293,"description":3591,"docs":3605,"editorsPick":295,"extension":296,"faq":3606,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":3613,"license":777,"listing":306,"logo":293,"meta":3614,"name":3585,"navigation":308,"openSource":308,"path":3615,"platforms":3616,"pricing":3617,"registries":3620,"repo":293,"seo":3621,"standards":3622,"status":423,"stem":3637,"tagline":3638,"tags":3639,"vendor":3642,"website":3619,"__hash__":3643},"tools\u002Ftools\u002Ftotara-learn.md","Totara Learn",[1464],{"type":247,"value":3588,"toc":3602},[3589,3592,3599],[250,3590,3591],{},"Totara Learn is the LMS component of Totara's platform, forked from Moodle in 2010 and shaped ever since around corporate and public-sector training rather than academic teaching: hierarchies and audiences, positions and organisations, certifications with recertification windows, competency frameworks, and the compliance reporting that follows from all of it. Those are the parts Moodle handles awkwardly, and they are the reason organisations pay for a Moodle derivative rather than running Moodle.",[250,3593,3594,3595,3598],{},"The licensing arrangement is the thing most buyers misread. The code is GPLv3 and subscribers can modify and host it themselves, which is a real difference from a closed SaaS LMS — but there is no public download. You subscribe, usually via a Totara partner, and receive source and updates for the term. Verified on 24 August 2026: the ",[253,3596,3597],{},"totara"," GitHub organisation contains vendored libraries and developer tooling only, no product core.",[250,3600,3601],{},"On standards, read the documentation closely rather than the marketing. SCORM 1.2 and AICC are stated as fully supported; SCORM 2004 is stated with exclusions broad enough that packages relying on sequencing should be tested before purchase; and xAPI is explicitly not supported by Totara, only by community plugins pointed at an external LRS. For a compliance-heavy SCORM 1.2 estate this is a mature, well-documented platform. For an xAPI-first programme it is the wrong starting point.",{"title":289,"searchDepth":290,"depth":290,"links":3603},[],[20],"https:\u002F\u002Ftotara.help",[3607,3610],{"q":3608,"a":3609},"Is Totara open source in the sense that I can download it?","Not from a public repository. The code is GPLv3 and subscribers receive source, but there is no public core repository on GitHub — the Totara organisation there holds vendored dependencies and developer tooling, not the product. Access comes with a subscription, usually through a partner.\n",{"q":3611,"a":3612},"Can I use it as an LRS or an xAPI target?","No. Totara's own xAPI page routes you to unsupported community plugins and an external LRS. If xAPI is central to your programme, treat that as an integration project rather than a platform feature.\n","NZ",{},"\u002Ftools\u002Ftotara-learn",[311],{"model":3618,"currency":958,"freeTier":295,"source":3619},"quote","https:\u002F\u002Fwww.totara.com",[],{"description":3591},{"scorm12":3623,"scorm2004":3626,"aicc":3629,"xapi":3630,"lti":3633},{"supported":308,"provenance":851,"checkedAt":242,"source":3624,"note":3625},"https:\u002F\u002Ftotara.help\u002Fdocs\u002Fadd-a-scorm-activity","Totara's own documentation says it \"fully supports the AICC and SCORM 1.2 specifications\".\n",{"supported":308,"editions":3627,"provenance":851,"checkedAt":242,"source":3624,"note":3628},[],"The same page qualifies 2004 heavily: support excludes \"Content Aggregation Model, The Run-Time Environment, Sequencing and Navigation\" extensions. Read that as basic 2004 playback without sequencing — test any 2004 package with sequencing rules before committing to it.\n",{"supported":308,"provenance":851,"checkedAt":242,"source":3624},{"supported":295,"provenance":851,"checkedAt":242,"source":3631,"note":3632},"https:\u002F\u002Ftotara.help\u002Fdocs\u002Fconfigure-xapi-with-totara","Totara documents an xAPI setup but states that it \"currently requires third-party plugins to work, and is not supported by Totara\". The plugins are the community Moodle logstore_xapi ones, and an external LRS is required. We record this as unsupported because the vendor does.\n",{"supported":308,"versions":3634,"provenance":851,"checkedAt":242,"source":3635,"note":3636},[1018,1019],"https:\u002F\u002Ftotara.help\u002Fdocs\u002Fexternal-tools","Documented as consumer only — \"Using Totara as a provider, i.e. exporting content to other sites, is not supported.\" LTI Advantage services are listed for 1.3.\n","tools\u002Ftotara-learn","Moodle-derived enterprise LMS, GPL-licensed but distributed only through a paid subscription",[1025,1083,3640,3641],"enterprise","compliance","Totara Learning Solutions","HMFmLJjZlrv4HLHdxJtzOYusqlP9Pg3Qy6GIFUqrm68",{"id":3645,"title":3646,"addedAt":242,"alternatives":3647,"body":3648,"categories":3686,"checkedAt":242,"claimed":293,"description":3687,"docs":293,"editorsPick":295,"extension":296,"faq":3688,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":3695,"name":3696,"navigation":308,"openSource":308,"path":3697,"platforms":3698,"pricing":3699,"registries":3701,"repo":3700,"seo":3702,"standards":3703,"status":423,"stem":3710,"tagline":3711,"tags":3712,"vendor":293,"website":3700,"__hash__":3715},"tools\u002Ftools\u002Funity-scorm-integration-kit.md","Unity Scorm Integration Kit",[],{"type":247,"value":3649,"toc":3684},[3650,3660,3663,3673],[250,3651,3652,3653,3656,3657,3659],{},"A Unity editor package that turns a WebGL build into a SCORM 2004 course. You drop a ",[253,3654,3655],{},"ScormManager"," prefab into the first scene, call into it from C# to read learner data and write completion, score, objectives and interactions, then use the export menu, which writes an ",[253,3658,2171],{},", bundles the 2004 schemas and zips the build into a package interchange file.",[250,3661,3662],{},"It is the only maintained option for this job, which is the main reason to know about it. Serious games and simulations are where SCORM reporting is most often abandoned entirely — the build ships, the LMS records a launch and nothing else — and the kit closes that gap with a documented C# API rather than hand-rolled JavaScript interop.",[250,3664,3665,3666,3669,3670,2110],{},"The constraints are real. It is 2004 4th Edition only, so an LMS restricted to SCORM 1.2 is out. The repository contains a full Unity project with its ",[253,3667,3668],{},"Library\u002F"," folder committed, which makes it large and awkward to consume as a dependency; in practice you import the ",[253,3671,3672],{},".unitypackage",[250,3674,3675,3676,3679,3680,3683],{},"On maintenance, read the dates carefully before the status chip. Between 2021 and 2026 the project sat still; the 2026 activity is one burst of merged community pull requests updating the WebGL template for Unity 6 and replacing the removed ",[253,3677,3678],{},"Pointer_stringify"," with ",[253,3681,3682],{},"UTF8ToString",". That is exactly the maintenance the project needed, but it is responsive rather than continuous — expect to wait for the next engine break.",{"title":289,"searchDepth":290,"depth":290,"links":3685},[],[17],"A Unity editor package that turns a WebGL build into a SCORM 2004 course. You drop a ScormManager prefab into the first scene, call into it from C# to read learner data and write completion, score, objectives and interactions, then use the export menu, which writes an imsmanifest.xml, bundles the 2004 schemas and zips the build into a package interchange file.",[3689,3692],{"q":3690,"a":3691},"Is this the ADL project?","It is its continuation. The CITATION.cff credits Richard Stals and Advanced Distributed Learning, and this repository is where the maintenance happens; the adlnet-hosted copy no longer resolves.\n",{"q":3693,"a":3694},"Does it work with mobile Unity builds?","No. The kit targets WebGL, because the SCORM run-time conversation happens in the browser page hosting the build. Native iOS or Android players have no LMS API object to find.\n",{},"Unity-SCORM Integration Kit","\u002Ftools\u002Funity-scorm-integration-kit",[304,311],{"model":313,"source":3700},"https:\u002F\u002Fgithub.com\u002Frstals\u002FUnity-SCORM-Integration-Kit",[],{"description":3687},{"scorm12":3704,"scorm2004":3706},{"supported":295,"provenance":320,"checkedAt":242,"note":3705},"The exporter writes a 2004 manifest only, and the bundled API finder looks for API_1484_11. A 1.2-only LMS is not a target.\n",{"supported":308,"editions":3707,"provenance":320,"checkedAt":242,"source":3708,"note":3709},[418],"https:\u002F\u002Fgithub.com\u002Frstals\u002FUnity-SCORM-Integration-Kit\u002Fblob\u002Fmaster\u002FUnity3D-Project\u002FAssets\u002FSCORM\u002FEditor\u002FScormExport.cs","ScormExport.cs emits \u003Cschemaversion>2004 4th Edition\u003C\u002Fschemaversion> and bundles the adlcp\u002Fadlseq\u002Fadlnav v1p3 schemas.\n","tools\u002Funity-scorm-integration-kit","Export a Unity WebGL build as a SCORM 2004 package and report progress from C#",[3713,3043,3714,3533],"unity","webgl","6ytyN2Xof6sbF2QhYbSkHXhR-G-Y0T48trVc_QEBU2M",{"id":3717,"title":3718,"addedAt":242,"alternatives":3719,"body":3720,"categories":3740,"checkedAt":242,"claimed":293,"description":3724,"docs":3741,"editorsPick":295,"extension":296,"faq":3742,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":3746,"name":3747,"navigation":308,"openSource":308,"path":3748,"platforms":3749,"pricing":3750,"registries":3751,"repo":3752,"seo":3753,"standards":3754,"status":423,"stem":3770,"tagline":3771,"tags":3772,"vendor":293,"website":3773,"__hash__":3774},"tools\u002Ftools\u002Fxerte.md","Xerte",[],{"type":247,"value":3721,"toc":3738},[3722,3725,3728,3735],[250,3723,3724],{},"Xerte Online Toolkits is a server you host and your authors log into. They assemble learning objects from a library of page templates — text, media, questions, interactive diagrams — and publish them out as web content, or as a SCORM or xAPI package for an LMS. It has been running in UK higher education for well over a decade, and accessibility of the published output has been a stated priority throughout, which is rare enough in this category to be the main reason to look at it.",[250,3726,3727],{},"The economics are the other reason. There is no per-author licence, so an institution can give the tool to every lecturer without a procurement round. Against that, someone has to keep a PHP and MySQL host patched, and the installation guide still leads with XAMPP.",[250,3729,3730,3731,3734],{},"Where it is a poor fit: teams expecting a hosted, modern, collaborative authoring experience, or a design system they control. The template model constrains what a course can look like, and the repository still carries Flash-era ",[253,3732,3733],{},".swf"," assets in older parent templates. Two hundred and ten open issues sit against a wide feature surface.",[250,3736,3737],{},"Development is live — the develop branch was pushed this month — though the last tagged stable release, v3.13, dates from October 2024. Seventy-two stars badly understates deployment, because this is distributed to institutions as a zip, not adopted from GitHub.",{"title":289,"searchDepth":290,"depth":290,"links":3739},[],[5],"https:\u002F\u002Fxerte.org.uk\u002Findex.php\u002Fen\u002F",[3743],{"q":3744,"a":3745},"Do authors need to install anything?","No — authoring happens in the browser against a shared server. The installation burden falls entirely on whoever runs the PHP and MySQL host, which is the trade Xerte makes: one sysadmin, unlimited authors, no per-seat licence.\n",{},"Xerte Online Toolkits","\u002Ftools\u002Fxerte",[311],{"model":313,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Fthexerteproject\u002Fxerteonlinetoolkits",{"description":3724},{"scorm12":3755,"scorm2004":3758,"xapi":3762,"cmi5":3765,"lti":3766},{"supported":308,"provenance":320,"checkedAt":242,"source":3756,"note":3757},"https:\u002F\u002Fgithub.com\u002Fthexerteproject\u002Fxerteonlinetoolkits\u002Ftree\u002Fdevelop\u002Flanguages\u002Fen-GB\u002Fmodules\u002Fxerte\u002Fscorm1.2","A dedicated tracking module (xttracking_scorm1.2.js) ships in the language module tree and is selected at export time.\n",{"supported":308,"editions":3759,"provenance":320,"checkedAt":242,"source":3760,"note":3761},[1144],"https:\u002F\u002Fgithub.com\u002Fthexerteproject\u002Fxerteonlinetoolkits\u002Ftree\u002Fdevelop\u002Flanguages\u002Fen-GB\u002Fmodules\u002Fxerte\u002Fscorm2004.3rd","The only 2004 tracking module in the tree is scorm2004.3rd. There is no 4th Edition variant, and sequencing is not authored.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":3763,"note":3764},"https:\u002F\u002Fgithub.com\u002Fthexerteproject\u002Fxerteonlinetoolkits\u002Ftree\u002Fdevelop\u002Fmodules\u002Fsite\u002FxAPI","Ships an xAPI tracking module built on ADL's xapiwrapper, plus an xAPI dashboard for reporting back over the statements.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":308,"versions":3767,"provenance":320,"checkedAt":242,"source":3768,"note":3769},[1018,1019],"https:\u002F\u002Fgithub.com\u002Fthexerteproject\u002Fxerteonlinetoolkits\u002Fblob\u002Fdevelop\u002Flti13_launch.php","lti_launch.php, lti2_launch.php and lti13_launch.php sit at the project root — so LTI 1.1, LTI 2.0 and LTI 1.3 launches are all handled, though this directory records only 1.1 and 1.3.\n","tools\u002Fxerte","Server-hosted, template-driven authoring for institutions, with SCORM and xAPI export",[2545,1083,603,858],"https:\u002F\u002Fxerte.org.uk","DMJDHnz_22idb40bOtmbZ125-pDAOIodHDh8H-7cw7U",{"id":3776,"title":3777,"addedAt":242,"alternatives":3778,"body":3779,"categories":3806,"checkedAt":242,"claimed":293,"description":3807,"docs":3808,"editorsPick":295,"extension":296,"faq":3809,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":3813,"name":3814,"navigation":308,"openSource":308,"path":3815,"platforms":3816,"pricing":3817,"registries":3818,"repo":3819,"seo":3820,"standards":3821,"status":3169,"stem":3829,"tagline":3830,"tags":3831,"vendor":631,"website":3819,"__hash__":3832},"tools\u002Ftools\u002Fadl-cmi5-client-library.md","Adl Cmi5 Client Library",[],{"type":247,"value":3780,"toc":3804},[3781,3795,3798,3801],[250,3782,3783,3784,270,3787,3790,3791,3794],{},"This is a small content-side library for cmi5: two scripts, ",[253,3785,3786],{},"cmi5Controller.js",[253,3788,3789],{},"cmi5Wrapper.js",", one worked example of an Assignable Unit, and a sample ",[253,3792,3793],{},"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.",[250,3796,3797],{},"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.",[250,3799,3800],{},"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.",[250,3802,3803],{},"Read it, then build on something maintained.",{"title":289,"searchDepth":290,"depth":290,"links":3805},[],[23],"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",[3810],{"q":3811,"a":3812},"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",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002Fcmi5-Client-Library",{"description":3807},{"cmi5":3822,"xapi":3825,"scorm12":3827,"scorm2004":3828},{"supported":308,"provenance":320,"checkedAt":242,"source":3823,"note":3824},"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":308,"provenance":320,"checkedAt":242,"note":3826},"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":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fadl-cmi5-client-library","ADL's archived JavaScript wrapper and example AU for the content side of cmi5",[572,334,629],"b9v2IBbn95x0Bc13X9vuxNt-UMagLySEMFZNf68aJjg",{"id":3834,"title":3835,"addedAt":242,"alternatives":3836,"body":3838,"categories":3862,"checkedAt":242,"claimed":293,"description":3842,"docs":3863,"editorsPick":295,"extension":296,"faq":3864,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":604,"license":605,"listing":306,"logo":293,"meta":3871,"name":3872,"navigation":308,"openSource":308,"path":3873,"platforms":3874,"pricing":3875,"registries":3876,"repo":3863,"seo":3877,"standards":3878,"status":329,"stem":3884,"tagline":3885,"tags":3886,"vendor":2818,"website":3863,"__hash__":3887},"tools\u002Ftools\u002Fcmi5-js.md","Cmi5 Js",[3837],"catapult",{"type":247,"value":3839,"toc":3860},[3840,3843,3854,3857],[250,3841,3842],{},"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.",[250,3844,3845,3846,3849,3850,3853],{},"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 ",[253,3847,3848],{},"moveon"," context category, carrying ",[253,3851,3852],{},"masteryScore"," as the documented extension, and merging the LMS-supplied context template into every statement.",[250,3855,3856],{},"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.",[250,3858,3859],{},"Reasonable to use today. Read it before you do, and expect to maintain your own copy.",{"title":289,"searchDepth":290,"depth":290,"links":3861},[],[23],"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fcmi5.js",[3865,3868],{"q":3866,"a":3867},"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":3869,"a":3870},"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",[304,311],{"model":313,"currency":958,"freeTier":308},[],{"description":3842},{"cmi5":3879,"xapi":3882},{"supported":308,"provenance":320,"checkedAt":242,"source":3880,"note":3881},"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":308,"provenance":320,"checkedAt":242,"source":3880,"note":3883},"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",[572,334,427],"M-luPAvqXhX9Fa8eDiHw4TQZF6W8PkqzkpxTaR763tU",{"id":3889,"title":3890,"addedAt":242,"alternatives":3891,"body":3892,"categories":3908,"checkedAt":242,"claimed":293,"description":3896,"docs":3909,"editorsPick":295,"extension":296,"faq":3910,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":604,"license":605,"listing":306,"logo":293,"meta":3917,"name":3918,"navigation":308,"openSource":308,"path":3919,"platforms":3920,"pricing":3921,"registries":3923,"repo":3922,"seo":3924,"standards":3925,"status":423,"stem":3930,"tagline":3931,"tags":3932,"vendor":3934,"website":3922,"__hash__":3935},"tools\u002Ftools\u002Fmoodle-mod-cmi5launch.md","Moodle Mod Cmi5launch",[],{"type":247,"value":3893,"toc":3906},[3894,3897,3900,3903],[250,3895,3896],{},"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.",[250,3898,3899],{},"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.",[250,3901,3902],{},"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.",[250,3904,3905],{},"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":289,"searchDepth":290,"depth":290,"links":3907},[],[23],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FMoodle-mod_cmi5launch#readme",[3911,3914],{"q":3912,"a":3913},"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":3915,"a":3916},"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",[2010],{"model":313,"source":3922},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002FMoodle-mod_cmi5launch",[],{"description":3896},{"cmi5":3926,"xapi":3928},{"supported":308,"provenance":320,"checkedAt":242,"source":3922,"note":3927},"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":308,"provenance":320,"checkedAt":242,"source":3922,"note":3929},"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",[1464,3933,746],"plugin","ADL Initiative","JYwa_1WFcgt90_kW7nBeHKE19c17EsGcEFYUmsH4sag",{"id":3937,"title":3938,"addedAt":242,"alternatives":3939,"body":3940,"categories":3986,"checkedAt":242,"claimed":293,"description":3987,"docs":3988,"editorsPick":295,"extension":296,"faq":3989,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":3993,"name":3994,"navigation":308,"openSource":308,"path":3995,"platforms":3996,"pricing":3997,"registries":3999,"repo":3998,"seo":4000,"standards":4001,"status":329,"stem":4009,"tagline":4010,"tags":4011,"vendor":293,"website":4014,"__hash__":4015},"tools\u002Ftools\u002Fdart-scorm.md","Dart Scorm",[],{"type":247,"value":3941,"toc":3984},[3942,3975,3978,3981],[250,3943,3944,3945,3948,3949,3951,3952,3954,3955,3958,3959,260,3961,260,3964,260,3967,260,3969,270,3972,3974],{},"A small Dart package that lets a Flutter or Dart web application talk to the LMS that launched it. ",[253,3946,3947],{},"ScormAPI.findApi()"," walks the window hierarchy and then the ",[253,3950,351],{}," hierarchy looking for an API object — preferring SCORM 2004's ",[253,3953,3006],{}," and falling back to 1.2's ",[253,3956,3957],{},"API"," — after which ",[253,3960,259],{},[253,3962,3963],{},"getValue",[253,3965,3966],{},"setValue",[253,3968,269],{},[253,3970,3971],{},"finish",[253,3973,273],{}," pass calls straight through to JavaScript.",[250,3976,3977],{},"That is the whole surface, and for the problem it addresses that is the right size. Flutter web output is a canvas inside an iframe; finding the API adapter across frames is fiddly, and this package removes the fiddliness in a few lines. The example project is genuinely useful — it shows the iframe wrapper, the manifest and the zip layout that make a Flutter build launchable as a SCO.",[250,3979,3980],{},"What it will not do: validate anything. There is no CMI data model, no type or vocabulary checking, no packaging step, and no help with completion or scoring semantics — write the wrong element and the LMS, not the library, tells you.",[250,3982,3983],{},"For someone deciding today: this is a single-maintainer package with a handful of stars, last released in August 2023 to add Dart 3 and null safety, and untouched since. Because it is a thin binding over an API that has not changed since 2009, staleness costs less here than it would in a runtime. The real risk is Flutter's own web renderer moving underneath it, not SCORM.",{"title":289,"searchDepth":290,"depth":290,"links":3985},[],[17],"A small Dart package that lets a Flutter or Dart web application talk to the LMS that launched it. ScormAPI.findApi() walks the window hierarchy and then the opener hierarchy looking for an API object — preferring SCORM 2004's API_1484_11 and falling back to 1.2's API — after which initialize, getValue, setValue, commit, finish and terminate pass calls straight through to JavaScript.","https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Fscorm\u002Flatest\u002F",[3990],{"q":3991,"a":3992},"Does it produce a SCORM package?","No. It handles the run-time conversation only. The example folder contains a hand-written imsmanifest.xml and a wrapper page showing how to zip a Flutter web build into a package, but there is no packaging command.\n",{},"dart_scorm","\u002Ftools\u002Fdart-scorm",[304,311],{"model":313,"source":3998},"https:\u002F\u002Fgithub.com\u002Fshripal17\u002Fdart_scorm",[],{"description":3987},{"scorm12":4002,"scorm2004":4004,"xapi":4007,"cmi5":4008},{"supported":308,"provenance":320,"checkedAt":242,"source":4003},"https:\u002F\u002Fgithub.com\u002Fshripal17\u002Fdart_scorm\u002Fblob\u002Fmain\u002Flib\u002Fsrc\u002Fscorm_version_extension.dart",{"supported":308,"editions":4005,"provenance":320,"checkedAt":242,"source":4003,"note":4006},[],"The package binds to the window.API_1484_11 object and passes calls straight through; no edition is asserted. The bundled example manifest declares \"2004 3rd Edition\".\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fdart-scorm","SCORM 1.2 and 2004 bindings for Flutter and Dart web applications",[4012,4013,428,304],"dart","flutter","https:\u002F\u002Fpub.dev\u002Fpackages\u002Fscorm","Pm-Hphr-BRtTaGtLBM9-TTlnT19DUJjRvHSCcEwDSNE",{"id":4017,"title":4018,"addedAt":242,"alternatives":4019,"body":4020,"categories":4036,"checkedAt":242,"claimed":293,"description":4024,"docs":293,"editorsPick":295,"extension":296,"faq":4037,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":605,"listing":306,"logo":293,"meta":4044,"name":4045,"navigation":308,"openSource":308,"path":4046,"platforms":4047,"pricing":4048,"registries":4049,"repo":4050,"seo":4051,"standards":4052,"status":423,"stem":4064,"tagline":4065,"tags":4066,"vendor":4070,"website":4050,"__hash__":4071},"tools\u002Ftools\u002Felearning-module-parser.md","Elearning Module Parser",[],{"type":247,"value":4021,"toc":4034},[4022,4025,4028,4031],[250,4023,4024],{},"This is the ingest half of a SCORM platform, packaged as a Java 17 library. Point it at a zip, a directory or an S3 prefix and it works out which of five formats it is holding — SCORM 1.2, SCORM 2004, AICC, cmi5 or xAPI\u002FTinCan — then returns typed metadata with consistent accessors for title, launch URL, structure and mastery data. That normalisation is the actual value: without it, every format needs its own parsing path and its own set of edge cases before your application can do anything useful with an upload.",[250,4026,4027],{},"The audience is narrow and obvious. If you are building or maintaining a JVM-based LMS, a content pipeline or QA tooling that accepts course packages, this saves you a fortnight of XML archaeology. If you are not on the JVM, it is not for you, and there is no CLI to borrow.",[250,4029,4030],{},"Be clear about the boundary. Nothing here plays content, tracks a learner, or implements a run-time. The same author's scorm-again covers the browser side, and the two are designed to sit either end of the same system.",[250,4032,4033],{},"It is young — first commit November 2024 — and has very few stars, but it is published to Maven Central, versioned properly, and pushed within the last week. Judge it on the release discipline rather than the star count.",{"title":289,"searchDepth":290,"depth":290,"links":4035},[],[17],[4038,4041],{"q":4039,"a":4040},"Does supporting cmi5 and xAPI mean it can run those courses?","No. Every format here is supported at the manifest level: the library tells you what a package claims to be and what is inside it. Launching a cmi5 AU or sending xAPI statements needs separate code.\n",{"q":4042,"a":4043},"Can it read packages that are not on local disk?","Yes. Storage is abstracted behind a FileAccess interface with implementations for local directories, zip archives, the classpath, in-memory payloads and S3 via either AWS SDK version, so an upload can be parsed where it lands.\n",{},"eLearning Module Parser","\u002Ftools\u002Felearning-module-parser",[304],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Felearning-module-parser",{"description":4024},{"scorm12":4053,"scorm2004":4055,"aicc":4058,"cmi5":4060,"xapi":4062},{"supported":308,"provenance":851,"checkedAt":242,"source":4054},"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Felearning-module-parser#supported-formats",{"supported":308,"editions":4056,"provenance":851,"checkedAt":242,"source":4054,"note":4057},[2678,1144,418],"Detected by SCORM 2004 namespaces in imsmanifest.xml; the parser surfaces the declared edition along with sequencing, rollup rules and delivery controls.\n",{"supported":308,"provenance":851,"checkedAt":242,"source":4054,"note":4059},"Detected from a .crs descriptor containing a [Course] section; parses assignable units and prerequisite graphs. Parsing only — HACP communication is out of scope.\n",{"supported":308,"provenance":851,"checkedAt":242,"source":4054,"note":4061},"Reads cmi5.xml: AU metadata, move-on criteria, mastery score, launch method and launch parameters. This is course-structure parsing, not a cmi5 launch implementation — nothing here issues a fetch URL or manages an AU session.\n",{"supported":308,"provenance":851,"checkedAt":242,"source":4054,"note":4063},"tincan.xml parsing only — activity definitions, launch activity ids and URLs. It is not an LRS client and sends no statements.\n","tools\u002Felearning-module-parser","Java library that detects and parses SCORM, AICC, cmi5 and xAPI packages into typed metadata",[684,4067,4068,4069],"manifest-parser","ingest","maven","Jonathan Putney","ux031EO1e9qifq03FgHsDGzaj4ZXyNlx_IEmKg4rx1o",{"id":4073,"title":4074,"addedAt":242,"alternatives":4075,"body":4076,"categories":4092,"checkedAt":242,"claimed":293,"description":4080,"docs":4093,"editorsPick":295,"extension":296,"faq":4094,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":4101,"license":1002,"listing":306,"logo":293,"meta":4102,"name":4103,"navigation":308,"openSource":308,"path":4104,"platforms":4105,"pricing":4106,"registries":4107,"repo":4108,"seo":4109,"standards":4110,"status":423,"stem":4121,"tagline":4122,"tags":4123,"vendor":4125,"website":4126,"__hash__":4127},"tools\u002Ftools\u002Fexelearning.md","Exelearning",[],{"type":247,"value":4077,"toc":4090},[4078,4081,4084,4087],[250,4079,4080],{},"eXeLearning is the rare open-source authoring tool with an institution behind it. Started in New Zealand, maintained since 2010 by Spain's education ministry through Cedec-INTEF and now developed jointly with the regional administrations, it exists to produce open educational resources and it exports to the formats schools actually use: HTML5, EPUB3, IMS Content Packaging, and SCORM 1.2 and 2004.",[250,4082,4083],{},"The current codebase is a rewrite, not the Python desktop application people may remember. It is a web application built on Bun and Elysia with real-time collaborative editing through Yjs, database support for MySQL, Postgres and SQLite, and CAS and OpenID Connect authentication. That makes it deployable as shared institutional infrastructure rather than something each author installs — which is clearly the point.",[250,4085,4086],{},"Who it suits: schools, universities and public bodies producing structured, accessible content who need SCORM output without a per-author licence. Who it does not suit: teams wanting slick custom interactions, branching simulations or video-heavy microlearning. The iDevice model is structured and pedagogical rather than free-form, and there is no xAPI or cmi5 path at all, so anything beyond course-level completion tracking is out of scope.",[250,4088,4089],{},"Development is active and public — v4.0.3 in August 2026, commits within the day, codecov reporting — and the funding model means it is unlikely to disappear.",{"title":289,"searchDepth":290,"depth":290,"links":4091},[],[5],"https:\u002F\u002Fgithub.com\u002Fexelearning\u002Fexelearning\u002Fblob\u002Fmain\u002Fdoc\u002Farchitecture.md",[4095,4098],{"q":4096,"a":4097},"Does the AGPL licence affect content I create with it?","No. The AGPL covers the application source, not the learning material you author or the packages you export. It does matter if you modify eXeLearning and run your modified copy as a hosted service, which is the situation the AGPL exists to address.\n",{"q":4099,"a":4100},"Does it have to be installed on a server?","Not necessarily. The current version is a web application — Docker is the quickest route — but the project also supports offline installers via Electron and nativePHP for people who want a desktop tool.\n","ES",{},"eXeLearning","\u002Ftools\u002Fexelearning",[311,665,1802,610],{"model":313,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Fexelearning\u002Fexelearning",{"description":4080},{"scorm12":4111,"scorm2004":4113,"xapi":4117,"cmi5":4119,"aicc":4120},{"supported":308,"provenance":320,"checkedAt":242,"source":4112},"https:\u002F\u002Fgithub.com\u002Fexelearning\u002Fexelearning\u002Fblob\u002Fmain\u002Fsrc\u002Fshared\u002Fexport\u002Fexporters\u002FScorm12Exporter.ts",{"supported":308,"editions":4114,"provenance":320,"checkedAt":242,"source":4115,"note":4116},[418],"https:\u002F\u002Fgithub.com\u002Fexelearning\u002Fexelearning\u002Fblob\u002Fmain\u002Fsrc\u002Fshared\u002Fexport\u002Fgenerators\u002FScorm2004Manifest.ts","The manifest generator writes '2004 4th Edition' as the schemaversion, with the imscp, adlcp, adlseq, adlnav and imsss namespaces declared.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":4118},"The exporters directory covers ELPX, EPUB3, HTML5, IMS Content Packaging, SCORM 1.2 and SCORM 2004. There is no xAPI or cmi5 exporter.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fexelearning","Free authoring tool from the Spanish education ministry, exporting SCORM, IMS CP and EPUB",[2545,4124,603,858],"oer","Ministerio de Educación, Formación Profesional y Deportes (Cedec-INTEF)","https:\u002F\u002Fexelearning.net","GoEnH1ZZXj25MLRYChDZK_xODhvCmIaMRlue77_V1lg",{"id":4129,"title":4130,"addedAt":242,"alternatives":4131,"body":4132,"categories":4163,"checkedAt":242,"claimed":293,"description":4164,"docs":4165,"editorsPick":295,"extension":296,"faq":4166,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4170,"name":4171,"navigation":308,"openSource":308,"path":4172,"platforms":4173,"pricing":4174,"registries":4176,"repo":4175,"seo":4177,"standards":4178,"status":329,"stem":4185,"tagline":4186,"tags":4187,"vendor":293,"website":4175,"__hash__":4190},"tools\u002Ftools\u002Fgrunt-scorm-manifest.md","Grunt Scorm Manifest",[],{"type":247,"value":4133,"toc":4161},[4134,4140,4147,4154],[250,4135,4136,4137,4139],{},"This is a Grunt plugin that generates an ",[253,4138,2171],{}," for a single-SCO course, published by Ray Gesualdo in 2013 and never revised: the sole release is v0.2.0, and the README carries an explicit \"No Maintenance Intended\" badge. The last commit to the repository was in 2016.",[250,4141,4142,4143,4146],{},"What it does, it does in about a hundred readable lines. You give it a course id, a title, a launch page and a file glob; it walks the matched files, writes the resource list, and emits either a SCORM 1.2 manifest or a \"2004 3rd Edition\" one. The only structural difference between the two is the schema version string and the casing of the ",[253,4144,4145],{},"adlcp:scormtype"," attribute, which is exactly the trap it exists to spare you.",[250,4148,4149,4150,4153],{},"The reasons not to depend on it are practical rather than moral. Grunt itself is largely out of use, the required version is ",[253,4151,4152],{},"~0.4.2",", there is no 2004 4th Edition path, and nothing beyond one SCO is expressible. Anyone building packages in a modern pipeline should reach for a maintained packager instead.",[250,4155,4156,4157,4160],{},"Its lasting value is as a reference. If you want to see the minimum viable manifest for both SCORM generations, side by side, with the version-specific gotchas isolated in one ",[253,4158,4159],{},"switch"," statement, this file is a clearer read than the ADL specification.",{"title":289,"searchDepth":290,"depth":290,"links":4162},[],[17],"This is a Grunt plugin that generates an imsmanifest.xml for a single-SCO course, published by Ray Gesualdo in 2013 and never revised: the sole release is v0.2.0, and the README carries an explicit \"No Maintenance Intended\" badge. The last commit to the repository was in 2016.","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fgrunt-scorm-manifest",[4167],{"q":4168,"a":4169},"Can it produce a multi-SCO package?","No. The task builds one organization containing one item pointing at one launch page, and lists every other matched file as a resource dependency. Course structures with several SCOs, or any sequencing rules, need a different tool or a hand-written manifest.\n",{},"grunt-scorm-manifest","\u002Ftools\u002Fgrunt-scorm-manifest",[836,304],{"model":313,"source":4175},"https:\u002F\u002Fgithub.com\u002Fraygesualdo\u002Fgrunt-scorm-manifest",[],{"description":4164},{"scorm12":4179,"scorm2004":4182},{"supported":308,"provenance":320,"checkedAt":242,"source":4180,"note":4181},"https:\u002F\u002Fgithub.com\u002Fraygesualdo\u002Fgrunt-scorm-manifest\u002Fblob\u002Fmaster\u002Ftasks\u002Fscorm_manifest.js","Passing version '1.2' sets schemaversion to 1.2 and switches the resource attribute to the lower-case adlcp:scormtype the 1.2 schema requires.\n",{"supported":308,"editions":4183,"provenance":320,"checkedAt":242,"source":4180,"note":4184},[1144],"The task hard-codes the schemaversion string '2004 3rd Edition'. There is no 4th Edition option — '2004' and '2004v3' both produce a 3rd Edition manifest.\n","tools\u002Fgrunt-scorm-manifest","Grunt task that writes an imsmanifest.xml for a single-SCO package",[4188,2974,4189],"build-tool","unmaintained","RUCoc1HvpKfk_nq9s6lf8XNMDrsoxm5SumzwaH8E79Q",{"id":4192,"title":4193,"addedAt":242,"alternatives":4194,"body":4195,"categories":4222,"checkedAt":242,"claimed":293,"description":4223,"docs":4224,"editorsPick":295,"extension":296,"faq":4225,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4232,"name":4233,"navigation":308,"openSource":308,"path":4234,"platforms":4235,"pricing":4236,"registries":4237,"repo":4238,"seo":4239,"standards":4240,"status":423,"stem":4249,"tagline":4250,"tags":4251,"vendor":293,"website":4238,"__hash__":4253},"tools\u002Ftools\u002Flaravel-scorm.md","Laravel Scorm",[],{"type":247,"value":4196,"toc":4220},[4197,4207,4210,4217],[250,4198,4199,4200,4202,4203,4206],{},"laravel-scorm is the server-side half of SCORM support for a Laravel application: upload a package, and it extracts the zip to a configured disk (local or S3), parses ",[253,4201,2171],{}," into SCO records, creates the migrations for the tracking tables, and stores each learner's CMI data as they work through the course. Configuration is a published ",[253,4204,4205],{},"config\u002Fscorm.php",", with translatable runtime error messages.",[250,4208,4209],{},"It fits teams that already have a Laravel product with users, courses and a database, and want SCORM content to become one more trackable activity rather than a reason to buy an LMS. It is not a drop-in feature: the README's prerequisites include serving extracted content from a separate domain outside the application root, which is the right call for security but means infrastructure work before anything renders.",[250,4211,4212,4213,4216],{},"The gap to be clear about is 2004. Packages are detected and tracked, but the two-thousand-and-four story stops at the data model — no sequencing, no navigation requests, no rollup. Single-SCO courses behave; anything relying on ",[253,4214,4215],{},"imsss"," rules will not.",[250,4218,4219],{},"Maintenance is real but thin: pushed March 2026, forty-eight stars, thirty-seven forks, nine open issues, and a README that opens by asking for collaborators. One maintainer, actively responding — which is better than most packages in this category, and still a single point of failure.",{"title":289,"searchDepth":290,"depth":290,"links":4221},[],[20],"laravel-scorm is the server-side half of SCORM support for a Laravel application: upload a package, and it extracts the zip to a configured disk (local or S3), parses imsmanifest.xml into SCO records, creates the migrations for the tracking tables, and stores each learner's CMI data as they work through the course. Configuration is a published config\u002Fscorm.php, with translatable runtime error messages.","https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fdevianl2\u002Flaravel-scorm",[4226,4229],{"q":4227,"a":4228},"Does it give me a player UI?","No. It handles the zip, the manifest, the SCO records and the CMI persistence, and exposes them through a ScormManager service. The launch page, the iframe and the API object your course talks to are yours to build.\n",{"q":4230,"a":4231},"Why does it insist the content live outside the application?","Extracted SCORM packages are untrusted HTML and JavaScript. The README requires a separate domain or subdomain pointing at the extraction directory so that course code cannot execute against your application's origin — sensible, but it means a vhost change, not just a composer install.\n",{},"laravel-scorm","\u002Ftools\u002Flaravel-scorm",[304,2010],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fdevianl2\u002Flaravel-scorm",{"description":4223},{"scorm12":4241,"scorm2004":4244,"xapi":4247,"cmi5":4248},{"supported":308,"provenance":320,"checkedAt":242,"source":4242,"note":4243},"https:\u002F\u002Fgithub.com\u002Fdevianl2\u002Flaravel-scorm\u002Fblob\u002Fmain\u002Fsrc\u002FManager\u002FScormManager.php","ScormManager reads \u003Cschemaversion> from the manifest and maps '1.2' to a SCORM 1.2 tracking model; ScormScoTracking persists the cmi.core elements.\n",{"supported":308,"editions":4245,"provenance":320,"checkedAt":242,"source":4242,"note":4246},[2678,1144,418],"The manifest parser accepts 'CAM 1.3', '2004 3rd Edition' and '2004 4th Edition' and collapses all three into a single scorm_2004 tracking model. There is no sequencing or navigation engine, so multi-SCO 2004 packages that rely on imsss rules will not behave as they do in a full LMS.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Flaravel-scorm","Laravel package that unpacks SCORM zips and stores CMI tracking in your database",[1276,1083,4252],"composer","orE7pjKq8FtN2NTTyLjzzux40jMqLoaHMsXyJ4uaJl4",{"id":4255,"title":4256,"addedAt":242,"alternatives":4257,"body":4258,"categories":4277,"checkedAt":242,"claimed":293,"description":4262,"docs":293,"editorsPick":295,"extension":296,"faq":4278,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4282,"name":4283,"navigation":308,"openSource":308,"path":4284,"platforms":4285,"pricing":4286,"registries":4288,"repo":4287,"seo":4289,"standards":4290,"status":329,"stem":4297,"tagline":4298,"tags":4299,"vendor":293,"website":4287,"__hash__":4301},"tools\u002Ftools\u002Flms-lrs.md","Lms Lrs",[],{"type":247,"value":4259,"toc":4275},[4260,4263,4266,4272],[250,4261,4262],{},"Two applications and an nginx configuration: a Vue front end that uploads a package and plays it, and a NestJS service that stores the run-time data in Postgres through TypeORM. The author's own repository description is the fairest summary available — \"THIS SOLUTION IS NOT OPTIMIZED FOR PRODUCTION. But it can be used as reference material\" — and this listing exists because the reference value is real.",[250,4264,4265],{},"What is genuinely useful is seeing the full loop written out in one readable stack: the browser-side API object, the HTTP calls it makes, and the tables that catch them. Very few open projects show the server half of SCORM tracking this plainly.",[250,4267,4268,4269,4271],{},"Two things to know before assuming more than that. The 1.2 adapter is the 2004 implementation wearing 1.2 method names, so a strict 1.2 SCO writing ",[253,4270,372],{}," is not being served a 1.2 data model. And despite the repository's cmi5 and Tin Can topics, the xAPI module registers no controllers at all — the entities exist, the endpoints do not — so no xAPI or cmi5 support is recorded here.",[250,4273,4274],{},"Maintenance state is plain: two stars, one author, no commits since March 2023. Read it, borrow from it, and do not build on it.",{"title":289,"searchDepth":290,"depth":290,"links":4276},[],[11],[4279],{"q":4280,"a":4281},"Is the LRS really an LRS?","Not in the sense of the xAPI specification. The xAPI module defines entities for actors, verbs, activities, statements and state, but registers no controllers, so there is no exposed statement endpoint to send to. Treat it as a schema sketch rather than a conformant LRS.\n",{},"lms-lrs","\u002Ftools\u002Flms-lrs",[311],{"model":313,"source":4287},"https:\u002F\u002Fgithub.com\u002Ftkosminov\u002Flms-lrs",[],{"description":4262},{"scorm12":4291,"scorm2004":4294},{"supported":308,"provenance":320,"checkedAt":242,"source":4292,"note":4293},"https:\u002F\u002Fgithub.com\u002Ftkosminov\u002Flms-lrs\u002Fblob\u002Fmaster\u002Flms\u002Fsrc\u002Fscorm.api.ts","A window.API object is registered, but it is the 2004 implementation with the LMS-prefixed method names aliased onto it; the data model underneath speaks cmi.completion_status rather than cmi.core.lesson_status.\n",{"supported":308,"editions":4295,"provenance":320,"checkedAt":242,"source":4292,"note":4296},[],"window.API_1484_11 is registered with Initialize\u002FGetValue\u002FSetValue\u002FCommit and a subset of the 2004 error codes; values are persisted to the NestJS service.\n","tools\u002Flms-lrs","A NestJS and Vue reference build of an LMS with a SCORM runtime and an xAPI store",[333,4300,1400,629],"nestjs","DJzovY53_uvvzN5Cx50L22ZukI_uNapIr-j8tygMihs",{"id":4303,"title":4304,"addedAt":242,"alternatives":4305,"body":4306,"categories":4322,"checkedAt":242,"claimed":293,"description":4310,"docs":4323,"editorsPick":295,"extension":296,"faq":4324,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":4328,"listing":306,"logo":293,"meta":4329,"name":4330,"navigation":308,"openSource":308,"path":4331,"platforms":4332,"pricing":4333,"registries":4334,"repo":4335,"seo":4336,"standards":4337,"status":568,"stem":4343,"tagline":4344,"tags":4345,"vendor":293,"website":4335,"__hash__":4346},"tools\u002Ftools\u002Flxhive.md","Lxhive",[],{"type":247,"value":4307,"toc":4320},[4308,4311,4314,4317],[250,4309,4310],{},"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.",[250,4312,4313],{},"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.",[250,4315,4316],{},"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.",[250,4318,4319],{},"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":289,"searchDepth":290,"depth":290,"links":4321},[],[23],"https:\u002F\u002Fgithub.com\u002Fg3i\u002FlxHive\u002Fwiki",[4325],{"q":4326,"a":4327},"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",[311,304],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fg3i\u002FlxHive",{"description":4310},{"xapi":4338,"cmi5":4341},{"supported":308,"provenance":320,"checkedAt":242,"source":4339,"note":4340},"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":295,"provenance":320,"checkedAt":242,"note":4342},"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",[627,1083,1578],"zvukFTg_FXko2QbDGmdq5CV6md9l9ei5MzGtf6nQwMY",{"id":4348,"title":4349,"addedAt":242,"alternatives":4350,"body":4351,"categories":4375,"checkedAt":242,"claimed":293,"description":4355,"docs":293,"editorsPick":295,"extension":296,"faq":4376,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":4380,"license":3088,"listing":306,"logo":293,"meta":4381,"name":4382,"navigation":308,"openSource":308,"path":4383,"platforms":4384,"pricing":4385,"registries":4387,"repo":4386,"seo":4388,"standards":4389,"status":329,"stem":4393,"tagline":4394,"tags":4395,"vendor":4398,"website":4386,"__hash__":4399},"tools\u002Ftools\u002Fmarkdown2scorm.md","Markdown2scorm",[],{"type":247,"value":4352,"toc":4373},[4353,4356,4359,4370],[250,4354,4355],{},"A small command-line tool from Naturalis Biodiversity Center that converts Markdown lecture notes into a SCORM package. The Perl script shells out to pandoc to produce either a standalone HTML file or a slide deck — S5, Slidy, Slideous, DZSlides or reveal.js — copies in a bundled build of the libscorm run-time library, fills in a manifest template and zips the result. The README explains the motivation clearly: write teaching material collaboratively in Git, and deliver it into Blackboard alongside quizzes and slides from elsewhere.",[250,4357,4358],{},"The idea is sound, and for a team already living in Markdown and pandoc it removes a genuinely irritating manual step. Read as a worked example of the minimum a SCORM package needs — manifest, schema files, a run-time wrapper, one SCO — it is instructive.",[250,4360,4361,4362,4365,4366,4369],{},"As a dependency, treat it cautiously. The last commit was in May 2019, it has nine stars, no issues and no releases; the bundled libscorm assets include a Flash-era ",[253,4363,4364],{},"swfobject.js"," and an ",[253,4367,4368],{},"expressInstall.swf",". It emits SCORM 1.2 only, one SCO per package, with no 2004, no xAPI and no configurable tracking. And there is no licence file at all, which matters more than the age.",[250,4371,4372],{},"Useful as a reference implementation or a starting fork. Not something to build a content pipeline on today.",{"title":289,"searchDepth":290,"depth":290,"links":4374},[],[8],[4377],{"q":4378,"a":4379},"Is there a licence?","No. The repository contains no LICENCE file and none is declared, so the code is under default copyright. That is a blocker for reuse in client work, whatever the intent of the authors.\n","NL",{},"markdown2scorm","\u002Ftools\u002Fmarkdown2scorm",[836],{"model":313,"source":4386},"https:\u002F\u002Fgithub.com\u002Fnaturalis\u002Fmarkdown2scorm",[],{"description":4355},{"scorm12":4390},{"supported":308,"provenance":320,"checkedAt":242,"source":4391,"note":4392},"https:\u002F\u002Fgithub.com\u002Fnaturalis\u002Fmarkdown2scorm\u002Fblob\u002Fmaster\u002Fassets\u002Fscaffold\u002Fimsmanifest.xml","The manifest template declares `\u003Cschemaversion>1.2\u003C\u002Fschemaversion>` against the adlcp_rootv1p2 namespace, and the only schema files in the repository are the 1.2 set.\n","tools\u002Fmarkdown2scorm","A Perl script that runs Markdown through pandoc and wraps the result as SCORM 1.2",[1825,4396,4397],"pandoc","perl","Naturalis Biodiversity Center","CNIDvMTpjfNUrZf-QRJTv2cNIzZHcNJ0p1Ac6rSlaWw",{"id":4401,"title":4402,"addedAt":242,"alternatives":4403,"body":4404,"categories":4423,"checkedAt":242,"claimed":293,"description":4408,"docs":293,"editorsPick":295,"extension":296,"faq":4424,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":1931,"license":1932,"listing":306,"logo":293,"meta":4431,"name":4432,"navigation":308,"openSource":308,"path":4433,"platforms":4434,"pricing":4435,"registries":4436,"repo":4437,"seo":4438,"standards":4439,"status":423,"stem":4450,"tagline":4451,"tags":4452,"vendor":4455,"website":4456,"__hash__":4457},"tools\u002Ftools\u002Fmoodle-mod-scormremote.md","Moodle Mod Scormremote",[],{"type":247,"value":4405,"toc":4421},[4406,4409,4412,4418],[250,4407,4408],{},"This solves a specific commercial problem: you sell or licence SCORM content, and handing over a zip means handing over the asset. mod_scormremote inverts that. The client's LMS receives a wrapper SCO that loads the real course from your Moodle in a sandboxed iframe and relays the SCORM API across domains with postMessage. You keep the content, you can replace it in place, and you get usage back — accounts, enrolments and completion appear in your Moodle as remote learners work through it.",[250,4410,4411],{},"The seat-limiting is the other half of the pitch. Clients are defined by their domains, tiers cap how many seats each client may consume, and a single wrapper file identifies which client is using it from the requesting domain. That is closer to a licensing system than an activity module, and it is why the plugin exists at all.",[250,4413,4414,4415,4417],{},"Know the constraint before you build on it: the wrapper is SCORM 1.2. It vendors only the scorm12 build of scorm-again and never defines ",[253,4416,3006],{},", so 2004-specific tracking on the remote side is not available. Frame embedding must also be permitted at both ends, which not every corporate client's LMS will allow.",[250,4419,4420],{},"Catalyst maintain it against a single MOODLE_39_STABLE branch, with CI and commits as recent as July 2026 — a supported vendor plugin rather than a hobby project, though support is explicitly best-effort unless you sponsor work.",{"title":289,"searchDepth":290,"depth":290,"links":4422},[],[20],[4425,4428],{"q":4426,"a":4427},"What does the remote LMS actually receive?","A small wrapper zip, not the course. It loads the real content from your Moodle inside a sandboxed iframe and bridges the SCORM API across the domain boundary with postMessage, so the content itself never leaves your server and can be swapped without the client reinstalling anything.\n",{"q":4429,"a":4430},"What has to be true on the hosting Moodle?","allowframembedding must be enabled so the remote site can iframe your content, and the remote LMS has to permit the wrapper to embed a cross-origin frame. Either side blocking frames is the usual cause of a blank player.\n",{},"mod_scormremote","\u002Ftools\u002Fmoodle-mod-scormremote",[2010],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fcatalyst\u002Fmoodle-mod_scormremote",{"description":4408},{"scorm12":4440,"scorm2004":4443,"aicc":4447,"xapi":4448,"cmi5":4449},{"supported":308,"provenance":320,"checkedAt":242,"source":4441,"note":4442},"https:\u002F\u002Fgithub.com\u002Fcatalyst\u002Fmoodle-mod_scormremote\u002Fblob\u002FMOODLE_39_STABLE\u002Famd\u002Fsrc\u002Flayer3.js","The generated wrapper SCO is SCORM 1.2. It sets window.API to a Scorm12API instance from scorm-again and bridges the LMS* calls back across postMessage.\n",{"supported":295,"editions":4444,"provenance":320,"checkedAt":242,"source":4445,"note":4446},[],"https:\u002F\u002Fgithub.com\u002Fcatalyst\u002Fmoodle-mod_scormremote\u002Fblob\u002FMOODLE_39_STABLE\u002Fscorm-again\u002Freadme_moodle.txt","Only the scorm12 build of scorm-again is vendored, and the bridge never defines API_1484_11. The wrapper the remote LMS receives therefore speaks SCORM 1.2, whatever version the underlying course is.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fmoodle-mod-scormremote","Serve a SCORM package from your Moodle into someone else's LMS via a thin wrapper SCO",[1464,4453,4454,3230],"moodle-plugin","distribution","Catalyst IT Australia","https:\u002F\u002Fmoodle.org\u002Fplugins\u002Fmod_scormremote","wmIYV8uD_8rF7n_tNveYnTXO9efG8g5k7J-0Aqd4p9A",{"id":4459,"title":4460,"addedAt":242,"alternatives":4461,"body":4462,"categories":4482,"checkedAt":242,"claimed":293,"description":4466,"docs":4483,"editorsPick":295,"extension":296,"faq":4484,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":777,"listing":306,"logo":293,"meta":4491,"name":4492,"navigation":308,"openSource":308,"path":4493,"platforms":4494,"pricing":4495,"registries":4496,"repo":4497,"seo":4498,"standards":4499,"status":423,"stem":4505,"tagline":4506,"tags":4507,"vendor":293,"website":4508,"__hash__":4509},"tools\u002Ftools\u002Fmoodle-logstore-xapi.md","Moodle Logstore Xapi",[],{"type":247,"value":4463,"toc":4480},[4464,4467,4470,4473],[250,4465,4466],{},"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.",[250,4468,4469],{},"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.",[250,4471,4472],{},"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.",[250,4474,4475,4476,4479],{},"One correction worth knowing: the widely circulated ",[253,4477,4478],{},"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":289,"searchDepth":290,"depth":290,"links":4481},[],[23],"https:\u002F\u002Fgithub.com\u002Fdavidpesce\u002Fmoodle-logstore_xapi\u002Ftree\u002Fmaster\u002Fdocs",[4485,4488],{"q":4486,"a":4487},"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":4489,"a":4490},"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",[2010,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fdavidpesce\u002Fmoodle-logstore_xapi",{"description":4466},{"xapi":4500,"cmi5":4503},{"supported":308,"provenance":320,"checkedAt":242,"source":4501,"note":4502},"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":295,"provenance":320,"checkedAt":242,"note":4504},"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",[1464,627,3933],"https:\u002F\u002Fmoodle.org\u002Fplugins\u002Fview\u002Flogstore_xapi","Fbl3IZMQTsMY2Rg0HM6Y1uoLCrqJyEYnKwo5Ldz6pME",{"id":4511,"title":4512,"addedAt":242,"alternatives":4513,"body":4514,"categories":4564,"checkedAt":242,"claimed":293,"description":4565,"docs":4566,"editorsPick":295,"extension":296,"faq":4567,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4571,"name":4572,"navigation":308,"openSource":308,"path":4573,"platforms":4574,"pricing":4575,"registries":4576,"repo":4577,"seo":4578,"standards":4579,"status":329,"stem":4586,"tagline":4587,"tags":4588,"vendor":293,"website":4577,"__hash__":4590},"tools\u002Ftools\u002Fngx-scorm-wrapper.md","Ngx Scorm Wrapper",[],{"type":247,"value":4515,"toc":4562},[4516,4553,4556,4559],[250,4517,4518,4519,4522,4523,4526,4527,260,4530,4533,4534,4537,4538,260,4541,525,4544,4547,4548,525,4550,4552],{},"ngx-scorm-wrapper is a port of the older AngularJS SCORM wrapper by patamechanix to Angular's dependency-injection model. You add ",[253,4520,4521],{},"ScormWrapperModule"," to your imports, inject ",[253,4524,4525],{},"ScormWrapperService"," into a component, and call ",[253,4528,4529],{},"doLMSInitialize",[253,4531,4532],{},"doLMSGetValue"," and so on without thinking about which global the LMS happened to expose. A ",[253,4535,4536],{},"version"," setting of ",[253,4539,4540],{},"Auto",[253,4542,4543],{},"1.2",[253,4545,4546],{},"2004"," decides whether the service binds to ",[253,4549,1106],{},[253,4551,1109],{},", and every call is dispatched through a pair of method names so the rest of your code stays version-agnostic.",[250,4554,4555],{},"The design is sound and the version-switching logic is the part worth reading — it is the same problem every SCORM wrapper solves, expressed compactly and with tests. There is a companion demo repository showing a working course.",[250,4557,4558],{},"The problem is age. The last commit is March 2019, the CI badge points at Travis, and the packaging predates the conventions every modern Angular library follows. Three stars and three open issues; nothing has been fixed in seven years and nothing will be.",[250,4560,4561],{},"Read it as a reference for how to bridge Angular's injector to a global browser API, then copy the service into your own project and maintain it yourself. As a dependency in a 2026 Angular application it is not a realistic choice.",{"title":289,"searchDepth":290,"depth":290,"links":4563},[],[17],"ngx-scorm-wrapper is a port of the older AngularJS SCORM wrapper by patamechanix to Angular's dependency-injection model. You add ScormWrapperModule to your imports, inject ScormWrapperService into a component, and call doLMSInitialize, doLMSGetValue and so on without thinking about which global the LMS happened to expose. A version setting of Auto, 1.2 or 2004 decides whether the service binds to window.API or window.API_1484_11, and every call is dispatched through a pair of method names so the rest of your code stays version-agnostic.","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fngx-scorm-wrapper",[4568],{"q":4569,"a":4570},"Will it install in a current Angular project?","Probably not without work. The last publish predates the Angular Package Format and Ivy, and the build tooling in the repo is Gulp with SystemJS and webpack AOT demos. Expect to vendor the service file rather than to `npm install` it.\n",{},"ngx-scorm-wrapper","\u002Ftools\u002Fngx-scorm-wrapper",[304,311],{"model":313,"currency":958,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002FDadUndead\u002Fngx-scorm-wrapper",{"description":4565},{"scorm12":4580,"scorm2004":4583},{"supported":308,"provenance":320,"checkedAt":242,"source":4581,"note":4582},"https:\u002F\u002Fgithub.com\u002FDadUndead\u002Fngx-scorm-wrapper\u002Fblob\u002Fmaster\u002Fsrc\u002Fservices\u002Fscorm-wrapper\u002Fscorm-wrapper.service.ts","The service looks for window.API and dispatches to LMSInitialize, LMSGetValue and the rest. Read in source, August 2026.\n",{"supported":308,"editions":4584,"provenance":320,"checkedAt":242,"source":4581,"note":4585},[],"Same service; a `scormVersions` list of Auto \u002F 1.2 \u002F 2004 selects between window.API and window.API_1484_11 and swaps the method names. No edition is distinguished in code, so none is claimed here.\n","tools\u002Fngx-scorm-wrapper","An injectable Angular service wrapping the SCORM 1.2 and 2004 runtime APIs",[4589,335,333],"angular","VewezAUayCmLmKZvcoSDgzJeXDAwyCi2iHyMtDpIn4s",{"id":4592,"title":4593,"addedAt":242,"alternatives":4594,"body":4595,"categories":4611,"checkedAt":242,"claimed":293,"description":4612,"docs":4613,"editorsPick":295,"extension":296,"faq":4614,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4618,"name":1769,"navigation":308,"openSource":308,"path":4619,"platforms":4620,"pricing":4621,"registries":4622,"repo":4623,"seo":4624,"standards":4625,"status":329,"stem":4634,"tagline":4635,"tags":4636,"vendor":293,"website":4623,"__hash__":4639},"tools\u002Ftools\u002Fnode-scorm-packager.md","Node Scorm Packager",[],{"type":247,"value":4596,"toc":4609},[4597,4603,4606],[250,4598,4599,4600,4602],{},"node-scorm-packager is a small Node module that takes a directory of finished HTML output, generates an ",[253,4601,2171],{}," for it, copies the matching SCORM schema definition files alongside, and writes the result to a destination folder. You give it a version, a title, an organisation, an identifier, a mastery score and a starting page; it gives you a package layout. It was written to sit inside a Gulp build, and the README's second example is exactly that.",[250,4604,4605],{},"It suits a team whose course is already a static web build and who want SCORM wrapping as a build step rather than a manual chore. It is deliberately narrow: no runtime, no API wrapper, no multi-SCO organisations, no sequencing, and — the part that catches people — no zip. You get a directory and have to compress it yourself.",[250,4607,4608],{},"The maintenance state is the deciding factor. The last commit was December 2018, npm still shows 0.0.9 from March 2016, and the project has seven stars and two open issues. Nothing here is broken, because the SCORM 1.2 and 2004 manifest formats have not moved since. But it is a frozen single-maintainer utility: read it, or vendor it, rather than depending on it receiving a fix.",{"title":289,"searchDepth":290,"depth":290,"links":4610},[],[17],"node-scorm-packager is a small Node module that takes a directory of finished HTML output, generates an imsmanifest.xml for it, copies the matching SCORM schema definition files alongside, and writes the result to a destination folder. You give it a version, a title, an organisation, an identifier, a mastery score and a starting page; it gives you a package layout. It was written to sit inside a Gulp build, and the README's second example is exactly that.","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fnode-scorm-packager",[4615],{"q":4616,"a":4617},"Does it produce a .zip I can upload to an LMS?","No. The README says zip creation is not implemented, and the source confirms it — you get a directory containing your files plus a generated imsmanifest.xml and the schema definition files. Zipping is left to you or to your build pipeline.\n",{},"\u002Ftools\u002Fnode-scorm-packager",[304,836],{"model":313},[],"https:\u002F\u002Fgithub.com\u002FIvacko\u002Fnode-scorm-packager",{"description":4612},{"scorm12":4626,"scorm2004":4629,"xapi":4632,"cmi5":4633},{"supported":308,"provenance":320,"checkedAt":242,"source":4627,"note":4628},"https:\u002F\u002Fgithub.com\u002FIvacko\u002Fnode-scorm-packager\u002Fblob\u002Fmaster\u002Flib\u002Findex.js","lib\u002Findex.js accepts version '1.2' and builds the manifest against the bundled adlcp_rootv1p2 \u002F imscp_rootv1p1p2 schemas.\n",{"supported":308,"editions":4630,"provenance":320,"checkedAt":242,"source":4627,"note":4631},[1144,418],"Only the strings '2004 3rd Edition' and '2004 4th Edition' are accepted; each maps to its own bundled XSD set. No sequencing rules are emitted — the manifest is a single-SCO organisation.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fnode-scorm-packager","Node library that writes an imsmanifest and lays out a SCORM course directory",[4637,500,4638],"node","build-step","fPSfK6eUwJXE3myvRjWprNO4yMq2MpO6PSXgWZ3l0WY",{"id":4641,"title":4642,"addedAt":242,"alternatives":4643,"body":4644,"categories":4660,"checkedAt":242,"claimed":293,"description":4648,"docs":4661,"editorsPick":295,"extension":296,"faq":4662,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4669,"name":4670,"navigation":308,"openSource":308,"path":4671,"platforms":4672,"pricing":4673,"registries":4674,"repo":4675,"seo":4676,"standards":4677,"status":329,"stem":4687,"tagline":4688,"tags":4689,"vendor":3112,"website":4675,"__hash__":4691},"tools\u002Ftools\u002Fpipwerks-scorm-api-wrapper.md","Pipwerks Scorm Api Wrapper",[245],{"type":247,"value":4645,"toc":4658},[4646,4649,4652,4655],[250,4647,4648],{},"The pipwerks wrapper sits between a course and the LMS's SCORM API, and has done that job since 2008. It solves the two problems that trip up everyone writing SCORM by hand: finding the API object, which may be several frames up or in an opener window, and papering over the fact that SCORM 1.2 and 2004 use different element and method names for the same ideas.",[250,4650,4651],{},"It is aimed at anyone hand-building a SCO, or writing a publish template for an authoring tool. At roughly 900 lines of dependency-free ES5 with no build step, it drops into a package and works in whatever browser the client's LMS insists on. ActionScript 2 and 3 versions ship alongside, of historical interest only.",[250,4653,4654],{},"What it is not is a runtime. It talks to an LMS-provided API — it does not implement one, does not simulate one for local testing, and does not touch sequencing, rollup or navigation. Nor does it validate what you write.",[250,4656,4657],{},"The practical point today: the last commit was May 2023 and the file's own version string reads 2018. It is stable rather than maintained — the runtime API has not changed since 2009, so there is little to fix, but nothing will be fixed either. If you want a maintained equivalent with SCORM 2004 sequencing and a TypeScript build, look at scorm-again; if you want the smallest thing that has worked for fifteen years, this is still it.",{"title":289,"searchDepth":290,"depth":290,"links":4659},[],[17],"https:\u002F\u002Fpipwerks.com\u002F",[4663,4666],{"q":4664,"a":4665},"Is it actually MIT licensed?","Effectively yes, but there is no LICENSE file in the repository. The readme and package.json point at pipwerks.mit-license.org, which resolves to a standard MIT grant in Philip Hutchison's name. If your legal review wants a file in the tree, you will have to record the URL instead.\n",{"q":4667,"a":4668},"Does it handle sequencing or multi-SCO navigation?","No. It is a thin abstraction over the runtime API — find, initialize, get, set, save, quit — plus automatic `cmi.exit` handling. Sequencing, rollup and navigation requests are the LMS's job.\n",{},"pipwerks SCORM API Wrapper","\u002Ftools\u002Fpipwerks-scorm-api-wrapper",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002Fscorm-api-wrapper",{"description":4648},{"scorm12":4678,"scorm2004":4681,"xapi":4684,"cmi5":4685,"aicc":4686},{"supported":308,"provenance":320,"checkedAt":242,"source":4679,"note":4680},"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002Fscorm-api-wrapper\u002Fblob\u002Fmaster\u002Fsrc\u002FJavaScript\u002FSCORM_API_wrapper.js","The wrapper walks the frame chain for `window.API`, and switches its data-model calls between `cmi.core.*` and `cmi.*` on the detected version.\n",{"supported":308,"editions":4682,"provenance":320,"checkedAt":242,"source":4679,"note":4683},[],"Finds `window.API_1484_11` and uses Initialize\u002FTerminate. It does not distinguish 2004 editions — the runtime API signature is the same across them, and sequencing is left entirely to the LMS.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fpipwerks-scorm-api-wrapper","The JavaScript wrapper most SCORM courses have been built on since 2008",[334,335,4690],"actionscript","DeNkntMCct71XGuHm21tZix9_0xJ3CUg0dDhbtQw4cc",{"id":4693,"title":4694,"addedAt":242,"alternatives":4695,"body":4696,"categories":4717,"checkedAt":242,"claimed":293,"description":4700,"docs":293,"editorsPick":295,"extension":296,"faq":4718,"firstParty":308,"foundedYear":293,"hosting":1060,"hqCountry":2068,"license":2874,"listing":306,"logo":293,"meta":4725,"name":4726,"navigation":308,"openSource":295,"path":4727,"platforms":4728,"pricing":4729,"registries":4733,"repo":293,"seo":4734,"standards":4735,"status":423,"stem":4743,"tagline":4744,"tags":4745,"vendor":2898,"website":4732,"__hash__":4749},"tools\u002Ftools\u002Fppt-to-scorm.md","Ppt To Scorm",[],{"type":247,"value":4697,"toc":4715},[4698,4701,4704,4707,4710],[250,4699,4700],{},"A deck is the most common starting point for a compliance module and the worst thing to hand an LMS directly. ppt-to-scorm.com takes the PowerPoint and returns a conformant SCORM 1.2 or 2004 package: player shell, manifest, navigation and a completion rule that fires when the learner reaches the end.",[250,4702,4703],{},"The self-serve path suits simple decks — upload, choose a SCORM version, download. Above that the work becomes human: narration, quiz interactions, video, and WCAG 2.2 AA remediation, which a converter cannot invent and which is usually the reason a deck was not already a course. Pricing reflects that split, starting at £150 for a self-serve conversion and rising for the rebuilt tiers.",[250,4705,4706],{},"Packages are tested against Moodle, Cornerstone, TalentLMS, Docebo, Totara and SAP SuccessFactors. That list matters more than it looks: conversion output that works in one LMS and silently fails to record in another is the standard failure mode in this category, and it comes from the player shell rather than the slides.",[250,4708,4709],{},"There is a separate SCORM Audit service for packages that already exist and do not behave.",[250,4711,4712,4714],{},[2858,4713,2860],{}," built by LOST END FOUND, which publishes this directory. It sits in the same category as competing converters, under the same rules, and is never an editor's pick.",{"title":289,"searchDepth":290,"depth":290,"links":4716},[],[8],[4719,4722],{"q":4720,"a":4721},"What does the free tier actually give you?","A watermarked SCORM 1.2 package, limited to a few conversions per email address. It is enough to prove the package imports and reports completion in your LMS before any money changes hands.\n",{"q":4723,"a":4724},"Are animations and narration preserved?","On the paid tiers, yes — the conversion drives PowerPoint rather than exporting flat images, so timings and embedded audio survive. Complex trigger-based animation is the usual exception; test your worst slide first.\n",{},"ppt-to-scorm.com","\u002Ftools\u002Fppt-to-scorm",[311,1060],{"model":3212,"priceFrom":4730,"currency":2881,"period":4731,"freeTier":308,"source":4732},150,"one-time","https:\u002F\u002Fppt-to-scorm.com",[],{"description":4700},{"scorm12":4736,"scorm2004":4737,"xapi":4739,"cmi5":4740,"aicc":4741,"lti":4742},{"supported":308,"provenance":851,"source":4732},{"supported":308,"editions":4738,"provenance":851,"source":4732},[2678,1144,418],{"supported":295},{"supported":295},{"supported":295},{"supported":295},"tools\u002Fppt-to-scorm","PowerPoint decks turned into packages that actually record completion",[4746,4747,4748],"powerpoint","conversion","service","EsxMEppqPgpEQUi5lAtvtJctByISp3UfhtvMDN1xZZE",{"id":4751,"title":4752,"addedAt":242,"alternatives":4753,"body":4754,"categories":4770,"checkedAt":242,"claimed":293,"description":4758,"docs":293,"editorsPick":295,"extension":296,"faq":4771,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":3088,"listing":306,"logo":293,"meta":4778,"name":4779,"navigation":308,"openSource":308,"path":4780,"platforms":4781,"pricing":4782,"registries":4783,"repo":4784,"seo":4785,"standards":4786,"status":329,"stem":4792,"tagline":4793,"tags":4794,"vendor":293,"website":4784,"__hash__":4796},"tools\u002Ftools\u002Fpptx-to-scorm.md","Pptx To Scorm",[],{"type":247,"value":4755,"toc":4768},[4756,4759,4762,4765],[250,4757,4758],{},"pptx_to_scorm is a small set of Ruby scripts for turning a PowerPoint deck into a browser slideshow packaged in SCORM's directory layout. Slides are exported as PNGs, thumbnails are generated with ImageMagick, embedded media is pulled out of the pptx's own zip, and the images are dropped into a jQuery-based slider template with a manifest alongside. A companion script can substitute YouTube iframes for extracted video.",[250,4760,4761],{},"It is a genuine solution to a genuine problem — rendering a deck as images sidesteps every font and animation fidelity issue — and the extraction code is a readable example of treating a pptx as the zip archive it is.",[250,4763,4764],{},"It is also unfinished. There are three commits, all from late January 2019, no licence file at all, no README, and no zipping step, so producing the final package is manual. Most importantly, the template's SCORM wrapper is commented out and the file it references was never committed: the output declares SCORM 1.2 and calls nothing. It will upload, it will display, and it will never record a completion.",[250,4766,4767],{},"Six stars for a repository with no documentation suggests people find it while searching for exactly this problem. Treat it as a worked example of the image-extraction and templating steps rather than a converter you can run — and expect to write the SCORM runtime half yourself, or to use a maintained tool instead.",{"title":289,"searchDepth":290,"depth":290,"links":4769},[],[8],[4772,4775],{"q":4773,"a":4774},"Will the output track completion in an LMS?","Not as it stands. The template declares SCORM 1.2 but its wrapper script is commented out and missing, so no LMSInitialize is ever called. You would need to supply a wrapper and call it from the slideshow yourself.\n",{"q":4776,"a":4777},"What does it actually need to run?","Ruby with rubyzip and mustache, ImageMagick's `convert` on the path for thumbnails, and slide images already exported as PNG. It is a pipeline of separate scripts rather than one command.\n",{},"pptx_to_scorm","\u002Ftools\u002Fpptx-to-scorm",[836],{"model":313,"currency":958,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Faprajnaparamita\u002Fpptx_to_scorm",{"description":4758},{"scorm12":4787,"scorm2004":4790},{"supported":308,"provenance":320,"checkedAt":242,"source":4788,"note":4789},"https:\u002F\u002Fgithub.com\u002Faprajnaparamita\u002Fpptx_to_scorm\u002Fblob\u002Fmaster\u002Ftemplate\u002Findex.html","The output template carries a SCORM 1.2 manifest, but its only SCORM script tag is commented out and the referenced scormify.js is not present in the repository. The result is a well-formed SCORM 1.2 content package that makes no runtime API calls, so it will import but never report completion without work. Read in source, August 2026.\n",{"supported":295,"editions":4791,"provenance":320,"checkedAt":242},[],"tools\u002Fpptx-to-scorm","Ruby scripts that turn PowerPoint slides into an HTML slideshow in a SCORM folder",[4746,4795,4747],"ruby","wwDRPaG6P5iQueXrL7prMd1yw_1MxpMyj9JDHxkTozQ",{"id":4798,"title":4799,"addedAt":242,"alternatives":4800,"body":4801,"categories":4833,"checkedAt":242,"claimed":293,"description":4834,"docs":293,"editorsPick":295,"extension":296,"faq":4835,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4839,"name":4840,"navigation":308,"openSource":308,"path":4841,"platforms":4842,"pricing":4843,"registries":4844,"repo":4845,"seo":4846,"standards":4847,"status":568,"stem":4857,"tagline":4858,"tags":4859,"vendor":293,"website":4845,"__hash__":4860},"tools\u002Ftools\u002Fscorm-ruby-gem.md","Scorm Ruby Gem",[],{"type":247,"value":4802,"toc":4831},[4803,4822,4825,4828],[250,4804,4805,4806,4808,4809,260,4812,260,4815,270,4818,4821],{},"This is the Ruby ecosystem's default answer to \"I need to open a SCORM zip and find out what is in it\". It opens a package, exposes the manifest as objects — identifier, organisations, resources, ",[253,4807,2921],{},", metadata — and can go the other way to bundle a directory into a valid package. A CLI wraps the same code with ",[253,4810,4811],{},"create",[253,4813,4814],{},"bundle",[253,4816,4817],{},"check",[253,4819,4820],{},"extract"," subcommands, which makes it usable from a Rakefile or a deploy script without writing any Ruby.",[250,4823,4824],{},"It is explicit about its scope, and that honesty is worth respecting: this is the Content Aggregation Model only. Nothing here implements the run-time API, tracks a learner, or talks to an LMS. If you are building a Rails application that needs to accept uploaded courses, validate them and read their structure, it fits exactly. If you need to play the course afterwards, you need a separate runtime.",[250,4826,4827],{},"The practical limitation to know before you adopt it is the version ceiling. The parser accepts SCORM 1.2 and SCORM 2004 3rd Edition; 4th Edition manifests fail strict validation, and 4th Edition is what most modern authoring tools emit.",[250,4829,4830],{},"Last touched in March 2024, with about eighty stars and no release tags. It is not abandoned so much as finished, in the way small parsing libraries often are — but nobody is going to add 4th Edition for you.",{"title":289,"searchDepth":290,"depth":290,"links":4832},[],[17],"This is the Ruby ecosystem's default answer to \"I need to open a SCORM zip and find out what is in it\". It opens a package, exposes the manifest as objects — identifier, organisations, resources, adlcp:scormType, metadata — and can go the other way to bundle a directory into a valid package. A CLI wraps the same code with create, bundle, check and extract subcommands, which makes it usable from a Rakefile or a deploy script without writing any Ruby.",[4836],{"q":4837,"a":4838},"Will it read a SCORM 2004 4th Edition package?","Not under strict parsing. The supported-version list stops at 2004 3rd Edition, so a 4th Edition manifest raises InvalidManifest unless you turn strict parsing off — at which point you are reading the manifest without the guarantees the check was there to give.\n",{},"scorm (Ruby gem)","\u002Ftools\u002Fscorm-ruby-gem",[304,836],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fmindset\u002Fscorm",{"description":4834},{"scorm12":4848,"scorm2004":4851,"aicc":4854,"xapi":4855,"cmi5":4856},{"supported":308,"provenance":320,"checkedAt":242,"source":4849,"note":4850},"https:\u002F\u002Fgithub.com\u002Fmindset\u002Fscorm\u002Fblob\u002Fmaster\u002Flib\u002Fscorm\u002Fmanifest.rb","Content Aggregation Model only. The gem parses and generates imsmanifest.xml; it does not implement the run-time API.\n",{"supported":308,"editions":4852,"provenance":320,"checkedAt":242,"source":4849,"note":4853},[1144],"The parser's SUPPORTED_VERSIONS constant lists '2004 3rd Edition', 'CAM 1.3' and '1.2'. A manifest declaring 2004 4th Edition is rejected unless strict parsing is disabled.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscorm-ruby-gem","Reads, checks and builds SCORM packages from Ruby, with a small CLI alongside",[4795,4067,836,1763],"iIe1kXyeJqitHQjGq9ihge2_dZ3ZDHGeq-Tc0VwAQCM",{"id":4862,"title":4863,"addedAt":242,"alternatives":4864,"body":4865,"categories":4886,"checkedAt":242,"claimed":293,"description":4887,"docs":4888,"editorsPick":295,"extension":296,"faq":4889,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4896,"name":245,"navigation":308,"openSource":308,"path":4897,"platforms":4898,"pricing":4899,"registries":4900,"repo":4901,"seo":4902,"standards":4903,"status":423,"stem":4915,"tagline":4916,"tags":4917,"vendor":4070,"website":4888,"__hash__":4919},"tools\u002Ftools\u002Fscorm-again.md","Scorm Again",[],{"type":247,"value":4866,"toc":4884},[4867,4875,4878,4881],[250,4868,4869,4870,270,4872,4874],{},"scorm-again is the JavaScript runtime you reach for when something other than a full LMS has to host SCORM content: a custom learning platform, an internal training portal, a preview tool, a test harness. It supplies the ",[253,4871,3957],{},[253,4873,3006],{}," objects a course expects to find on the window, keeps the CMI data model, validates what the content writes to it, and commits to whatever endpoint you configure.",[250,4876,4877],{},"It is unusually thorough for a library of its size. The SCORM 2004 side includes an actual sequencing and rollup implementation rather than the usual stub, and v3 added a cross-frame bridge so content can run in a sandboxed or cross-origin iframe while the real API stays in the parent. That last feature is the reason other projects — Catalyst's Moodle remote-SCORM plugin among them — build on it rather than writing their own.",[250,4879,4880],{},"What it is not: an LMS, a packager, or a validator. It will not tell you whether a zip is well-formed; the same author's Java parser covers that. Nor does it speak xAPI or cmi5, and AICC was deliberately dropped in v3.0.0.",[250,4882,4883],{},"Maintenance is healthy — v3.3.0 shipped in August 2026, the test suite runs in CI, and the migration guide for the v2 to v3 break is honest about what changed. For a single-maintainer library this is about as safe a dependency as the category offers.",{"title":289,"searchDepth":290,"depth":290,"links":4885},[],[17],"scorm-again is the JavaScript runtime you reach for when something other than a full LMS has to host SCORM content: a custom learning platform, an internal training portal, a preview tool, a test harness. It supplies the API and API_1484_11 objects a course expects to find on the window, keeps the CMI data model, validates what the content writes to it, and commits to whatever endpoint you configure.","https:\u002F\u002Fjcputney.github.io\u002Fscorm-again\u002F",[4890,4893],{"q":4891,"a":4892},"Does it need an LMS behind it?","No. With no LMS endpoint configured it logs every call and holds the data model in memory, which makes it usable as a local harness for content you are developing. Point it at a commit endpoint and the same code becomes the runtime half of a real platform.\n",{"q":4894,"a":4895},"Is the SCORM 2004 sequencing implementation complete?","The repository implements the overall sequencing process, rollup, global objectives and the navigation request handlers, which is far more than most JavaScript runtimes attempt. It is not a certified implementation, so anything relying on unusual sequencing rules still wants testing against the target LMS.\n",{},"\u002Ftools\u002Fscorm-again",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Fscorm-again",{"description":4887},{"scorm12":4904,"scorm2004":4906,"aicc":4910,"xapi":4913,"cmi5":4914},{"supported":308,"provenance":320,"checkedAt":242,"source":4905},"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Fscorm-again\u002Ftree\u002Fmaster\u002Fsrc\u002Fcmi\u002Fscorm12",{"supported":308,"editions":4907,"provenance":320,"checkedAt":242,"source":4908,"note":4909},[418],"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Fscorm-again\u002Ftree\u002Fmaster\u002Fsrc\u002Fcmi\u002Fscorm2004","The data model and the sequencing implementation cite SCORM 2004 4th Edition throughout the source. The JavaScript API surface is identical across 2004 editions, so 3rd Edition content generally runs, but 4th Edition is what the code is written against.\n",{"supported":295,"provenance":320,"checkedAt":242,"source":4911,"note":4912},"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Fscorm-again\u002Fblob\u002Fmaster\u002FMIGRATION.md","AICC support was present up to v2.x and removed in v3.0.0 on the grounds that AICC uses HACP rather than a JavaScript API. There is no AICC code in src\u002F.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscorm-again","A tested JavaScript SCORM 1.2 and 2004 runtime for anything that has to host a course",[427,334,333,4918],"sequencing","2wPbs5QofMDGQIFRLowDa09E5N_O7SleQTdr10sMYbM",{"id":4921,"title":4922,"addedAt":242,"alternatives":4923,"body":4924,"categories":4976,"checkedAt":242,"claimed":293,"description":4977,"docs":293,"editorsPick":295,"extension":296,"faq":4978,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":4982,"name":4983,"navigation":308,"openSource":308,"path":4984,"platforms":4985,"pricing":4986,"registries":4987,"repo":4988,"seo":4989,"standards":4990,"status":423,"stem":4997,"tagline":4998,"tags":4999,"vendor":293,"website":4988,"__hash__":5002},"tools\u002Ftools\u002Fscorm-godot-plugin.md","Scorm Godot Plugin",[],{"type":247,"value":4925,"toc":4974},[4926,4941,4968,4971],[250,4927,4928,4929,4932,4933,4936,4937,4940],{},"This is a Godot 4 editor addon for the specific case of shipping a browser game as an LMS module. It adds a ",[253,4930,4931],{},"Scorm"," autoload that GDScript can call directly — ",[253,4934,4935],{},"set_lesson_status(LessonStatus.COMPLETED)",", a score setter, bookmark and suspend-data accessors — and a ",[253,4938,4939],{},"ScormExport"," hook that watches for a web export and packages the output into a SCORM zip with a manifest already in place.",[250,4942,4943,4944,4947,4948,270,4950,4953,4954,4956,4957,4960,4961,4963,4964,4967],{},"The runtime half is a conventional SCORM 1.2 JavaScript shim: the usual seven-level ",[253,4945,4946],{},"findAPI"," walk up ",[253,4949,348],{},[253,4951,4952],{},"window.opener",", then ",[253,4955,3247],{}," and reads and writes against ",[253,4958,4959],{},"cmi.core.*",". The useful design decision is what the plugin does on your behalf — it sets ",[253,4962,2644],{}," to ",[253,4965,4966],{},"incomplete"," on first launch so a learner who closes the tab does not lose the attempt, which is the sort of detail people miss and then spend a day debugging.",[250,4969,4970],{},"Scope is honest and narrow: SCORM 1.2 only, no 2004, no xAPI. For a Godot exercise or serious game that has to report a pass and a score to a corporate LMS, that is the whole requirement.",[250,4972,4973],{},"It is a single-maintainer project with three stars, but it is genuinely maintained — tagged releases, an addon test scene, and engine migrations tracked through Godot 4.7 in July 2026. Small user base, real upkeep; the risk is bus factor rather than rot.",{"title":289,"searchDepth":290,"depth":290,"links":4975},[],[17],"This is a Godot 4 editor addon for the specific case of shipping a browser game as an LMS module. It adds a Scorm autoload that GDScript can call directly — set_lesson_status(LessonStatus.COMPLETED), a score setter, bookmark and suspend-data accessors — and a ScormExport hook that watches for a web export and packages the output into a SCORM zip with a manifest already in place.",[4979],{"q":4980,"a":4981},"Which Godot versions does it target?","The README says 4.2 onwards and recent commits track the engine — v2.3.2 migrated to Godot 4.5 and v2.3.3 to 4.7. It is a GDScript addon, so nothing needs compiling, but the export hook is tied to Godot's web export.\n",{},"scorm-godot-plugin","\u002Ftools\u002Fscorm-godot-plugin",[311,304],{"model":313,"currency":958,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Farahenda\u002Fscorm-godot-plugin",{"description":4977},{"scorm12":4991,"scorm2004":4994},{"supported":308,"provenance":320,"checkedAt":242,"source":4992,"note":4993},"https:\u002F\u002Fgithub.com\u002Farahenda\u002Fscorm-godot-plugin\u002Fblob\u002Fmain\u002Faddons\u002Fscorm\u002Fscorm.js","scorm.js implements the standard findAPI walk up window.parent and window.opener, then calls LMSInitialize and reads and writes cmi.core.lesson_status, cmi.core.score.raw, cmi.core.lesson_location and cmi.suspend_data. The bundled manifest declares schemaversion 1.2. Read in source, August 2026.\n",{"supported":295,"editions":4995,"provenance":320,"checkedAt":242,"note":4996},[],"No API_1484_11 lookup and no 2004 data-model elements in the addon.","tools\u002Fscorm-godot-plugin","Godot editor plugin that wires a web export to the SCORM 1.2 runtime and zips it",[5000,5001,1763],"godot","games","tW5QENRsrxLgCR1sv4jCVtrZpAbgNBow2hx2SnIEgZo",{"id":5004,"title":5005,"addedAt":242,"alternatives":5006,"body":5007,"categories":5033,"checkedAt":242,"claimed":293,"description":5034,"docs":293,"editorsPick":295,"extension":296,"faq":5035,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5039,"name":5040,"navigation":308,"openSource":308,"path":5041,"platforms":5042,"pricing":5043,"registries":5045,"repo":5046,"seo":5047,"standards":5048,"status":329,"stem":5052,"tagline":5053,"tags":5054,"vendor":293,"website":5046,"__hash__":5055},"tools\u002Ftools\u002Fscorm-h5p-wrapper.md","Scorm H5p Wrapper",[],{"type":247,"value":5008,"toc":5031},[5009,5019,5022,5025],[250,5010,5011,5012,5014,5015,5018],{},"A Node application that takes an ",[253,5013,1415],{}," file and returns a SCORM zip. It bundles h5p-standalone so the content runs without an H5P server, adds a small adaptor that maps the H5P ",[253,5016,5017],{},"xAPI"," completion event onto SCORM score and status calls, and hands the whole thing to simple-scorm-packager. It runs as a local web app with an upload form, and there is a Docker image and an optional CSV log of successful packagings.",[250,5020,5021],{},"The README is unusually fair about its own trade-offs, listing four disadvantages before any instructions: no shared caching of H5P libraries across packages, no in-LMS editing, no benefit from H5P core updates, and larger files. Take that seriously — it is the correct summary of when this approach is wrong.",[250,5023,5024],{},"Where it fits is narrow and real: an LMS with no H5P module, a client who must receive a self-contained file, or content that has to stay exactly as it was when it was signed off.",[250,5026,5027,5028,5030],{},"On maintenance, look past the repository's recent activity. Those pushes are Renovate and Dependabot branches; the ",[253,5029,474],{}," branch has not changed since January 2020, and the hosted instance the README points at no longer resolves. It packages fine, but the H5P runtime inside it is six years old.",{"title":289,"searchDepth":290,"depth":290,"links":5032},[],[8],"A Node application that takes an .h5p file and returns a SCORM zip. It bundles h5p-standalone so the content runs without an H5P server, adds a small adaptor that maps the H5P xAPI completion event onto SCORM score and status calls, and hands the whole thing to simple-scorm-packager. It runs as a local web app with an upload form, and there is a Docker image and an optional CSV log of successful packagings.",[5036],{"q":5037,"a":5038},"Should I use this instead of my LMS's H5P plugin?","Usually not, and the README says so itself. If your LMS has a working H5P module, use it — packaging costs you shared library caching, in-place editing and upstream H5P updates. The wrapper earns its place when the LMS has no H5P support at all, or when the content must be frozen.\n",{},"scorm-h5p-wrapper","\u002Ftools\u002Fscorm-h5p-wrapper",[836,311],{"model":313,"source":5044},"https:\u002F\u002Fgithub.com\u002Fsr258\u002Fscorm-h5p-wrapper\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fsr258\u002Fscorm-h5p-wrapper",{"description":5034},{"scorm12":5049},{"supported":308,"provenance":320,"checkedAt":242,"source":5050,"note":5051},"https:\u002F\u002Fgithub.com\u002Fsr258\u002Fscorm-h5p-wrapper\u002Fblob\u002Fmaster\u002Fsrc\u002Fcreator.js","`creator.js` calls simple-scorm-packager with `version: \"1.2\"` hard-coded. The bundled adaptor branches on SCORM 2004 elements as well, but no 2004 package is ever produced without editing the source.\n","tools\u002Fscorm-h5p-wrapper","Web app that packs an H5P file into a self-contained SCORM 1.2 package",[1833,4637,603],"0NVIic68CzssfAGAr6D_DoJVOY7_1GHYk3ESBoTkt-c",{"id":5057,"title":5058,"addedAt":242,"alternatives":5059,"body":5060,"categories":5084,"checkedAt":242,"claimed":293,"description":5085,"docs":293,"editorsPick":295,"extension":296,"faq":5086,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5093,"name":5094,"navigation":308,"openSource":308,"path":5095,"platforms":5096,"pricing":5097,"registries":5098,"repo":5099,"seo":5100,"standards":5101,"status":423,"stem":5113,"tagline":5114,"tags":5115,"vendor":293,"website":5099,"__hash__":5118},"tools\u002Ftools\u002Fscorm-kit.md","Scorm Kit",[245],{"type":247,"value":5061,"toc":5082},[5062,5073,5076,5079],[250,5063,5064,5065,5068,5069,5072],{},"scorm-kit is a build-pipeline CLI for SCORM 1.2 packages: nine subcommands covering static lint of the manifest and API usage, a WCAG 2.2 AA static audit, a semantic diff between two zips, a translation bundler, a local mock LMS, real-user-monitoring injection, a PII and tracker audit, cmi5 validation and SCORM-to-cmi5 wrapping, and a ",[253,5066,5067],{},"report"," command that aggregates three of those into one score. Everything takes ",[253,5070,5071],{},"--json"," and returns conventional exit codes, which is the point — it is designed to sit in CI rather than to be run by hand.",[250,5074,5075],{},"The interesting commands are the ones nobody else offers. Treating a package as a reviewable artifact — parsing the manifest, hashing the asset list, emitting a unified diff — is a good idea for teams who put courseware through pull requests. The privacy audit covers what a procurement review flags and a courseware vendor will not volunteer.",[250,5077,5078],{},"It is not an authoring tool, not a SCORM 2004 tool, and the a11y and privacy passes are static analysis, not a substitute for a manual audit.",[250,5080,5081],{},"The maintenance picture is the deciding factor. This is a single-maintainer project created in May 2026, last pushed in June, with no stars, no forks and one npm release. The code is clean and the tests exist, but a directory reader should treat it as a promising reference implementation to read and borrow from — or to vendor at a pinned commit — rather than something to make a client's release pipeline depend on this year.",{"title":289,"searchDepth":290,"depth":290,"links":5083},[],[17],"scorm-kit is a build-pipeline CLI for SCORM 1.2 packages: nine subcommands covering static lint of the manifest and API usage, a WCAG 2.2 AA static audit, a semantic diff between two zips, a translation bundler, a local mock LMS, real-user-monitoring injection, a PII and tracker audit, cmi5 validation and SCORM-to-cmi5 wrapping, and a report command that aggregates three of those into one score. Everything takes --json and returns conventional exit codes, which is the point — it is designed to sit in CI rather than to be run by hand.",[5087,5090],{"q":5088,"a":5089},"Which commands are worth reaching for first?","`diff` and `privacy` are the two with no obvious alternative elsewhere — one makes a package reviewable in a pull request, the other flags hard-coded tokens, third-party trackers and off-package form actions before a client's security review does.\n",{"q":5091,"a":5092},"Is the local runtime its own implementation?","No, and the readme says so: `scorm-kit mock` wraps scorm-again as its SCORM 1.2 engine and adds a logging UI, fail-mode injection and CLI configuration around it.\n",{},"scorm-kit","\u002Ftools\u002Fscorm-kit",[836],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fparthdhanani\u002Fscorm-kit",{"description":5085},{"scorm12":5102,"scorm2004":5105,"cmi5":5108,"xapi":5111},{"supported":308,"provenance":320,"checkedAt":242,"source":5103,"note":5104},"https:\u002F\u002Fgithub.com\u002Fparthdhanani\u002Fscorm-kit\u002Fblob\u002Fmain\u002Fsrc\u002Flint\u002Flint.js","The linter requires schema \"ADL SCORM\" and schemaversion 1.2, and the `mock` runtime exposes `window.API` only. SCORM 1.2 is the whole target.\n",{"supported":295,"editions":5106,"provenance":320,"checkedAt":242,"note":5107},[],"A 2004 package is reported as an error by `lint`, and the mock runtime does not expose `API_1484_11`.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":5109,"note":5110},"https:\u002F\u002Fgithub.com\u002Fparthdhanani\u002Fscorm-kit\u002Fblob\u002Fmain\u002Fsrc\u002Fcmi5\u002Fcmi5.js","`cmi5 validate` and `cmi5 lint` check cmi5.xml structure — courseStructure root, IRI-shaped ids, launchMethod and moveOn enumerations, masteryScore range, AU launch URLs resolving inside the package. `cmi5 convert` wraps a SCORM 1.2 package as a cmi5 AU. This is packaging-level support; nothing here runs a cmi5 session.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":5112},"No xAPI client. The `rum` command posts its own JSON beacons to an endpoint you supply, not xAPI statements to an LRS.\n","tools\u002Fscorm-kit","A nine-command CLI that lints, diffs and audits SCORM packages before upload",[836,5116,858,5117],"linting","ci","PtcNi46OIs-ton7ff6w-u_0NNiNjSeL-dMW19Cra7ag",{"id":5120,"title":5121,"addedAt":242,"alternatives":5122,"body":5123,"categories":5164,"checkedAt":242,"claimed":293,"description":5165,"docs":5166,"editorsPick":295,"extension":296,"faq":5167,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5168,"name":5169,"navigation":308,"openSource":308,"path":5170,"platforms":5171,"pricing":5172,"registries":5173,"repo":5174,"seo":5175,"standards":5176,"status":329,"stem":5183,"tagline":5184,"tags":5185,"vendor":293,"website":5174,"__hash__":5188},"tools\u002Ftools\u002Fscorm-local.md","Scorm Local",[],{"type":247,"value":5124,"toc":5162},[5125,5153,5156,5159],[250,5126,5127,5128,5131,5132,260,5134,260,5137,260,5140,260,5142,5144,5145,5148,5149,5152],{},"scorm-local gives a SCO something to talk to when there is no LMS in the room. Call ",[253,5129,5130],{},"scormLocal(scoId, options)"," and you get an object exposing ",[253,5133,3247],{},[253,5135,5136],{},"LMSFinish",[253,5138,5139],{},"LMSGetValue",[253,5141,2708],{},[253,5143,3263],{}," and the three error methods, backed by localStorage. A ",[253,5146,5147],{},"persistFor"," option controls how long committed data survives, from never to forever, so you can test resume behaviour on a timer, and an initial ",[253,5150,5151],{},"model"," object lets you seed values the LMS would normally supply.",[250,5154,5155],{},"The use case is content development. While a course is being written, its author needs the tracking calls to succeed and needs to see what got written; a shim like this removes the round trip to an LMS entirely and makes the stored data inspectable in devtools.",[250,5157,5158],{},"It is not a test harness for acceptance. The README says \"not compliant yet\" in its second line, and that assessment still holds: nothing validates the data model, the error codes are not trustworthy, and there is no SCORM 2004. Anything you sign off against it, you have signed off against nothing.",[250,5160,5161],{},"Ten stars, two forks, one open issue, and the last commit was January 2016. A decade-old single-maintainer utility that still does its one small job because that job has not changed. Vendor it rather than depend on it.",{"title":289,"searchDepth":290,"depth":290,"links":5163},[],[14],"scorm-local gives a SCO something to talk to when there is no LMS in the room. Call scormLocal(scoId, options) and you get an object exposing LMSInitialize, LMSFinish, LMSGetValue, LMSSetValue, LMSCommit and the three error methods, backed by localStorage. A persistFor option controls how long committed data survives, from never to forever, so you can test resume behaviour on a timer, and an initial model object lets you seed values the LMS would normally supply.","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fscorm-local",[],{},"scorm-local","\u002Ftools\u002Fscorm-local",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fblvz\u002Fscorm-local",{"description":5165},{"scorm12":5177,"scorm2004":5180,"xapi":5181,"cmi5":5182},{"supported":308,"provenance":320,"checkedAt":242,"source":5178,"note":5179},"https:\u002F\u002Fgithub.com\u002Fblvz\u002Fscorm-local#readme","Returns an API object carrying all eight SCORM 1.2 LMS methods. The README states plainly that it is \"not compliant yet\" — values are stored and returned without data-model validation, and error codes should not be relied upon.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscorm-local","A SCORM 1.2 API shim that keeps CMI data in localStorage while you build content",[334,5186,5187],"localstorage","stub","SsLyKpxW0SOqKyF9P7as9Av6R9ipihQRhwxR95MxFd0",{"id":5190,"title":5191,"addedAt":242,"alternatives":5192,"body":5193,"categories":5221,"checkedAt":242,"claimed":293,"description":5222,"docs":5223,"editorsPick":295,"extension":296,"faq":5224,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5231,"name":5232,"navigation":308,"openSource":308,"path":5233,"platforms":5234,"pricing":5235,"registries":5237,"repo":5236,"seo":5238,"standards":5239,"status":423,"stem":5248,"tagline":5249,"tags":5250,"vendor":293,"website":5236,"__hash__":5251},"tools\u002Ftools\u002Fscorm-mcp-server.md","Scorm Mcp Server",[],{"type":247,"value":5194,"toc":5219},[5195,5202,5213,5216],[250,5196,5197,5198,5201],{},"This is a packager aimed squarely at a 2026 problem: an LLM or a design tool has produced a self-contained HTML module, and it now needs to import into an LMS. Point the ",[253,5199,5200],{},"scorm_package"," tool at a file, folder or zip and you get a PIF zip back — assets inlined so nothing is fetched at run time, a tracking runtime injected, and a manifest validated against the bundled ADL schemas rather than merely checked for well-formedness.",[250,5203,5204,5205,525,5207,5209,5210,5212],{},"The runtime is version-adaptive: it binds to whichever API the host exposes, ",[253,5206,3006],{},[253,5208,3957],{},", and maps the data model accordingly — one ",[253,5211,2644],{}," and a 0–100 score under 1.2, split completion and success under 2004. That is the right design for a wrapper, and it is tested; the repository carries a large suite covering the converter, the runtime and schema conformance.",[250,5214,5215],{},"Judge it as a young project, because it is one. First commit July 2026, a handful of stars, one maintainer, and the detailed handover documentation is in French. The maintainer's own conformance evidence is an import into SCORM Cloud, which is meaningful but is not certification.",[250,5217,5218],{},"It is not an authoring tool and does not attempt cmi5 or xAPI. If your content is already built and your only remaining problem is the wrapper, it is a reasonable, inspectable choice — with the caveat that the bus factor is one.",{"title":289,"searchDepth":290,"depth":290,"links":5220},[],[17],"This is a packager aimed squarely at a 2026 problem: an LLM or a design tool has produced a self-contained HTML module, and it now needs to import into an LMS. Point the scorm_package tool at a file, folder or zip and you get a PIF zip back — assets inlined so nothing is fetched at run time, a tracking runtime injected, and a manifest validated against the bundled ADL schemas rather than merely checked for well-formedness.","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fscorm-mcp-server",[5225,5228],{"q":5226,"a":5227},"Do I need an MCP client to use it?","No. The same code ships a CLI (`npx scorm-mcp-server pack course.html`), a local drag-and-drop web UI, and a `buildPackage()` function for use in a build pipeline. MCP is one entry point of four.\n",{"q":5229,"a":5230},"What does it do to my HTML?","It inlines CSS, fonts, scripts and images as data URIs so the package runs with no network, then injects a small runtime that reports completion, progress, time and optionally score. The markup itself is left alone, which also means any tracking your content already does is untouched.\n",{},"scorm-mcp-server","\u002Ftools\u002Fscorm-mcp-server",[836,304],{"model":313,"source":5236},"https:\u002F\u002Fgithub.com\u002Fgiacomomaria81\u002Fscorm-mcp-server",[],{"description":5222},{"scorm12":5240,"scorm2004":5243,"xapi":5246,"cmi5":5247},{"supported":308,"provenance":320,"checkedAt":242,"source":5241,"note":5242},"https:\u002F\u002Fgithub.com\u002Fgiacomomaria81\u002Fscorm-mcp-server\u002Fblob\u002Fmain\u002Fsrc\u002Fconverter.ts","converter.ts emits a schemaversion 1.2 manifest with lower-case adlcp:scormtype and adlcp:masteryscore, validated against a bundled copy of the 1.2 XSDs.\n",{"supported":308,"editions":5244,"provenance":320,"checkedAt":242,"source":5241,"note":5245},[418],"The default output is a '2004 4th Edition' manifest. No 2nd or 3rd Edition option exists.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscorm-mcp-server","An MCP tool that wraps a finished HTML module into an offline SCORM package",[1217,836,1763],"q17oyiyg9grM3joYh_9VVpQ4oovfFnBcEJMPcf588FE",{"id":5253,"title":5254,"addedAt":242,"alternatives":5255,"body":5256,"categories":5300,"checkedAt":242,"claimed":293,"description":5301,"docs":293,"editorsPick":295,"extension":296,"faq":5302,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5306,"name":5307,"navigation":308,"openSource":308,"path":5308,"platforms":5309,"pricing":5310,"registries":5312,"repo":5311,"seo":5313,"standards":5314,"status":423,"stem":5320,"tagline":5321,"tags":5322,"vendor":293,"website":5324,"__hash__":5325},"tools\u002Ftools\u002Fscorm-player-sheikhsulaiman.md","Scorm Player Sheikhsulaiman",[],{"type":247,"value":5257,"toc":5298},[5258,5267,5292,5295],[250,5259,5260,5261,5263,5264,5266],{},"A static site that plays a SCORM 1.2 package and shows the run-time conversation while it happens. JSZip unpacks the archive in the browser, the files are written to the Cache API and served back through a service worker at a real same-origin path — which matters, because SCORM content uses relative asset paths and finds its LMS by walking ",[253,5262,348],{}," for an object named ",[253,5265,3957],{},", and blob URLs break both.",[250,5268,5269,5270,5273,5274,260,5277,5280,5281,260,5284,5287,5288,5291],{},"The implementation goes further than most demonstrations into the behaviour the specification assigns to the LMS rather than the content: ",[253,5271,5272],{},"session_time"," accumulating into ",[253,5275,5276],{},"total_time",[253,5278,5279],{},"cmi.core.exit"," producing the next attempt's ",[253,5282,5283],{},"entry",[253,5285,5286],{},"adlcp:masteryscore"," deriving pass or fail from a raw score, ",[253,5289,5290],{},"maxtimeallowed"," with its time-limit action, and AICC-script prerequisites. Each of those decisions is written into the call log as an explicit entry, so the player explains itself rather than behaving magically.",[250,5293,5294],{},"Two caveats decide whether it is for you. It is SCORM 1.2 only, by design. And it is brand new: two commits on a single day in July 2026, no stars, no external users, and its conformance figures come from a harness the author wrote and shipped in the same repository — plausible, and unverified by anyone else.",[250,5296,5297],{},"Read it as a well-argued reference implementation of the LMS side, and as a quick local harness for a 1.2 package. Do not yet depend on it.",{"title":289,"searchDepth":290,"depth":290,"links":5299},[],[11],"A static site that plays a SCORM 1.2 package and shows the run-time conversation while it happens. JSZip unpacks the archive in the browser, the files are written to the Cache API and served back through a service worker at a real same-origin path — which matters, because SCORM content uses relative asset paths and finds its LMS by walking window.parent for an object named API, and blob URLs break both.",[5303],{"q":5304,"a":5305},"Is it really MIT licensed?","The README and package.json both say MIT, but there is no LICENSE file in the repository, so GitHub reports no licence. Ask the author to add one before vendoring the code into anything you ship.\n",{},"scorm-player","\u002Ftools\u002Fscorm-player-sheikhsulaiman",[311],{"model":313,"source":5311},"https:\u002F\u002Fgithub.com\u002Fsheikhsulaiman\u002Fscorm-player",[],{"description":5301},{"scorm12":5315,"scorm2004":5318},{"supported":308,"provenance":320,"checkedAt":242,"source":5316,"note":5317},"https:\u002F\u002Fgithub.com\u002Fsheikhsulaiman\u002Fscorm-player\u002Fblob\u002Fmain\u002Fsrc\u002Fcmi.js","All eight API functions, the eleven error codes and the CMI type and vocabulary rules are implemented in src\u002Fcmi.js and src\u002Fscorm-api.js. Read in source; the project's own test suites were not run for this listing.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":5319},"Explicitly not implemented. Content probing for API_1484_11 is told so rather than being allowed to fail silently.\n","tools\u002Fscorm-player-sheikhsulaiman","Browser-only SCORM 1.2 player and run-time inspector, with no server and no upload",[334,2896,5323,629],"inspector","https:\u002F\u002Fsheikhsulaiman.github.io\u002Fscorm-player\u002F","BHrbge5RFiJavd8iu5024PSlNxudFtCtZbzOBOvZreE",{"id":5327,"title":5328,"addedAt":242,"alternatives":5329,"body":5330,"categories":5373,"checkedAt":242,"claimed":293,"description":5374,"docs":293,"editorsPick":295,"extension":296,"faq":5375,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5382,"name":5383,"navigation":308,"openSource":308,"path":5384,"platforms":5385,"pricing":5386,"registries":5387,"repo":5388,"seo":5389,"standards":5390,"status":568,"stem":5395,"tagline":5396,"tags":5397,"vendor":293,"website":5388,"__hash__":5399},"tools\u002Ftools\u002Fscorm-converter-2004.md","Scorm Converter 2004",[],{"type":247,"value":5331,"toc":5371},[5332,5348,5351,5364],[250,5333,5334,5335,5337,5338,5340,5341,270,5344,5347],{},"This is a hundred-line Python utility across three files, written for one migration and published as-is. The author's organisation was moving from ILIAS to SAP SuccessFactors and found that SCORM 2004 3rd Edition packages which ran happily in the old system were rejected by the new one. Rather than re-author, they wrote a script that unzips each package, rewrites the ",[253,5336,1294],{}," element in ",[253,5339,2171],{}," to \"2004 4th Edition\", strips the ",[253,5342,5343],{},"imsss:sequencing",[253,5345,5346],{},"metadata"," elements out of the organization and its items, and zips it back up.",[250,5349,5350],{},"Understanding what that is, and is not, matters. It is not a conversion between editions — no data-model migration, no sequencing translation, no validation of the result. It is a workaround for an importer stricter than the specification requires, and dropping the sequencing rules is a silent behavioural change rather than a side effect.",[250,5352,5353,5354,260,5357,270,5360,5363],{},"Judged as a product it is unremarkable: three commits, all on one day in October 2024, no stars, no tests, and a README that documents its own dependencies as ",[253,5355,5356],{},"os",[253,5358,5359],{},"ZIP",[253,5361,5362],{},"ParseXML",". Two details should stop you running it unattended: it deletes each source zip after extraction, and it joins paths with hardcoded Windows backslashes.",[250,5365,5366,5367,5370],{},"Judged as what it is — a shared workaround for a common and badly documented import failure — it is worth reading. The forty lines of ",[253,5368,5369],{},"ParseXML.py"," will tell you in two minutes whether your rejected package has the same cause, which is more than most vendor support tickets achieve.",{"title":289,"searchDepth":290,"depth":290,"links":5372},[],[8],"This is a hundred-line Python utility across three files, written for one migration and published as-is. The author's organisation was moving from ILIAS to SAP SuccessFactors and found that SCORM 2004 3rd Edition packages which ran happily in the old system were rejected by the new one. Rather than re-author, they wrote a script that unzips each package, rewrites the schemaversion element in imsmanifest.xml to \"2004 4th Edition\", strips the imsss:sequencing and metadata elements out of the organization and its items, and zips it back up.",[5376,5379],{"q":5377,"a":5378},"Does it actually convert 3rd Edition to 4th Edition?","Not in the sense the name implies. It changes the declared schemaversion and deletes the sequencing and metadata elements that were causing the target LMS to reject the package. Content, data-model usage and the rest of the manifest are untouched.\n",{"q":5380,"a":5381},"What happens to my sequencing rules?","They are removed. If your course relied on imsss sequencing for prerequisites or rollup, that behaviour is gone after conversion. For a single-SCO package this costs nothing; for a structured multi-SCO course it is a real loss.\n",{},"scormConverter","\u002Ftools\u002Fscorm-converter-2004",[836],{"model":313,"currency":1134,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002FhoedlChr\u002FscormConverter",{"description":5374},{"scorm2004":5391},{"supported":308,"editions":5392,"provenance":320,"checkedAt":242,"source":5393,"note":5394},[1144,418],"https:\u002F\u002Fgithub.com\u002FhoedlChr\u002FscormConverter\u002Fblob\u002Fmain\u002FParseXML.py","ParseXML.py rewrites the manifest's schemaversion element to \"2004 4th Edition\" and removes imsss:sequencing and metadata elements from the organization and its items. It does not otherwise transform the package. Read in source, August 2026.\n","tools\u002Fscorm-converter-2004","Python script that relabels SCORM 2004 3rd Edition packages as 4th Edition",[630,2974,5398],"migration","DqAy9B42lLafrfWYCXQ-FsQJNpNjrws7im5837mZ3xI",{"id":5401,"title":5402,"addedAt":242,"alternatives":5403,"body":5404,"categories":5427,"checkedAt":242,"claimed":293,"description":5428,"docs":293,"editorsPick":295,"extension":296,"faq":5429,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":5433,"listing":306,"logo":293,"meta":5434,"name":5435,"navigation":308,"openSource":308,"path":5436,"platforms":5437,"pricing":5438,"registries":5439,"repo":5440,"seo":5441,"standards":5442,"status":329,"stem":5450,"tagline":5451,"tags":5452,"vendor":293,"website":5440,"__hash__":5455},"tools\u002Ftools\u002Fscorm-debug.md","Scorm Debug",[],{"type":247,"value":5405,"toc":5425},[5406,5416,5419,5422],[250,5407,5408,5409,5411,5412,5415],{},"scorm_debug is one PHP script and two borrowed runtime harnesses. Point a web server at the folder, drop zips in, and it extracts each one, reads ",[253,5410,2171],{}," to find the launch page, and gives you a link to open that page inside a SCORM 1.2 wrapper and another to open it inside a 2004 wrapper. ",[253,5413,5414],{},"php -S localhost:8080"," and you are testing.",[250,5417,5418],{},"The audience is a developer who receives SCORM packages from other people and needs to see whether a course initialises, sets a status and commits, without the ceremony of uploading to an LMS or registering for a cloud service. For that narrow job the lack of ambition is the feature — there is nothing to configure and nothing to sign up for.",[250,5420,5421],{},"It is not a conformance tool and does not claim to be. No sequencing, no reporting, no persistence between runs, no validation of what the course writes. The 2004 harness is Claude Ostyn's from 2007, which is a testament to how well that wrapper was built and also an indication of how much has been maintained since.",[250,5423,5424],{},"The last commit was June 2019; there are twenty-two stars and one open issue. The licensing patchwork is the practical caution: three licences, no LICENSE file, and one of them share-alike.",{"title":289,"searchDepth":290,"depth":290,"links":5426},[],[14],"scorm_debug is one PHP script and two borrowed runtime harnesses. Point a web server at the folder, drop zips in, and it extracts each one, reads imsmanifest.xml to find the launch page, and gives you a link to open that page inside a SCORM 1.2 wrapper and another to open it inside a 2004 wrapper. php -S localhost:8080 and you are testing.",[5430],{"q":5431,"a":5432},"What licence is this under?","There is no LICENSE file. The README assigns three licences to three parts — GPL-2.0 for the Moodle-derived 1.2 wrapper, CC BY-SA 2.5 for Claude Ostyn's 2004 wrapper, MIT for index.php. Fine on a developer machine; do your own review before it goes anywhere near a product.\n","NOASSERTION",{},"scorm_debug","\u002Ftools\u002Fscorm-debug",[311,836],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Ffrumbert\u002Fscorm_debug",{"description":5428},{"scorm12":5443,"scorm2004":5446,"xapi":5448,"cmi5":5449},{"supported":308,"provenance":320,"checkedAt":242,"source":5444,"note":5445},"https:\u002F\u002Fgithub.com\u002Ffrumbert\u002Fscorm_debug#readme","The 1.2 harness is a modified copy of the Moodle 2.6 SCORM wrapper, with added buttons to simulate unload and reload.\n",{"supported":308,"provenance":320,"checkedAt":242,"source":5444,"note":5447},"The 2004 harness is Claude Ostyn's 2007 all-in-one test wrapper, bundled as-is. No edition is declared, and there is no sequencing engine.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fscorm-debug","Drop SCORM zips in a folder and launch each one against a 1.2 or 2004 harness locally",[1083,5453,5454],"local","debugging","Qq7iF5P2ufgJupL9g6b-PWHTsB3WQsR32S3jt-FqbDg",{"id":5457,"title":5458,"addedAt":242,"alternatives":5459,"body":5460,"categories":5487,"checkedAt":242,"claimed":293,"description":5488,"docs":293,"editorsPick":295,"extension":296,"faq":5489,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":3088,"listing":306,"logo":293,"meta":5493,"name":5494,"navigation":308,"openSource":308,"path":5495,"platforms":5496,"pricing":5497,"registries":5499,"repo":5498,"seo":5500,"standards":5501,"status":3169,"stem":5506,"tagline":5507,"tags":5508,"vendor":293,"website":5498,"__hash__":5510},"tools\u002Ftools\u002Fsimple-scorm-api.md","Simple Scorm Api",[],{"type":247,"value":5461,"toc":5485},[5462,5476,5479,5482],[250,5463,5464,5465,5468,5469,270,5471,5473,5474,2110],{},"A single file, ",[253,5466,5467],{},"simple-api.htm",", that puts a SCORM 1.2 API adapter on the page, loads a SCO into a frame beside it, and logs every call with its arguments and return value. Learner data is seeded with a fictitious student, ",[253,5470,4959],{},[253,5472,1364],{}," are held in memory, and session time is added to total time when the content calls ",[253,5475,5136],{},[250,5477,5478],{},"For roughly a decade this was the fastest way to answer \"is the content calling anything at all?\" without standing up an LMS, which is why it accumulated 70 stars and 48 forks despite never being promoted. Everything it does is visible in one file you can read in an afternoon, and that transparency remains its best quality.",[250,5480,5481],{},"It is over now, and the author says so first: the README states plainly that this is a dead project. The repository is archived, the last change to the code is from 2015, and there is no SCORM 2004 support and none coming. More consequentially, there is no licence — not a permissive one, none at all — so it is legally readable but not reusable.",[250,5483,5484],{},"Where that leaves someone deciding today: fine as a throwaway local harness or as reading, unsuitable as a dependency, and not a conformance tool in any sense. It records what the content did; it does not judge whether the content was correct. For that, use ADL's conformance test suite.",{"title":289,"searchDepth":290,"depth":290,"links":5486},[],[14],"A single file, simple-api.htm, that puts a SCORM 1.2 API adapter on the page, loads a SCO into a frame beside it, and logs every call with its arguments and return value. Learner data is seeded with a fictitious student, cmi.core.* and cmi.suspend_data are held in memory, and session time is added to total time when the content calls LMSFinish.",[5490],{"q":5491,"a":5492},"Can I use it commercially?","No licence is granted. The repository contains only a README and one HTML file, with no licence of any kind, so default copyright applies and you have no permission to copy, modify or redistribute it. It is also archived, so asking the author through an issue is not an option.\n",{},"simple-scorm-api","\u002Ftools\u002Fsimple-scorm-api",[311],{"model":313,"source":5498},"https:\u002F\u002Fgithub.com\u002Fskfriese\u002Fsimple-scorm-api",[],{"description":5488},{"scorm12":5502,"scorm2004":5505},{"supported":308,"provenance":320,"checkedAt":242,"source":5503,"note":5504},"https:\u002F\u002Fgithub.com\u002Fskfriese\u002Fsimple-scorm-api\u002Fblob\u002Fmaster\u002Fsimple-api.htm","The eight 1.2 functions are implemented over an in-memory cmi.core data model seeded with a fake learner, with session_time accumulated into total_time on LMSFinish. There is no persistence between page loads.\n",{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fsimple-scorm-api","One HTML file that impersonates an LMS so a SCORM 1.2 SCO can be run locally",[334,2896,5509,4189],"single-file","W2n2CumaciEAxUvX0ujoelv-8doFNs07tL_XEX1lR4U",{"id":5512,"title":5513,"addedAt":242,"alternatives":5514,"body":5515,"categories":5534,"checkedAt":242,"claimed":293,"description":5535,"docs":293,"editorsPick":295,"extension":296,"faq":5536,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5540,"name":1770,"navigation":308,"openSource":308,"path":5541,"platforms":5542,"pricing":5543,"registries":5545,"repo":5544,"seo":5546,"standards":5547,"status":3169,"stem":5554,"tagline":5555,"tags":5556,"vendor":293,"website":5544,"__hash__":5557},"tools\u002Ftools\u002Fsimple-scorm-packager.md","Simple Scorm Packager",[],{"type":247,"value":5516,"toc":5532},[5517,5523,5526,5529],[250,5518,5519,5520,5522],{},"The job here is small and well defined: point it at a directory of built web files, give it a title, a version, a language and a mastery score, and it writes ",[253,5521,2171],{},", copies in the schema definition files and zips the lot. It works either programmatically or through a CLI, which is what makes it useful — packaging becomes an npm script that runs after the bundler rather than a manual step someone forgets before a release.",[250,5524,5525],{},"The metadata options are unusually thorough for a tool of this size: LOM description, keywords, typical duration, a vCard for the author, and structured requirements entries. If a client's LMS is fussy about manifest metadata, that matters.",[250,5527,5528],{},"It is not an authoring tool and does not touch the run-time API. Your content still has to call SCORM itself, through a wrapper of your choosing.",[250,5530,5531],{},"The important fact for anyone deciding today is that the repository was archived by its owner. The 2026 commits are Dependabot merges for transitive dependency advisories, not development, and npm has stood at 0.2.7 since June 2022. With 74 stars it remains the most-referenced Node packager of its kind, and archived code that only writes XML and zips files ages better than most — but no bug you find will be fixed upstream, and a fork is the realistic path if you need a change.",{"title":289,"searchDepth":290,"depth":290,"links":5533},[],[17],"The job here is small and well defined: point it at a directory of built web files, give it a title, a version, a language and a mastery score, and it writes imsmanifest.xml, copies in the schema definition files and zips the lot. It works either programmatically or through a CLI, which is what makes it useful — packaging becomes an npm script that runs after the bundler rather than a manual step someone forgets before a release.",[5537],{"q":5538,"a":5539},"Does it validate the package it produces?","No. It writes a manifest and copies the ADL and IMS schema files into the zip so an LMS can validate against them, but it does not check the result itself. Run the output through a conformance test or a player before shipping it.\n",{},"\u002Ftools\u002Fsimple-scorm-packager",[836,304],{"model":313,"source":5544},"https:\u002F\u002Fgithub.com\u002Flmihaidaniel\u002Fsimple-scorm-packager",[],{"description":5535},{"scorm12":5548,"scorm2004":5551},{"supported":308,"provenance":320,"checkedAt":242,"source":5549,"note":5550},"https:\u002F\u002Fgithub.com\u002Flmihaidaniel\u002Fsimple-scorm-packager\u002Ftree\u002Fmaster\u002Flib\u002Fschemas\u002FdefinitionFiles","The repository ships the SCORM 1.2 schema set (adlcp_rootv1p2, imscp_rootv1p1p2, imsmd_rootv1p2p1) and writes a matching manifest.\n",{"supported":308,"editions":5552,"provenance":320,"checkedAt":242,"source":5549,"note":5553},[1144,418],"Separate schema directories for 2004 3rd and 4th Edition, including the imsss sequencing schemas. 2004 2nd Edition is not offered.\n","tools\u002Fsimple-scorm-packager","Node package that turns a build directory into a conformant SCORM zip",[4637,836,1763],"oba4z_a2woUR0Ghi0fJWoaLrC_O0s29Nf7R-zk6SIRc",{"id":5559,"title":5560,"addedAt":242,"alternatives":5561,"body":5562,"categories":5596,"checkedAt":242,"claimed":293,"description":5597,"docs":293,"editorsPick":295,"extension":296,"faq":5598,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5602,"name":5603,"navigation":308,"openSource":308,"path":5604,"platforms":5605,"pricing":5606,"registries":5607,"repo":5608,"seo":5609,"standards":5610,"status":329,"stem":5620,"tagline":5621,"tags":5622,"vendor":293,"website":5608,"__hash__":5623},"tools\u002Ftools\u002Fsimplify-scorm.md","Simplify Scorm",[],{"type":247,"value":5563,"toc":5594},[5564,5581,5584,5591],[250,5565,5566,5567,5570,5571,5573,5574,5576,5577,5580],{},"simplify-scorm implements the runtime side of SCORM: include ",[253,5568,5569],{},"scormAPI.js"," on the page that launches a course and it exposes ",[253,5572,1106],{}," for SCORM 1.2 and ",[253,5575,1109],{}," for SCORM 2004, records everything the course sets on a CMI object, and gives you event hooks on each API call so you can persist that data wherever you like. ",[253,5578,5579],{},"cmi.toJSON()"," hands you a plain object to POST to your own service.",[250,5582,5583],{},"It is aimed at developers embedding course playback in an application that is not an LMS — a portal, an internal tool, a product with a training tab. For that job the code is short enough to read in a sitting, which is most of its appeal.",[250,5585,5586,5587,5590],{},"What it is not is conformant. The repository is unusually honest about this: ",[253,5588,5589],{},"scormAPI2004.compliance.md"," is a checklist of 2004 requirements with an explicit TODO section, and there is no sequencing or navigation engine at all. Nothing validates data-model values on the way in.",[250,5592,5593],{},"The maintenance picture matters more than the feature list. The last commit was April 2020 and fifteen issues are open. Its real significance today is lineage — the actively maintained scorm-again library names simplify-scorm as its starting point. Treat this repository as a readable reference implementation, and reach for its descendant if you need something under support.",{"title":289,"searchDepth":290,"depth":290,"links":5595},[],[17],"simplify-scorm implements the runtime side of SCORM: include scormAPI.js on the page that launches a course and it exposes window.API for SCORM 1.2 and window.API_1484_11 for SCORM 2004, records everything the course sets on a CMI object, and gives you event hooks on each API call so you can persist that data wherever you like. cmi.toJSON() hands you a plain object to POST to your own service.",[5599],{"q":5600,"a":5601},"Is this a packager or a player?","Neither. It is the LMS half of the conversation — the API object a course looks for on the window when it launches. You host it on your launching page, hook the events, and persist the CMI data to your own backend.\n",{},"simplify-scorm","\u002Ftools\u002Fsimplify-scorm",[304,311],{"model":313},[],"https:\u002F\u002Fgithub.com\u002Fgabrieldoty\u002Fsimplify-scorm",{"description":5597},{"scorm12":5611,"scorm2004":5614,"xapi":5618,"cmi5":5619},{"supported":308,"provenance":320,"checkedAt":242,"source":5612,"note":5613},"https:\u002F\u002Fgithub.com\u002Fgabrieldoty\u002Fsimplify-scorm\u002Fblob\u002Fmaster\u002Fsrc\u002FscormAPI.js","src\u002FscormAPI.js creates window.API with the eight LMS* methods and a CMI object matching the SCORM 1.2 data model.\n",{"supported":308,"editions":5615,"provenance":320,"checkedAt":242,"source":5616,"note":5617},[418],"https:\u002F\u002Fgithub.com\u002Fgabrieldoty\u002Fsimplify-scorm\u002Fblob\u002Fmaster\u002Fsrc\u002FscormAPI2004.compliance.md","src\u002FscormAPI2004.js creates window.API_1484_11 against the 4th Edition data model. The bundled compliance.md lists a TODO block of requirements that are not implemented, including SCO launch and several error cases. There is no sequencing or navigation engine.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"provenance":320,"checkedAt":242},"tools\u002Fsimplify-scorm","SCORM 1.2 and 2004 runtime APIs in plain JavaScript, for the LMS side of the fence",[334,427,629],"94lv5w3YAJyPSPAkioL_3HbvMr0edWdb0k-pI57ViMo",{"id":5625,"title":5626,"addedAt":242,"alternatives":5627,"body":5628,"categories":5656,"checkedAt":242,"claimed":293,"description":5657,"docs":293,"editorsPick":295,"extension":296,"faq":5658,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5662,"name":5663,"navigation":308,"openSource":308,"path":5664,"platforms":5665,"pricing":5666,"registries":5668,"repo":5669,"seo":5670,"standards":5671,"status":568,"stem":5678,"tagline":5679,"tags":5680,"vendor":293,"website":5669,"__hash__":5681},"tools\u002Ftools\u002Fusescorm.md","Usescorm",[],{"type":247,"value":5629,"toc":5654},[5630,5641,5648,5651],[250,5631,5632,5633,5636,5637,5640],{},"A React hook over the SCORM run-time API, distributed on npm as ",[253,5634,5635],{},"@blocdigital\u002Fusescorm",". ",[253,5638,5639],{},"useScorm({ version: '1.2' })"," finds the API object, initialises the session, and returns an instance exposing get, set, commit and terminate alongside a small event emitter. It handles completion status and exit mode automatically by default, and auto-commits on change unless you turn that off.",[250,5642,5643,5644,5647],{},"The part worth noticing is the typing. Rather than accepting arbitrary strings, the CMI data model elements for 1.2 and 2004 are enumerated as union types, and the generic resolves to the intersection of both when the version is set to ",[253,5645,5646],{},"auto",". In a TypeScript course build that turns a whole class of silent failure — a mistyped element name returning an empty string at run time — into a compile error.",[250,5649,5650],{},"It suits React-built courses and course players. It is no help to anyone not using React, and it does no packaging: you still need a packager to emit the manifest and zip.",[250,5652,5653],{},"On maintenance, be realistic about scale. This is a single agency's library at version 0.2.3, last released February 2025, with single-figure stars and no visible outside contributors. The code is short and readable enough to audit in an afternoon, which is the honest basis on which to depend on it.",{"title":289,"searchDepth":290,"depth":290,"links":5655},[],[17],"A React hook over the SCORM run-time API, distributed on npm as @blocdigital\u002Fusescorm. useScorm({ version: '1.2' }) finds the API object, initialises the session, and returns an instance exposing get, set, commit and terminate alongside a small event emitter. It handles completion status and exit mode automatically by default, and auto-commits on change unless you turn that off.",[5659],{"q":5660,"a":5661},"What is the `storage` API actually doing?","It serialises an object into `cmi.suspend_data` and emits a `storage` event when it changes, so component state and bookmark data survive a resume. Suspend data is size-limited by the standard — 4,096 characters in SCORM 1.2 — and several LMSs enforce less, so keep the object small.\n",{},"usescorm","\u002Ftools\u002Fusescorm",[304],{"model":313,"source":5667},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@blocdigital\u002Fusescorm",[],"https:\u002F\u002Fgithub.com\u002Fbloc-digital\u002Fusescorm",{"description":5657},{"scorm12":5672,"scorm2004":5675},{"supported":308,"provenance":320,"checkedAt":242,"source":5673,"note":5674},"https:\u002F\u002Fgithub.com\u002Fbloc-digital\u002Fusescorm\u002Fblob\u002Fmain\u002Fsrc\u002FScormInstance.ts","`CMIElement1_2` and `IScorm1_2` are typed out element by element, and the instance branches on a '1.2' version case.\n",{"supported":308,"editions":5676,"provenance":320,"checkedAt":242,"source":5673,"note":5677},[],"`API_1484_11` is looked up and `CMIElement2004` is typed separately. An 'auto' mode intersects both type sets when the version is unknown.\n","tools\u002Fusescorm","React hook that wraps the SCORM run-time API and keeps state in suspend data",[1761,333,499],"xmUEQLx2nbY3WF4c30Jv7fS_viOif6DjWvCV00CMYrQ",{"id":5683,"title":5684,"addedAt":242,"alternatives":5685,"body":5686,"categories":5709,"checkedAt":242,"claimed":293,"description":5710,"docs":293,"editorsPick":295,"extension":296,"faq":5711,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":2068,"license":605,"listing":306,"logo":293,"meta":5718,"name":5719,"navigation":308,"openSource":308,"path":5720,"platforms":5721,"pricing":5722,"registries":5724,"repo":5725,"seo":5726,"standards":5727,"status":423,"stem":5731,"tagline":5732,"tags":5733,"vendor":5735,"website":5725,"__hash__":5736},"tools\u002Ftools\u002Fxapi-java.md","Xapi Java",[],{"type":247,"value":5687,"toc":5707},[5688,5698,5701,5704],[250,5689,5690,5691,5694,5695,2110],{},"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 ",[253,5692,5693],{},"WebClient"," wrapper with auto-configuration, so in a Spring Boot service the endpoint and credentials become three properties in ",[253,5696,5697],{},"application.yml",[250,5699,5700],{},"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.",[250,5702,5703],{},"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.",[250,5705,5706],{},"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":289,"searchDepth":290,"depth":290,"links":5708},[],[23],"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.",[5712,5715],{"q":5713,"a":5714},"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":5716,"a":5717},"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",{},"xAPI Java","\u002Ftools\u002Fxapi-java",[304],{"model":313,"source":5723},"https:\u002F\u002Fgithub.com\u002FBerryCloud\u002Fxapi-java\u002Fblob\u002Fmain\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FBerryCloud\u002Fxapi-java",{"description":5710},{"xapi":5728},{"supported":308,"provenance":320,"checkedAt":242,"source":5729,"note":5730},"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",[684,5734,745],"spring","BerryCloud","ERlaCwXIBsiAWmel2XcVmY2PxRDiqczcASbBbvr_8Fs",{"id":5738,"title":5739,"addedAt":242,"alternatives":5740,"body":5741,"categories":5757,"checkedAt":242,"claimed":293,"description":5745,"docs":5758,"editorsPick":295,"extension":296,"faq":5759,"firstParty":295,"foundedYear":293,"hosting":603,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5766,"name":5767,"navigation":308,"openSource":308,"path":5768,"platforms":5769,"pricing":5770,"registries":5772,"repo":5773,"seo":5774,"standards":5775,"status":568,"stem":5783,"tagline":5784,"tags":5785,"vendor":631,"website":5773,"__hash__":5786},"tools\u002Ftools\u002Fadl-lrs-conformance-test-suite.md","Adl Lrs Conformance Test Suite",[3837],{"type":247,"value":5742,"toc":5755},[5743,5746,5749,5752],[250,5744,5745],{},"This is the tool ADL wrote to decide whether an LRS does what the xAPI specification requires. It is a Node.js runner that fires the specification's MUST requirements at a live endpoint and reports each one against its requirement identifier, so a failure points at a clause rather than at a symptom. If you are building or buying an LRS, this is the test that matters; every other claim about xAPI conformance is downstream of it.",[250,5747,5748],{},"Two things make it more useful than a typical conformance harness. Tests are traceable — you can grep by requirement number or by specification section, which turns a red run into a specific reading assignment. And the 2.0 work has been done: the suite understands that xAPI moved to IEEE, and its 2.0 battery covers the actual behavioural changes, including RFC 3339 timestamps, context agents and groups, and the retirement of Alternate Request Syntax.",[250,5750,5751],{},"Be clear about what it is not. It is not a client-side or content-side test — it tells you nothing about whether your course emits sensible statements. It writes data that is never cleaned up, so it must never touch production. And it only exercises basic and OAuth 1 authentication, which is not how most commercial LRSs are deployed today.",[250,5753,5754],{},"Maintenance is adequate rather than brisk: real commits through 2024 and a merge in September 2025, from a small ADL-adjacent group. For a specification that is itself stable, that cadence is reasonable.",{"title":289,"searchDepth":290,"depth":290,"links":5756},[],[14],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002Flrs-conformance-test-suite#readme",[5760,5763],{"q":5761,"a":5762},"Can I point it at production?","No. The README says plainly that it should not be run against a production LRS endpoint, because the data it writes is persisted and never voided. Use a disposable instance or a dedicated test tenant.\n",{"q":5764,"a":5765},"Does a clean run make my LRS conformant?","It means the suite's MUST tests passed on the version you selected. The suite covers MUST requirements, not the whole specification, and only the basic and OAuth 1 authentication paths. It is the strongest evidence available, not a proof.\n",{},"xAPI LRS Conformance Test Suite","\u002Ftools\u002Fadl-lrs-conformance-test-suite",[836],{"model":313,"source":5771},"https:\u002F\u002Fgithub.com\u002Fadlnet\u002Flrs-conformance-test-suite\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fadlnet\u002Flrs-conformance-test-suite",{"description":5745},{"xapi":5776,"cmi5":5778,"scorm12":5780,"scorm2004":5781},{"supported":308,"provenance":320,"checkedAt":242,"source":5758,"note":5777},"Tests the MUST requirements of the specification against a running LRS endpoint. A `--xapiVersion` flag selects the version to test against; the README documents 1.0.x behaviour and a 2.0 battery covering context agents and groups, RFC 3339 timestamps, `Last-Modified` headers and the removal of Alternate Request Syntax. Authentication is Basic or OAuth 1.\n",{"supported":295,"provenance":320,"checkedAt":242,"note":5779},"It tests the LRS, not a cmi5 launch. ADL's CATAPULT project covers cmi5.\n",{"supported":295,"provenance":320,"checkedAt":242},{"supported":295,"editions":5782,"provenance":320,"checkedAt":242},[],"tools\u002Fadl-lrs-conformance-test-suite","ADL's Node.js suite that runs the MUST requirements of the xAPI spec against a live LRS",[683,836,797],"eaO57QhefNwVFfx0DB0nY_5zw86I7ULCxLMrMRRLZAU",{"id":5788,"title":5789,"addedAt":242,"alternatives":5790,"body":5791,"categories":5811,"checkedAt":242,"claimed":293,"description":5812,"docs":5813,"editorsPick":295,"extension":296,"faq":5814,"firstParty":295,"foundedYear":293,"hosting":304,"hqCountry":293,"license":305,"listing":306,"logo":293,"meta":5820,"name":573,"navigation":308,"openSource":308,"path":5821,"platforms":5822,"pricing":5823,"registries":5824,"repo":5825,"seo":5826,"standards":5827,"status":423,"stem":5833,"tagline":5834,"tags":5835,"vendor":293,"website":5813,"__hash__":5836},"tools\u002Ftools\u002Fxapi-js.md","Xapi Js",[],{"type":247,"value":5792,"toc":5809},[5793,5800,5803,5806],[250,5794,5795,5796,5799],{},"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 ",[253,5797,5798],{},"fetch"," and axios.",[250,5801,5802],{},"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.",[250,5804,5805],{},"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.",[250,5807,5808],{},"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":289,"searchDepth":290,"depth":290,"links":5810},[],[23],"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",[5815,5817],{"q":727,"a":5816},"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":5818,"a":5819},"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",[304,311],{"model":313,"currency":958,"freeTier":308},[],"https:\u002F\u002Fgithub.com\u002Fxapijs\u002Fxapi",{"description":5812},{"xapi":5828,"cmi5":5831},{"supported":308,"provenance":320,"checkedAt":242,"source":5829,"note":5830},"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":295,"provenance":320,"checkedAt":242,"note":5832},"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",[628,333,745],"Nac6dh4boyhji9PkIV33VgxOBKoYbwz4fOgJzV_7nX0",[5838,5845,5852,5859,5866,5873,5880,5887,5894],{"id":33,"title":34,"extension":35,"faq":5839,"icon":49,"intro":50,"meta":5844,"name":6,"order":52,"slug":5,"stem":53,"tagline":54,"__hash__":55},[5840,5841,5842,5843],{"q":38,"a":39},{"q":41,"a":42},{"q":44,"a":45},{"q":47,"a":48},{},{"id":57,"title":58,"extension":35,"faq":5846,"icon":72,"intro":73,"meta":5851,"name":9,"order":75,"slug":8,"stem":76,"tagline":77,"__hash__":78},[5847,5848,5849,5850],{"q":61,"a":62},{"q":64,"a":65},{"q":67,"a":68},{"q":70,"a":71},{},{"id":80,"title":81,"extension":35,"faq":5853,"icon":95,"intro":96,"meta":5858,"name":12,"order":98,"slug":11,"stem":99,"tagline":100,"__hash__":101},[5854,5855,5856,5857],{"q":84,"a":85},{"q":87,"a":88},{"q":90,"a":91},{"q":93,"a":94},{},{"id":103,"title":104,"extension":35,"faq":5860,"icon":118,"intro":119,"meta":5865,"name":15,"order":121,"slug":14,"stem":122,"tagline":123,"__hash__":124},[5861,5862,5863,5864],{"q":107,"a":108},{"q":110,"a":111},{"q":113,"a":114},{"q":116,"a":117},{},{"id":126,"title":127,"extension":35,"faq":5867,"icon":141,"intro":142,"meta":5872,"name":18,"order":144,"slug":17,"stem":145,"tagline":146,"__hash__":147},[5868,5869,5870,5871],{"q":130,"a":131},{"q":133,"a":134},{"q":136,"a":137},{"q":139,"a":140},{},{"id":149,"title":150,"extension":35,"faq":5874,"icon":164,"intro":165,"meta":5879,"name":21,"order":167,"slug":20,"stem":168,"tagline":169,"__hash__":170},[5875,5876,5877,5878],{"q":153,"a":154},{"q":156,"a":157},{"q":159,"a":160},{"q":162,"a":163},{},{"id":172,"title":173,"extension":35,"faq":5881,"icon":187,"intro":188,"meta":5886,"name":24,"order":190,"slug":23,"stem":191,"tagline":192,"__hash__":193},[5882,5883,5884,5885],{"q":176,"a":177},{"q":179,"a":180},{"q":182,"a":183},{"q":185,"a":186},{},{"id":195,"title":196,"extension":35,"faq":5888,"icon":210,"intro":211,"meta":5893,"name":27,"order":213,"slug":26,"stem":214,"tagline":215,"__hash__":216},[5889,5890,5891,5892],{"q":199,"a":200},{"q":202,"a":203},{"q":205,"a":206},{"q":208,"a":209},{},{"id":218,"title":219,"extension":35,"faq":5895,"icon":230,"intro":231,"meta":5899,"name":30,"order":233,"slug":29,"stem":234,"tagline":235,"__hash__":236},[5896,5897,5898],{"q":222,"a":223},{"q":225,"a":226},{"q":228,"a":229},{},1789388509357]