mHub is an open platform that turns folders of simple files and ordinary websites into apps for phones, TVs and desktops. You do not need to be a programmer: if you can describe what you want, an AI can build it, and mHub gives it a place to run.
mHub is not one app. It is three parts that fit together, and every one of them is open. Two are foundations: a content format and a browser API. The third is the apps, and each of them stands on one foundation or both.
What you actually use. Vuma turns addons into one browsable screen, and other apps each take one idea to every screen in the house. All of them are web apps: nothing to install. See the apps
An addon is a source of content: films, radio stations, podcasts, courses. Under the hood it is a folder of small text files on any web host, described by the Addon Protocol v2. An AI can write one for you. See the protocol
Open a normal website inside an mHub app and it can do things a browser never allows: read data from anywhere, survive a dead domain, live on your TV. One namespace, one script tag: the mHub Browser API. See the API
Vuma stands on both foundations; the apps beside it show how far one foundation alone carries. All of them are live.
Give Vuma addons and it turns them into one browsable screen: every catalog your addons expose, search across all of them, a library, a player that resumes where you left off. It is one web app that runs on phones, TVs and desktops alike, and handles touch, remote control and pointer itself.
It stands on both foundations: addons bring the content, and inside an mHub browser the Browser API adds the powers a plain page never has. You can even mount it on a page of your own, with your addons and your name on it: one HTML file.
Radio stations, podcasts and free audiobooks as one app. Waves is
one HTML file over the same Vuma build: five audio addons, a teal
accent, and addonManager: "fixed", so the sources are set
and the user only switches them on and off. View source on it: the page
is the whole tutorial.
Kids TV. One addon, bright colours, German from the first screen
(locale: "de"), and addonManager: "hidden":
nothing to misconfigure from the couch. Also one HTML file over the
Vuma build.
The addon is the data; what someone builds on top of it is the app. Mediathek is one HTML file straight on the ard-mediathek addon, no Vuma underneath: rows, search, series with their episodes, subtitles, and a player that remembers where you stopped. The addon does the fetching, the page does the looks.
The other foundation on its own: Glance uses no addons at all. One HTML file on the Browser API, pulling live weather, headlines, market prices and the status of your own servers onto one calm screen. In a plain browser it degrades gracefully; inside an mHub app every tile wakes up.
Waves and Junior are exactly this: load the Vuma build, give it an
element, call mount. This file, on any static host, is a
finished app with your addons, your name and your colours, and it follows
Vuma releases by itself. No build step, no server code, no account.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=no">
<title>My App</title>
<link rel="stylesheet" href="https://vuma.mx/latest/style.css">
</head>
<body>
<div id="app"></div>
<script type="module">
import { mount } from "https://vuma.mx/latest/app.js";
mount({
addons: ["https://www.mhub.mx/dw"],
brand: { name: "My App", colors: { accent: "#00AAFF" } },
});
</script>
</body>
</html>
An addon is its manifest URL. The ones hosted here are listed on the addon index, and an AI can build you a new one.
Every mount option, and where the files come from, is documented in the app itself: the hosting guide. It ships with the build, so it describes the version you are about to load rather than the one this page was written against.
An addon is a source of content: films, radio stations, podcasts, recipes, courses. Put the folder anywhere on the web, add its address in an app, and everything in it appears there, browsable. Version 2 of the protocol needs no server: every endpoint can be a static file on any CDN. Every existing v1 addon keeps working; the apps translate between the two, and v1 stays supported.
All endpoints are GET, all cacheable, all hostable as plain files. One optional POST for the task system.
/mhub-addon.json /catalog/{type}/{catalogId}.json /item/{type}/{id}.json /source/{type}/{id}.json
Catalogs, item details, sources, resolvers and subtitles are separate resources. One addon can provide all of them or just one.
"resources": ["catalog", "item", "source", "resolve", "subtitle"]
An endpoint can answer with a task instead of data. The app fetches with the user's own IP, so a static addon works with geo-blocked APIs.
// addon stays static, // the client does the trip
A minimal addon is one manifest and one catalog file. Upload both to any static host and it works. The spec is OpenAPI 3.1 with generated TypeScript types and a zero-dependency client library, MIT licensed, on GitHub.
{ "id": "my-movies", "name": "My Movies", "specVersion": 2, "resources": ["catalog"], "types": ["video"], "catalogs": [{ "id": "all", "name": "All", "type": "video" }] }
The whole addon format fits into a single prompt, and you never have to read it. Copy the prompt, add your idea, and the AI answers with a folder of files. Upload them anywhere and your addon is live.
It points the AI at the spec. Works with any assistant that can read links, like ChatGPT or Claude.
"My favorite radio stations." "Every film by one director." "The public lectures of my university." Anything with a list.
Any static host works, GitHub Pages is free. Add the address in an mHub app and browse your own addon.
Read the mHub Addon Protocol v2 spec at https://raw.githubusercontent.com/mediahubmx/protocol/main/openapi.yaml and build an addon for me. An addon is a folder of static JSON files, ready to upload to any web host. Answer with every file: its full path, then its complete content. My addon: [describe your idea here]
If your assistant cannot open links, paste the spec file into the chat instead. The spec and complete example addons live on GitHub.
Everything lives under one namespace: window.mhub,
and every host serves the full core. Feature-detect the namespace once,
then just call it. No SDK, no build step, no account: one script tag is
the whole setup, and self-hosting it is fine.
The API is live in the apps and rolling out with their releases. Write
against it today and your page keeps working either way: where no host is
present, window.mhub
is simply absent and your site stays an ordinary website.
Fetch anything. No CORS, and request headers the browser normally reserves for itself.
// cross-origin, readable const r = await mhub.fetch(url);
Some media needs its own request headers to play. One call, and the host picks the right route on every platform.
const s = await mhub.openStream( { url, headers }); video.src = s.url;
Key/value storage that follows your site, not the domain it happens to run on. No prompt, no setup.
await mhub.storage.set(k, v);
One domain down, your site still loads. Serve one small file on every domain; the browser finds it, verifies your mirrors and fails over by itself. No code.
{ "id": "mysite", "endpoints": [ "https://a.example", "https://b.example" ] }
A tile on the browser home screen. The way back to your site, surviving between visits.
mhub.setLinks([ { id, name, icon, url }]);
The address bar becomes your site's search. Queries and suggestions go straight to your page.
mhub.setSearch({ placeholder, onQuery, onSuggest });
Know where you run and what the host can do, from phone to TV, before first paint.
if (mhub.device.isTV) tvUi();
A page that runs as an app tells the host what it handles itself: its
own back navigation (setBackHandler), a full-screen player
(setImmersive), and the door out (exit); a
meta tag in the HTML says it is an app built for the remote.
Every member, with the permission model and the mirror system, is in
the API reference.
mhub.setBackHandler(depth); mhub.setImmersive(true); <meta name="mhub" content="app dpad">
The obvious use is a media library on your TV. But the powers underneath are general, and most of these are impossible as a normal website. A few things a single web page can be inside mHub:
Pull any feed straight from its source. Normal browsers block that; inside mHub it just works. Your reading list follows you, and it reads well from the couch.
Weather, headlines and the price of things you care about, as one calm screen on the TV. We built this one; it is the Glance screenshot further up, and it runs live.
Talk to the devices in your own network: lights, NAS, printer, router. Browsers refuse local requests like that; the mHub app makes them for you.
Fetch feeds, play episodes, resume where you stopped. One page, no server, no app store.
Check shops for prices and availability, keep a watchlist. The page asks; you see the answer on any screen.
A friendly face for open archives like Archive.org or Project Gutenberg. Browse, search and read them like an app.
The API reference covers every member, the permission model, and the mirror system. The protocol spec ships with complete example addons you can copy.