Spun README

The project's README from github.com/yappologistic/Spun. As one markdown file: README.md.

Spun

A CD, vinyl and cassette music player for Linux.

Spun in vinyl mode with a gold tonearm and the Cider queue alongside it

Support Spun on Buy Me a Coffee
Optional support for Spun's development.

Install · Get started · Features · Help · License

Play local music or control Apple Music through Cider. Spun puts your album artwork on a spinning CD, vinyl record or cassette, with an interface inspired by Material Design 3. Optional 3D players add physical depth and lighting that follows Noctalia's wallpaper palette.

Source-available · PolyForm Noncommercial 1.0.0. Personal and other permitted noncommercial use is free. This is not an OSI-approved open-source license. Read the license details.

Install on CachyOS or Arch Linux

Spun builds from source; there is no packaged installer yet. Open a terminal and run:

sudo pacman -S --needed base-devel git cmake ninja python qt6-base qt6-declarative qt6-multimedia qt6-svg taglib

git clone https://github.com/yappologistic/Spun.git
cd Spun
./scripts/build.sh -DBUILD_TESTING=OFF
./scripts/install-launcher.sh

For 3D players, also install qt6-quick3d and run the build command again. Spun includes 3D when that dependency is available. To build without it, add -DSPUN_ENABLE_3D=OFF to the build command.

Open Spun from your application menu, or run ./scripts/run.sh from its folder. The launcher points to that folder. If you move it, run ./scripts/install-launcher.sh again.

Building on another Linux distribution

You need a C++20 compiler, CMake 3.22+, Ninja, pkg-config, Python 3, Qt 6.8+ with Quick Controls, Multimedia, SVG and development files, and TagLib 2.0+ development files. Qt Quick 3D is optional. Package names differ between distributions. Spun is developed on CachyOS with Hyprland and Noctalia; desktop integration can vary elsewhere.

Start listening

Local music: choose Local, then + to add tracks, or drop files and folders onto Spun. More → Add music folder includes artist and album subfolders. Imports show progress, skip songs already in the queue and can be cancelled without adding a partial import. Directory symlinks inside the folder are not followed. Your music files are not copied or modified. More → Play demo plays the included original soundcheck.

Apple Music through Cider: open Cider, sign in there, then choose Cider in Spun. Cider handles authentication and streaming and must remain running. Apple Music playback requires the appropriate access through Cider.

For search, browsing and the full queue:

  1. Enable Cider's local API.
  2. Open Spun's Queue and choose Connect to Cider.
  3. Approve Spun in Cider. Spun remembers the connection.

For older Cider versions, choose Use an app token instead. Create one in Cider's Settings → Connectivity → Manage External Application Access, allow playback, queue, library and audio access, then paste it into Spun.

Spun connects to the local API on port 10767. Basic playback controls use Linux's media-player interface, so working playback alone does not confirm API access. Available actions depend on your Cider version and permissions.

Inside the player

CD, vinyl and cassette

Choose a medium in More → Preferences. All three share playback controls, album details, lyrics and Mini mode.

Browse through Cider

Use the top-left search button to browse songs, albums, playlists and artists without leaving Spun.

Queue and listening tools

Cider changes refresh the visible queue and relevant details. Temporary connection failures preserve browsing results and offer reconnection when needed. Batch operations stop and report partial progress when Cider cannot confirm a change; uncertain playback actions are not retried automatically.

Preferences and desktop integration

Choose your font, interface size, background blur, animations and media appearance in More → Preferences. Spun follows Noctalia's colors and reduced-motion setting when available. Reduced motion also skips loading sequences and perspective tilt.

Spun's desktop media entry follows the selected Local or Cider source, including artwork, playback state, volume and seeking. Cider may also expose its own entry. Hyprland integration depends on the compositor's supported interfaces.

Audio settings contains crossfade and, where supported by Cider, Automix and listening modes. Audio quality in the current song's menu shows what Cider reports and labels device output separately.

Fonts

Spun uses your system font by default. Choose any installed family in Preferences → Font. Fonts are not bundled or downloaded automatically.

For the intended appearance, we recommend Google Sans Flex. Install the TTF with your desktop's font installer, reopen Spun and select it in Preferences. The font has its own SIL Open Font License.

Keyboard shortcuts
Action Shortcut
Play / pause Space
Previous / next track Ctrl + Left / Right
Seek backward / forward Left / Right
Add files / folder Ctrl + O / Ctrl + Shift + O
Queue Ctrl + L
Cider browser Ctrl + B
Search the current panel Ctrl + F
Quick jump Ctrl + K
Select browser / upcoming queue tracks Ctrl + A (track list focused)
Toggle focused browser track Space (track list focused)
Select tracks / range Ctrl-click / Shift-click
Mini mode Ctrl + M
Flip medium / switch lyrics F / Y
Mute M
Keyboard help F1
Back / dismiss Escape
Quit Ctrl + Q

Update or remove

To update, open a terminal in your Spun folder:

git pull --ff-only
./scripts/build.sh -DBUILD_TESTING=OFF

To remove the application-menu entry:

rm "${XDG_DATA_HOME:-$HOME/.local/share}/applications/spun.desktop"

You can then delete the Spun source folder. Your music stays where it was. Preferences remain in ~/.config/spun/ unless you remove them separately.

Troubleshooting and privacy

