Useful web elements that work everywhere on the web.
https://missing-elements.github.io/
Missing Elements builds standalone, framework-agnostic web components for capabilities the web platform does not provide out of the box (yet 🙂).
Each component is built on browser standards and works with React, Vue, Svelte, Angular, server-rendered HTML, or no framework at all. They are designed to be easy to embed, safe to self-host, and useful in applications with strict Content Security Policies.
| Component | What it does | Status |
|---|---|---|
| pdfjs‑viewer | A standalone, isolated, self-hostable, plug-in custom element for viewing and editing PDF files, based on the PDF.js Firefox built-in viewer. | ✅ Released |
| h5p‑offline‑player | Self-hosted H5P player component. No H5P server, Moodle or WordPress. Plays offline, streams video, supports xAPI, H5P into SCORM and VS Code. | ✅ Released |
- Browser-native — Prefer platform APIs, standard web components, and small integration surfaces over framework lock-in.
- Framework-agnostic — Use the same component in React, Vue, Svelte, Angular, or plain HTML.
- Self-hostable — Host assets yourself without depending on a third-party viewer service or CDN.
- CSP-conscious — Support deployments with restrictive Content Security Policies and clear asset boundaries.
- Encapsulated — Keep component styles and behavior isolated from the surrounding application.
- Practical — Solve real document and learning-content viewing problems with a small, understandable API.
The common model is simple: load a component once, then use its custom element in your page.
<script type="module" src="/path/to/component.js"></script>
<!-- The exact element and attributes depend on the component. -->
<your-element src="/files/example"></your-element>See each repository for installation instructions, browser requirements, demos, API documentation, and self-hosting guidance.
Many viewer integrations send documents or learning content to a third-party service, require a backend conversion step, or rely on an external CDN at runtime.
Missing Elements components are intended to give hosts control over:
- where viewer code is served from;
- which origins a page can contact;
- how documents and packages are stored and loaded;
- whether an experience can work without a network connection.
Self-hosting does not make untrusted content automatically safe. Host applications should still apply an appropriate Content Security Policy, validate inputs where applicable, and choose a security policy that fits their users and content sources.
If these components are useful to you, you can support their development: