Initiative Tracker
A D&D combat tracker built for streaming — with HP tracking, conditions, undo support, and a live OBS overlay that updates in real time. It didn't exist, so I made it.
A friend mentioned they were thinking about streaming D&D, and that was all it took. My brain immediately started spinning on what kind of tool could make that easier. Something tailored to the table, something that could actually show up on stream. I went looking for an initiative tracker with an OBS overlay and came up empty. So I built one.
If you've never played D&D (or any tabletop RPG), initiative is basically the turn order for combat. Every player and every enemy rolls a die at the start of a fight, and whoever rolls highest goes first. Keeping track of that — along with hit points, status effects, and whose turn it is — is usually the DM's job, often scrawled on a notepad or tracked in some clunky spreadsheet. My goal was to make that whole thing cleaner and to surface it on stream so viewers could follow along.
The tracker itself does quite a bit. You add everyone to the encounter (players and enemies alike), give them their initiative roll and their HP, and from there the tool handles the rest. It tracks turn order, lets you deal or heal damage with a few clicks, apply conditions like Poisoned or Stunned, and automatically moves through the round. There's undo support too, which I'm genuinely glad I added because combat gets messy and mistakes happen. You can attach portrait images, assign custom colors to each participant, and even set different sound effects for when a turn advances or someone gets knocked out. It's a lot of little things that add up.
The feature that gave me the most grief — and that I'm most proud of — is the OBS overlay. Drop the generated URL into OBS as a Browser Source, and it renders a live view of the current encounter: names, initiative order, portrait images, HP bars, health status. Everything updates in real time as you make changes in the tracker. The hard part: the overlay runs in a completely separate browser window with no direct connection to the tracker. I had to build a polling system where the tracker continuously pushes its state to the server and the overlay pulls updates. Getting that to feel seamless — with no noticeable delay, no manual refresh — took a lot of iteration. The session ID system (each tracker instance gets a unique ID that ties it to its overlay) also took more thinking than I expected. But once it clicked, it worked exactly the way I wanted.
Making that actually work and look correct was rough. The overlay runs in a completely separate browser window with no direct connection to the tracker, so I had to build a system where the tracker constantly pushes its state to the server, and the overlay polls for updates. Getting that to feel seamless — changes in the tracker showing up on stream without any noticeable delay or manual refresh — took a lot of iteration. The session ID system (each browser gets its own unique ID that ties the tracker to its overlay) also took more thinking than I expected. But once it clicked, it really clicked. It works exactly the way I wanted.
The overlay itself shows each participant as a small card: their name, initiative value, an optional portrait, and a health bar. For enemies specifically, you can choose to show vague injury labels instead of exact numbers — so viewers see "Injured" or "Severely Injured" rather than "7/40 HP", which adds a nice layer of tension. You can also hide HP entirely for enemies, or choose custom text and outline colors per participant to make things visually distinct.
One setting I particularly like is the injury mode toggle. Rather than showing raw health numbers, it switches to a label system: Healthy, Lightly Injured, Injured, Severely Injured, Defeated. It's a small thing, but for streaming it feels way more dramatic than watching a number tick down.
Down the line I want to let users customize the look of the overlay itself – different layouts, color schemes, maybe different card styles. I already have an idea of what would feel best, but I need to research what's actually feasible before committing to anything. There's also a possibility I add Stream Deck integration or Twitch chat commands at some point, but that'll only happen if people actually ask for it.
For now, it's the most complete tool I've built so far, and it solves a problem I couldn't find a solution for anywhere else. That feels pretty good.