Captain Pansu • Shipped 2025

A leaderboard that ranks friends in League and TFT

The Captain Pansu leaderboard: ranked rows of players with tier, LP, win rate and recent average placement, top rows highlighted.
Role
Product Design, Development
Timeline
August 2025 to May 2026
Team
Solo
Tools
Lovable, Cursor, Claude Code, Supabase, Riot API, TypeScript, Tailwind CSS, shadcn/ui
Live
Shipped
Accounts tracked across the NA and KR servers
22
Games on one board, League of Legends and TFT
2
Shared refresh cooldown that keeps it inside Riot's limits
10 min

A leaderboard for my friends' League and TFT ranks. Built solo from August 2025 until we stopped playing in May 2026.

I designed and built it alone. The shared API limit shaped how it worked.

Problem

Comparing rank meant ten separate searches.

Stats sites show one player, not a group. Checking everyone meant searching each Riot ID on a stats site. Switching between servers and doing it again for the other game made it worse.

Captain Pansu puts every account on one board.

Ten separate lookups become one board with one refresh button.

Process

I tested the two core ideas in a quick prototype first.

I built a Lovable prototype in TFT only. It tested the two core ideas: looking players up and filtering by tier.

Both worked, so I rebuilt with Cursor, Claude Code, and Supabase, covering both games.

The Lovable editor with the chat on the left and the first dark TFT leaderboard prototype on the right.
The Lovable prototype: TFT only, built to answer two questions.

Process

One refresh button meant designing its limit.

The Riot API is rate-limited and shared. Refresh locks for ten minutes after anyone uses it.

I made the limit visible. The last update time sits next to the button, so it feels like a rule, not a bug.

The board's header in Korean: last update, December 26 2025 at 4:49:32 PM, next to a locked refresh button reading refresh available in 7:41.
Last update on the left, the lock on the button: refresh available in 7:41.

Reflection

We stopped playing in May. Next time, I'd design the paused screen first.

By May, most of us had stopped playing.

I paused the database, and the board showed an error instead of saying it was resting. A side project should end looking finished, not broken.