Tier2 build…
not connected

Tier2 finds the songs fans know but radio forgot. It ranks an artist, playlist, decade, or your own taste by real listening counts, then rebuilds it from the deeper cuts. It runs entirely in your browser and talks only to Spotify and Last.fm.

First-time setup (5 minutes)

  1. Get a Spotify Client ID and a Last.fm API key (steps below).
  2. Click Keys at the top, paste both, and Save.
  3. Click Connect Spotify and approve access.
  4. Pick a tab and start building.

Get a Spotify Client ID

  1. Go to developer.spotify.com/dashboard and log in with your Spotify account.
  2. Click Create app. Name and description can be anything.
  3. Under Redirect URI, add this exact value (including the trailing slash) and save:
  4. Open the app's Settings and copy the Client ID (you do not need the client secret).
  5. Open User Management and add your own Spotify account (the name and the email on your account). Apps start in development mode and only let people you add log in.

Get a Last.fm API key

  1. Go to last.fm/api/account/create and log in.
  2. Fill in any application name and your email. Callback URL can be left blank.
  3. Submit, then copy the API key (the 32-character string). You don't need the shared secret.

The tabs

Result rows

▶ Play on Spotify plays one track in your Spotify app. ✓ Keep / + Add chooses what your selection is — tap a removed hit's + to keep it, or a cut's ✓ to drop it. The three buttons below the list all act on that selection: Shuffle All shuffles and queues the whole set on your computer with no playlist, Save to Spotify makes a playlist, and Add to Inventory stages them for a compilation.

Playback

Play needs Spotify Premium and the Spotify app open on the same device — the desktop app on a computer, or the Spotify app on your phone — plus a one-time Keys → Reconnect Spotify to grant playback permission. On a phone, if the app isn't already active, Play opens the track in Spotify instead. Shuffle All queues your kept songs onto that device.

Filters (top of the app)

Exclude live, remaster, holiday, instrumental, and interlude tracks, and set a release-year range. Filters apply to every result and to playback matching.

Troubleshooting

Privacy

Your keys live only in this browser's localStorage and are sent only to Spotify and Last.fm. New playlists are private by default; "Make playlist public" is an explicit opt-in.

Skip the Hits

Discover the songs fans know but radio forgot. Tier2 ranks an artist or playlist by real listening counts and rebuilds it from the deeper cuts.

Keys are stored only in this browser (localStorage) and never sent anywhere except directly to Spotify and Last.fm. Your redirect URI must be registered in the Spotify dashboard as . Full setup steps and troubleshooting are under Help at the top.

Empty. Use "Add to inventory" on any result.
Artist
Discover
Mix
Sommelier
Enhance Playlists
Filters · live, holiday, interludes excluded
Applied to every result on every tab, and saved across sessions. Years: exclude single years or inclusive ranges, comma-separated (1999, 2004, 2010-2016). The "Released from / to" boxes above set one overall range; this field carves out specific years inside it. Artists: separate each with a comma (Nickelback, Creed). Matching is by name, case-insensitive — use Verify on Spotify to confirm each name resolves to the artist you mean before running. Tracks with unknown release dates are kept.
Loading your playlists…
Enhance: 1 playlist — swap its top-10 hits for deeper cuts. Merge: 2+ playlists into a new one. Delete: removes the selected playlists from your library.
overplayed
tracks
Decade words normalize to Last.fm's dense tags (1990s → 90s). Ranking is by listening data, not radio charts — there's no clean historical-chart API.
Loading your playlists…
Bigger names ⟵⟶ deep underground
Bigger names ⟵⟶ deep underground
Working…
Freshness score
How much of this is NOT a top-10 radio hit.
Actions use the tracks marked ✓ Keep. Tap + on a row (e.g. a removed hit) to add it back, or ✓ to drop one.
Request log (every API call + full error body)