migratify plan
Reads the source playlist, scores every candidate on the destination and writes a report. An interrupted run resumes where it stopped.
read-onlySpotify YouTube Music
A free, open-source command-line tool that moves playlists both ways between Spotify and YouTube Music — tracks, cover art and Liked Songs. When it is not sure which version is right, it asks instead of guessing.
$ git clone https://github.com/DecoudJuan/Migratify
MIT licensed · Python 3.10+ · Windows, macOS and Linux · no account, no server, no API key
01 The wrong song problem
The same title exists as a cover, a karaoke track, a live take, a remix, a sped-up edit — and as a different song by a different artist.
Most tools take the first search result and hand you a playlist that is quietly 15% wrong. Migratify scores every candidate instead, and a wrong-artist match is capped below the review floor — so it can never even be offered to you.
02 How it works
Deciding is separate from doing. Run the whole migration, read the report, change your mind — neither account will have noticed.
migratify planReads the source playlist, scores every candidate on the destination and writes a report. An interrupted run resumes where it stopped.
read-onlymigratify reviewOnly the tracks the scorer could not settle. Five candidates each, with lengths, scores and the reason for every number.
local onlymigratify applyCreates the playlist and adds what was accepted — naming the destination account before it asks. Run it twice and nothing duplicates.
the only writermigratify > apply
Continue? [Y/n]: y Created https://music.youtube.com/playlist?list=PLxK… in juan@gmail.com Added 94 tracks Cover not uploaded — YouTube Music has no API for playlist artwork. The original is at ~/.migratify/covers/a3f1c9b2e5d4.jpg if you want to set it by hand. Done. url: https://music.youtube.com/playlist?list=PLxK… account: juan@gmail.com on YouTube Music
03 What it carries across
Spotify → YouTube Music and back again. The direction comes from the URL you paste.
Your saved library migrates like any playlist — and lands as one. Nothing is ever written into a library.
The playlist travels, not just its contents. Cover upload wherever the destination allows it.
migratify sync matches only what never arrived, into the playlist that already exists.
No developer app, no client ID, no API key. Works on a free Spotify account.
Markdown, CSV or JSON per run: what matched, what it scored, what was missing.
Matches are cached locally per direction, so running it again costs no new searches.
Standalone builds for Windows and macOS. Double-click and you get the prompt.
It runs on your machine and talks only to the two services. Everything stays in ~/.migratify.
04 The matching engine
Every candidate that comes back is scored from 0 to 100. Artist and duration carry the weight, because they are what a cover cannot fake.
Artist veto — similarity below 0.5 caps the candidate at 40, under the review floor, however perfect the title looks.
Version penalty — 25 points for every differing tag: live, remix, acoustic, instrumental, karaoke, radio edit, sped up.
ISRC short-circuit — an exact ISRC hit scores 100 at once. Recording identity, not similarity.
Duration is the best cover detector there is. A re-recording almost never lands within five seconds of the original. When a service does not report a length, it scores a neutral 0.5 — absence is not evidence.
The near-tie rule matters as much as the thresholds: top two within four points and the track goes to review, however high the score. Taking the higher number would be a coin flip dressed as a decision. Every threshold is configurable.
05 Commands
| Command | What it does | Writes? |
|---|---|---|
migratify |
Opens the interactive prompt — the banner above. Type commands without the prefix. | no |
migratify login |
Connects both services by signing in. Imports an existing browser session when it can, opens a login window when it cannot. | no |
migratify auth status |
What is connected, and which browsers were found on this machine. | no |
migratify playlists spotify |
Lists your playlists on a service, with track counts. Liked Songs included. | no |
migratify plan <url> |
Matches the whole playlist and writes a report. Safe to run as many times as you like. | no |
migratify review |
Resolves the ambiguous matches. Records your decisions locally. | no |
migratify apply |
Creates the destination playlist and adds the accepted tracks. Asks first, and names the account. | yes |
migratify migrate <url> |
plan → review → apply, guided, in one command. | yes |
migratify migrate liked --to ytmusic |
Migrates your saved library. Also --to spotify for the other direction. |
yes |
migratify sync <url> |
Adds only the tracks that never reached the destination, into the playlist the first run created. | yes |
migratify runs |
Past runs with their IDs, so you can review or report on an older one. | no |
migratify report --format csv |
Re-renders any run's report as Markdown, CSV or JSON. | no |
06 Get it
No Python. Unzip and run. ~70 MB.
Python 3.10 or newer, any platform.
$ git clone https://github.com/DecoudJuan/Migratify
$ cd Migratify && pip install -e ".[login]"
$ migratify login
login extra is the browser automation — what lets you connect by signing in.migratify auth status to confirm it worked.migratify auth ytmusic --paste
07 Questions
Install Migratify, run migratify login once to sign in to both services, then run migratify migrate followed by the playlist URL. Migratify detects the direction from the link, matches every track against YouTube Music, asks you about the ones it cannot decide, and only then creates the playlist.
Yes. The same engine runs in both directions and the direction is taken from the URL you paste: a Spotify link migrates to YouTube Music, a YouTube Music link migrates to Spotify. Nothing about the matching changes.
Yes, in either direction: migratify migrate liked --to ytmusic, or --to spotify. Your saved library lands as an ordinary playlist on the other service. Migratify never writes into a saved library, because an unwanted playlist takes one click to delete and several hundred saved tracks do not.
No. You sign in the way you always do, in a browser window, and Migratify captures that session locally. There is nothing to register and nothing to paste.
Yes, and that is why signing in is the default path. Since 2025 Spotify requires a Premium subscription for a newly registered app to reach the Web API, so the usual register-an-app flow is unavailable on a free account. Signing in does not touch that gate.
That is the failure Migratify is built to avoid. Every candidate is scored on artist, title, duration, album and result type. A wrong-artist candidate is vetoed below the review floor so it cannot even be offered. Each differing version tag — live, remix, acoustic, karaoke, sped up — costs 25 points. A track only auto-accepts at 88 or above with no version mismatch and no close runner-up; anything less certain waits for you.
Name and description travel in both directions, and cover art uploads when the destination is Spotify. YouTube Music has no API for playlist artwork, so going that way Migratify downloads the original cover to your machine and tells you where it is, in case you want to set it by hand.
Run migratify sync with the same playlist URL. It matches only the tracks that never reached the destination and adds them to the playlist the first migration created, rather than making a second one. The link is remembered per destination service.
Migratify is free and MIT-licensed. It runs entirely on your machine and talks only to Spotify and YouTube Music. Sessions, the match cache and the reports live in a .migratify folder in your home directory. There is no Migratify server and no account to create.
No, on purpose. A hosted version would need your Spotify and YouTube credentials on someone else's server, and the matcher depends on libraries that do not belong in a content script. A local command-line tool is the honest form for this problem — and it is also why nothing you migrate ever passes through a third party.
Run plan as many times as you like — it never touches an account.
Nothing is created until you say apply.
$ migratify migrate https://open.spotify.com/playlist/…