Anirudh GoelAI automation engineer
Say hi

Rep

Desi Hip Hop's real top 5. 90 artists, live ballots, and honesty about the count.

Industry
Music Community
Year
2026
Role
Design and build (personal project)
Built with
Cloudflare Workers
Drop 5 on a laptop: DROP 5 in black and saffron over pick five, defend your number one, lock it in, Your Five with Baba Sehgal, Bohemia, Yo Yo Honey Singh and Raftaar in slots 01 to 04, and the roster's cards marked PICKED.
The home page on a phone: the saffron banner, REP, the nav of Drop 5, Tier, Top 90, Mixtape and Compare, the Hindi watermark, and the asli DHH top 5 line over three buttons.

Rep is a ranking platform for Desi Hip Hop: 90 web-verified artists across ten cities, a top-five builder, a tier list, a daily 1v1, verified beef timelines and a slang dictionary. It shipped to production on 14 June 2026. The premise is editorial first: it launches with a seed ranking curated by respect tier, so the board is never empty or wrong, and converts to live community rankings the moment real ballots arrive.

Rep, in numbers.

Ninety artists, one board

  1. Web-verified artists, each with a profile90
  2. Regions on the map, across ten cities9
  3. Beefs on the timeline, each with public sources3

A seed ranking by respect tier until real ballots arrive, live rankings after.

14 June2026, the day Rep shipped to production
1 Workerserves the site and fronts D1 for ballots and R2 for share cards
S to Dtier ballots count five points down to one
Every 3rd daythe daily 1v1 is a curated marquee pair
No loginto vote; a per-IP hourly cap and Turnstile keep ballots honest

The brief

A ranking site with zero votes is either empty or lying, so every surface states its own provenance: seed ranking, no ballots yet, or live, N ballots counted. The whole product is one Cloudflare Worker serving a static vanilla-JS site, fronting D1 for ballots and R2 for share cards, with HTMLRewriter injecting real Open Graph tags and JSON-LD so a shared ballot unfurls on WhatsApp and X, which run no JavaScript.

Anonymous voting on a free tier invites abuse, so it is layered rather than solved: a per-IP hourly cap, Cloudflare Turnstile on the two write endpoints that matter, fail-open if the check itself is down, and a moderation token so the first slur on the wall is one request away from gone. The look is a gully zine: kraft paper, carbon ink, saffron, Anton set tight. The detail is in the screens below.

Pick, tier, vote.

Drop 5: pick five, defend your number one, lock it in.

Filter the ninety by city, era, subgenre and language, tap five cards into your slots, and lock.

Picks are validated against the artists table; duplicates and unknown slugs are rejected. The ballot gets a permalink whose share card is rendered client-side to a PNG and stored once in R2.

Tier 5: argue with science, S to D.

Drag any of the ninety into S, A, B, C or D.

It autosaves locally, exports as a designer-tier PNG, and the tier list counts as a ballot in the live rankings alongside the top fives.

Two artists, one tap. A new 1v1 every day.

A deterministic matchup per IST day: same-city or same-era, tier-matched pairs generated from the live roster, with a curated marquee pair every third day.

After voting you see each side’s count, a split bar and the running total. No login. A per-IP hourly cap plus Cloudflare Turnstile on the write endpoints keep the ballots honest on a free tier.

Screens

A ranking platform for Desi Hip Hop that admits when it has no votes.

Ninety web-verified artists across ten cities. It ships with an editorial seed ranking by respect tier, so the board is never empty or wrong on day one, and converts to live community rankings the moment real ballots arrive. Every surface says which it is showing: seed ranking, no ballots yet, or live, N ballots counted.

The home page on a laptop: the saffron banner, REP set huge over a saffron bar with the Hindi word asli as a pale watermark, the asli DHH top 5 line, three buttons, and a strip counting artists, cities, labels, cyphers and verified beefs.

The Pen Game top five, and where the number comes from.

Top-five ballots are weighted six minus rank, tier ballots S equals five down to D equals one, and the leaderboard aggregates from the votes table with its source labelled. A ballot and its vote rows are written in one atomic D1 batch, so a partial write can never leave an orphaned list.

The Pen Game Top Five on the home page, labelled seed ranking, no ballots yet, from respect tier until you vote: Prabh Deep, Seedhe Maut, Hanumankind, Divine and Naezy, each with a photo, a city and a pen-game seed share.

Nine regions, because the scene is a map before it is a chart.

Mumbai, Delhi, Punjab, Bengaluru, Pune, the Northeast, Chennai, Ahmedabad, Srinagar. Each region has its own roster with the artists who came up there, so city pride has a page to argue from.

Nine Regions on the home page: a bento with Mumbai on a large black tile, then Delhi, Punjab, Bengaluru, Pune, the Northeast, Chennai, Ahmedabad and Srinagar, each with its artist count, photos and View the roster.

Verified friction: a beef timeline that only carries receipts.

Three beefs, dated, each with public sources. The rule for the section is that a beef goes in only when the receipts are public. Everything else stays out, however well known it is.

Verified Friction on the home page, only beefs with public diss tracks make this page: three dated rows, Emiway Bantai vs Raftaar, Kr$na vs Emiway Bantai, and Yo Yo Honey Singh vs Raftaar, then Open the full beef timeline.

Nine doors deeper: labels, producers, cyphers, slang, timeline, compare, mixtape, top 90, beefs.

The vault is the depth behind the ranking: the institutions, the unsung hands, the scene snapshots, the dictionary, a 1992 to 2026 timeline. Ninety artist profiles carry scraped editorial bios, each one indexed with its own MusicGroup JSON-LD and a sitemap entry, so the deepest content is the most findable.

Nine Doors Deeper on the home page: nine tiles, Labels, Producers, Cyphers, Slang, Timeline, Compare, Mixtape, Top 90 and Beefs, each with a short line, a count and Open.

Say it louder: the defend wall, and Who’s Missing.

Quotes defending an artist’s place, and a suggestion form for the ninety-first name, gated by Turnstile. Turnstile fails open if its verification service is down, so a broken bot check can never block a real ballot, and enforcement flips with one variable, no deploy.

Say It Louder on the home page: three quotes in italic, defending Seedhe Maut, Hanumankind and Krsna, each marked seed take, then Who's Missing? with a stage name field, a why they belong field and Submit, nothing typed.

Top 90, the full order, cut by era or subgenre.

India’s full DHH order on one page, sortable by pen game or by streams, filtered by era and subgenre. Every row opens the artist’s profile. Seed until the ballots ship, live after.

Top 90 on a laptop: india's full DHH order, cut by era or by subgenre, labelled seed ranking, no ballots yet, the By Pen Game and By Streams switch, a filter field, era and subgenre chips, then rows with a seed share and a tier chip.
Top 90 on a phone: the saffron banner, TOP 90, the era and subgenre line, the seed label, the By Pen Game and By Streams switch and the filter field.

Compare

Pick two artists and read them side by side. The whole product runs on a single Cloudflare Worker serving a static vanilla-JS site, fronting D1 for ballots and R2 for share cards, with HTMLRewriter injecting real Open Graph tags and JSON-LD server-side so a shared link unfurls correctly on WhatsApp and X, which run no JavaScript.

Have a build in mind? Say hi.