┌─▄▄─┐ ▄▄ ▄▄─┐ ▄▄─┐ ▄▄ ▄▄─┐ ▄▄ ┌
▓░ ▓░ ▓░ │ ▓░ │ ▓░ ▓░ ▓░ │
▒░ ▒░ ▒░ │ ▒░─┤ ▒░ ▒░─ ▀▀─┤
░░ ░░ ░░ │ ░░ │ ░░ │ ░░ ░░_|
───┘ ───┘
Open a Spotify link (or a pasted Slack message containing one) in the running TIDAL desktop app — no more "sample only, go search it manually."
$ ./tidalify "lose a few braincells https://open.spotify.com/track/0YmcHurKqkzDQeHB8zuzk0?si=…"
▶ TIDAL: $uicideboy$ — COUNT YOUR BLESSINGS
tidal://track/450298202
input text → extract Spotify URL → Odesli (song.link) exact match
├─ match found → open tidal://track|album/<id> ← ~all links, zero auth
└─ Odesli miss → tidalapi catalog search
→ apfel (on-device Apple Intelligence) picks the best hit
→ deterministic guard vetoes a wrong pick
→ open tidal://track/<id>
- Odesli matches by ISRC (the track's fingerprint), so the common path is exact and needs no login.
- The
tidal://deep link is handled by the already-open TIDAL.app — it doesn't open a browser tab. - The fallback only fires when Odesli has no TIDAL entry. It uses
tidalapi(TIDAL's own client — no developer keys) and the localapfelmodel to choose among real search results, then a string-similarity guard refuses to auto-open anything that doesn't actually resemble the source track.
Phase 1 (the happy path) needs nothing but Python 3 and TIDAL.app. To enable the search fallback:
./setup.sh # creates .venv, installs tidalapi, and apfel (via brew)
./tidalify --login # one-time TIDAL browser sign-in (token cached in ~/.config/tidalify)| What | When it's needed | Install |
|---|---|---|
| Python 3, TIDAL.app | always (Phase 1) | already present |
tidalapi |
fallback: catalog search | setup.sh (pip, in .venv) |
apfel |
fallback: auto-pick the match | brew install apfel (needs Apple Intelligence, macOS 26+) |
apfel is optional: without it the fallback still runs — it just lists the
candidate tracks for you to pick manually instead of choosing automatically.
Optional — put it on your PATH:
ln -s "$PWD/tidalify" /usr/local/bin/tidalify # or ~/bintidalify "<spotify url or text containing one>" # open it in TIDAL
tidalify -n "<…>" # dry-run: print the tidal:// link, don't open
echo "<…>" | tidalify # read from stdin (used by the macOS Shortcut)
tidalify -c GB "<…>" # regional availability (default US)
tidalify --login # one-time TIDAL sign-in for the fallbackExit code 1 on any failure (no link found, no match, network error).
See SHORTCUT.md.
apfel --schemablocks on an open stdin; tidalify always calls it with stdin redirected to/dev/null.- The TIDAL OAuth token lives at
~/.config/tidalify/session.json. Treat it like a password; it is git-ignored. - Built on the shoulders of Odesli,
tidalapi, and
apfel. The
tidalapi+ session-file pattern is borrowed from tidal-mcp.