01 / 20

Pickle Royale

A 2v2 pickleball ladder I designed and built for my own group.

Role
Design and build, solo
Type
Personal project
Live
pickleball.dhrumilkherde.com/demo

The problem

Me and my friends play 2v2 every week, random teams every time.

Nobody could remember who was actually any good. Rankings lived in people's heads and got argued about in the car park.

So I built the scoreboard.

How I gave it a look

I do not describe a design to an AI in words. Words drift.

I collect references, annotate them in Shottr to mark exactly which part I mean, put them in a folder named for what they are for, and hand over the path.

It reads what I pointed at instead of what I managed to describe.

The form follows the moment

Log Match asks: who played, what was the score, who carried.

That is the order you decide it in, standing on court with one phone between four people.

Not the order a database would prefer.

The form follows the moment, on one phone

Pickle Royale Log Match flow on a 390px mobile screen, step one: picking players for the Green and Orange teams.

Step one: who played

Pickle Royale Log Match flow on a 390px mobile screen, step two: entering the score, with a live win-probability readout.

Step two: what was the score

The system I was offered

The AI proposed the simple version. Everyone starts at 100. Win, go to 110. Lose, go to 90. Every time.

Beat the best player in the group: +10.

Beat the worst player in the group: +10.

It cannot tell those apart, so it cannot tell you anything.

What I asked for instead

Rate everyone, predict every match, and move people by how wrong the prediction was.

Beat someone you were meant to beat and barely anything happens. Lose to someone you were meant to beat and it costs you.

Hard to climb, easy to fall down. That is what makes the top of it worth anything.

What that looks like in play

Maya and Neha, 1467 and 1333. Kabir and Sanjay, 1085 and 889.

The model gave the favourites 92%.

What that looks like in play, the upset

Pickle Royale upset-alert modal reading David Beats Goliath, over confetti, showing Kabir plus 59 to 1145 and Sanjay plus 59 to 948.
UPSET ALERT: David beats Goliath, real deltasfig. 01

What that looks like in play, the magnitude

They lost 3-11.

59 points, each way. An even match moves about 9.

What that looks like in play, the ladder before and after

Before
Pickle Royale standings before the upset: Maya first at 1467, Neha second, Kabir and Sanjay near the bottom.
Before: Maya and Neha well clear of the field
After
Pickle Royale standings after the upset: Maya still first but the gap to the field compressed, Kabir and Sanjay each climbed two rungs.
After: gap compressed, Kabir and Sanjay climb

Margin, dampened

An 11-0 counts for more than an 11-9, on a log curve, so a blowout matters without being everything.

And a strong team crushing a weak one earns less than the scoreline suggests, deliberately. Otherwise whoever is top farms the bottom of the ladder and never defends anything.

Margin, dampened, the skunk

Pickle Royale result screen for an 11-0 skunk, reading Pickled, with the winning team's contribution-split deltas.

An 11-0 skunk, the bigger swing

Who carried

In doubles a win is not split evenly, and everyone at the court knows it.

A slider from centre, 10/90 at the extremes. Drag it toward whoever did the work.

Who carried, the slider at rest and dragged

Before
Pickle Royale who-carried slider at rest, reading Maya 50%, 50% Neha.
The same slider at rest, 50/50
After
The same Pickle Royale who-carried slider dragged toward Maya, reading Maya 90%, 10% Neha.
Dragged to 90/10 toward whoever carried

Who carried, in a loss

In a loss it inverts: whoever carried loses less. It was not their fault.

The split only moves points inside a team, never changes the team total. Which is why it is safe to let friends argue about it.

Ratings are never stored, only replayed

Every rating is recomputed from the whole match log, in order, per group.

So deleting a mistyped match is safe, and one group's results cannot leak into another's.

Then I had to let people in

The login wall blocked everyone I wanted to show it to. So there is a demo: every visit mints a throwaway group seeded with a real season, signs you in, hands you a player. Log a match, watch the ladder move.

A daily cron deletes them. Real groups are never touched.

Pickle Royale group-settings sheet showing the demo group's name and its six-character join code with a copy button.
A throwaway group, seeded and readyfig. 02

Built with

Frontend
React, Vite, TypeScript
Platform
One Cloudflare Worker serving app and API, D1 for data, one deploy
Auth
Google sign-in
Ratings
shared/elo.ts: base 1200, K of 40 for the first ten games then 24, contribution clamped 10/90, margin of victory on a FiveThirtyEight-style log curve
Made with
Claude Code, with design references annotated in Shottr

Thanks for walking through it

Dhrumil Kherde, product designer.

dhrumilkherde.com

dhrumilkherde.com