Compare
How it compares
H5P content has several homes. This one is a player you host yourself, on infrastructure you control, with no H5P server. It does not edit content, and for some sites one of the others is the better choice; this page says which.
At a glance
| Option | What you run | Edits content | Plays a .h5p as it is | Offline | Where learners’ data goes |
|---|---|---|---|---|---|
| h5p-offline-player | Static files on your site, or on a player domain you run | No | Yes, from a URL or a picked file, streamed | Yes: an installable app, and a cache for repeat plays | Nowhere, unless your page sends the xAPI events on |
| h5p.com | Nothing: a hosted service by H5P Group, by subscription | Yes | Uploaded into the service | No | H5P Group’s service |
| Moodle, WordPress or Drupal with H5P | A PHP site and its database; Moodle has H5P built in | Yes | Uploaded, then unpacked by the server | No | Your site’s database: basic scores per user |
| Lumi | A desktop app on each author’s computer | Yes | Yes, in the app | Yes, in the app | Wherever its exports are hosted |
| h5p-standalone | Static files on your site | No | No: each package is unzipped into a folder first | Not built in | Nowhere, unless your page sends the xAPI events on |
What only this player does
- A
.h5pplays as it is. No unzipping, no upload step, no folder per package: a URL to the file, or a file picked from disk. A 300 MB package starts after a few kilobytes on a host that honoursRange, and on one that does not it starts as soon as its libraries have arrived. - Offline, as an app. The installable app opens
.h5pfiles from the computer and plays them with no network, the libraries included. - Every statement names its build. Each xAPI statement carries
context.revision, a fingerprint of the package it came from, so a completion record says which version the learner finished. How. - cmi5, without an H5P server. The package stays on a static host and an LMS launches it as an assignable unit, checked against ADL’s CATAPULT. The cmi5 example.
- Tools for packages made by machine.
h5p-verifyplays a package headless and says whether it works;h5p-normalizerewrites one so its video streams. Both are commands, both have agent skills. - MIT, with the GPL kept apart. The H5P core runtime is GPL-3.0; it is a package of its own, so the element in your bundle is MIT alone.
When to choose something else
- You need to edit content. This is a player. Author in Lumi, on h5p.com or in a site with the H5P plugin, export the
.h5p, and play it here — the two work together. - Your site already runs Moodle. Its built-in H5P plays and edits content and records scores in the gradebook. Use it.
- You want it managed for you. h5p.com hosts, edits, reports and integrates with LMSs, with support, for a subscription. This player needs someone to deploy and update it.
- You want scores stored per learner with no code. The H5P plugins for WordPress, Drupal and Moodle keep basic results per user out of the box. Here results are events: your page, an LRS or cmi5 decides where they go.
- You have a few packages and are happy to unzip them. h5p-standalone is smaller and has been around longer; served from static files, media streams from the host directly.
Data and trust
Installed, the player and every package run on your site; embedded, on a player domain you
run. In both cases the learner’s browser talks to your hosts and nothing else, unless a
package or your configuration names another: the H5P hub, for an export without its
libraries, is the one the player itself may reach, and only when told to. Nothing is
stored except the content’s own saved state when resume is set, in the
browser on that device. Statements are not stored at all.
A package is JavaScript, here as everywhere H5P runs, and it runs with the rights of the origin that serves it. That is why the setup page asks what lives on your site before it recommends a setup.
Facts about the other options are from their documentation as of October 2026 and may have changed; corrections are welcome as issues.