Omarchy Web Apps is a static, browser-native host for Omarchy plugins. It keeps the plugin catalog, theme contract, and QML source visible, while replacing desktop-only boundaries with narrow web adapters only where the browser truly needs one. There is no Qt runtime, C++, server application, package install, or build step in the deployed site.
The first packaged application is a faithful web port of
AksharP5/omarchy-radio-atlas,
imported from commit 1738fa116522ed5dffc1bec53144a3b9f2ac7204.
Any ordinary static HTTP server works:
npm run serve
# http://127.0.0.1:4173Or serve the repository root through GitHub Pages, Caddy, nginx, Apache, a CDN,
or python -m http.server 4173. Opening index.html through file:// is not
supported because browsers intentionally block local fetch() and QML loads.
The deployed application has zero npm dependencies. package.json only
provides convenient development commands.
The adapter preserves the useful overlay experience:
- rotatable, deeply zoomable Canvas globe with clipped country geometry;
- live Radio Browser station discovery, country browsing, search, and random tuning;
- progressive world catalog expansion up to 5,000 records;
- coordinate estimation for stations that publish only a country;
- virtualized station list, favorites, recent history, and cached results;
<audio>playback with play/pause, previous/next, stop, mute, volume, failed-stream skipping, and Media Session controls;- the complete upstream keyboard and pointer control set;
- close/reopen behavior without discarding the in-page session; and
- indexed browser persistence with no telemetry.
The browser contacts only Radio Browser and the station stream the user asks it to play. Some community stations expose only insecure HTTP audio; an HTTPS-hosted page detects those entries before assigning them to the media element and moves to the next playable station without issuing a mixed-content request. A static browser page also cannot read arbitrary ICY response headers, so it exposes the station identity to Media Session but does not claim MPV's proxy-level now-playing extraction.
See the parity audit for the source-by-source mapping.
The selector contains the first twelve themes in the canonical Omarchy manual:
- Tokyo Night
- Catppuccin
- Lumon
- Ethereal
- Everforest
- Gruvbox
- Miasma
- Hackerman
- Osaka Jade
- Kanagawa
- Nord
- Matte Black
Their tokens and canonical previews come from the corresponding current Omarchy theme directories. The palette identities were also cross-checked against the public Omarchy Themes preview catalog where that catalog exposes the first-party entry. Catppuccin is the initial theme because it most closely matches Radio Atlas's upstream screenshot; the selection persists locally.
The importer accepts either a checkout or a Git URL. --repo always points to
the plugin root itself—the directory containing its schema-1 manifest.json:
node tools/import-plugin.mjs --repo /path/to/plugin
node tools/import-plugin.mjs --repo https://github.com/owner/plugin.gitThat one command creates or updates plugins/<manifest-id>/ and registers its
descriptor in plugins/catalog.json. The running shell reads the catalog and
adds the application tab programmatically; shell.js never needs a plugin-
specific edit.
The importer validates schema-1 manifest.json, entry-point containment, symlinks, file
sizes, and record count. It copies only auditable static source, records the Git
commit/date/dirty state and a deterministic SHA-256 source digest, generates
qmlweb/OmarchyShell.qml, and updates plugins/catalog.json. It never executes
the imported plugin.
A plugin using the portable QtQuick subset gets the vendored QmlWeb runtime. A plugin using Quickshell processes, files, Wayland/Hyprland, Omarchy UI globals, shell IPC, or an external player is refused until an explicit adapter is named:
node tools/import-plugin.mjs \
--repo /path/to/plugin \
--adapter my-browser-adapter \
--app-entry app/index.htmlThe adapter directory is deliberately preserved on later imports so upstream
source can be refreshed and audited independently. An adapter is not a blank
compatibility waiver: plugin.json retains every detected native boundary.
See the architecture and plugin contract before adding a second application.
npm testThe suite checks importer refusal/reproducibility, source digest and commit, manifest/catalog resolution, exact theme order and tokens, local-only assets, QmlWeb packaging, Radio Browser normalization, map mathematics, and upstream control/API parity. The final browser audit also exercises the portable QML runtime and Radio Atlas search, playback, history, favorites, themes, close/reopen behavior, and responsive layout.
This host and its original adapter code are licensed under AGPL-3.0-only. Imported Radio Atlas source remains MIT-licensed; QmlWeb remains MIT/BSD-2-Clause; Natural Earth geometry is public domain; and Omarchy theme token provenance is retained. See third-party notices.

