Synced lyrics + now-playing on your Even Realities G2 glasses.
Orpheus is an Even Hub WebView app that overlays a live now-playing card and word-by-word synced lyrics on the G2 lens (the 576×288 green HUD), with a phone console for control. It can read music from three places:
| Source | What it does | Needs |
|---|---|---|
| Apple Music (built-in) | Orpheus is the player — streams Apple Music via MusicKit JS in the WebView. | A token relay (your own Apple Developer key). |
| Apple Music (native) | Mirrors whatever the native Apple Music app is already playing — on your iPhone or your Mac — via the Syrinx helper. | The Syrinx helper app (sideloaded). No relay. |
| Spotify | Mirrors your Spotify now-playing via the Spotify Web API, remote-controls via Connect. | Your own Spotify app client ID. No relay. |
Lyrics for every source come from LRCLIB and are fetched directly by the phone — no account, no key.
Inspired by ArmasF31/HUD-Music-Integration-Even-Hub, which demonstrated the native-Apple-Music-over-localhost bridge. Orpheus is an independent, from-scratch implementation.
| Now Playing | Synced lyrics | Split | Mini |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
┌──────────────┐ HUD frames ┌────────────┐
│ G2 glasses │◀────────────────│ │
└──────────────┘ │ Orpheus │ lyrics ┌──────────┐
┌──────────────┐ touch/ring │ (WebView │────────────▶│ LRCLIB │
│ phone console│────────────────▶│ plugin) │ └──────────┘
└──────────────┘ └─────┬──────┘
│ reads now-playing from ONE source:
┌──────────────────────────────┼───────────────────────────────┐
▼ ▼ ▼
MusicKit JS Syrinx helper Spotify Web API
(built-in Apple) http://localhost:8766 (mirror + Connect)
needs relay ──▶ worker/ iPhone or Mac, native Apple Music
- The built-in Apple source needs a tiny Cloudflare Worker relay
(
worker/) to mint the Apple Music developer token. You deploy your own — there is no shared default. - The native Apple source needs Syrinx, a small helper
that reads the system music player and serves it over
http://localhost:8766. - The glasses HUD renderer and the phone UI are driven by one hook (
src/orpheus/useOrpheus.ts);src/orpheus/controller.tsrenders the lens.
- Even Realities G2 glasses + the Even phone app (Even Hub).
- The Even Hub CLI (
evenhub) for packing/QR — see the Even Realities developer docs. - Node 20+.
- Per source: an Apple Developer account (built-in Apple) · a Mac/iPhone + Xcode (native/Syrinx) · a Spotify app client ID (Spotify).
npm install
# pick your build variant:
npm run build # built-in Apple Music (needs VITE_ORPHEUS_RELAY, see below)
npm run build:native # native Apple Music via Syrinx (VITE_ENABLE_NATIVE=1)
npm run build:spotify # Spotify companion (VITE_ENABLE_SPOTIFY=1)
# pack into an installable .ehpk (native shown; `npm run pack` for built-in Apple):
npm run pack:native # → orpheus-native.ehpk (uses app.native.json)Sideload the .ehpk through the Even app, or run evenhub qr against a dev server for
hot-reload testing. Try it in the desktop simulator with npm run dev + npm run simulator.
Before packing, edit the manifest (
app.json/app.native.json): changepackage_idfromcom.junichi.*to your own namespace. For the native build, also whitelist your Mac — see Native config.
syrinx/ is a small XcodeGen project with two targets
that share one HTTP bridge:
- Syrinx (iOS) — reads the iPhone's Apple Music (
MPMusicPlayerController) and keeps itself alive in the background with a silent-audio session, so lyrics keep flowing when the phone is locked. - SyrinxMac (macOS, menubar) — reads the Mac's Music.app via AppleScript.
brew install xcodegen # once
cd syrinx
xcodegen generate # generates Syrinx.xcodeproj from project.yml
open Syrinx.xcodeprojPick the Syrinx (iOS) or SyrinxMac scheme, set your own signing team, and Run.
Grant the Apple Music / Media permission on first launch. It serves GET /status plus transport
POSTs on http://localhost:8766. (See syrinx/README — Syrinx.md for the API + brightness
extras.)
The Even runtime's network permission is a strict allowlist, so the Mac you connect to must
be listed. In app.native.json, replace the your-mac.local placeholder with your Mac's Bonjour
name (System Settings → General → About → Name, lowercased, spaces → hyphens, +.local), and
mirror it in src/orpheus/appleNative.ts (DEFAULT_MAC). The iPhone (localhost) target needs
no edits. Once you connect to any host in the app, it's remembered — Bonjour names survive DHCP IP
drift, so prefer .local over a raw IP.
Only the built-in Apple Music source needs this (the native and Spotify sources don't).
worker/ is a Cloudflare Worker that mints the Apple Music developer token from your key.
cd worker
npm install
# set your secrets (from your Apple Developer MusicKit key):
npx wrangler secret put MUSICKIT_KEY # contents of AuthKey_XXXXXXXXXX.p8
npx wrangler secret put MUSICKIT_KEY_ID # 10-char Key ID
npx wrangler secret put MUSICKIT_TEAM_ID # 10-char Team ID
# optional gate: npx wrangler secret put ORPHEUS_APP_KEY
npx wrangler deployThen build Orpheus pointing at it:
VITE_ORPHEUS_RELAY=https://your-relay.workers.dev npm run build
# if you set ORPHEUS_APP_KEY, also pass VITE_ORPHEUS_APP_KEY=<same value>src/orpheus/ player logic, lyrics, glasses HUD renderer, the useOrpheus() hook
src/App.tsx phone console UI
worker/ Cloudflare Worker relay (Apple Music token mint) — self-host
syrinx/ iOS + macOS native helper (XcodeGen) — sideload
app.json Even Hub manifest, built-in Apple build
app.native.json Even Hub manifest, native build (localhost + Mac whitelist)
- LRCLIB — synced lyrics.
- ArmasF31/HUD-Music-Integration-Even-Hub — inspiration for the native bridge.
- Even Realities — the G2 + Even Hub SDK.
MIT.



