Browse 50 example portfolios on Showcase →
Field NotesHosting SCORM14 min read

How to actually host a SCORM file. Without an LMS.

Four real options, ranked by how much your client will hate each. With the SCORM-API gotchas no one warns you about.

Every freelance instructional designer who has ever sent a SCORM 1.2 package to a client has gotten the same email back: "hey — I downloaded the file but it doesn't open?" A SCORM file isn't a file you open. It's a runtime. It needs a host. And until very recently, the answer to "where do I host it?" was either "buy an LMS" or "give up and send a Loom."

This post is the article we wish we'd had when we started. Four real options, what each costs, how they actually feel in the hands of a non-technical client, and the SCORM-API gotchas no one tells you about until you've broken production.

A SCORM file isn't a file you open. It's a runtime. It needs a host.— the sentence that explains 80% of this

What "hosting SCORM" actually means.

A SCORM package is a .zip with two things in it: your authored course (HTML, JS, images, video) and a manifest file (imsmanifest.xml) that tells the host how to start it. Crucially, the course expects to talk to a runtime — a JavaScript API named API for SCORM 1.2 or API_1484_11 for SCORM 2004 — that it can call to read and write learner state: completion, score, suspend data, location, the whole envelope.

"Hosting SCORM" means: extracting the zip, serving the files over HTTPS, and injecting a working API into the page so the course can call LMSInitialize(), LMSSetValue(), and LMSFinish() and not crash. An LMS does this for you. So does every other option below.

If you skip this

You'll spend three afternoons trying to "open story.html directly" before you discover that's not how this works. Save yourself the afternoons.

The four real options, ranked.

We tested each of these by uploading the same 240MB Storyline 360 package (a 14-minute AML compliance refresher with branching scenarios, two assessments, and one drag-and-drop). Each platform was rated on: did the SCORM run?, did it look like a portfolio?, and did a non-technical client manage to launch it on the first try?

1

A purpose-built ID hosting service (Training OS, Rise public links).

Best for: freelance + in-house IDs sharing work with prospects + clients

Recommended

Upload the .zip. Get a URL. Done. The platform extracts the package, hosts the runtime, serves it under HTTPS with a stable URL, and gives you a portfolio page around it. Cost is typically free for a small number of modules; paid tiers run $15–25/month or one-time fees.

This is the option most freelance IDs should default to in 2026. It's the only one that solves both halves of the problem — the SCORM runs, and the URL you send looks like a portfolio.

What's good

  • SCORM 1.2 + 2004 + xAPI in browser, no LMS setup
  • Portfolio page + case studies wrap around the module
  • Signed share-links with expiry for NDA work
  • Free tier sufficient for most freelance ID needs

What's not

  • Not built for dispatching courses to multiple client LMSes
  • Less conformance-testing rigor than SCORM Cloud
  • Newer category — your client might not have heard of it yet
2

SCORM Cloud (Rustici).

Best for: conformance testing, dispatching to client LMSes

Solid

SCORM Cloud is built by Rustici, the team that authored the SCORM spec. It's the most rigorous SCORM testing environment on earth. Their dispatch feature lets you sell a course to multiple client LMSes from one source — irreplaceable if that's your business model.

It is, however, a platform built for LMS administrators and course distributors. The UI looks like an admin console because it is one. There's no concept of a "portfolio page" — just a list of courses you can register learners into. The free tier caps at 10 launches per month and 100MB, which goes fast.

What's good

  • Best SCORM conformance + debugging tools on the market
  • Dispatch feature is genuinely unique
  • Tin Can / xAPI support built in

What's not

  • UI is LMS-admin-shaped, not portfolio-shaped
  • Pricing scales with active learners — gets expensive quickly
  • Free tier caps at 10 launches/month, 100MB
3

Self-host with a SCORM player (scorm-again, pipwerks, etc).

Best for: IDs who are also developers

If you're technical

You can absolutely host a SCORM package on your own web server with an open-source SCORM player like scorm-again or the venerable pipwerks wrapper. The course-side calls (LMSSetValue, etc.) get intercepted by the player, which fakes a runtime in pure JavaScript.

