myspoti
Native Android client for Spotify, built with Jetpack Compose
Multi-source music player with cross-platform resolver support. The conceptual spawn of Tomahawk.
MediaJavaScript · HTMLGitHub @ParachordSelf-installOwner unconfirmed
Paste into Claude or ChatGPT for installation instructions suited to your environment.
Have you tried it? One tap is enough. No sign-in needed.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A modern multi-source music player inspired by Tomahawk. Play music from Spotify, Apple Music, Amazon Music, YouTube, Bandcamp, SoundCloud, your own Subsonic server, local files, and more - all in one unified interface.
parachord:// protocol for opening artists, albums, playlists, and search from other appsParachord is a player for people who already subscribe to the services it plays from, plus their own files and servers. It brings those services together in one app. It is not a way to get music without paying for it, or to keep copies of it.
If you work for a music service and have a concern about how Parachord plays your catalog, please open an issue.
require(esm), which it supports from Node 24.9). CI builds on 22 and tests on 24; the app itself runs on the Node 24 inside Electron 44.npm run build:mac compiles the MusicKit helper in Swift. Nothing else needs a compiler. The one native module, better-sqlite3, ships prebuilt binaries for every platform Parachord builds on.pip install castlabs-evsSee docs/setup/SYSTEM_REQUIREMENTS.md for full details including network requirements and Linux sandbox dependencies. Packaging for a Linux distribution? See docs/setup/LINUX_PACKAGING.md: what the build downloads and compiles, how to build without electron-builder's packages, castlabs versus stock Electron, and what the app expects at runtime.
Download the latest release for your platform from the Releases page:
.dmg or .zip.exe installer or portable.AppImage, .deb, or .rpm# Clone the repository
git clone https://github.com/Parachord/parachord.git
cd parachord
# Install dependencies (Electron's ~100 MB binary downloads on the first npm start — see below)
npm install
# Start the app (the renderer bundle is built first, see Development)
npm start
Parachord is built on castlabs Electron for Content Security (ECS), a fork of Electron with the Widevine CDM. It isn't on the npm registry, so npm install fetches it from castlabs' GitHub releases. Stock Electron has no Widevine, so DRM-protected services (Apple Music on Windows and Linux, Amazon Music everywhere) can't play on it.
Electron 44 doesn't download its binary during npm install. The package has no postinstall; the ~100 MB binary from castlabs' releases is fetched lazily, on the first npm start (a one-time "Downloading Electron binary..." pause). To pre-download it, or to retry a download that failed, run:
npx install-electron --no
If it still fails, delete node_modules/electron and run that again — it prints what went wrong.
Locally built apps carry castlabs' development VMP signature. That's enough for Widevine's test servers, but Apple's licence server refuses it, so Apple Music on Windows and Linux plays only 30-second previews in a local build. Release builds get a production signature through castlabs EVS in CI (see CI/CD). To sign a local build yourself, create a free EVS account and run python3 -m castlabs_evs.vmp sign-pkg dist/<platform-dir> before code signing on macOS or after it on Windows.
parachord/
├── src/renderer/app.js # React application (single file, no JSX) — the source
├── app.js # Generated renderer bundle (esbuild, gitignored; never edit)
├── main.js # Electron main process
├── main-process/ # Main-process modules (IPC handlers, sync links)
├── preload.js # Electron preload script (IPC bridge)
├── index.html # Application shell (loads vendor/ scripts, then app.js)
├── vendor/ # React, Tailwind CSS build, fuse.js (committed, no CDN)
├── resolver-loader.js # Plug-in system loader
├── plugins-src/<id>/ # Plug-in sources: manifest.json + implementation.js
├── plugins/ # Generated .axe files (node scripts/build-axes.js; never edit)
├── marketplace-manifest.json # Plug-in catalog (versions generator-synced)
├── sync-providers/ # Spotify / Apple Music / ListenBrainz playlist sync
├── local-files/ # Local music library module
│ ├── scanner.js # Directory scanner
│ ├── metadata-reader.js # ID3/audio metadata extraction
│ ├── database.js # SQLite music database
│ └── watcher.js # File system watcher
├── native/musickit-helper/ # Native MusicKit helper (Swift, macOS only)
├── scripts/ # Build scripts (renderer bundle, .axe generator, VMP signing, notarization)
├── tests/ # Jest suites
├── parachord-extension/ # Browser extension source
└── .github/workflows/ # CI/CD pipeline
Parachord uses a plug-in architecture with two types:
Content Resolvers - Find and play music from services
search(query) and resolve(artist, track, album)Meta Services - Provide metadata and recommendations
Plug-ins use the .axe format - a JSON file containing metadata and JavaScript implementation. See Authoring a plugin for the format. The bundled .axe files are generated from plugins-src/<id>/ (see Development); community plug-ins live in Parachord/parachord-plugins.
React.createElement only (no JSX); vendored in vendor/, bundled by esbuild with no transformsvendor/tailwind.css (npm run build:css), nothing loads from a CDN/protocol deep-link bridge (port 8888 by default, configurable in Settings)# Run in development mode with DevTools
npm run dev
# Rebuild the renderer bundle on every save (run alongside npm run dev)
npm run dev:renderer
# Build for distribution
npm run build:mac # macOS (.dmg, .zip) — also compiles the MusicKit helper
npm run build:win # Windows (.exe, portable)
npm run build:linux # Linux (.AppImage, .deb, .rpm)
Edit src/renderer/app.js. The root app.js that index.html loads is an esbuild bundle of it (plain IIFE, no minify, no transforms, with a source map), gitignored and rebuilt by the prestart, predev, pretest and prebuild hooks, so a plain npm start or npm test never runs stale code. Edits to the root file are overwritten on the next build.
The source of a bundled plug-in is plugins-src/<id>/manifest.json plus implementation.js, a real module you can require in tests. node scripts/build-axes.js (also npm run axes) writes plugins/<id>.axe, the matching fallback entry in the renderer, and the version in marketplace-manifest.json. Bump manifest.version when the implementation changes, or installed copies won't re-download. npm run axes:check fails on any drift and runs in the test suite, so never hand-edit an .axe.
CI runs these on every push and pull request; run them locally first:
npm run lint # ESLint — strict on the extracted modules, warnings only on the legacy files
npm run typecheck # tsc over the modules that opted into checkJs
npm test # Jest (builds the renderer bundle first; needs Node 24.9+, see Building from Source)
Several runtime dependencies are ESM-only (chokidar, electron-store, music-metadata). The main process is CommonJS and loads them through Node's require(esm), which Electron 44's Node 24 supports; electron-store's class is therefore require('electron-store').default. Jest resolves them through the module-sync export condition (see jest.config.js) and loads them with --experimental-vm-modules, which the test scripts pass.
package.json pins castlabs Electron by GitHub tag (castlabs/electron-releases#v44.5.1+wvcus) and build.electronDownload.mirror points electron-builder at the same releases. Bump both together, then run npx electron-builder install-app-deps so better-sqlite3 is rebuilt against the new Node ABI. castlabs supports the three latest Electron majors; an older major still inside their window can download a CDM but gets no fixes.
The project uses GitHub Actions for automated builds on all platforms. Builds are triggered on:
Tagged releases automatically create draft GitHub Releases with all platform artifacts.
macOS and Windows builds are VMP-signed through castlabs EVS (scripts/vmp-sign.js), so Widevine's production licence servers accept them. The signing runs before Apple code signing on macOS and after Authenticode on Windows; Linux needs no VMP signature. CI logs in to EVS from the EVS_ACCOUNT_NAME and EVS_PASSWD repository secrets on every run. Pull-request builds from forks have no secrets, so they keep the development signature; release tags fail instead of shipping an unsigned build.
| Action | Shortcut |
|---|---|
| New Playlist | Cmd/Ctrl+N |
| Find/Search | Cmd/Ctrl+F |
| Previous Track | Cmd/Ctrl+Left |
| Next Track | Cmd/Ctrl+Right |
| Toggle Shuffle | Cmd/Ctrl+S |
| Settings (macOS) | Cmd+, |
| Copy Diagnostic Log | Cmd/Ctrl+Shift+L |
| Leave Search | Escape |
| Play/Pause, Next, Previous | Media keys (configurable in Settings) |
Play/Pause has no keyboard shortcut (Space was removed because it conflicted with typing in chat); use the playbar or a media key.
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)MIT License - see LICENSE for details.
Parachord - Your music is everywhere but you shouldn't have to be.