Cross-platform vinyl visualization player — organize playlists in your browser, browse a 3D album shelf, and sync playback with your local music apps through an interactive tonearm UI.
SpinDeck doesn't stream or host any audio. Your music apps handle playback; we handle playlists and control.
English · 简体中文 · 📖 Official Documentation
This is SpinDeck's playback screen: a translucent vinyl record and draggable tonearm over the album art, with a soft background tinted from the cover. Track info sits on the disc label; Exit Playback, visual settings, and prev/next controls ring the edges.
📸 Screenshot copyright notice
The album artwork (1989 (Taylor's Version)) and song title (Style (Taylor's Version)) shown in the preview belong to Taylor Swift and their respective copyright holders (including Republic Records). They are used here solely for demonstration of SpinDeck's UI and are not hosted, distributed, or licensed by this project. SpinDeck does not claim any rights to this content.
- Create, edit, and bulk-delete playlists — everything stays local in your browser
- Import playlists from QQ Music, NetEase Cloud Music, or Kugou Music via share links (up to 300 tracks per import)
- Manually create playlists (metadata only, no track list)
- Auto-refresh imported playlists every 5 / 15 / 30 minutes or 1 hour to stay in sync with the source
- A Three.js-rendered 3D shelf — flip through album covers like a real rack
- Tap a record to play; skip tracks with prev/next controls or swipe gestures
- Dynamic backgrounds from cover art; upload a custom background and tweak blur
- Drag the tonearm to drop the needle (play) or lift it (pause) — tactile, turntable-like interaction
- Classic or modern disc styles
- Playback state syncs with your connected music app (where the platform supports it)
- Light, dark, or follow system
- UI in English and Simplified Chinese
- Open SpinDeck, create a playlist, paste a share link from a supported platform
- Once import finishes, open the playlist shelf and browse the covers
- Pick a track — the tonearm UI appears; drop the needle and your local music app starts playing
- Tweak theme, language, and visuals in Settings
That's it. No account, no cloud upload — just your playlists and your player.
Progress varies by platform. Only QQ Music is fully supported end to end today.
| Platform | Playlist Import | Playback Control | Status |
|---|---|---|---|
| QQ Music | ✅ | ✅ | Fully supported — import + playback control |
| NetEase Cloud Music | ✅ | Desktop only | Import works; playback control on desktop (macOS / Windows) |
| Kugou Music | ✅ | — | Import only — no playback control (technical limitations) |
| Apple Music | — | — | Not implemented yet |
| Spotify | — | — | Not implemented yet |
| YouTube Music | — | — | Not implemented yet |
💡 Notes
- QQ Music is the most complete: playlist import, playback control, and cross-device deep links.
- NetEase Cloud Music — import everywhere, but tonearm playback sync is desktop only (not mobile).
- Kugou Music — import for browsing in SpinDeck, but no reliable way to control the Kugou app from here.
- Apple Music, Spotify, and YouTube Music show up in the UI for future use — no working integration yet.
Run SpinDeck in a browser or as a Tauri desktop app (recommended on macOS for the full playback-control experience).
| Environment | Notes |
|---|---|
| Browser | Any modern browser (Chrome, Safari, Firefox, Edge, etc.) — needs a local Node server for API routes (pnpm --filter @spindeck/web dev or start) |
| Desktop (Tauri) | macOS / Windows / Linux native window; release builds bundle the web UI and embedded local server |
| Desktop (macOS / Windows) | Full QQ Music experience; NetEase playback control here too |
| Mobile (iOS / Android) | QQ Music via deep links; NetEase playback control not supported |
Download the newest desktop builds from GitHub Releases — the release title and tag show the current version (e.g. v0.1.0).
To read the version from a cloned repo:
node -p "require('./package.json').version"| Tool | Version | Required for |
|---|---|---|
| Node.js | ≥ 18 | Web dev, API server, desktop embedded server |
| pnpm | 9.x (repo pins 9.0.0) |
Installing dependencies and all pnpm scripts |
| Rust | stable | Desktop (Tauri) dev & build only |
| Platform toolchain | — | e.g. Xcode Command Line Tools on macOS |
These are declared in root package.json (engines.node, packageManager). CI uses Node 20 and pnpm 9.
Enable the pinned pnpm via Corepack:
corepack enable
pnpm -v # should report 9.x
node -v # should report v18 or newerSee Version & Requirements above. In short: Node.js ≥ 18, pnpm 9.x; add Rust (stable) for desktop development.
# Clone the repo
git clone https://github.com/dongguacute/SpinDeck.git
cd SpinDeck
# Install dependencies
pnpm install
# Start the dev server
pnpm devOpen the local URL printed in your terminal.
You'll also need:
- Rust (stable)
- Platform toolchain (e.g. Xcode Command Line Tools on macOS)
Development — Tauri loads the web dev server:
pnpm --filter @spindeck/desktop devRuns @spindeck/web dev and opens the SpinDeck window. App icon matches apps/web/app/assets/icons/SpinDeckLogo.svg.
Production build — packages the web build and embedded Node runtime:
pnpm --filter @spindeck/desktop buildOutput: apps/desktop/src-tauri/target/release/bundle/ (.app on macOS, .msi / .exe on Windows, etc.).
Release builds currently require Node.js on the user's machine for the embedded server. Regenerate desktop icons after logo changes (edit apps/desktop/assets/app-icon.svg, which includes macOS safe-area padding):
pnpm desktop:iconspnpm build
pnpm --filter @spindeck/web startpnpm lint # Lint
pnpm check-types # Type check
pnpm format # Format codepnpm + Turborepo monorepo:
| Path | Description |
|---|---|
apps/web |
SpinDeck web app |
apps/desktop |
Tauri 2 desktop shell (src-tauri/ lives here) |
packages/core |
Core logic (playlist fetching, etc.) |
packages/player |
Third-party music app control & deep links |
packages/vinyl-ui |
Vinyl tonearm UI components |
packages/ui |
Shared UI components & themes |
packages/picker |
Cover art color extraction & backgrounds |
Each package has its own README with more detail.
- This project is for personal learning and technical exchange — not for commercial use.
- All media content and data come from third-party services. SpinDeck does not host or store any copyrighted music files.
- Please comply with each music platform's terms of service and applicable laws when using this project.
Licensed under the Apache License 2.0.
- Documentation: https://spindeck.dgct.cc
- Repository: https://github.com/dongguacute/SpinDeck
- Issues: https://github.com/dongguacute/SpinDeck/issues
- Author: Cherry Fu · @dongguacute
If SpinDeck is useful to you, a ⭐ on GitHub means a lot — thanks for stopping by!