Spun does not ask for your Apple Music password. Its Cider token is stored with owner-only file permissions in ~/.config/spun/cider-connection.json. Preferences and local listening data also stay in ~/.config/spun/. Artwork and music metadata may be fetched during playback and browsing. Do not include tokens, private configuration, listening history or personal logs in issue reports.

Development

Build, test and benchmark

Build the diagnostic companion and run the registered tests:

./scripts/build.sh -DBUILD_TESTING=ON
ctest --test-dir build --output-on-failure

Tests use temporary preferences and synthetic local API fixtures. Audio checks need a working user audio session, and API fixtures need permission to listen on loopback. Desktop-control tests use a private D-Bus session. Diagnostics are separate from the normal player.

For focused artwork, lighting, geometry and media checks:

./scripts/test-3d.sh

The default uses offscreen CPU rendering through Mesa and requires an available X display for its OpenGL context. It does not create visible windows. It checks rendered artwork and palette changes without exercising the full native window lifecycle.

For the complete 3D interaction and Cider-fixture suites, run SPUN_TEST_RENDERER=native ./scripts/test-3d.sh in a separate Wayland or X11 test session. This includes projected seeking, tonearm gestures, lid transitions, scaling and mode combinations. Set SPUN_TEST_SCREEN to the dedicated output name and SPUN_TEST_OUTPUT to a local capture directory. Missing 3D rendering fails the checks instead of silently skipping them.

For large imports, run QT_QPA_PLATFORM=offscreen QT_QPA_PLATFORMTHEME= ./build/spun-import-test --stress. This creates 20,000 temporary sparse WAV files representing 625 GiB of audio without allocating that much disk space, then removes them.

--inspect-cider and --inspect-library inspect a live Cider connection without changing playback. The opt-in --verify-cider-writes changes playback, queue and audio settings and leaves song radio playing after restoring its temporary edits. Use a privately paired test profile with --config /path/to/test/settings.ini; never share its connection file or captured library data.

Run python3 scripts/benchmark.py --output /tmp/spun-performance for isolated performance comparisons. Offscreen results are not whole-desktop GPU measurements. python3 scripts/make-demo.py regenerates the original soundcheck after building and additionally requires FFmpeg.

Before submitting substantial code contributions, open an issue to discuss scope and contributor licensing. A patch does not transfer its copyright; future commercial distribution needs appropriate rights to contributed code and compliance with third-party licenses.

License

Spun's original code and assets use the PolyForm Noncommercial License 1.0.0, with required notices and third-party credits.

The license permits noncommercial use, specified personal uses, modification and redistribution under its terms. It also permits use by certain charitable, educational, public research, public safety, health, environmental and government institutions, regardless of funding. It is broader than personal use only. Uses outside its permissions require a separate license from the relevant rights holder. The full license controls.

The author may offer separate commercial terms for code they own in the future. No paid edition is offered here.

Material Symbols Rounded icons retain their Apache 2.0 license. Qt, TagLib and optional fonts retain their respective licenses. Spun is an independent project and is not endorsed by Google, Apple, Cider or Noctalia.

Spun (yappologistic/Spun)

Searching Database…

446 ·GitHub
What is this?Spun is a desktop music player for Linux that shows your album art spinning on a CD, vinyl record, or cassette, and can either play local music files or control Apple Music playback through the Cider client.
How do I install and run Spun?There is no packaged installer yet: you build Spun from source on CachyOS or Arch Linux with CMake and Ninja, then launch it from your application menu or with ./scripts/run.sh.
What do I need installed before building it?You need a C++20 compiler, CMake 3.22+, Ninja, pkg-config, Python 3, Qt 6.8+ (with Quick Controls, Multimedia, SVG and development files), and TagLib 2.0+ development files; Qt Quick 3D is optional for the 3D player view.
Will it behave the same on any Linux desktop?Spun is developed on CachyOS with Hyprland and Noctalia, so theming, color following, and desktop integration can vary on other distributions and compositors.
Does it run on any Linux distro?Spun targets Linux, with first-class install instructions for CachyOS and Arch Linux; other distributions need a manual build with the same toolchain.
Is my Apple Music password or Cider token stored safely?Spun never asks for your Apple Music password; it only keeps a Cider API token locally with owner-only file permissions in ~/.config/spun/.
Is Spun open source?No — it is source-available under PolyForm Noncommercial 1.0.0, which is not an OSI-approved open-source license; personal and other noncommercial use is free.
What's the difference between the CD, vinyl, and cassette modes?They share the same playback controls but look and behave differently: the CD spins with an optional 500 RPM setting, vinyl has a draggable tonearm with optional crackle/hiss effects, and cassette shows turning tape reels with optional transport sounds.
What do the 3D players add?Enabling Qt Quick 3D gives modeled discs, reels, cases and tonearm parts with metallic surfaces and lighting tinted by Noctalia's current wallpaper palette; it needs qt6-quick3d and can be disabled with -DSPUNENABLE3D=OFF.
Can I use Spun without Cider at all?Yes — the Local mode plays your own files or folders directly without copying or modifying them; Cider is only needed for Apple Music playback and browsing.
What can I do once Spun is connected to Cider's browser?You can search Apple Music, browse your library, explore artist discographies, play stations and song radio, pin favorites, and manage a queue with saved snapshots and bookmarks, though writing to Apple Music playlists isn't supported.
Size
5.3 MB
Stars
446
Updated
CommitSep 16
Age
1mo
Commits · 90 Days