Files
hermes-agent/apps/desktop/src/plugins/radio
Teknium 61afcde8f9 refactor(desktop): one Plugins surface — Capabilities → Plugins owns agent + desktop plugins, install, and the catalog
Plugins were split across two pages that each showed half the picture:
Settings → Plugins listed desktop plugins plus "Install from Git" and a
pointer saying agent plugins live elsewhere; Capabilities → Plugins listed
agent plugins plus the catalog picker but knew nothing about desktop
plugins. A user asking "what extends my Hermes and where do I add more?"
had to visit both and still could not see the whole set in one place.

Capabilities → Plugins is now THE plugins page:

- Agent plugins section (scoped to the profile selector) with the
  "Install from Git" button in its header — installs target the scoped
  profile, not whichever one is active.
- Desktop plugins section beneath it (same for every profile), with the
  folder/rescan controls and the "agent half missing here" drift chip,
  whose repair also lands in the SCOPED profile.
- The catalog picker underneath, unchanged.

Settings → Plugins is removed. `/settings?tab=plugins[&plugin=…]` and the
existing `?tab=mcp` redirect share one table (`settings/moved-tabs.ts`) so
old bookmarks and palette links land on the same row on the new page.
Command palette: plugins moved from the Settings group to the Capabilities
group; installed-plugin rows deep-link to `/skills?tab=plugins&plugin=…`.
Dead `settings.plugins.agent.*` and `settings.nav.plugins` i18n keys dropped;
docs and in-code pointers say Capabilities → Plugins.
2026-09-10 02:30:50 -07:00
..

Radio

Bundled Hermes Desktop plugin, off by default. Enable Radio in Capabilities → Plugins. Playback starts only when you press Play.

Controls

The status-bar widget has a compact braille waveform, station picker, play/pause, and double-arrow Next. The picker includes pinned stations, search, a larger waveform, available song metadata, volume, and a broadcaster website link. Next changes stations; live broadcasts do not support skipping songs. Pause releases the stream; playing again returns to live.

Presets include Nightride FM, Radio Paradise, and EVE Radio (GamingNow). Search combines local stations with Radio Browser results, accepts HTTPS non-HLS streams, and deduplicates by ID and URL. Pins, station, and volume use plugin-scoped local storage.

Plugin boundary

plugin.js imports only @hermes/plugin-sdk, react, and react/jsx-runtime. Existing bundled discovery finds it automatically; defaultEnabled: false uses the ordinary live enable toggle. No shell, SDK, backend, dependency, or registry changes are needed.

The same plain-ESM file can be loaded through the runtime plugin door at $HERMES_HOME/desktop-plugins/radio/plugin.js for development. Do not install that duplicate alongside the bundled version. Layout styles use Hermes theme tokens and are removed on disable. Playback, timers, and audio nodes are also released. Closing the window stops playback; there is no background audio service. Other windows pause when a window starts playing.

Audio and privacy

Both waveform sizes use real audio samples, with two dim previous traces. Silence stays flat; reduced motion freezes the display. Streams that cannot be analysed retry without CORS and show an activity indicator, not invented levels. Nightride and EVE Radio song metadata is fetched while the picker is open and playback is active. Artist names link directly to their profile, never search results or a song. Apple's public artist lookup resolves unambiguous exact names to Apple Music profiles. MusicBrainz is a fallback for Spotify, Bandcamp, or official artist homepages. Missing or ambiguous matches stay plain text, with no dead link or reserved icon gap. Artist names are sent to these services only while the picker shows live metadata; results are cached for a day. MusicBrainz requests are paced across windows. No account or API key is needed.

Audio connects directly to broadcasters. Searches send the typed station query to Radio Browser. There are no accounts, keys, analytics, recording, or rebroadcasting. Disabled plugins perform no work; enabling does not autoplay. Stream availability, regional restrictions, and metadata vary. Hermes is not endorsed by these broadcasters.

References

No upstream code, assets, shaders, or dependencies are copied.