About this project

TastyTunes is a desktop application that acts as a remote control for Cambridge Audio network players built on the StreamMagic platform. The README names the supported models as the Evo 75/150, CXN100 and CXN (V2), MXN10, AXN10, EXN100, Edge NQ and 851N, with development and daily testing carried out against an Evo 150. The app runs locally, talks to the streamer over the user's own network, and needs no account or cloud service. Installers are published for macOS 11+ (universal, signed and notarized), Windows 10+ (a single signed installer covering x64 and arm64) and Linux (x64 or arm64 AppImage, including 64-bit Raspberry Pi OS). On launch the app discovers StreamMagic devices on the network via SSDP, and an IP address can be entered manually if discovery finds nothing. A demo mode runs the whole application against a built-in virtual streamer and two sample libraries, with no hardware present. Now Playing presents large album artwork over a blurred art backdrop, track details, format badges for codec, sample rate, bit depth, lossless and MQA, and a signal-quality indicator whose states differ in shape as well as colour. A fullscreen Display mode, a frameless always-on-top mini player, and an optional menu bar or system tray panel are offered alongside the main window. The library feature pools every local UPnP media server and the streamer's USB storage into Artists, Albums and Tracks views, backed by a rebuildable local index that supports search-as-you-type across all sources. Filtering and sorting cover genre, decade, format, dynamic range and an albums-versus-compilations distinction. Album handling keeps featured guests in place, groups compilations under Various Artists, shows disc dividers for multi-disc sets, and collapses multi-volume box sets behind a volume selector. Missing artwork can be filled from the Cover Art Archive. Beyond library playback there are favourites, locally stored playlists keyed on content definition, a queue with multi-select and drag reordering, the streamer's 99 preset slots (recallable by number keys, each able to carry its own volume), a seven-band EQ with tilt and balance, source switching, and browsing of the radio-browser.info directory with genre and decade categories. Synced lyrics come from LRCLIB and are highlighted line by line; clicking a line seeks to it. Artist biographies and album facts are drawn from MusicBrainz and Wikipedia, with attribution links. Audio analysis reads files from local media servers to draw a waveform in the seek bar and under the artwork, and to compute a dynamic range value following the DR database's TT-DR procedure, which then becomes a filter and sort option in the Library. A capped recently-played log and a listening record written as yearly JSON Lines files track what was played and for how long; both are clearable and can be disabled. ListenBrainz scrobbling submits a listen only after real played time and retries failed submissions. Automation includes sleep timers of 15 minutes to two hours or end-of-track, with optional volume fade-out, and per-weekday schedules that can wake the device to a preset with a fade-in or send it to standby. An optional MCP server, off by default, exposes the app's capabilities to local AI agents such as Claude Code or Claude Desktop, covering playback and volume, presets and sources, library and radio, favourites, tone and EQ, sleep timers, the listening record and audio analysis. Editing tools are separated and disabled until switched on, and agents inherit the UI's volume cap, power safeguards and connection toggles. The README also shows a Home Assistant rest_command example that calls the MCP endpoint without extra integrations. The project documents exactly which network traffic leaves the machine: nothing is sent for streamer control or library browsing beyond the local network, while lyrics, artist and album context, missing album art, the update check and radio search are toggleable, and scrobbling is off until a token is added. There is no analytics, telemetry or account system, and a requests console plus a raw streamer-traffic console are built in. The stack is Electron with electron-vite, React 19, TypeScript, Tailwind CSS v4 and Zustand, with the main process handling device I/O over SSDP and the streamer's SMOIP WebSocket. The streamer is treated as the single source of truth: commands are sent, state is pushed back, and the interface re-renders from that push. The project is released under the GNU General Public License v3.0, with development on a develop branch and CI running typecheck, ESLint and Prettier checks.