Dave Sníd

Table Slayer

As I mentioned in a brief sojourn, I took most of 2025 off to build a personal project called Table Slayer. The site lets Game Masters build and manage animated battle maps for in person RPG games on a TV. Emphasis on in person, as there are a lot of great virtual tabletop options for playing online already. Technically I launched the beta this Spring, but I wasn’t really happy with everything until a month or so ago. At this point I feel it’s a solid product that scales well and is easy to use. There’s a user-focused changelog to see the progression of features over time. In between, I spent a lot of time learning a lot more about realtime web technologies, Three.js, Svelte, and hosting architecture. There was a decent amount of refactoring along the way, but nearly all my core technology choices held up well.

Some demos of feature updates

More importantly, people actually use it! Over the Summer Table Slayer collected hundreds of users; a few dozen of those now pay for the service. I haven’t done much marketing other than posting about it on my bluesky and I stuck to my promise of not including tracking or analytics software. Features are added mostly as users request them, or as I fancy. The code is open and is licensed with a functional source license that converts to Apache 2 after two years.

Table Slayer is by far the most complex software I’ve built on my own, but I did utilize some contractors for the 3D and illustration work. Svelte ended up being a fantastic framework to work in, and my Turso, Cloudflare, Drizzle, Partykit, and yJS architecture has proven to be extremely stable. It even runs in multiple regions on Fly.io, with embedded database syncs local to each region. On the operations side, I have database branching deployed with each PR through Github actions so I can run tests against production-copied data. The worries I had about my engineering chops have mostly evaporated by now, and I’ve inherited the fun engineerig trait of overbuilding things for small projects. One of the things I’m most proud of is that I wrote the auth system from scratch using docs from Lucia!

All in all this was an interesting year to take on something big and see it through. The landscape of AI tools changed a lot in 2025 and though my code started hand-crafted to start, lately I employ AI agents to do most of my coding tasks. It did help to have that initial hand-written layer though, so I could be opinionated later when agents wouldn’t follow my patterns. It’s not all perfect, and there are still a couple rough areas to smooth out. In particular the Partykit driven websocket system that syncs through yJS is still a bit fragile, but very honestly, I assumed going into this project that I wasn’t going to be able to pull off a fully real-time editing system on my own. I’m surprised it works as well as it does. My only regret is leaning into hosted services (Turso, Cloudflare) a bit too much, because you can’t just spin up a Docker container and run it yourself without some keys.

What’s next? After building Table Slayer with “dumb” TVs in mind, I want to explore building something that works with a large-format touchscreen instead. This would remove the need for a separate controller device, and allow direct interaction from players other than the GM. Finding large format touchscreens though isn’t easy or cheap, and so I had to contact a few manufacturers directly to prototype something custom. I hope to finish the year with a new table using such a screen. If that goes well, I might explore building an actual physical device around it, rather than just software. We’ll see!

↩ More posts