Blinding Lights — The Weeknd
Kill Bill — SZA
Runaway — Kanye West
Starboy — The Weeknd
Levitating — Dua Lipa
All The Stars — Kendrick Lamar
Die With A Smile — Lady Gaga
As It Was — Harry Styles

Song Battle

Vote on head-to-head music battles. Every vote shapes the global rankings.

← Back
RoleSolo Developer, Designer
StackNext.js, TypeScript, Spotify API
TypePersonal Project
StatusLive

Music rankings have always bothered me. Billboard uses streams, Apple uses sales, Spotify uses play counts. None of them ask the simplest question: if you had to choose between two songs, which one would you pick?

Song Battle started from that question. I wanted rankings determined purely by preference. No algorithms deciding what counts as a “listen,” no play-count inflation, no label politics. Just two songs, side by side, and your honest opinion.

What if the best song in the world was decided the same way we decide the best chess player?

How It Works

01Listen

Two songs appear side by side with album art and 30-second Spotify previews. No context, no bias. Just the music.

02Vote

Pick your favorite. One tap. Both songs’ ELO ratings update instantly based on the expected vs actual outcome.

03Rank

Over thousands of votes, the leaderboard converges on a crowd-sourced ranking that reflects genuine preference.

The Battle

Two songs. One choice.

The battle interface is intentionally simple. Two cards, two songs, two buttons. Each card shows album art, song title, artist, release year, and a 30-second audio preview pulled from the Spotify API. You listen, you pick, you get a new matchup. The whole loop takes about ten seconds.

Battle interface with two songs side by sideHead-to-head battle with album art and vote buttons
The Leaderboard

Rankings powered by math

Every song starts at 1500 ELO. Wins against higher-ranked songs earn more points. Losses to lower-ranked songs cost more. The K-factor of 32 keeps the board responsive. Over time, consensus emerges. The leaderboard shows ELO ratings, battle counts, and win percentages for every song in the pool.

Leaderboard with ELO rankingsGlobal rankings with ELO scores and battle stats
4.9kTotal votes
500Songs
1500Starting ELO
32K-factor

Spotify Integration

Song data, album art, and 30-second previews pulled directly from the Spotify API. The catalog is real and the previews are instant.

ELO Algorithm

The same mathematical model used in chess. Songs gain or lose points based on the strength of their opponent, not just whether they win.

Framer Motion

Page transitions and card animations keep the voting loop feeling fast and responsive. Every interaction has weight.

Retro Aesthetic

Pixel fonts, neon gradients, and arcade-style buttons. The interface has personality because music deserves more than a clinical UI.

The app is built with Next.js and TypeScript. The Spotify Web API handles all the music data: track metadata, album artwork, and preview URLs. When a user loads the battle page, the server selects two songs weighted to favor matchups between similarly ranked tracks, which produces more informative ELO updates.

The ELO calculation runs server-side on each vote. Both ratings are recalculated based on expected outcome probability and the actual result, then written back to the database. The visual direction leans into a retro-gaming, neon-cyberpunk aesthetic. Press Start 2P and Orbitron for typography, magenta and cyan gradients, dark backgrounds with subtle glow effects.

What I Learned

Simple mechanics, deep engagement

The entire interaction is “listen, pick one.” But the simplicity is what makes it addictive. People keep voting because each matchup is a new debate with themselves.

ELO is elegant for subjective ranking

Taking a system designed for chess and applying it to music works beautifully. With enough votes, consensus emerges naturally from individual opinions.

API constraints shape the product

Spotify’s 30-second preview is a limitation, but it forces gut reactions that often produce more honest rankings than full listens would.

Visual identity carries weight

The neon glow, pixel fonts, and arcade buttons make voting feel like a game. People engage differently when the interface has personality.