Project Watch.Uristocrat: What It Took to Build the Reddit Version of Watch Uristocrat
watch.uristocrat.com tells you what sports are on today and where to watch them. Pick a league, get the games, click the network.
The site works fine. But the people who actually need it are already on Reddit — in r/nba, r/formula1, r/ufc. Game-day threads are huge. Someone always asks where to watch. I wanted to put the tool there, inside the subreddit, not one link away from it.
Reddit has a platform for this called Devvit. You can build custom post types that render directly in the feed, real interactive apps, not just links.
How it works
The app is two things.
First, a Devvit app in TypeScript. It registers a custom post type and adds a mod menu item. A subreddit moderator picks a league from a dropdown, the app creates the post, stores the league ID in Redis keyed to the post ID, and navigates to it.
When someone opens the post, the render function reads the league from Redis, hits ESPN's public scoreboard API (site.api.espn.com), maps the broadcast channel names to streaming URLs, and renders a card for each game — matchup name, live/final/upcoming status, and buttons linking directly to ESPN, Peacock, Paramount+, Prime Video, Apple TV+, wherever.
Results get cached in Redis for five minutes so every pageview isn't a fresh ESPN request.
Leagues: NBA, MLB, NHL, NFL, Premier League, Champions League, La Liga, MLS, F1, UFC, ATP Tennis.
Second, a webroot — one HTML file per league, each reading a <meta name="league"> tag and calling the same ESPN API.
The thing that broke first
The first version fetched from watch.uristocrat.com own API. The Devvit app would call my backend, which would call ESPN and shape the response.
That failed with gRPC status 7: PERMISSION_DENIED. Devvit blocks HTTP requests to any domain not in an approved allowlist. Custom domains need to go through a review process. I didn't want to wait on that.
The fix was obvious once I hit it: ESPN's scoreboard API is already public. There's no reason to proxy it. I added site.api.espn.com to the Devvit config and moved the streaming link logic into the app itself.
Devvit.configure({ http: { domains: ['site.api.espn.com'] }, redditAPI: true, redis: true,});There's a second constraint worth knowing: Devvit's render context doesn't allow network requests at all. Fetching has to happen in an async handler outside the render function, get written to Redis, and then the render function reads from Redis. It's not how you'd normally think about data fetching in a React-style component, but it makes sense for how Devvit sandboxes things.
The UI
Devvit's component model is vstack, hstack, text, button so there is no HTML, no CSS. The vocabulary is limited but enough for a card list. Live games render in Reddit orange (#ff4500), bold. Everything else is gray. It's readable at a glance with scores.
Why bother
A moderator installs it once. After that, posting a Watch Guide before any game day is two taps. The community that's already there gets the info without leaving Reddit.
The app is live on Reddit's developer platform as watch-uristocrat. If you mod a sports subreddit and want to add it, reach out.
What's possibly next
A few things I've been thinking about but haven't built yet.
The mod menu action is manual right now — a moderator has to trigger it. The natural next step is a scheduled job that auto-posts a Watch Guide on game days, so the thread is already up when fans show up in the morning. Devvit supports schedulers natively.
The render context constraint (no HTTP, read-only from Redis) means the data is always a snapshot from the last cache write. Five minutes is fine for most cases, but for live games — especially late in a close match — you'd want fresher updates. One option is a background scheduler that refreshes the cache more aggressively while a game is in progress.
Right now every Watch Guide post is one league. A combined "what's on tonight across all sports" view would be more useful on game-heavy nights. The data's already there, it's just a layout problem.
And eventually I do want to go through the Devvit domain review process so the app can pull from watch.uristocrat.com directly. The ESPN API is public and free but it's also undocumented and unofficial — it could change. Routing through my own backend gives me a stable contract and lets me layer in things ESPN doesn't expose, like streaming availability by region.
Member discussion