How I built the Nuance Network leaderboard for Bittensor subnet 23
- Published
- Reading time
- 2 min read
A small Next.js dashboard that ranks subnet 23 miners: one proxy route, a typed client, and polling tuned to how often each piece of data changes.
Nuance Network is Bittensor subnet 23. Miners earn by posting quality content on X, and the network scores it. In August 2025 I wanted one place to see who was ranking, how a single miner was doing and whether a post would count before sending it. So I built Nuance Tracker, a leaderboard on top of the public Nuance API.
It's a Next.js app with React Query for data and Tailwind CSS for styling. There's no database. Everything on screen comes from the API.
One route in front of the API
The browser never calls api.nuance.info directly. Every request goes to a single route in the app, /api/nuance, with the upstream path in an endpoint query parameter. The route forwards the rest of the parameters, sets its own User-Agent, adds CORS headers and turns any network failure into a plain JSON error.
That one file means the client only ever knows one base URL, and a new endpoint needs no new server code. GET and POST both go through it, so the post checkers use the same path as the leaderboard.
A client that renames things
On top of the route sits a small client class. Each call has a 10 second timeout through an AbortController, so a slow upstream shows an error instead of a spinner that never ends.
The API's field names didn't match what the UI wanted, so the client maps them. A handle becomes a username, a node hotkey becomes a hotkey, and rank is simply the position in the response. The API doesn't send a last active time, so for now the client fills in the current time and a comment marks it as a placeholder.
Polling matched to the data
The home page loads subnet stats, the top 10 miners and the top posts in parallel. That data is treated as fresh for 30 seconds and refetched every minute. The full miner list is bigger and changes slower, so it stays fresh for a minute and refetches every five. A miner's profile pulls stats, linked accounts, posts and interactions in four parallel calls.
Search runs in the browser. It filters the full list of miner scores by hotkey as you type, with no request per keystroke.
Where it is now
The site has five pages: the leaderboard, a miners view, analytics, a submit page and a quality checker that sends a draft post to the API and shows its word and character count.
The code is public and the site is still deployed. As of 14 September 2026 the upstream Nuance API isn't responding, so the dashboard shows its error state instead of live numbers.

