[{"data":1,"prerenderedAt":2133},["ShallowReactive",2],{"footer-categories":3,"app-search-categories":227,"category-packagers-sdks-libraries":237,"mdc--79t0xg-key":2077},[4,30,55,80,105,130,155,180,205],{"id":5,"title":6,"extension":7,"faq":8,"icon":21,"intro":22,"meta":23,"name":24,"order":25,"slug":26,"stem":27,"tagline":28,"__hash__":29},"categories\u002Fcategories\u002Fauthoring-tools.yml","SCORM authoring tools and course frameworks","yml",[9,12,15,18],{"q":10,"a":11},"Which authoring tools publish cmi5?","Far fewer than claim to. cmi5 needs the full AU lifecycle — launch, session identifier, moveOn rules — not just an xAPI endpoint. The standards matrix on each listing shows what we could verify and where the claim came from; the cmi5 hub page lists the tools together.\n",{"q":13,"a":14},"Do I need a paid authoring tool at all?","Not necessarily. If your courses are text, images and simple assessment, an open-source framework or a markdown-to-SCORM converter produces a perfectly conformant package. Paid suites earn their money on complex interactions, branching simulation, review workflows and support.\n",{"q":16,"a":17},"What is the difference between SCORM 1.2 and 2004 output?","1.2 is simpler, universally supported, and limited: one completion status, a coarse data model. 2004 adds sequencing and navigation, a separate success\u002Fcompletion distinction, and richer objectives — at the cost of LMSs implementing it inconsistently. Publish 1.2 unless something specific requires 2004.\n",{"q":19,"a":20},"Can I move a course between authoring tools?","Rarely without rework. Published packages are portable; source projects generally are not. That lock-in is the strongest argument for the code-first frameworks in this category, where the source is plain text you own.\n","i-lucide-pen-tool","The authoring tool decides what standard your course speaks, long before anyone uploads it. That makes\n\"which standards does it publish?\" the first question worth asking, and the one vendor comparison pages\nanswer least clearly — plenty of tools advertise xAPI support that turns out to mean a statement endpoint\nrather than a conformant launch.\n\nThree quite different things live in this category. **GUI authoring tools** are the familiar commercial\nsuites: you assemble slides, interactions and quizzes, then publish a package. **Code-first frameworks**\nhand you a build pipeline instead, which is the right shape when courses are versioned in git and reviewed\nlike software. **Markdown and document converters** sit between the two, turning writing into a package\nwith the least ceremony.\n\nTwo practical notes. Publishing SCORM 1.2 remains the safest default for reaching old LMSs, and most tools\nstill offer it alongside 2004 — check which edition. And accessibility varies enormously between tools that\nclaim WCAG conformance; if that matters to your client, test the published output rather than trusting the\nbrochure.\n",{},"Authoring tools & course frameworks","1","authoring-tools","categories\u002Fauthoring-tools","Where the course gets made — and where its SCORM output is decided.","CkWCyRM7Yrc2GVdbc65rAQjKCeNcgRzCqKcYYXPQVQk",{"id":31,"title":32,"extension":7,"faq":33,"icon":46,"intro":47,"meta":48,"name":49,"order":50,"slug":51,"stem":52,"tagline":53,"__hash__":54},"categories\u002Fcategories\u002Fconverters-migration.yml","SCORM converters and migration tools",[34,37,40,43],{"q":35,"a":36},"How do I convert PowerPoint to SCORM?","Either with a self-serve converter that wraps the exported slides in a player and manifest, or by rebuilding the deck in an authoring tool. The first is minutes and cheap; the second gives you real interactions, narration and accessibility. Both appear in this directory.\n",{"q":38,"a":39},"Does converting a deck preserve animations and narration?","It depends entirely on the export path. Tools that go through PDF or images lose both. Tools that drive PowerPoint itself can keep timings and audio. Check the listing, and test with your most complicated slide rather than your simplest.\n",{"q":41,"a":42},"Can I convert an existing SCORM package to xAPI?","Partly. Wrappers exist that intercept SCORM API calls and re-emit them as xAPI statements, which preserves completion and score. What they cannot do is give you the richer verbs that make xAPI worth having — that needs authoring for xAPI in the first place.\n",{"q":44,"a":45},"Is SCORM 1.2 to 2004 conversion safe?","Structurally, usually. Behaviourally, test it. 2004's stricter data model rejects values 1.2 tolerated, and sequencing defaults can change how a multi-SCO course navigates.\n","i-lucide-repeat","Most SCORM work does not start from a blank canvas. It starts with a PowerPoint deck that has been through\nfour rounds of review, a folder of MP4s, an H5P activity, or a course built for a platform the client has\nsince left. The tools here move that content across the gap.\n\nThey divide by what goes in. **Document and deck converters** wrap slides into a package, usually adding a\nplayer shell, navigation and a completion rule. **Video and media wrappers** do the same for a single asset,\nwhere the only real question is what counts as \"complete\". **Format bridges** move between the standards\nthemselves — SCORM to xAPI, SCORM 1.2 to 2004, H5P to SCORM — and are the fiddliest, because the two ends\ndisagree about what a result means.\n\nThe honest caveat for the whole category: a converter can guarantee a conformant package, but it cannot\ninvent instructional design. A converted deck is a deck in an LMS. That is often exactly what a compliance\nmodule needs, and rarely what a flagship course needs — worth being clear about before the budget is set.\n",{},"Converters & migration","2","converters-migration","categories\u002Fconverters-migration","Turning what you already have — decks, video, H5P, old packages — into something an LMS accepts.","l5wpzElL1rBxqlsmtpMVsuvZRxfSFas4hwwMc2CXT5o",{"id":56,"title":57,"extension":7,"faq":58,"icon":71,"intro":72,"meta":73,"name":74,"order":75,"slug":76,"stem":77,"tagline":78,"__hash__":79},"categories\u002Fcategories\u002Fplayers-runtimes-debuggers.yml","SCORM players, runtimes and debuggers",[59,62,65,68],{"q":60,"a":61},"What is the difference between a SCORM player and a SCORM runtime?","A runtime is a library that implements the SCORM API surface a course calls; a player is a whole application that loads a package, hosts it in an iframe and provides that runtime. Every player contains a runtime, but you can embed a runtime without a player.\n",{"q":63,"a":64},"Do I need a full LMS just to check a package works?","No. An in-browser debugger will unzip the package locally, serve it, and show you every API call it makes. That catches the majority of packaging faults — missing manifest entries, wrong SCORM version, completion never being set — in a minute rather than a deployment cycle.\n",{"q":66,"a":67},"Why does my course work in one player but not in an LMS?","Usually one of three things: the LMS enforces the data-model constraints the player relaxes (string lengths, vocabularies, read-only elements), the LMS restricts cross-origin access to the API object, or the course relies on a sequencing behaviour the LMS implements differently. Tools with LMS quirk profiles exist specifically to reproduce these differences.\n",{"q":69,"a":70},"Which JavaScript runtime should I embed in a new project?","Look for one that supports both SCORM 1.2 and 2004, is still receiving commits, and has an explicit persistence interface so you can decide where learner state goes. The listings here show the standards matrix and the last commit date for exactly that comparison.\n","i-lucide-play-circle","A SCORM package is inert until something gives it an API to talk to. That something is a runtime: the\nJavaScript object a course looks for on `window.API` (SCORM 1.2) or `window.API_1484_11` (SCORM 2004),\nwhich answers `LMSInitialize`, `GetValue`, `SetValue` and `Commit` and persists the data model somewhere.\n\nThe tools here fall into three groups that are easy to confuse. **Runtimes and API wrappers** are libraries\nyou embed — either in a course, to talk to whatever LMS it lands in, or in your own application, to play the\nrole of the LMS. **Players** are complete applications that unzip a package, serve it, and drive it end to\nend. **Debuggers** are players with the lid off: they show the API call transcript, the current CMI data\nmodel, suspend data, sequencing decisions and the moment something returns error 101.\n\nIf you are testing whether a package works before it reaches a client's LMS, start with a debugger. If you\nare building a product that must host SCORM content, start with a runtime and read its persistence adapter\ncarefully — that is where most integrations go wrong.\n",{},"Players, runtimes & debuggers","3","players-runtimes-debuggers","categories\u002Fplayers-runtimes-debuggers","Run a SCORM package outside an LMS — and watch what it actually does.","hcDF7H9nETO_B5A3g2eWnh5kzICgufiyMse4cjh7gHk",{"id":81,"title":82,"extension":7,"faq":83,"icon":96,"intro":97,"meta":98,"name":99,"order":100,"slug":101,"stem":102,"tagline":103,"__hash__":104},"categories\u002Fcategories\u002Ftesting-validation-conformance.yml","SCORM testing, validation and conformance tools",[84,87,90,93],{"q":85,"a":86},"How do I test a SCORM package without an LMS?","Use an in-browser debugger or a local test harness: both provide the SCORM API, record every call, and show you the resulting data model. For automated checks, a harness that can be scripted lets you assert on completion and score in CI.\n",{"q":88,"a":89},"Is there an official SCORM conformance test?","Yes — ADL publishes conformance test suites for SCORM 1.2 and SCORM 2004, and a separate suite for xAPI. They are the reference for whether an implementation is conformant. They are exacting and slow, which is why lighter validators exist for day-to-day work.\n",{"q":91,"a":92},"What should be in a SCORM QA checklist?","At minimum: the package imports cleanly, the correct SCORM version is declared, initialise and terminate are called, completion and success statuses are set as intended, score is reported in the right range, suspend data survives a resume, and the package behaves when the LMS returns an error. Testing against more than one LMS catches the rest.\n",{"q":94,"a":95},"Why does the same package pass one validator and fail another?","Validators differ in strictness and in which optional parts of the specification they enforce. A package can be schema-valid and still break in an LMS that applies stricter data-model rules — which is why manifest validation and runtime testing are two different jobs.\n","i-lucide-check-check","Most SCORM failures are found late, by the wrong person, in production. The course was signed off, uploaded\nto the client's LMS, and then learners' completions did not record — and now the problem is a support ticket\nrather than a build step.\n\nThe tools in this category move that discovery earlier. **Manifest validators** check `imsmanifest.xml`\nagainst the schema and the common packaging mistakes (missing resources, wrong `scormType`, broken hrefs,\nidentifiers that collide). **Test harnesses** drive a package programmatically and assert on what it sent —\nuseful in CI, where a regression in a course template can otherwise ship silently. **Conformance test\nsuites**, notably ADL's, are the formal article: they exercise the full data model and sequencing behaviour\na conformant implementation must support. **Test packages** are the inverse — known-good and known-bad\ncontent you fire at an LMS to find out what *it* actually implements.\n\nA note on the word \"certified\": conformance certification is granted by the bodies that own the\nspecifications, not by tools and not by us. Where a product appears in an official registry we link to it\nand mark the fact `registry-verified`; everything else is a vendor's own claim or our own check.\n",{},"Testing, validation & conformance","4","testing-validation-conformance","categories\u002Ftesting-validation-conformance","Prove a package is correct before a client's LMS proves it isn't.","NiGuliqtBVM9lTcU49a0WOVt0jMaZ2d1QAI3sJyZhdY",{"id":106,"title":107,"extension":7,"faq":108,"icon":121,"intro":122,"meta":123,"name":124,"order":125,"slug":126,"stem":127,"tagline":128,"__hash__":129},"categories\u002Fcategories\u002Fpackagers-sdks-libraries.yml","SCORM packagers, SDKs and libraries for developers",[109,112,115,118],{"q":110,"a":111},"Which JavaScript SCORM library should I use?","Look for one supporting SCORM 1.2 and 2004, still receiving commits, with an explicit persistence interface. The listings show licence, stars and last commit so you can judge maintenance rather than guess. Several long-abandoned wrappers still rank well in search — the badges here say plainly which.\n",{"q":113,"a":114},"Do I need a library, or can I call the SCORM API directly?","You can call it directly; it is not a large API. What libraries buy you is the tedious part — finding the API object across nested frames, handling initialisation order, normalising the differences between 1.2 and 2004, and coping with LMSs that return errors in creative ways.\n",{"q":116,"a":117},"What is the difference between a packager and an authoring tool?","A packager takes content you have already built and wraps it conformantly. An authoring tool creates the content. If you have a web app and need it to run in an LMS, you want a packager.\n",{"q":119,"a":120},"Are these production-ready?","Some are used in thousands of courses; some are a weekend project with three stars. The maintenance badge and the metrics panel on each listing exist precisely so you can tell which is which.\n","i-lucide-package","This is the developer end of the directory, and the part no other directory covers — general software\nindexes exclude libraries and CLIs, and e-learning listings only track products with a pricing page.\n\n**Packagers and CLIs** take a built web app and emit a conformant zip: manifest, resource declarations,\nthe right SCORM version, sensible identifiers. Several are bundler plugins, so a course built with Vite or\nwebpack produces a package as a build artefact rather than a manual step. **API wrappers** live on the\ncontent side and give your application a sane interface over the raw SCORM API — initialise, get, set,\ncommit, terminate — while handling the LMS quirks that make raw integration miserable. **Manifest tooling**\nparses and validates `imsmanifest.xml`, which is where a surprising share of import failures originate.\n**Framework integrations** wrap all of that for React, Vue, Angular, Svelte, Unity and Godot.\n\nWhat to look at before adopting one: does it support both SCORM 1.2 and 2004, does it expose a persistence\nboundary you can control, and is it still maintained? Every listing here carries the licence, the last\ncommit date and an honest maintenance badge, because a wrapper abandoned in 2019 can still be the right\nanswer — but you should know that going in.\n",{},"Packagers, SDKs & libraries","5","packagers-sdks-libraries","categories\u002Fpackagers-sdks-libraries","The pieces you build with when the course is an application, not a slide deck.","3KvCkFwRNYzh9-fZmEfQdmLiSCT3pp7bsS3eQcBnG6c",{"id":131,"title":132,"extension":7,"faq":133,"icon":146,"intro":147,"meta":148,"name":149,"order":150,"slug":151,"stem":152,"tagline":153,"__hash__":154},"categories\u002Fcategories\u002Flms-and-plugins.yml","Learning management systems with SCORM support",[134,137,140,143],{"q":135,"a":136},"Which LMSs support cmi5?","Genuine cmi5 support is still uncommon, and considerably rarer than the marketing suggests. The cmi5 standards page groups every listing we could verify, and flags which claims are vendor-stated rather than checked.\n",{"q":138,"a":139},"Why does my package work in one LMS and not another?","Usually strictness. A permissive LMS accepts data-model values the specification forbids; a stricter one rejects them, and the course silently stops recording. Sequencing and cross-origin access to the API object are the other two common causes.\n",{"q":141,"a":142},"Is an open-source LMS good enough for SCORM?","Often better than the alternatives, because the implementation is inspectable and its bugs are public. Moodle's SCORM module in particular has been exercised by more courses than most commercial engines.\n",{"q":144,"a":145},"Do I need an LMS at all to deliver SCORM?","No. Distribution and licensing platforms in this directory host the content and report back without a full LMS, which suits publishers selling courses into clients' own systems.\n","i-lucide-graduation-cap","Every SCORM package eventually meets an LMS, and the LMS decides whether the standard is honoured or\nmerely claimed. That gap is why this category exists in a tools directory: not to rank platforms on\nfeatures, but to record what each one actually does with a package.\n\nIncluded here are **open-source platforms** whose SCORM implementation you can read, **commercial platforms**\nwhose support you have to take on trust or test, and **plugins** that add or replace SCORM handling in a\nplatform that ships with something weaker. The plugins matter more than they look: a good deal of real-world\nSCORM behaviour on any given installation comes from a module rather than core.\n\nThe facts worth comparing are narrow and specific. Which SCORM version, and which 2004 edition. Whether\nsequencing is implemented or quietly ignored. How suspend data is stored and how much of it survives.\nWhether xAPI and cmi5 are genuinely supported or approximated. Each listing carries these with provenance,\nbecause vendor marketing and vendor documentation frequently disagree with each other.\n",{},"LMS & LMS plugins","6","lms-and-plugins","categories\u002Flms-and-plugins","Where the package finally has to run — and how well each platform actually implements the spec.","xW4Pab08lObiEGf6iWf0S-QGh8jj2jJWV3vWoKcRrFU",{"id":156,"title":157,"extension":7,"faq":158,"icon":171,"intro":172,"meta":173,"name":174,"order":175,"slug":176,"stem":177,"tagline":178,"__hash__":179},"categories\u002Fcategories\u002Fxapi-cmi5.yml","xAPI learning record stores and cmi5 tooling",[159,162,165,168],{"q":160,"a":161},"What is the difference between xAPI and cmi5?","xAPI is a statement format and a store API — deliberately unopinionated. cmi5 is a profile of xAPI that specifies how a course is launched, how a session is identified, and how completion is determined. If you need SCORM-like accountability with xAPI's reach, you need cmi5, not xAPI alone.\n",{"q":163,"a":164},"Do I need an LRS?","Only if you are using xAPI or cmi5. SCORM reports to the LMS and needs nothing extra. Once statements leave the LMS, something has to store them, and that something is an LRS.\n",{"q":166,"a":167},"Is xAPI replacing SCORM?","Not in practice, and not soon. SCORM remains what procurement asks for and what every LMS imports. xAPI is additive — it captures what SCORM cannot — and most real deployments run both.\n",{"q":169,"a":170},"How do I know an LRS is conformant?","ADL publishes a conformance test suite and maintains a list of adopters. We link that registry rather than certifying anything ourselves; listings backed by it carry the Verified chip.\n","i-lucide-share-2","SCORM records what happened inside a course, in a course's own terms, to the LMS that launched it. xAPI\nbreaks all three assumptions: any activity, anywhere, reported to any record store. cmi5 then puts the\ndiscipline back — it is an xAPI profile that restores the parts of SCORM an administrator actually needs,\na defined launch, a session, and rules for what counts as completion.\n\nThis category holds the infrastructure. **Learning record stores** receive, validate and serve statements;\nthey are ordinary databases with a specific API and specific conformance expectations, and several good\nopen-source ones exist. **Client libraries** send statements from courses and applications. **cmi5 tooling**\ncovers players, assignable-unit runtimes and the conformance test suite that decides whether an\nimplementation is real.\n\nA caution worth stating plainly, because it is the fact this directory most often has to correct: an xAPI\nendpoint is not cmi5 support. Receiving statements is the easy half. Honouring the AU lifecycle, the\nsession identifier and the moveOn rules is what makes a completion mean something — and it is what we\ncheck before recording cmi5 as supported.\n",{},"xAPI & cmi5","7","xapi-cmi5","categories\u002Fxapi-cmi5","The standards after SCORM — and the tools that actually implement them.","Z08AoeVOVPwRcuEk4GxjtdqYuXVacfkkSSQMb14CEP4",{"id":181,"title":182,"extension":7,"faq":183,"icon":196,"intro":197,"meta":198,"name":199,"order":200,"slug":201,"stem":202,"tagline":203,"__hash__":204},"categories\u002Fcategories\u002Fdistribution-licensing.yml","SCORM distribution, licensing and hosting platforms",[184,187,190,193],{"q":185,"a":186},"What is SCORM dispatch?","A small SCORM package that acts as a pointer rather than the content. The LMS imports and launches it normally; the package fetches the real course from a hosting platform and relays tracking back. The client's LMS sees an ordinary course; you keep the file.\n",{"q":188,"a":189},"Why not just send the client a zip?","You can, and for a one-off it is fine. What you lose is control of updates, any visibility of usage, and any ability to time-limit access — which is precisely what a licensing arrangement needs.\n",{"q":191,"a":192},"Does dispatch work in every LMS?","Not quite. Some LMSs sandbox course content in ways that break the proxy's connection back to its origin, and some corporate networks block the content domain. Any serious platform in this category publishes a tested-LMS list; ask for it before committing.\n",{"q":194,"a":195},"What happens when a licence expires?","Platform-dependent, and worth testing. The good implementations fail politely with a message; weaker ones leave a blank frame and an LMS recording an incomplete attempt.\n","i-lucide-send","If you sell courses, you have the publisher's problem: the client wants the content inside their own LMS,\nand the moment you hand over a zip you have handed over the asset. Every update becomes a redistribution\nexercise, and you cannot tell how many people took the course or when the licence should end.\n\nThe tools here solve it the same way. The client installs a small proxy package — a few kilobytes, a\nmanifest and a launcher — which streams the real content from the platform at run time and reports tracking\nback. The course never leaves your control, updates take effect without anyone re-importing anything, and\nlicences can carry seat counts, expiry dates and domain locks.\n\nThe vocabulary varies: dispatch, distribution, licensing, content delivery. What differentiates them in\npractice is narrower than the marketing suggests — whether the proxy works in restrictive LMSs that block\ncross-origin access, what happens when the licence expires mid-session, how tracking is reconciled if the\nconnection drops, and whether you can white-label the whole thing for your own clients.\n",{},"Distribution, licensing & hosting","8","distribution-licensing","categories\u002Fdistribution-licensing","Getting a course into someone else's LMS without giving away the course.","nkIpVD2NvqBC7m2F3MZ57C3AjDoCZ0eJjUNGd2oE9ZI",{"id":206,"title":207,"extension":7,"faq":208,"icon":218,"intro":219,"meta":220,"name":221,"order":222,"slug":223,"stem":224,"tagline":225,"__hash__":226},"categories\u002Fcategories\u002Fanalytics-tracking.yml","SCORM and xAPI analytics and tracking tools",[209,212,215],{"q":210,"a":211},"Can I get analytics from SCORM without moving to xAPI?","Yes, within limits. SCORM reports completion, score, time and a small data model — enough for drop-off and pass rates, not enough for fine-grained interaction analysis. Launch-tracking tools add a layer of their own without requiring you to re-author anything.\n",{"q":213,"a":214},"Do I need a separate analytics tool if I have an LRS?","Often, yes. Most record stores are built to store and serve statements correctly rather than to visualise them well. Some ship a reporting layer; the rest expect you to bring one.\n",{"q":216,"a":217},"What should I measure?","Start with completion rate, time to complete, and per-question failure. They are cheap, comparable across courses, and answer the question that actually gets asked — is this course working?\n","i-lucide-bar-chart-3","An LMS will tell you who completed a course. It is usually much less helpful about anything else: where\npeople dropped out, which question everybody fails, whether the course is worth its production cost, or\nwhat happened across the six systems your organisation actually uses.\n\nThe tools here fill that gap from two directions. **Statement analytics** sit on top of an xAPI record store\nand turn a stream of statements into dashboards, cohorts and reports — the natural pairing if you have\nalready adopted xAPI. **Launch and delivery tracking** works at the package level instead, recording when\nand where a course was opened and how far it got, which is the pragmatic option when the content is SCORM\nand always will be.\n\nOne thing to settle early, because it is a data-protection question and not just a technical one: how much\nof this is personally identifiable, how long it is kept, and who can see it. Learner-level analytics are\ngenuinely useful and genuinely sensitive, and the answer should be written down before the dashboard is\nbuilt rather than after someone asks.\n",{},"Analytics & tracking","9","analytics-tracking","categories\u002Fanalytics-tracking","Turning completion records into something worth reading.","eGUFwQLbgbMeYmVcG_VLX1KbidUQxzBPyNR2G2IyenU",[228,229,230,231,232,233,234,235,236],{"slug":26,"name":24},{"slug":51,"name":49},{"slug":76,"name":74},{"slug":101,"name":99},{"slug":126,"name":124},{"slug":151,"name":149},{"slug":176,"name":174},{"slug":201,"name":199},{"slug":223,"name":221},{"category":238,"categories":245,"tools":308},{"id":106,"title":107,"extension":7,"faq":239,"icon":121,"intro":122,"meta":244,"name":124,"order":125,"slug":126,"stem":127,"tagline":128,"__hash__":129},[240,241,242,243],{"q":110,"a":111},{"q":113,"a":114},{"q":116,"a":117},{"q":119,"a":120},{},[246,253,260,267,274,281,288,295,302],{"id":5,"title":6,"extension":7,"faq":247,"icon":21,"intro":22,"meta":252,"name":24,"order":25,"slug":26,"stem":27,"tagline":28,"__hash__":29},[248,249,250,251],{"q":10,"a":11},{"q":13,"a":14},{"q":16,"a":17},{"q":19,"a":20},{},{"id":31,"title":32,"extension":7,"faq":254,"icon":46,"intro":47,"meta":259,"name":49,"order":50,"slug":51,"stem":52,"tagline":53,"__hash__":54},[255,256,257,258],{"q":35,"a":36},{"q":38,"a":39},{"q":41,"a":42},{"q":44,"a":45},{},{"id":56,"title":57,"extension":7,"faq":261,"icon":71,"intro":72,"meta":266,"name":74,"order":75,"slug":76,"stem":77,"tagline":78,"__hash__":79},[262,263,264,265],{"q":60,"a":61},{"q":63,"a":64},{"q":66,"a":67},{"q":69,"a":70},{},{"id":81,"title":82,"extension":7,"faq":268,"icon":96,"intro":97,"meta":273,"name":99,"order":100,"slug":101,"stem":102,"tagline":103,"__hash__":104},[269,270,271,272],{"q":85,"a":86},{"q":88,"a":89},{"q":91,"a":92},{"q":94,"a":95},{},{"id":106,"title":107,"extension":7,"faq":275,"icon":121,"intro":122,"meta":280,"name":124,"order":125,"slug":126,"stem":127,"tagline":128,"__hash__":129},[276,277,278,279],{"q":110,"a":111},{"q":113,"a":114},{"q":116,"a":117},{"q":119,"a":120},{},{"id":131,"title":132,"extension":7,"faq":282,"icon":146,"intro":147,"meta":287,"name":149,"order":150,"slug":151,"stem":152,"tagline":153,"__hash__":154},[283,284,285,286],{"q":135,"a":136},{"q":138,"a":139},{"q":141,"a":142},{"q":144,"a":145},{},{"id":156,"title":157,"extension":7,"faq":289,"icon":171,"intro":172,"meta":294,"name":174,"order":175,"slug":176,"stem":177,"tagline":178,"__hash__":179},[290,291,292,293],{"q":160,"a":161},{"q":163,"a":164},{"q":166,"a":167},{"q":169,"a":170},{},{"id":181,"title":182,"extension":7,"faq":296,"icon":196,"intro":197,"meta":301,"name":199,"order":200,"slug":201,"stem":202,"tagline":203,"__hash__":204},[297,298,299,300],{"q":185,"a":186},{"q":188,"a":189},{"q":191,"a":192},{"q":194,"a":195},{},{"id":206,"title":207,"extension":7,"faq":303,"icon":218,"intro":219,"meta":307,"name":221,"order":222,"slug":223,"stem":224,"tagline":225,"__hash__":226},[304,305,306],{"q":210,"a":211},{"q":213,"a":214},{"q":216,"a":217},{},[309,407,500,572,620,691,762,837,897,969,1033,1104,1178,1259,1316,1379,1463,1513,1565,1633,1692,1775,1839,1903,1952,2019],{"id":310,"title":311,"addedAt":312,"alternatives":313,"body":316,"categories":362,"checkedAt":312,"claimed":363,"description":364,"docs":363,"editorsPick":365,"extension":366,"faq":367,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":377,"name":325,"navigation":378,"openSource":378,"path":379,"platforms":380,"pricing":382,"registries":385,"repo":386,"seo":387,"standards":388,"status":399,"stem":400,"tagline":401,"tags":402,"vendor":363,"website":386,"__hash__":406},"tools\u002Ftools\u002Fgamestdio-scorm.md","Gamestdio Scorm","2026-08-24",[314,315],"pipwerks-scorm-api-wrapper","scorm-again",{"type":317,"value":318,"toc":358},"minimark",[319,349,352],[320,321,322,326,327,330,331,330,334,330,337,340,341,344,345,348],"p",{},[323,324,325],"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 ",[323,328,329],{},"initialize",", ",[323,332,333],{},"get",[323,335,336],{},"set",[323,338,339],{},"commit"," and ",[323,342,343],{},"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 ",[323,346,347],{},"pipwerks"," object.",[320,350,351],{},"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.",[320,353,354,355,357],{},"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 — ",[323,356,315],{}," 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":359,"searchDepth":360,"depth":360,"links":361},"",2,[],[126],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",[368,371],{"q":369,"a":370},"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":372,"a":373},"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",[374,381],"web",{"model":383,"source":384},"open-source","https:\u002F\u002Fgithub.com\u002Fgamestdio\u002Fscorm\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002Fgamestdio\u002Fscorm",{"description":364},{"scorm12":389,"scorm2004":393,"xapi":396,"cmi5":397,"aicc":398},{"supported":378,"provenance":390,"checkedAt":312,"source":391,"note":392},"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":378,"editions":394,"provenance":390,"checkedAt":312,"source":391,"note":395},[],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"stale","tools\u002Fgamestdio-scorm","A TypeScript port of the pipwerks wrapper, published once in 2019 and untouched since",[403,404,405],"typescript","javascript","wrapper","vy_R2KLRiChKTg0UDhq7t4bDeqNg3LG8a7UljUhCbcM",{"id":408,"title":409,"addedAt":312,"alternatives":410,"body":411,"categories":468,"checkedAt":312,"claimed":363,"description":469,"docs":470,"editorsPick":365,"extension":366,"faq":471,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":475,"name":476,"navigation":378,"openSource":378,"path":477,"platforms":478,"pricing":479,"registries":481,"repo":480,"seo":482,"standards":483,"status":493,"stem":494,"tagline":495,"tags":496,"vendor":363,"website":480,"__hash__":499},"tools\u002Ftools\u002Fstudiolxd-scorm.md","Studiolxd Scorm",[],{"type":317,"value":412,"toc":466},[413,427,452,455],[320,414,415,416,340,419,422,423,426],{},"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 ",[323,417,418],{},"window.parent",[323,420,421],{},"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 ",[323,424,425],{},"\u003Cscript>"," global.",[320,428,429,430,330,433,340,436,439,440,443,444,447,448,451],{},"The useful part is the abstraction over the two data models. Calls such as ",[323,431,432],{},"setComplete()",[323,434,435],{},"setScore()",[323,437,438],{},"setExit('suspend')"," map to ",[323,441,442],{},"cmi.core.lesson_status"," under 1.2 and ",[323,445,446],{},"cmi.completion_status"," \u002F ",[323,449,450],{},"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.",[320,453,454],{},"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.",[320,456,457,458,461,462,465],{},"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 ",[323,459,460],{},"@studiolxd\u002Freact-scorm"," at v2.0.0 and carrying no community yet. The MIT licence file sits inside ",[323,463,464],{},"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":359,"searchDepth":360,"depth":360,"links":467},[],[126],"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",[472],{"q":473,"a":474},"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",[374,381],{"model":383,"source":480},"https:\u002F\u002Fgithub.com\u002Fstudiolxd\u002Fscorm",[],{"description":469},{"scorm12":484,"scorm2004":486,"xapi":491,"cmi5":492},{"supported":378,"provenance":390,"checkedAt":312,"source":485},"https:\u002F\u002Fgithub.com\u002Fstudiolxd\u002Fscorm\u002Fblob\u002Fmain\u002Fpackages\u002Fscorm\u002Fsrc\u002Fcore\u002Fscorm12-driver.ts",{"supported":378,"editions":487,"provenance":390,"checkedAt":312,"source":489,"note":490},[488],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"active","tools\u002Fstudiolxd-scorm","Headless SCORM 1.2 and 2004 runtime with React, Vue, Angular, Svelte and Web Component adapters",[404,403,497,498],"runtime","content-side","PTJfy8djcv6kQ_HBa0T6ofG0PEF9nw_HHg9i9Ixkq7Y",{"id":501,"title":502,"addedAt":312,"alternatives":503,"body":504,"categories":548,"checkedAt":312,"claimed":363,"description":549,"docs":363,"editorsPick":365,"extension":366,"faq":550,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":551,"name":552,"navigation":378,"openSource":378,"path":553,"platforms":554,"pricing":555,"registries":557,"repo":556,"seo":558,"standards":559,"status":399,"stem":566,"tagline":567,"tags":568,"vendor":363,"website":556,"__hash__":571},"tools\u002Ftools\u002Fszenadam-scorm-api-wrapper.md","Szenadam Scorm Api Wrapper",[],{"type":317,"value":505,"toc":546},[506,529,536,539],[320,507,508,509,330,511,330,513,330,515,330,518,340,521,524,525,528],{},"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 ",[323,510,329],{},[323,512,333],{},[323,514,336],{},[323,516,517],{},"status",[323,519,520],{},"save",[323,522,523],{},"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 ",[323,526,527],{},"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.",[320,530,531,532,535],{},"The audience is narrow but real: a TypeScript project that wants the pipwerks behaviour without a ",[323,533,534],{},"declare module"," shim or a hand-written type file. If you do not need types, the original is better attended.",[320,537,538],{},"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.",[320,540,541,542,545],{},"Weigh the maintenance state before adopting it. The last commit to ",[323,543,544],{},"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":359,"searchDepth":360,"depth":360,"links":547},[],[126],"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",[374],{"model":383,"source":556},"https:\u002F\u002Fgithub.com\u002Fszenadam\u002Fscorm-api-wrapper",[],{"description":549},{"scorm12":560,"scorm2004":563},{"supported":378,"provenance":390,"checkedAt":312,"source":561,"note":562},"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":378,"editions":564,"provenance":390,"checkedAt":312,"source":561,"note":565},[],"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",[403,569,570],"api-wrapper","npm","zXUV-JIu1sG3A-3hwL-s9cQhY_Hq4rJP1Gp5yJ0Nj7g",{"id":573,"title":574,"addedAt":312,"alternatives":575,"body":576,"categories":592,"checkedAt":312,"claimed":363,"description":580,"docs":593,"editorsPick":365,"extension":366,"faq":594,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":595,"name":596,"navigation":378,"openSource":378,"path":597,"platforms":598,"pricing":599,"registries":600,"repo":601,"seo":602,"standards":603,"status":399,"stem":613,"tagline":614,"tags":615,"vendor":363,"website":601,"__hash__":619},"tools\u002Ftools\u002Frescorm.md","Rescorm",[],{"type":317,"value":577,"toc":590},[578,581,584,587],[320,579,580],{},"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.",[320,582,583],{},"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.",[320,585,586],{},"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.",[320,588,589],{},"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":359,"searchDepth":360,"depth":360,"links":591},[],[126],"https:\u002F\u002Fgithub.com\u002Fagordillo\u002FRESCORM\u002Fwiki",[],{},"RESCORM","\u002Ftools\u002Frescorm",[374,381],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fagordillo\u002FRESCORM",{"description":580},{"scorm12":604,"scorm2004":608,"xapi":611,"cmi5":612},{"supported":378,"provenance":605,"checkedAt":312,"source":606,"note":607},"vendor-stated","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":378,"editions":609,"provenance":605,"checkedAt":312,"source":606,"note":610},[488],"The README states \"SCORM 1.2 and SCORM 2004 4th Edition support\". Not confirmed against the running code.\n",{"supported":365,"provenance":605,"checkedAt":312},{"supported":365,"provenance":605,"checkedAt":312},"tools\u002Frescorm","React boilerplate that ships SCORM tracking alongside the application code",[616,617,618],"react","boilerplate","redux","DKDhFrjkjeKYWk_T9gKN2zygFQPkXauCxtxvXeTJWIk",{"id":621,"title":622,"addedAt":312,"alternatives":623,"body":624,"categories":657,"checkedAt":312,"claimed":363,"description":658,"docs":659,"editorsPick":365,"extension":366,"faq":660,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":667,"name":668,"navigation":378,"openSource":378,"path":669,"platforms":670,"pricing":671,"registries":673,"repo":674,"seo":675,"standards":676,"status":399,"stem":686,"tagline":687,"tags":688,"vendor":689,"website":674,"__hash__":690},"tools\u002Ftools\u002Freact-scorm-provider.md","React Scorm Provider",[314,315],{"type":317,"value":625,"toc":655},[626,637,640],[320,627,628,629,632,633,636],{},"React SCORM Provider is a two-part library from the US agency S4 NetQuest: a ",[323,630,631],{},"ScormProvider"," component that opens the LMS connection once near the root of the tree, and a ",[323,634,635],{},"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.",[320,638,639],{},"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.",[320,641,642,643,646,647,650,651,654],{},"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 ",[323,644,645],{},"react-autobind",". It does use ",[323,648,649],{},"React.createContext"," and exports the context object, so you can call ",[323,652,653],{},"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":359,"searchDepth":360,"depth":360,"links":656},[],[126],"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",[661,664],{"q":662,"a":663},"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":665,"a":666},"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",[374,381],{"model":383,"source":672},"https:\u002F\u002Fgithub.com\u002FS4-NetQuest\u002Freact-scorm-provider\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FS4-NetQuest\u002Freact-scorm-provider",{"description":658},{"scorm12":677,"scorm2004":680,"xapi":683,"cmi5":684,"aicc":685},{"supported":378,"provenance":390,"checkedAt":312,"source":678,"note":679},"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":378,"editions":681,"provenance":390,"checkedAt":312,"source":678,"note":682},[],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Freact-scorm-provider","A React context and higher-order component over the pipwerks SCORM wrapper",[616,404,405],"S4 NetQuest","HtZF2_aRGjZ7Y76ATNQNE6nv331einRrtr_ro6AqI_s",{"id":692,"title":693,"addedAt":312,"alternatives":694,"body":695,"categories":726,"checkedAt":312,"claimed":363,"description":727,"docs":728,"editorsPick":365,"extension":366,"faq":729,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":735,"listing":376,"logo":363,"meta":736,"name":737,"navigation":378,"openSource":378,"path":738,"platforms":739,"pricing":740,"registries":742,"repo":741,"seo":743,"standards":744,"status":493,"stem":756,"tagline":757,"tags":758,"vendor":759,"website":760,"__hash__":761},"tools\u002Ftools\u002Fscobot.md","Scobot",[],{"type":317,"value":696,"toc":724},[697,711,718,721],[320,698,699,700,340,703,706,707,710],{},"SCOBot is a JavaScript wrapper that sits between courseware and the SCORM run-time API, so that content authors write ",[323,701,702],{},"setInteraction()",[323,704,705],{},"setBookmark()"," rather than hand-building ",[323,708,709],{},"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.",[320,712,713,714,717],{},"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 ",[323,715,716],{},"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.",[320,719,720],{},"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.",[320,722,723],{},"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":359,"searchDepth":360,"depth":360,"links":725},[],[126],"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",[730,732],{"q":473,"a":731},"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":733,"a":734},"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",[374,381],{"model":383,"source":741},"https:\u002F\u002Fgithub.com\u002Fcybercussion\u002FSCOBot",[],{"description":727},{"scorm12":745,"scorm2004":748,"xapi":754,"cmi5":755},{"supported":378,"provenance":390,"checkedAt":312,"source":746,"note":747},"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":378,"editions":749,"provenance":390,"checkedAt":312,"source":752,"note":753},[750,751,488],"2nd","3rd","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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fscobot","SCORM 1.2 and 2004 content wrapper with a mock LMS for working offline",[404,405,374],"Cybercussion Interactive, LLC","https:\u002F\u002Fcybercussion.com\u002Fscobot","RX6fbni4wpqsONuYUsqZoQaRmIXdJyyYRwKzYaas5jQ",{"id":763,"title":764,"addedAt":312,"alternatives":765,"body":766,"categories":805,"checkedAt":312,"claimed":363,"description":806,"docs":363,"editorsPick":365,"extension":366,"faq":807,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":814,"license":375,"listing":376,"logo":363,"meta":815,"name":816,"navigation":378,"openSource":378,"path":817,"platforms":818,"pricing":819,"registries":821,"repo":822,"seo":823,"standards":824,"status":493,"stem":831,"tagline":832,"tags":833,"vendor":835,"website":822,"__hash__":836},"tools\u002Ftools\u002Fscol-r.md","Scol R",[],{"type":317,"value":767,"toc":803},[768,783,797,800],[320,769,770,771,774,775,778,779,782],{},"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 ",[323,772,773],{},"index.html"," loads a remote URL in an iframe and relays the SCORM API across the origin boundary by ",[323,776,777],{},"postMessage",", so the remote application can call ",[323,780,781],{},"LMSSetValue"," as if it were inside the package.",[320,784,785,786,789,790,330,793,796],{},"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, ",[323,787,788],{},"cmi.core.student_id"," versus ",[323,791,792],{},"cmi.learner_id",[323,794,795],{},"cmi.progress_measure"," having no 1.2 equivalent — rather than pretending the two versions are the same.",[320,798,799],{},"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.",[320,801,802],{},"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":359,"searchDepth":360,"depth":360,"links":804},[],[126],"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.",[808,811],{"q":809,"a":810},"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":812,"a":813},"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","FR",{},"SCOL-R","\u002Ftools\u002Fscol-r",[374,381],{"model":383,"currency":820,"freeTier":378},"USD",[],"https:\u002F\u002Fgithub.com\u002FDidask\u002Fscol-r",{"description":806},{"scorm12":825,"scorm2004":828},{"supported":378,"provenance":390,"checkedAt":312,"source":826,"note":827},"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":378,"editions":829,"provenance":390,"checkedAt":312,"source":826,"note":830},[],"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",[405,834,403],"cross-origin","Didask","b87d5NLwFFGX90QObDQXiVpn0Y2UaLD7hML-EKEjIus",{"id":838,"title":839,"addedAt":312,"alternatives":840,"body":841,"categories":857,"checkedAt":312,"claimed":363,"description":845,"docs":858,"editorsPick":365,"extension":366,"faq":859,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":866,"listing":376,"logo":363,"meta":867,"name":868,"navigation":378,"openSource":378,"path":869,"platforms":870,"pricing":871,"registries":873,"repo":874,"seo":875,"standards":876,"status":493,"stem":888,"tagline":889,"tags":890,"vendor":894,"website":895,"__hash__":896},"tools\u002Ftools\u002Fscorm-cloud-api-clients.md","Scorm Cloud Api Clients",[],{"type":317,"value":842,"toc":855},[843,846,849,852],[320,844,845],{},"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.",[320,847,848],{},"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.",[320,850,851],{},"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.",[320,853,854],{},"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":359,"searchDepth":360,"depth":360,"links":856},[],[126],"https:\u002F\u002Fcloud.scorm.com\u002Fdocs\u002Fv2\u002Freference\u002F",[860,863],{"q":861,"a":862},"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":864,"a":865},"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","Apache-2.0",{},"SCORM Cloud API v2 clients","\u002Ftools\u002Fscorm-cloud-api-clients",[374],{"model":383,"source":872},"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fscormcloud-api-v2-client-java\u002Fblob\u002Fmaster\u002FLICENSE",[],"https:\u002F\u002Fgithub.com\u002FRusticiSoftware\u002Fscormcloud-api-v2-client-java",{"description":845},{"scorm12":877,"scorm2004":880,"aicc":882,"cmi5":883,"xapi":885},{"supported":378,"provenance":390,"checkedAt":312,"source":878,"note":879},"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":378,"editions":881,"provenance":390,"checkedAt":312,"source":878},[750,751,488],{"supported":378,"provenance":390,"checkedAt":312,"source":878},{"supported":378,"provenance":390,"checkedAt":312,"source":878,"note":884},"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":378,"provenance":390,"checkedAt":312,"source":886,"note":887},"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",[891,892,893],"api-client","scorm-cloud","generated","Rustici Software","https:\u002F\u002Fcloud.scorm.com","r9VbvOwfgJOkK3Aeg0Zd61NKtSzr1te5q7gNfCAhY5Q",{"id":898,"title":899,"addedAt":312,"alternatives":900,"body":901,"categories":936,"checkedAt":312,"claimed":363,"description":937,"docs":363,"editorsPick":365,"extension":366,"faq":938,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":942,"listing":376,"logo":363,"meta":943,"name":944,"navigation":378,"openSource":378,"path":945,"platforms":946,"pricing":947,"registries":948,"repo":949,"seo":950,"standards":951,"status":399,"stem":962,"tagline":963,"tags":964,"vendor":967,"website":949,"__hash__":968},"tools\u002Ftools\u002Fpipwerks-scorm-manifests.md","Pipwerks Scorm Manifests",[],{"type":317,"value":902,"toc":934},[903,913,924,931],[320,904,905,906,909,910,912],{},"Two directories, each containing an ",[323,907,908],{},"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 ",[323,911,773],{},", and the readme lists the five or six strings you need to change — course identifier, version, organisation code, and the two title elements.",[320,914,915,916,919,920,923],{},"The useful detail is structural. The XSDs live in a ",[323,917,918],{},"SCORM-schemas\u002F"," subfolder with ",[323,921,922],{},"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.",[320,925,926,927,930],{},"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 ",[323,928,929],{},"href"," values exist — and it does not cover multi-SCO organisations, sequencing rules or metadata, which is where manifests actually get difficult.",[320,932,933],{},"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":359,"searchDepth":360,"depth":360,"links":935},[],[126],"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.",[939],{"q":940,"a":941},"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",[374],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002FSCORM-Manifests",{"description":937},{"scorm12":952,"scorm2004":955,"xapi":959,"cmi5":960,"aicc":961},{"supported":378,"provenance":390,"checkedAt":312,"source":953,"note":954},"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":378,"editions":956,"provenance":390,"checkedAt":312,"source":957,"note":958},[488],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fpipwerks-scorm-manifests","Boilerplate imsmanifest.xml files for single-SCO SCORM 1.2 and 2004 packages",[965,617,966],"manifest","templates","Philip Hutchison","Lf07ximFS_rZBONWgXpLgWmVy1cm8zMKI6EBy1WP7c0",{"id":970,"title":971,"addedAt":312,"alternatives":972,"body":973,"categories":1006,"checkedAt":312,"claimed":363,"description":1007,"docs":363,"editorsPick":365,"extension":366,"faq":1008,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1012,"name":1013,"navigation":378,"openSource":378,"path":1014,"platforms":1015,"pricing":1016,"registries":1017,"repo":1018,"seo":1019,"standards":1020,"status":399,"stem":1027,"tagline":1028,"tags":1029,"vendor":1031,"website":1018,"__hash__":1032},"tools\u002Ftools\u002Fscormify.md","Scormify",[314,315],{"type":317,"value":974,"toc":1004},[975,991,994,1001],[320,976,977,978,980,981,984,985,340,988,990],{},"SCORMify is about as small as a SCORM wrapper gets: a manifest, an ",[323,979,773],{},", and roughly sixty lines of JavaScript that find the LMS API object, call ",[323,982,983],{},"LMSInitialize",", and expose two helpers for writing ",[323,986,987],{},"cmi.core.score.raw",[323,989,442],{},". You drop your own HTML, CSS, video and scripts into the folder, zip it, and upload.",[320,992,993],{},"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.",[320,995,996,997,1000],{},"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 ",[323,998,999],{},"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.",[320,1002,1003],{},"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":359,"searchDepth":360,"depth":360,"links":1005},[],[126],"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.",[1009],{"q":1010,"a":1011},"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",[374,381],{"model":383,"currency":820,"freeTier":378},[],"https:\u002F\u002Fgithub.com\u002FLitmos\u002FSCORMify",{"description":1007},{"scorm12":1021,"scorm2004":1024},{"supported":378,"provenance":390,"checkedAt":312,"source":1022,"note":1023},"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":365,"editions":1025,"provenance":390,"checkedAt":312,"note":1026},[],"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",[405,404,1030],"scorm-1-2","Litmos","jLPP_aw2ui0YHdDoASdD_HcVJzNGuoDgUpcy3DFjR0w",{"id":1034,"title":1035,"addedAt":312,"alternatives":1036,"body":1037,"categories":1066,"checkedAt":312,"claimed":363,"description":1067,"docs":1068,"editorsPick":365,"extension":366,"faq":1069,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1076,"name":1035,"navigation":378,"openSource":378,"path":1077,"platforms":1078,"pricing":1080,"registries":1082,"repo":1081,"seo":1083,"standards":1084,"status":493,"stem":1096,"tagline":1097,"tags":1098,"vendor":363,"website":1102,"__hash__":1103},"tools\u002Ftools\u002Ftessera.md","Tessera",[],{"type":317,"value":1038,"toc":1064},[1039,1055,1058,1061],[320,1040,1041,1042,330,1045,330,1048,330,1051,1054],{},"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 (",[323,1043,1044],{},"useQuestion",[323,1046,1047],{},"useQuiz",[323,1049,1050],{},"useCompletion",[323,1052,1053],{},"usePersistence","), and one command packages the result for a target standard.",[320,1056,1057],{},"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.",[320,1059,1060],{},"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.",[320,1062,1063],{},"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":359,"searchDepth":360,"depth":360,"links":1065},[],[126],"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",[1070,1073],{"q":1071,"a":1072},"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":1074,"a":1075},"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",[374,1079,381],"cli",{"model":383,"source":1081},"https:\u002F\u002Fgithub.com\u002Fredmodd\u002Ftessera",[],{"description":1067},{"scorm12":1085,"scorm2004":1087,"xapi":1090,"cmi5":1093},{"supported":378,"provenance":390,"checkedAt":312,"source":1086},"https:\u002F\u002Fgithub.com\u002Fredmodd\u002Ftessera\u002Fblob\u002Fmain\u002Fpackages\u002Ftessera-learn\u002Fsrc\u002Fplugin\u002Fexport.ts",{"supported":378,"editions":1088,"provenance":390,"checkedAt":312,"source":1086,"note":1089},[488],"The exporter writes \u003Cschemaversion>2004 4th Edition\u003C\u002Fschemaversion>; 2nd and 3rd Edition manifests are not offered.\n",{"supported":378,"provenance":390,"checkedAt":312,"source":1091,"note":1092},"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":378,"provenance":390,"checkedAt":312,"source":1094,"note":1095},"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",[404,1099,1100,1101],"svelte","packager","code-first","https:\u002F\u002Ftesseralearn.dev","195x-qN4w1g7NPQa78OtQdnkYOLyXk8uZmRkKLnGokE",{"id":1105,"title":1106,"addedAt":312,"alternatives":1107,"body":1108,"categories":1147,"checkedAt":312,"claimed":363,"description":1148,"docs":363,"editorsPick":365,"extension":366,"faq":1149,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":866,"listing":376,"logo":363,"meta":1156,"name":1157,"navigation":378,"openSource":378,"path":1158,"platforms":1159,"pricing":1160,"registries":1162,"repo":1161,"seo":1163,"standards":1164,"status":493,"stem":1171,"tagline":1172,"tags":1173,"vendor":363,"website":1161,"__hash__":1177},"tools\u002Ftools\u002Funity-scorm-integration-kit.md","Unity Scorm Integration Kit",[],{"type":317,"value":1109,"toc":1145},[1110,1120,1123,1134],[320,1111,1112,1113,1116,1117,1119],{},"A Unity editor package that turns a WebGL build into a SCORM 2004 course. You drop a ",[323,1114,1115],{},"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 ",[323,1118,908],{},", bundles the 2004 schemas and zips the build into a package interchange file.",[320,1121,1122],{},"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.",[320,1124,1125,1126,1129,1130,1133],{},"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 ",[323,1127,1128],{},"Library\u002F"," folder committed, which makes it large and awkward to consume as a dependency; in practice you import the ",[323,1131,1132],{},".unitypackage",".",[320,1135,1136,1137,1140,1141,1144],{},"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 ",[323,1138,1139],{},"Pointer_stringify"," with ",[323,1142,1143],{},"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":359,"searchDepth":360,"depth":360,"links":1146},[],[126],"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.",[1150,1153],{"q":1151,"a":1152},"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":1154,"a":1155},"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",[374,381],{"model":383,"source":1161},"https:\u002F\u002Fgithub.com\u002Frstals\u002FUnity-SCORM-Integration-Kit",[],{"description":1148},{"scorm12":1165,"scorm2004":1167},{"supported":365,"provenance":390,"checkedAt":312,"note":1166},"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":378,"editions":1168,"provenance":390,"checkedAt":312,"source":1169,"note":1170},[488],"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#",[1174,1175,1176,1100],"unity","csharp","webgl","6ytyN2Xof6sbF2QhYbSkHXhR-G-Y0T48trVc_QEBU2M",{"id":1179,"title":1180,"addedAt":312,"alternatives":1181,"body":1182,"categories":1229,"checkedAt":312,"claimed":363,"description":1230,"docs":1231,"editorsPick":365,"extension":366,"faq":1232,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":866,"listing":376,"logo":363,"meta":1236,"name":1237,"navigation":378,"openSource":378,"path":1238,"platforms":1239,"pricing":1240,"registries":1242,"repo":1241,"seo":1243,"standards":1244,"status":399,"stem":1252,"tagline":1253,"tags":1254,"vendor":363,"website":1257,"__hash__":1258},"tools\u002Ftools\u002Fdart-scorm.md","Dart Scorm",[],{"type":317,"value":1183,"toc":1227},[1184,1218,1221,1224],[320,1185,1186,1187,1190,1191,1193,1194,1197,1198,1201,1202,330,1204,330,1207,330,1210,330,1212,340,1215,1217],{},"A small Dart package that lets a Flutter or Dart web application talk to the LMS that launched it. ",[323,1188,1189],{},"ScormAPI.findApi()"," walks the window hierarchy and then the ",[323,1192,421],{}," hierarchy looking for an API object — preferring SCORM 2004's ",[323,1195,1196],{},"API_1484_11"," and falling back to 1.2's ",[323,1199,1200],{},"API"," — after which ",[323,1203,329],{},[323,1205,1206],{},"getValue",[323,1208,1209],{},"setValue",[323,1211,339],{},[323,1213,1214],{},"finish",[323,1216,343],{}," pass calls straight through to JavaScript.",[320,1219,1220],{},"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.",[320,1222,1223],{},"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.",[320,1225,1226],{},"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":359,"searchDepth":360,"depth":360,"links":1228},[],[126],"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",[1233],{"q":1234,"a":1235},"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",[374,381],{"model":383,"source":1241},"https:\u002F\u002Fgithub.com\u002Fshripal17\u002Fdart_scorm",[],{"description":1230},{"scorm12":1245,"scorm2004":1247,"xapi":1250,"cmi5":1251},{"supported":378,"provenance":390,"checkedAt":312,"source":1246},"https:\u002F\u002Fgithub.com\u002Fshripal17\u002Fdart_scorm\u002Fblob\u002Fmain\u002Flib\u002Fsrc\u002Fscorm_version_extension.dart",{"supported":378,"editions":1248,"provenance":390,"checkedAt":312,"source":1246,"note":1249},[],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fdart-scorm","SCORM 1.2 and 2004 bindings for Flutter and Dart web applications",[1255,1256,498,374],"dart","flutter","https:\u002F\u002Fpub.dev\u002Fpackages\u002Fscorm","Pm-Hphr-BRtTaGtLBM9-TTlnT19DUJjRvHSCcEwDSNE",{"id":1260,"title":1261,"addedAt":312,"alternatives":1262,"body":1263,"categories":1279,"checkedAt":312,"claimed":363,"description":1267,"docs":363,"editorsPick":365,"extension":366,"faq":1280,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":866,"listing":376,"logo":363,"meta":1287,"name":1288,"navigation":378,"openSource":378,"path":1289,"platforms":1290,"pricing":1291,"registries":1292,"repo":1293,"seo":1294,"standards":1295,"status":493,"stem":1307,"tagline":1308,"tags":1309,"vendor":1314,"website":1293,"__hash__":1315},"tools\u002Ftools\u002Felearning-module-parser.md","Elearning Module Parser",[],{"type":317,"value":1264,"toc":1277},[1265,1268,1271,1274],[320,1266,1267],{},"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.",[320,1269,1270],{},"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.",[320,1272,1273],{},"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.",[320,1275,1276],{},"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":359,"searchDepth":360,"depth":360,"links":1278},[],[126],[1281,1284],{"q":1282,"a":1283},"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":1285,"a":1286},"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",[374],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Felearning-module-parser",{"description":1267},{"scorm12":1296,"scorm2004":1298,"aicc":1301,"cmi5":1303,"xapi":1305},{"supported":378,"provenance":605,"checkedAt":312,"source":1297},"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Felearning-module-parser#supported-formats",{"supported":378,"editions":1299,"provenance":605,"checkedAt":312,"source":1297,"note":1300},[750,751,488],"Detected by SCORM 2004 namespaces in imsmanifest.xml; the parser surfaces the declared edition along with sequencing, rollup rules and delivery controls.\n",{"supported":378,"provenance":605,"checkedAt":312,"source":1297,"note":1302},"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":378,"provenance":605,"checkedAt":312,"source":1297,"note":1304},"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":378,"provenance":605,"checkedAt":312,"source":1297,"note":1306},"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",[1310,1311,1312,1313],"java","manifest-parser","ingest","maven","Jonathan Putney","ux031EO1e9qifq03FgHsDGzaj4ZXyNlx_IEmKg4rx1o",{"id":1317,"title":1318,"addedAt":312,"alternatives":1319,"body":1320,"categories":1351,"checkedAt":312,"claimed":363,"description":1352,"docs":1353,"editorsPick":365,"extension":366,"faq":1354,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1358,"name":1359,"navigation":378,"openSource":378,"path":1360,"platforms":1361,"pricing":1362,"registries":1364,"repo":1363,"seo":1365,"standards":1366,"status":399,"stem":1373,"tagline":1374,"tags":1375,"vendor":363,"website":1363,"__hash__":1378},"tools\u002Ftools\u002Fgrunt-scorm-manifest.md","Grunt Scorm Manifest",[],{"type":317,"value":1321,"toc":1349},[1322,1328,1335,1342],[320,1323,1324,1325,1327],{},"This is a Grunt plugin that generates an ",[323,1326,908],{}," 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.",[320,1329,1330,1331,1334],{},"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 ",[323,1332,1333],{},"adlcp:scormtype"," attribute, which is exactly the trap it exists to spare you.",[320,1336,1337,1338,1341],{},"The reasons not to depend on it are practical rather than moral. Grunt itself is largely out of use, the required version is ",[323,1339,1340],{},"~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.",[320,1343,1344,1345,1348],{},"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 ",[323,1346,1347],{},"switch"," statement, this file is a clearer read than the ADL specification.",{"title":359,"searchDepth":360,"depth":360,"links":1350},[],[126],"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",[1355],{"q":1356,"a":1357},"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",[1079,374],{"model":383,"source":1363},"https:\u002F\u002Fgithub.com\u002Fraygesualdo\u002Fgrunt-scorm-manifest",[],{"description":1352},{"scorm12":1367,"scorm2004":1370},{"supported":378,"provenance":390,"checkedAt":312,"source":1368,"note":1369},"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":378,"editions":1371,"provenance":390,"checkedAt":312,"source":1368,"note":1372},[751],"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",[1376,965,1377],"build-tool","unmaintained","RUCoc1HvpKfk_nq9s6lf8XNMDrsoxm5SumzwaH8E79Q",{"id":1380,"title":1381,"addedAt":312,"alternatives":1382,"body":1383,"categories":1436,"checkedAt":312,"claimed":363,"description":1437,"docs":1438,"editorsPick":365,"extension":366,"faq":1439,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1443,"name":1444,"navigation":378,"openSource":378,"path":1445,"platforms":1446,"pricing":1447,"registries":1448,"repo":1449,"seo":1450,"standards":1451,"status":399,"stem":1458,"tagline":1459,"tags":1460,"vendor":363,"website":1449,"__hash__":1462},"tools\u002Ftools\u002Fngx-scorm-wrapper.md","Ngx Scorm Wrapper",[],{"type":317,"value":1384,"toc":1434},[1385,1425,1428,1431],[320,1386,1387,1388,1391,1392,1395,1396,330,1399,1402,1403,1406,1407,330,1410,1413,1414,1417,1418,1413,1421,1424],{},"ngx-scorm-wrapper is a port of the older AngularJS SCORM wrapper by patamechanix to Angular's dependency-injection model. You add ",[323,1389,1390],{},"ScormWrapperModule"," to your imports, inject ",[323,1393,1394],{},"ScormWrapperService"," into a component, and call ",[323,1397,1398],{},"doLMSInitialize",[323,1400,1401],{},"doLMSGetValue"," and so on without thinking about which global the LMS happened to expose. A ",[323,1404,1405],{},"version"," setting of ",[323,1408,1409],{},"Auto",[323,1411,1412],{},"1.2"," or ",[323,1415,1416],{},"2004"," decides whether the service binds to ",[323,1419,1420],{},"window.API",[323,1422,1423],{},"window.API_1484_11",", and every call is dispatched through a pair of method names so the rest of your code stays version-agnostic.",[320,1426,1427],{},"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.",[320,1429,1430],{},"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.",[320,1432,1433],{},"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":359,"searchDepth":360,"depth":360,"links":1435},[],[126],"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",[1440],{"q":1441,"a":1442},"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",[374,381],{"model":383,"currency":820,"freeTier":378},[],"https:\u002F\u002Fgithub.com\u002FDadUndead\u002Fngx-scorm-wrapper",{"description":1437},{"scorm12":1452,"scorm2004":1455},{"supported":378,"provenance":390,"checkedAt":312,"source":1453,"note":1454},"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":378,"editions":1456,"provenance":390,"checkedAt":312,"source":1453,"note":1457},[],"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",[1461,405,403],"angular","VewezAUayCmLmKZvcoSDgzJeXDAwyCi2iHyMtDpIn4s",{"id":1464,"title":1465,"addedAt":312,"alternatives":1466,"body":1467,"categories":1483,"checkedAt":312,"claimed":363,"description":1484,"docs":1485,"editorsPick":365,"extension":366,"faq":1486,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1490,"name":1491,"navigation":378,"openSource":378,"path":1492,"platforms":1493,"pricing":1494,"registries":1495,"repo":1496,"seo":1497,"standards":1498,"status":399,"stem":1507,"tagline":1508,"tags":1509,"vendor":363,"website":1496,"__hash__":1512},"tools\u002Ftools\u002Fnode-scorm-packager.md","Node Scorm Packager",[],{"type":317,"value":1468,"toc":1481},[1469,1475,1478],[320,1470,1471,1472,1474],{},"node-scorm-packager is a small Node module that takes a directory of finished HTML output, generates an ",[323,1473,908],{}," 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.",[320,1476,1477],{},"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.",[320,1479,1480],{},"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":359,"searchDepth":360,"depth":360,"links":1482},[],[126],"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",[1487],{"q":1488,"a":1489},"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",{},"node-scorm-packager","\u002Ftools\u002Fnode-scorm-packager",[374,1079],{"model":383},[],"https:\u002F\u002Fgithub.com\u002FIvacko\u002Fnode-scorm-packager",{"description":1484},{"scorm12":1499,"scorm2004":1502,"xapi":1505,"cmi5":1506},{"supported":378,"provenance":390,"checkedAt":312,"source":1500,"note":1501},"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":378,"editions":1503,"provenance":390,"checkedAt":312,"source":1500,"note":1504},[751,488],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fnode-scorm-packager","Node library that writes an imsmanifest and lays out a SCORM course directory",[1510,570,1511],"node","build-step","fPSfK6eUwJXE3myvRjWprNO4yMq2MpO6PSXgWZ3l0WY",{"id":1514,"title":1515,"addedAt":312,"alternatives":1516,"body":1517,"categories":1533,"checkedAt":312,"claimed":363,"description":1521,"docs":1534,"editorsPick":365,"extension":366,"faq":1535,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1542,"name":1543,"navigation":378,"openSource":378,"path":1544,"platforms":1545,"pricing":1546,"registries":1547,"repo":1548,"seo":1549,"standards":1550,"status":399,"stem":1560,"tagline":1561,"tags":1562,"vendor":967,"website":1548,"__hash__":1564},"tools\u002Ftools\u002Fpipwerks-scorm-api-wrapper.md","Pipwerks Scorm Api Wrapper",[315],{"type":317,"value":1518,"toc":1531},[1519,1522,1525,1528],[320,1520,1521],{},"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.",[320,1523,1524],{},"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.",[320,1526,1527],{},"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.",[320,1529,1530],{},"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":359,"searchDepth":360,"depth":360,"links":1532},[],[126],"https:\u002F\u002Fpipwerks.com\u002F",[1536,1539],{"q":1537,"a":1538},"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":1540,"a":1541},"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",[374,381],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fpipwerks\u002Fscorm-api-wrapper",{"description":1521},{"scorm12":1551,"scorm2004":1554,"xapi":1557,"cmi5":1558,"aicc":1559},{"supported":378,"provenance":390,"checkedAt":312,"source":1552,"note":1553},"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":378,"editions":1555,"provenance":390,"checkedAt":312,"source":1552,"note":1556},[],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fpipwerks-scorm-api-wrapper","The JavaScript wrapper most SCORM courses have been built on since 2008",[404,405,1563],"actionscript","DeNkntMCct71XGuHm21tZix9_0xJ3CUg0dDhbtQw4cc",{"id":1566,"title":1567,"addedAt":312,"alternatives":1568,"body":1569,"categories":1602,"checkedAt":312,"claimed":363,"description":1603,"docs":363,"editorsPick":365,"extension":366,"faq":1604,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1608,"name":1609,"navigation":378,"openSource":378,"path":1610,"platforms":1611,"pricing":1612,"registries":1613,"repo":1614,"seo":1615,"standards":1616,"status":1626,"stem":1627,"tagline":1628,"tags":1629,"vendor":363,"website":1614,"__hash__":1632},"tools\u002Ftools\u002Fscorm-ruby-gem.md","Scorm Ruby Gem",[],{"type":317,"value":1570,"toc":1600},[1571,1591,1594,1597],[320,1572,1573,1574,1577,1578,330,1581,330,1584,340,1587,1590],{},"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, ",[323,1575,1576],{},"adlcp:scormType",", metadata — and can go the other way to bundle a directory into a valid package. A CLI wraps the same code with ",[323,1579,1580],{},"create",[323,1582,1583],{},"bundle",[323,1585,1586],{},"check",[323,1588,1589],{},"extract"," subcommands, which makes it usable from a Rakefile or a deploy script without writing any Ruby.",[320,1592,1593],{},"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.",[320,1595,1596],{},"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.",[320,1598,1599],{},"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":359,"searchDepth":360,"depth":360,"links":1601},[],[126],"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.",[1605],{"q":1606,"a":1607},"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",[374,1079],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fmindset\u002Fscorm",{"description":1603},{"scorm12":1617,"scorm2004":1620,"aicc":1623,"xapi":1624,"cmi5":1625},{"supported":378,"provenance":390,"checkedAt":312,"source":1618,"note":1619},"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":378,"editions":1621,"provenance":390,"checkedAt":312,"source":1618,"note":1622},[751],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"maintained","tools\u002Fscorm-ruby-gem","Reads, checks and builds SCORM packages from Ruby, with a small CLI alongside",[1630,1311,1079,1631],"ruby","packaging","iIe1kXyeJqitHQjGq9ihge2_dZ3ZDHGeq-Tc0VwAQCM",{"id":1634,"title":1635,"addedAt":312,"alternatives":1636,"body":1637,"categories":1658,"checkedAt":312,"claimed":363,"description":1659,"docs":1660,"editorsPick":365,"extension":366,"faq":1661,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1668,"name":315,"navigation":378,"openSource":378,"path":1669,"platforms":1670,"pricing":1671,"registries":1672,"repo":1673,"seo":1674,"standards":1675,"status":493,"stem":1687,"tagline":1688,"tags":1689,"vendor":1314,"website":1660,"__hash__":1691},"tools\u002Ftools\u002Fscorm-again.md","Scorm Again",[],{"type":317,"value":1638,"toc":1656},[1639,1647,1650,1653],[320,1640,1641,1642,340,1644,1646],{},"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 ",[323,1643,1200],{},[323,1645,1196],{}," 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.",[320,1648,1649],{},"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.",[320,1651,1652],{},"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.",[320,1654,1655],{},"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":359,"searchDepth":360,"depth":360,"links":1657},[],[126],"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",[1662,1665],{"q":1663,"a":1664},"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":1666,"a":1667},"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",[374,381],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Fscorm-again",{"description":1659},{"scorm12":1676,"scorm2004":1678,"aicc":1682,"xapi":1685,"cmi5":1686},{"supported":378,"provenance":390,"checkedAt":312,"source":1677},"https:\u002F\u002Fgithub.com\u002Fjcputney\u002Fscorm-again\u002Ftree\u002Fmaster\u002Fsrc\u002Fcmi\u002Fscorm12",{"supported":378,"editions":1679,"provenance":390,"checkedAt":312,"source":1680,"note":1681},[488],"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":365,"provenance":390,"checkedAt":312,"source":1683,"note":1684},"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fscorm-again","A tested JavaScript SCORM 1.2 and 2004 runtime for anything that has to host a course",[497,404,403,1690],"sequencing","2wPbs5QofMDGQIFRLowDa09E5N_O7SleQTdr10sMYbM",{"id":1693,"title":1694,"addedAt":312,"alternatives":1695,"body":1696,"categories":1748,"checkedAt":312,"claimed":363,"description":1749,"docs":363,"editorsPick":365,"extension":366,"faq":1750,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1754,"name":1755,"navigation":378,"openSource":378,"path":1756,"platforms":1757,"pricing":1758,"registries":1759,"repo":1760,"seo":1761,"standards":1762,"status":493,"stem":1769,"tagline":1770,"tags":1771,"vendor":363,"website":1760,"__hash__":1774},"tools\u002Ftools\u002Fscorm-godot-plugin.md","Scorm Godot Plugin",[],{"type":317,"value":1697,"toc":1746},[1698,1713,1740,1743],[320,1699,1700,1701,1704,1705,1708,1709,1712],{},"This is a Godot 4 editor addon for the specific case of shipping a browser game as an LMS module. It adds a ",[323,1702,1703],{},"Scorm"," autoload that GDScript can call directly — ",[323,1706,1707],{},"set_lesson_status(LessonStatus.COMPLETED)",", a score setter, bookmark and suspend-data accessors — and a ",[323,1710,1711],{},"ScormExport"," hook that watches for a web export and packages the output into a SCORM zip with a manifest already in place.",[320,1714,1715,1716,1719,1720,340,1722,1725,1726,1728,1729,1732,1733,1735,1736,1739],{},"The runtime half is a conventional SCORM 1.2 JavaScript shim: the usual seven-level ",[323,1717,1718],{},"findAPI"," walk up ",[323,1721,418],{},[323,1723,1724],{},"window.opener",", then ",[323,1727,983],{}," and reads and writes against ",[323,1730,1731],{},"cmi.core.*",". The useful design decision is what the plugin does on your behalf — it sets ",[323,1734,716],{}," to ",[323,1737,1738],{},"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.",[320,1741,1742],{},"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.",[320,1744,1745],{},"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":359,"searchDepth":360,"depth":360,"links":1747},[],[126],"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.",[1751],{"q":1752,"a":1753},"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",[381,374],{"model":383,"currency":820,"freeTier":378},[],"https:\u002F\u002Fgithub.com\u002Farahenda\u002Fscorm-godot-plugin",{"description":1749},{"scorm12":1763,"scorm2004":1766},{"supported":378,"provenance":390,"checkedAt":312,"source":1764,"note":1765},"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":365,"editions":1767,"provenance":390,"checkedAt":312,"note":1768},[],"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",[1772,1773,1631],"godot","games","tW5QENRsrxLgCR1sv4jCVtrZpAbgNBow2hx2SnIEgZo",{"id":1776,"title":1777,"addedAt":312,"alternatives":1778,"body":1779,"categories":1803,"checkedAt":312,"claimed":363,"description":1804,"docs":363,"editorsPick":365,"extension":366,"faq":1805,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1812,"name":1813,"navigation":378,"openSource":378,"path":1814,"platforms":1815,"pricing":1816,"registries":1817,"repo":1818,"seo":1819,"standards":1820,"status":493,"stem":1832,"tagline":1833,"tags":1834,"vendor":363,"website":1818,"__hash__":1838},"tools\u002Ftools\u002Fscorm-kit.md","Scorm Kit",[315],{"type":317,"value":1780,"toc":1801},[1781,1792,1795,1798],[320,1782,1783,1784,1787,1788,1791],{},"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 ",[323,1785,1786],{},"report"," command that aggregates three of those into one score. Everything takes ",[323,1789,1790],{},"--json"," and returns conventional exit codes, which is the point — it is designed to sit in CI rather than to be run by hand.",[320,1793,1794],{},"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.",[320,1796,1797],{},"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.",[320,1799,1800],{},"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":359,"searchDepth":360,"depth":360,"links":1802},[],[126],"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.",[1806,1809],{"q":1807,"a":1808},"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":1810,"a":1811},"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",[1079],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fparthdhanani\u002Fscorm-kit",{"description":1804},{"scorm12":1821,"scorm2004":1824,"cmi5":1827,"xapi":1830},{"supported":378,"provenance":390,"checkedAt":312,"source":1822,"note":1823},"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":365,"editions":1825,"provenance":390,"checkedAt":312,"note":1826},[],"A 2004 package is reported as an error by `lint`, and the mock runtime does not expose `API_1484_11`.\n",{"supported":378,"provenance":390,"checkedAt":312,"source":1828,"note":1829},"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":365,"provenance":390,"checkedAt":312,"note":1831},"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",[1079,1835,1836,1837],"linting","accessibility","ci","PtcNi46OIs-ton7ff6w-u_0NNiNjSeL-dMW19Cra7ag",{"id":1840,"title":1841,"addedAt":312,"alternatives":1842,"body":1843,"categories":1871,"checkedAt":312,"claimed":363,"description":1872,"docs":1873,"editorsPick":365,"extension":366,"faq":1874,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1881,"name":1882,"navigation":378,"openSource":378,"path":1883,"platforms":1884,"pricing":1885,"registries":1887,"repo":1886,"seo":1888,"standards":1889,"status":493,"stem":1898,"tagline":1899,"tags":1900,"vendor":363,"website":1886,"__hash__":1902},"tools\u002Ftools\u002Fscorm-mcp-server.md","Scorm Mcp Server",[],{"type":317,"value":1844,"toc":1869},[1845,1852,1863,1866],[320,1846,1847,1848,1851],{},"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 ",[323,1849,1850],{},"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.",[320,1853,1854,1855,1413,1857,1859,1860,1862],{},"The runtime is version-adaptive: it binds to whichever API the host exposes, ",[323,1856,1196],{},[323,1858,1200],{},", and maps the data model accordingly — one ",[323,1861,716],{}," 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.",[320,1864,1865],{},"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.",[320,1867,1868],{},"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":359,"searchDepth":360,"depth":360,"links":1870},[],[126],"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",[1875,1878],{"q":1876,"a":1877},"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":1879,"a":1880},"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",[1079,374],{"model":383,"source":1886},"https:\u002F\u002Fgithub.com\u002Fgiacomomaria81\u002Fscorm-mcp-server",[],{"description":1872},{"scorm12":1890,"scorm2004":1893,"xapi":1896,"cmi5":1897},{"supported":378,"provenance":390,"checkedAt":312,"source":1891,"note":1892},"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":378,"editions":1894,"provenance":390,"checkedAt":312,"source":1891,"note":1895},[488],"The default output is a '2004 4th Edition' manifest. No 2nd or 3rd Edition option exists.\n",{"supported":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fscorm-mcp-server","An MCP tool that wraps a finished HTML module into an offline SCORM package",[1901,1079,1631],"mcp","q17oyiyg9grM3joYh_9VVpQ4oovfFnBcEJMPcf588FE",{"id":1904,"title":1905,"addedAt":312,"alternatives":1906,"body":1907,"categories":1926,"checkedAt":312,"claimed":363,"description":1927,"docs":363,"editorsPick":365,"extension":366,"faq":1928,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1932,"name":1933,"navigation":378,"openSource":378,"path":1934,"platforms":1935,"pricing":1936,"registries":1938,"repo":1937,"seo":1939,"standards":1940,"status":1947,"stem":1948,"tagline":1949,"tags":1950,"vendor":363,"website":1937,"__hash__":1951},"tools\u002Ftools\u002Fsimple-scorm-packager.md","Simple Scorm Packager",[],{"type":317,"value":1908,"toc":1924},[1909,1915,1918,1921],[320,1910,1911,1912,1914],{},"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 ",[323,1913,908],{},", 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.",[320,1916,1917],{},"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.",[320,1919,1920],{},"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.",[320,1922,1923],{},"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":359,"searchDepth":360,"depth":360,"links":1925},[],[126],"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.",[1929],{"q":1930,"a":1931},"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",{},"simple-scorm-packager","\u002Ftools\u002Fsimple-scorm-packager",[1079,374],{"model":383,"source":1937},"https:\u002F\u002Fgithub.com\u002Flmihaidaniel\u002Fsimple-scorm-packager",[],{"description":1927},{"scorm12":1941,"scorm2004":1944},{"supported":378,"provenance":390,"checkedAt":312,"source":1942,"note":1943},"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":378,"editions":1945,"provenance":390,"checkedAt":312,"source":1942,"note":1946},[751,488],"Separate schema directories for 2004 3rd and 4th Edition, including the imsss sequencing schemas. 2004 2nd Edition is not offered.\n","archived","tools\u002Fsimple-scorm-packager","Node package that turns a build directory into a conformant SCORM zip",[1510,1079,1631],"oba4z_a2woUR0Ghi0fJWoaLrC_O0s29Nf7R-zk6SIRc",{"id":1953,"title":1954,"addedAt":312,"alternatives":1955,"body":1956,"categories":1990,"checkedAt":312,"claimed":363,"description":1991,"docs":363,"editorsPick":365,"extension":366,"faq":1992,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":1996,"name":1997,"navigation":378,"openSource":378,"path":1998,"platforms":1999,"pricing":2000,"registries":2001,"repo":2002,"seo":2003,"standards":2004,"status":399,"stem":2014,"tagline":2015,"tags":2016,"vendor":363,"website":2002,"__hash__":2018},"tools\u002Ftools\u002Fsimplify-scorm.md","Simplify Scorm",[],{"type":317,"value":1957,"toc":1988},[1958,1975,1978,1985],[320,1959,1960,1961,1964,1965,1967,1968,1970,1971,1974],{},"simplify-scorm implements the runtime side of SCORM: include ",[323,1962,1963],{},"scormAPI.js"," on the page that launches a course and it exposes ",[323,1966,1420],{}," for SCORM 1.2 and ",[323,1969,1423],{}," 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. ",[323,1972,1973],{},"cmi.toJSON()"," hands you a plain object to POST to your own service.",[320,1976,1977],{},"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.",[320,1979,1980,1981,1984],{},"What it is not is conformant. The repository is unusually honest about this: ",[323,1982,1983],{},"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.",[320,1986,1987],{},"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":359,"searchDepth":360,"depth":360,"links":1989},[],[126],"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.",[1993],{"q":1994,"a":1995},"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",[374,381],{"model":383},[],"https:\u002F\u002Fgithub.com\u002Fgabrieldoty\u002Fsimplify-scorm",{"description":1991},{"scorm12":2005,"scorm2004":2008,"xapi":2012,"cmi5":2013},{"supported":378,"provenance":390,"checkedAt":312,"source":2006,"note":2007},"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":378,"editions":2009,"provenance":390,"checkedAt":312,"source":2010,"note":2011},[488],"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":365,"provenance":390,"checkedAt":312},{"supported":365,"provenance":390,"checkedAt":312},"tools\u002Fsimplify-scorm","SCORM 1.2 and 2004 runtime APIs in plain JavaScript, for the LMS side of the fence",[404,497,2017],"reference-implementation","94lv5w3YAJyPSPAkioL_3HbvMr0edWdb0k-pI57ViMo",{"id":2020,"title":2021,"addedAt":312,"alternatives":2022,"body":2023,"categories":2051,"checkedAt":312,"claimed":363,"description":2052,"docs":363,"editorsPick":365,"extension":366,"faq":2053,"firstParty":365,"foundedYear":363,"hosting":374,"hqCountry":363,"license":375,"listing":376,"logo":363,"meta":2057,"name":2058,"navigation":378,"openSource":378,"path":2059,"platforms":2060,"pricing":2061,"registries":2063,"repo":2064,"seo":2065,"standards":2066,"status":1626,"stem":2073,"tagline":2074,"tags":2075,"vendor":363,"website":2064,"__hash__":2076},"tools\u002Ftools\u002Fusescorm.md","Usescorm",[],{"type":317,"value":2024,"toc":2049},[2025,2036,2043,2046],[320,2026,2027,2028,2031,2032,2035],{},"A React hook over the SCORM run-time API, distributed on npm as ",[323,2029,2030],{},"@blocdigital\u002Fusescorm",". ",[323,2033,2034],{},"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.",[320,2037,2038,2039,2042],{},"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 ",[323,2040,2041],{},"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.",[320,2044,2045],{},"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.",[320,2047,2048],{},"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":359,"searchDepth":360,"depth":360,"links":2050},[],[126],"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.",[2054],{"q":2055,"a":2056},"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",[374],{"model":383,"source":2062},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@blocdigital\u002Fusescorm",[],"https:\u002F\u002Fgithub.com\u002Fbloc-digital\u002Fusescorm",{"description":2052},{"scorm12":2067,"scorm2004":2070},{"supported":378,"provenance":390,"checkedAt":312,"source":2068,"note":2069},"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":378,"editions":2071,"provenance":390,"checkedAt":312,"source":2068,"note":2072},[],"`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",[616,403,569],"xmUEQLx2nbY3WF4c30Jv7fS_viOif6DjWvCV00CMYrQ",{"data":2078,"body":2079},{},{"type":2080,"children":2081},"root",[2082,2089,2128],{"type":2083,"tag":320,"props":2084,"children":2085},"element",{},[2086],{"type":2087,"value":2088},"text","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.",{"type":2083,"tag":320,"props":2090,"children":2091},{},[2092,2098,2100,2105,2107,2112,2114,2119,2121,2126],{"type":2083,"tag":2093,"props":2094,"children":2095},"strong",{},[2096],{"type":2087,"value":2097},"Packagers and CLIs",{"type":2087,"value":2099}," 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. ",{"type":2083,"tag":2093,"props":2101,"children":2102},{},[2103],{"type":2087,"value":2104},"API wrappers",{"type":2087,"value":2106}," 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. ",{"type":2083,"tag":2093,"props":2108,"children":2109},{},[2110],{"type":2087,"value":2111},"Manifest tooling",{"type":2087,"value":2113},"\nparses and validates ",{"type":2083,"tag":323,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":2087,"value":908},{"type":2087,"value":2120},", which is where a surprising share of import failures originate.\n",{"type":2083,"tag":2093,"props":2122,"children":2123},{},[2124],{"type":2087,"value":2125},"Framework integrations",{"type":2087,"value":2127}," wrap all of that for React, Vue, Angular, Svelte, Unity and Godot.",{"type":2083,"tag":320,"props":2129,"children":2130},{},[2131],{"type":2087,"value":2132},"What 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.",1789388511059]