Transfer playlists between Spotify and YouTube Music — instantly, privately, and for free.
- Spotify ↔ YouTube Music — transfer in either direction
- Smart track matching — uses ISRC codes for exact matching, falls back to title + artist search
- Live progress — real-time match count as the transfer runs (Server-Sent Events)
- Privacy-first — tokens are never stored on the server; everything stays in your browser session
- One-click Vercel deploy
Connect Spotify → Connect YouTube Music → Pick a playlist → Hit Transfer
For each track:
1. Search by ISRC (exact match, ~99% accuracy)
2. Fall back to "track + artist" search (~85%)
3. Fall back to loose search (~70%)
Create new playlist on target → Add all matched tracks
- Node.js 18+ installed on your machine
- A free Spotify account
- A Google account (for YouTube Music)
git clone https://github.com/nikhil-thomas-a/playlist-porter.git
cd playlist-porternpm install- Go to developer.spotify.com/dashboard
- Log in and click "Create app"
- Fill in:
- App name: Playlist Porter (or anything you like)
- Redirect URI:
http://localhost:3000/api/auth/callback/spotify - Which API/SDKs: check Web API
- Click Save
- On your app page, click Settings — you'll see your Client ID and Client Secret
- Go to console.cloud.google.com
- Create a new project → enable YouTube Data API v3
- Go to APIs & Services → OAuth consent screen → External → create
- Go to APIs & Services → Credentials → + Create Credentials → OAuth client ID
- Application type: Web application
- Redirect URI:
http://localhost:3000/api/auth/callback/google
- Copy your Client ID and Client Secret
Create .env.local in the project root:
SPOTIFY_CLIENT_ID=paste_your_spotify_client_id_here
SPOTIFY_CLIENT_SECRET=paste_your_spotify_client_secret_here
GOOGLE_CLIENT_ID=paste_your_google_client_id_here
GOOGLE_CLIENT_SECRET=paste_your_google_client_secret_here
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=any_long_random_string_herenpm run devOpen http://localhost:3000 in your browser. Done!
- Click the button above
- Add all environment variables from
.env.example - Update redirect URIs in Spotify/Google dashboards to your Vercel URL
- Set
NEXTAUTH_URLto your Vercel deployment URL
| Limitation | Reason |
|---|---|
| Only one platform connected at a time per sign-in | NextAuth uses a single session; connect one, then switch accounts to connect the other |
| YouTube transfers are slower | YouTube API requires adding tracks one by one; Spotify supports batch writes of 100 |
| YouTube quota: 10,000 units/day | Each track search costs 100 units on the free tier — large playlists may hit the daily limit |
| YouTube "Liked Songs" not readable | YouTube Music's liked songs are private and not exposed via the Data API |
| Podcasts and episodes are skipped | Cross-platform podcast support is out of scope |
src/
├── app/
│ ├── api/
│ │ ├── auth/[...nextauth]/ # OAuth for Spotify + Google
│ │ ├── playlists/ # Fetch playlists from either platform
│ │ └── transfer/ # Core transfer engine (SSE streaming)
│ ├── globals.css
│ ├── layout.tsx
│ ├── page.tsx # All UI in one file
│ └── providers.tsx
├── lib/
│ ├── spotify.ts # Spotify Web API
│ └── youtube.ts # YouTube Data API v3
└── types/
├── index.ts
└── next-auth.d.ts
- Manual search fallback for unmatched tracks
- Transfer history
- Export playlist as CSV / JSON
- Batch transfer multiple playlists
MIT — free to use, modify, and distribute.