PunyTunes

September 3, 2025 ยท View on GitHub

PunyTunes is a desktop system tray application for controlling StreamMagic music streamers.

Volume control requires the streamer to be in Pre-Amp or Control Bus mode. PunyTunes also supports Hegel amplifiers.

Note

This code is "source available". You're welcome to use it in any way allowed by the license. The application however is not currently under active development. Any Issues or Pull Requests may not be responded to, but you can always try.

Screenshots

See the PunyTunes application website for more details.

In the MacOS System Tray

PunyTunes is a system tray application. You activate its display by clicking on the PunyTunes icon in the system tray.

PunyTunes System Tray

Compact View

The default compact view shows what is currently playing on the streamer, along with transport controls and (when available) volume controls.

Compact View

Detail View

More details can be shown for the Queue, Presets, Sources, and Streamer. The following shows the Queue details.

Detail View

Tip

There are two additional detail panes only visible using hotkeys. Shift + L will show a Logs pane, and Shift + P will show a streamer Payloads pane.

Technology Stack

PunyTunes is a Tauri application using Rust for the back-end and Svelte for the UI.

Installation

System Pre-Requisites

First follow the Tauri pre-requisite installation instructions. Follow the requirements for a desktop application only (PunyTunes does not target mobile) for your platform of choice (MacOS, Windows, or Linux).

In short, you will need Rust and Node.js installed.

PunyTunes development also uses pnpm so you should install that too.

Installing PunyTunes

Clone the repository and install its dependencies.

git clone https://github.com/mjoblin/punytunes.git
cd punytunes
pnpm install

Local Development

PunyTunes was developed in Rust Rover. You can use whatever IDE you prefer, but the following assumes Rust Rover.

Configure Rust Rover

Load the PunyTunes project root directory, and attach the src-tauri/Cargo.toml.

Create a Run Configuration. Set the "Command" to run --no-default-features and the "Working Directory" to src-tauri/.

Run Locally

In the terminal, run the following from the project root:

pnpm tauri dev

This will start a full instance of PunyTunes, so you should see the icon in your system tray.

(If PunyTunes doesn't find your streamer on startup, try selecting the Streamer tab in the UI and clicking the "Find" button).

Then, in Rust Rover, start the Run Configuration. This requires that pnpm tauri dev is already running (see above). This will start a second instance of PunyTunes which will result in a second PunyTunes icon appearing in your system tray. This is the instance you will be developing.

Now, any changes you make to the Svelte UI code from Rust Rover will live-update in the second instance of the application.

Floating Window

PunyTunes is a system tray application. During development it's often easier to have the application appear in an always-visible floating window instead. To do that, copy src-tauri/tauri.conf.FLOATING.json to src-tauri/tauri.conf.json before starting the Run Configuration. To revert back to the normal system tray behavior, copy src-tauri/tauri.conf.SYSTEM_TRAY.json to src-tauri/tauri.conf.json.

Building

PunyTunes has been built successfully for MacOS and Windows, and for Linux with some small tweaks. For detailed build instructions refer to the Tauri build documentation.

On MacOS you may first need to run this:

rustup target add x86_64-apple-darwin

Then build the application from the project root:

pnpm tauri build --target universal-apple-darwin

Warning

The first time you build, you will get an error telling you to update "com.CHANGE_THIS" in src-tauri/tauri.conf.json. See the Tauri configuration documentation for details.

If the build fails with "failed to bundle project: error running bundle_dmg.sh, try building a second time.

You will see warnings during the build. These should not prevent the build from succeeding, and are largely due to the code having some Windows-specific code paths which are not followed on the Mac. Newer Rust compiler versions might also flag additional warnings.

For Windows, build the application with this from the project root:

pnpm tauri build

The built files will be written to a platform-specific directory under src-tauri/target/.

Brief Code Overview

The Rust back-end handles the communication with the StreamMagic streamer (and Hegel amplifiers). This code lives under src-tauri/src/ with main.rs being the entry point.

The Svelte UI handles the web view. This code lives under src/ with App.svelte being the entry point.

Communication between the Svelte front-end and the Rust back-end is defined in src/lib/commands.ts and src-tauri/src/commands.rs.

Svelte state (for display, including streamer updates received from the back-end) is handled in src/lib/state.ts.

Tests

Run tests from src-tauri/ with cargo test.

Types

PunyTunes uses ts_rs to generate TypeScript types from Rust types.

TypeScript types are generated by cargo test and are stored under src/types/generated/.