Two dashboards for two Bittensor subnets
- Published
- Reading time
- 1 min read
What I learned building a leaderboard for subnet 23 in 2025 and a live dashboard for subnet 102 in 2026, and why the second one is so much smaller.
Bittensor subnets are small networks where miners compete and validators score them. Each one has its own rules, and most have some public data. The people mining them want to know one thing quickly: how am I doing right now. I've built dashboards for two of them.
Subnet 23: Nuance
Nuance Tracker came first, in August 2025. It ranks miners on subnet 23 and adds miner profiles, analytics and a post quality checker. All data goes through one proxy route in the app to the Nuance API, with React Query refetching the leaderboard every minute and the full miner list every five.
Subnet 102: Connito
The Connito dashboard for subnet 102 came in May 2026, and it's deliberately minimal. The repository has four commits over two days. It calls Connito's public gateway straight from the browser with SWR, with no proxy and no environment variables.
It refreshes every 12 seconds because that's how often the gateway itself polls. Asking faster would only fetch the same numbers again.
Designing for gaps
Subnet data has gaps, and the second dashboard is built around them. Between rounds the leaderboard can come back empty, so the last leaderboard with real scores is saved in the browser and shown with a note saying it's the previous round. Some fields, like a miner's hotkey or Hugging Face repo, sometimes come back empty, so they're remembered per miner and only fill in blanks. When the gateway fails, it keeps the last data on screen and retries every five seconds.
One fix came the day after launch. The validator panel showed the on-chain validator count, but the gateway tracks its own. I switched it to the gateway's numbers so the panel matches what is actually being polled.
What carried over
Both dashboards come down to the same two ideas: refresh at the pace the data actually changes, and treat the empty and error states as part of the design. Both are public on GitHub.

