Hayden Griffin

Afterglow

A Music Assistant player for LG TVs and the PS5: the artwork, word-by-word lyrics and the queue from the remote or a DualSense, with MilkDrop visuals drawn in time with the music.

Made-up data. Press an arrow key to start, Enter to choose, Esc to go back.Open full screen

An unofficial Music Assistant player for LG webOS TVs. It shows the artwork, word-by-word lyrics and the queue, lets you browse and play from the remote, and draws MilkDrop visuals in time with whatever your speakers are playing.

Try the demo in a browser → It runs on made-up data. Use the arrow keys and Enter as the remote's arrows and OK, and Escape as Back; OK → Display switches between Visuals, Album and Lyrics.

Afterglow is independent of, and not endorsed by, Music Assistant or LG. It began as a fork of Michael Nestrud's viz-man.

What it does

Four captures from the TV: the Album view, One line lyrics over MilkDrop, Stage lyrics over MilkDrop, and the Display settings with the lyric overlay rows

Requirements

Status: Afterglow runs every day on a rooted 2021 LG C1 (webOS 6). The Homebrew Channel listing and installs on other TVs and webOS versions haven't been tried yet. Long sessions on the C1 have shown native memory growing in an aged web runtime, which is under investigation (see Performance). Reports either way are very welcome.

Install

Download io.github.haydengriffin.afterglow_<version>_all.ipk from the releases, or build it (below). Then either:

Open Afterglow and sign in with your Music Assistant address, username and password. The TV keeps its own long-lived token, named after the TV, which you can revoke in Music Assistant or with Log out; the password is not stored. Then run Scan presets once. The setup guide walks through every step.

Sign in

Settings

Press OK for the playback controls: a transport row with Display and Details, and a top strip with Browse, Now playing, Queue and Settings (sound and sync, display, presets, performance, account). Per-TV settings live on the TV; favourites and shared preferences sync through your Music Assistant account. See Settings and remote keys, The preset scan and Performance.

Playback controls

Privacy

Afterglow talks to your Music Assistant server. Artwork comes through Music Assistant's image proxy, falling back to the image's own address when the proxy has none. The other exception is lyrics. They come from Music Assistant; when it has none for a song, the TV asks lrclib.net directly, sending the song's title and artist (the album and length are only used on the TV to pick the best match). Choose other lyrics sends the same search, and a song whose lyrics you chose is fetched by that LRCLIB record's id. LRCLIB sees the request coming from your network. Turn Online lyrics off (OK → Display → Lyrics, shown in the Lyrics view) to stop it; it is on by default and synced with your other TVs.

Check my setup asks lrclib.net for one fixed record (no song, nothing about you) to see that it answers, only when you run it and Online lyrics is on. The Scan to save code in Details is drawn on the TV from the link Music Assistant already has; nothing is sent.

The TV stores its Music Assistant token in the app's own storage, never your password. There is no analytics or telemetry. The browser demo requests nothing but its own files.

Development

npm install
npm test
npm run package   # dist/io.github.haydengriffin.afterglow_<version>_all.ipk
                  # and dist/io.github.haydengriffin.afterglow.manifest.json

npm run dev serves the app in a desktop browser; ?mock=1 runs it on demo data without Music Assistant, which is what the browser demo is (built by .github/workflows/pages.yml). The README images are rendered from the demo by scripts/showcase.mjs with Playwright. See Development and the changelog.

Support

Afterglow is free and open source. If it made your setup better, you can buy me a coffee. Bug reports and pull requests are just as welcome.

Credits

Full notices are in NOTICE and app/THIRD_PARTY.md.

Licence

MIT, by Hayden Griffin. See LICENSE.