This works. It is also work. You need to: extract the zip, host the files on a CDN with proper MIME types, configure CORS, inject the player JS, persist learner state somewhere (LocalStorage if you don't care, an API if you do), and then build the portfolio chrome around it yourself.

What's good

  • Total control — your stack, your rules
  • Free if you don't count your time
  • You'll learn a lot about the SCORM spec the hard way

What's not

  • You're now a SCORM-player maintainer
  • Persisting state across sessions is a real backend project
  • Storyline's tincan.xml path hardcoding will trip you up once
4

A Loom recording of you clicking through it.

Best for: nothing, really. But people do it.

Don't

Strictly speaking, this isn't hosting SCORM — it's recording SCORM. We're including it because it's what most freelance IDs end up doing when nothing else works: screen-record yourself driving the course, send the Loom.

The problem: a SCORM course's interactivity, branching, and assessments are the craft you're selling. A Loom of you clicking through it makes the course look passive — exactly the opposite of what you want a prospect to see.

What's good

  • Zero technical setup. Loom is free.
  • Works for any course in any format.

What's not

  • The interactivity — the actual work — is invisible
  • Prospects close the tab at minute 6 of "and then I’d click here"
  • You're competing on narration quality, not design quality

SCORM API gotchas no one warns you about.

Even on a working host, three things will bite you. Here they are in order of pain.

1. cmi.completion_status vs cmi.core.lesson_status.

If your course was authored as SCORM 2004 and you upload it to a host that only speaks 1.2 (or vice versa), the API names don't match — and your course will silently fail to register as "complete." Storyline lets you publish as either; check the publish dialog before you yell at the host.

Common mistake

Authoring in Storyline as SCORM 2004 and uploading to a SCORM 1.2-only host. The course will run, but completion will never fire and your clients will think they "broke it."

2. The "API not found" race condition.

SCORM courses look for the API on the parent window during page load. If the host injects the API after the iframe has started looking, you get a silent "API not found" — the course runs, but no data is recorded. A good host injects the API before the iframe loads.

3. SCO suspend_data length limits.

SCORM 1.2 spec caps cmi.suspend_data at 4,096 characters. SCORM 2004 raised it to 64,000. Storyline encodes a lot of state into this field — and if you have a long branching course, you can hit the limit and have your "resume where you left off" silently break. SCORM 2004 4th Edition is the safe default.

SCORM 1.2 API · the four calls that matterJavaScript
// 1. The course looks for the API on parent.
// If it can't find it within 500 polls, it silently fails.
var API = findAPI(window);

// 2. Initialize the session. Always returns "true" on a good host.
API.LMSInitialize("");

// 3. Read and write learner state.
API.LMSSetValue("cmi.core.lesson_status", "completed");
API.LMSSetValue("cmi.core.score.raw", "87");
var who = API.LMSGetValue("cmi.core.student_name");

// 4. Commit changes + close the session.
API.LMSCommit("");
API.LMSFinish("");

When to choose xAPI instead.

If you're authoring new content from scratch in 2026, consider xAPI ("Tin Can") over SCORM. xAPI is more flexible — you can capture interactions outside a single course session, support offline learning, and store statements in any LRS (Learning Record Store) you want. Most modern authoring tools (Storyline, Rise, Captivate, iSpring) support xAPI alongside SCORM.

The catch: xAPI needs an LRS to talk to. SCORM Cloud bundles one. Training OS logs and exports statements via its own pipeline. If you self-host, you're spinning up something like Learning Locker. For a freelance ID, the practical advice is: author in SCORM 1.2 + xAPI in parallel, host on something that gives you both, and let the client pick.

TL;DR — just tell me what to do.

If you're a freelance ID with a portfolio to show: use a purpose-built hosting service (we obviously like ours, but Rise public links work too). You'll be live in 11 minutes.

If you're dispatching courses to client LMSes: SCORM Cloud, full stop. Their dispatch is unmatched.

If you write code for fun: scorm-again on a small DigitalOcean droplet. You'll learn a lot. You'll also spend a Saturday on it.

If you're sending a Loom: please don't. Just upload it somewhere that runs it.

/06  Try it for free

Drop a SCORM file. See it live in 11 minutes.

Free for 3 modules. No card. Lifetime is $149 once. You read the article, you know how this is supposed to work — see it in your own browser.

Upload your first SCORM →
JV

About the author

Jon Vig · Ex-LMS engineer · founder, Training OS.

/07Keep readingRelated notes