Open Source · Windows App · Python

Migrate & Manage
Your Spotify Library

Spotigrate lets you effortlessly move your Liked Songs into any playlist, delete tracks in bulk, and take full control of your music — no API tokens needed.

Scroll
Songs Supported
0 API Keys Needed
3 Auth Flows
100% Local Data

Everything you need.
Nothing you don't.

A powerful desktop app that automates the tedious parts of Spotify playlist management using browser automation — no API keys, no OAuth dance.

One-Click Chrome Launch
Automatically opens Chrome in remote-debug mode so Spotigrate can connect instantly. No manual Win+R or terminal commands needed.
🎵
Migrate All or Pick & Choose
Move every Liked Song at once or open a visual song picker to hand-select exactly which tracks land in your new playlist.
🗑️
Bulk Delete from Playlists
Load any playlist by URL, pick songs to remove, and delete them in bulk. No more clicking "Remove" one track at a time.
📊
Live Colour-Coded Log
Watch every action in real time with colour-coded log entries — green for success, yellow for warnings, red for errors. Copy the log anytime.
🔌
Chrome Status Indicator
Auto-refreshes every 5 seconds to show whether Spotigrate is connected to your Chrome session so you always know your status.
⏸️
Preview Mode + Stop Button
Run in preview mode to see exactly what would happen before committing any changes. Hit Stop anytime to gracefully halt mid-operation.

Migration
in minutes.

Spotigrate uses Playwright to control a Chrome browser session, reading and writing directly to the Spotify web app — no private API access required.

01
Launch Chrome via Spotigrate
One button opens Chrome in remote debugging mode (port 9222) and navigates straight to Spotify.
02
Log in to Spotify in the browser
Sign in manually in the Chrome window — your credentials stay between you and Spotify.
03
Enter target playlist name
Type the name of the destination playlist exactly as it appears in Spotify. It will be created if it doesn't exist.
04
Select songs & migrate
Choose "All Songs" or pick individual tracks, hit Migrate, and watch the live log as every song is moved.
spotigrate — migration log
─── MIGRATION ───────────────────────────────── Target playlist : My Chill Vibes Chrome port : 9222 Pause : 0.4 s Mode : All songs   → Scanning Liked Songs... Scrolling page... (1/12) Scrolling page... (6/12) Scrolling page... (12/12) ✓ Found 248 songs   → Starting migration... ✓ Added: Blinding Lights ✓ Added: As It Was ⚠ Skipped (already in playlist) ✓ Added: Flowers [... 244 more songs ...]   ════════════════════════════════════════════════ 🎉 Done! Added: 246 | Skipped: 2 | Not found: 0 ════════════════════════════════════════════════   Status: Done — 246 added

Secure license-based access.

Every copy of Spotigrate is tied to a unique license key generated at registration. All data is stored locally and encrypted — nothing ever leaves your machine.

📝
Register
Enter your Gmail & password. App generates a unique license key shown once — save it safely.
SPOTI-XXXXX-XXXXX Generated
🔐
Login
Gmail + Password + License Key grants access. All three must match for entry.
Auto-Login
Already verified? An encrypted session file skips the login screen entirely on next launch.
🔑
Forgot Password
Gmail + License Key → temporary password emailed → forced new password screen → access restored.

Privacy-first by design.

Your data never touches any server. Everything is encrypted locally using industry-standard cryptography — Spotigrate has no cloud component whatsoever.

🔒
Fernet Encryption
All user data (email, hashed password, license key) is encrypted with Python's cryptography.fernet before being written to disk.
🧂
Salted Password Hashing
Passwords are never stored in plaintext. Each account gets a unique random salt hashed with SHA-256 before storage.
💻
100% Local Storage
All user data is stored in %APPDATA%\Spotigrate on your machine. No cloud sync, no telemetry, no analytics.
📧
Baked-In SMTP
Email credentials are encrypted and baked into the compiled EXE at build time. End users never see or can modify SMTP settings.
🔑
License Key System
Each account is issued a unique SPOTI-XXXXX-XXXXX key using secrets.token_hex — required for every login.
🚪
Session Management
Encrypted session files enable auto-login. Logging out destroys the session file instantly, requiring full credentials on next launch.

Up and running
in 3 steps.

Download the compiled EXE for a no-install experience, or run from source if you prefer to inspect the code yourself.

1
Download Spotigrate.exe from the GitHub Releases page and run it directly — no Python needed.
2
Register an account with your Gmail and a password. Copy your generated license key and keep it safe.
3
Launch Chrome via Spotigrate, log in to Spotify in the browser, then start migrating!
Requirements
  • Windows 10 / 11
  • Google Chrome installed
  • Spotify Web Player account
  • Gmail address for registration
Dependencies Used
  • customtkinter — Modern dark UI
  • playwright — Browser automation
  • cryptography — Fernet encryption

All dependencies auto-install on first run if missing.

