The player
Every activity on Embed My plays in h5p-offline-player, an open-source H5P player that runs
entirely in the browser. It reads the .h5p archive in place through a Service Worker and hands
the files to the H5P runtime: nothing is unpacked on a server, and there is no server at all. Embed My is a
front for it: the page that writes the snippet, and a frame that runs the player on its own address.
What it does
- Plays any
.h5ppackage from a URL, or from a file picked on the device, with no upload. - Starts a large package after a few kilobytes on a host that answers Range requests, and streams its video.
- Plays exports that ship without their libraries from a pack of the H5P hub's libraries, downloading only the ones a package needs. A package that carries older versions plays the pack's newer ones, its content upgraded first with each library's own upgrade steps, and content made for a version newer than the hub's plays at the newest one there is.
- Plays packages you did not make as data, with
untrusted: none of their own code runs, and their content is checked against its libraries' field definitions, as the H5P plugins check an upload. - Shows H5P's own toolbar on request: rights of use, download, fullscreen. Its buttons and dialogs come in more than fifty languages, in the language the package declares, so they match its text.
- Emits xAPI statements and the content's saved state as events, for a page or an LMS to collect, and runs as a cmi5 unit or, packed by h5p-embed, as a SCORM 1.2 or 2004 activity.
- Ships as one web component,
<h5p-player>, plus its workers; the H5P runtime is a package of its own.
Where it is
| Source and documentation | github.com/missing-elements/h5p-offline-player |
|---|---|
| Setup guide | Setting up the player: with a bundler, with no build step, or as an embed page in an iframe |
| The player on npm | @missing-elements/h5p-offline-player (MIT) |
| The H5P runtime on npm | @missing-elements/h5p-runtime (GPL-3.0), the core the frame loads |
| Libraries for bare exports | @missing-elements/h5p-libraries, every hub content type's libraries, for packages that ship without their own |
| Self-hosted embeds | @missing-elements/h5p-embed (MIT), the embed page as a static site for a domain of your own, and a package as a SCORM zip for an LMS |
| Making packages | @missing-elements/h5p-author (MIT), a package of any hub content type from a short JSON source |
| VS Code extension | H5P Preview, which plays .h5p files in an editor tab, offline; Cursor and VSCodium install it from Open VSX |
| Demo site | h5p-offline-player.vercel.app |
| Agent skills | skills.sh/missing-elements/h5p-offline-player, for Claude Code, Cursor, Copilot, Codex and the rest |
| Issues | github.com/missing-elements/h5p-offline-player/issues, for anything about how a package plays |
Tools that come with it
npx @missing-elements/h5p-verify course.h5pplays a package in a real browser runtime and reports missing libraries, start-up errors and a screenshot, before you share it. With--previewit opens the package in the real player in your own browser instead, for a person to play through.npx @missing-elements/h5p-normalize course.h5prewrites a package once so that its video starts at once instead of after the whole file has downloaded.npx @missing-elements/h5p-author build rivers.json rivers.h5pbuilds a playable package from a short JSON source that holds only what differs from the content type's defaults, checking every field as H5P's editor would. The h5p-author agent skill writes that source from a prompt or a lesson.npx @missing-elements/h5p-embed --scorm course.h5pwrites a package as a SCORM zip that reports the score, the time and the learner's place to an LMS such as Moodle; its page does the same in the browser, with nothing uploaded.
Run it yourself
For embeds an organisation controls, write the same embed page as a static site with h5p-embed and deploy it to a domain of your own. Snippets then point at that domain, and no third party sits between your learners and your content. It can also limit which hosts packages come from and which sites may frame it.
npx @missing-elements/h5p-embed@latest h5p-player
To put the player straight into your own pages instead, the setup guide covers each way to do it. Your packages stay as they are either way. Embed My's own player origin is h5p-embed's page.
Licences
The player, its workers and its tools are MIT. The H5P core runtime it loads inside the frame comes from h5p-php-library and is GPL-3.0, published as a package of its own with its licence and notices served beside it. The content inside a package carries its own licence. Embed My is independent of H5P Group; āH5Pā is a trademark of H5P Group.