Glimpse of Spotigrate

A faithful recreation of Spotigrate's actual interface — built with CustomTkinter and designed to match Spotify's own dark aesthetic.

Spotigrate
Migrate & manage your Spotify playlists
⬤  Chrome: Connected · Port 9222
⚠ Setup Required Launch Chrome with remote debugging before running
⚡ Launch Chrome
Opens Chrome with remote debugging — no Win+R needed
Or manually → Win + R → paste this command:
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrome-debug-profile"
Then open open.spotify.com in that Chrome window and log in.  💡 Pause (sec) = wait time between each song migration or deletion.
Playlist Name
My Chill Vibes
Pause (sec)
0.4
Mode
● All songs Pick & choose
🧾 Clear Log
⏹ Stop
▶ Start Migration
Progress 154 / 248 songs
─── MIGRATION ─────────────────────────────────
Target playlist : My Chill Vibes
→ Scanning Liked Songs...
✓ Found 248 songs
✓ Added: Blinding Lights
✓ Added: As It Was
⚠ Skipped (already in playlist)
✓ Added: Flowers

Handpick exactly
what moves.

Switch to "Pick & choose" mode and a full visual picker loads all your Liked Songs. Search, filter, invert — then confirm and only the selected tracks migrate.

Real-time search filter
Type any part of a song name to instantly filter the list to matching tracks only.
Select All / None / Invert
One-click toolbar buttons to bulk-toggle all songs or flip your current selection.
🗑
Delete Picker works identically
Load any playlist by URL, then pick songs to permanently remove — with a confirmation dialog before anything is deleted.
Click Songs names to Migrate — 248 song(s)
246 of 248 selected
1.Blinding Lights
2.As It Was
3.Flowers
4.Anti-Hero
5.Unholy
6.Escapism.
7.Calm Down
8.About Damn Time

Chrome remote debugging command.

If you prefer to launch Chrome manually instead of using the one-click button, paste this into Win+R or a terminal.

Run dialog · Win + R
> chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrome-debug-profile"
Port 9222 is the default Spotigrate expects. After Chrome launches, navigate to open.spotify.com and log in before starting a migration or deletion. The user-data-dir flag keeps this debug profile separate from your regular Chrome profile.

Common issues, solved.

Spotigrate's engine handles most edge cases automatically, but here's what to do if something goes wrong.

! "Frame has been detached" error
Spotigrate automatically detects detached frames and re-acquires the live Spotify page from Chrome's context list. If it persists, reload open.spotify.com in Chrome and click Start again.
! No track rows found after 30 seconds
Spotify's SPA may not have fully loaded. Reload the Liked Songs or playlist page in Chrome, wait until tracks are visible, then retry the operation.
! Playlist not found / URL redirects
Spotigrate verifies the playlist ID after navigation. If Spotify redirects (playlist deleted, private, or wrong URL), copy the URL directly from the browser address bar and try again.
! Songs skipped during migration
Songs are skipped if they already exist in the target playlist. The log will show a yellow ⚠ for each skip. Re-run the migration to retry any that failed mid-operation.
! Chrome status shows "Not connected"
Chrome must be launched with --remote-debugging-port=9222. Use the ⚡ Launch Chrome button in the app, or paste the command into Win+R manually.
! "Recommendations" section songs being included
Spotigrate's JS layer specifically excludes Spotify's "Recommended" rows using multiple selector checks, so only your actual liked/playlist songs are counted.

Frequently asked questions.

No. Spotigrate uses Playwright browser automation to control an open Chrome window — it reads and clicks the Spotify web player just like a human would. Zero API credentials, OAuth tokens, or developer accounts needed.
Completely. You log into Spotify yourself in the Chrome window — Spotigrate never sees, requests, or stores your Spotify credentials. It only interacts with the already-logged-in browser session.
The license key (SPOTI-XXXXX-XXXXX) is a locally-generated identifier that ties your account to the installation. It's generated using secrets.token_hex at registration, stored encrypted in %APPDATA%\Spotigrate, and required alongside your password at every login. Nothing is sent to any server.
Yes. Spotigrate scrolls the page in a loop, collecting track IDs as they appear, until it detects the official total reported by Spotify's header or hits a scroll-stall condition. There is no hard cap.
Spotigrate verifies the playlist exists by checking Spotify's "Add to playlist" submenu before starting. If it's not found, it shows instructions for you to create it manually in Spotify first, then retry.
The pause (in seconds) is a configurable wait time inserted between each song migration or deletion action. A value of 0.4–1.5 seconds is recommended to avoid triggering Spotify's rate-limiting. The delete tab defaults to 1.5 s for extra safety.
The pre-compiled .exe is Windows-only.

Ready to take back
control of your music?

Free, open-source, and built with the Spotify colour palette. Give it a star if it saved you hours of manual clicking.

↓   Download Free ⭐   Star on GitHub
Send me an email Chat on WhatsApp