The final boss of every campaign is scheduling
I've never lost a campaign to a bad session. I've lost them to the group chat. Notes on Table Clock, the small thing I built next to The Scribe's Tower.
I've never lost a campaign to a bad session. I've lost them to Tuesday.
Nobody announces it. The poll goes up, three people react, the fourth doesn't, and the week after you don't bother posting the poll. A month later someone says "we should pick that back up," everyone agrees, and nobody does. The lich was fine. The lich was ready.
The Tower is for the other problem
Most of what I've built for this hobby is The Scribe's Tower, and it's the biggest thing I've made. Running a campaign means carrying a living world around — months of sessions, dozens of NPCs, factions with their own agendas, threads I promised to pay off and was quietly afraid of forgetting. The Tower carries that with me, so I can stop being my campaign's database and go back to reading the table. Every new DMing problem I hit, I still solve there first.
But it works on the game while the game is happening. Whether Saturday happens at all is a different question, and I was still answering that one by hand, in Discord, every week.
The annoyance had a shape
I've written before that every hobby of mine eventually becomes a software project — the moment "this is annoying" turns into "this annoyance has a shape."
Scheduling has a very clear shape. Post the poll in Discord. Get three reactions. Chase the fourth player in DMs. Find out on Friday that the fifth answered for the wrong week. Do it again in seven days.
That last line is the actual problem. Every tool I tried is built to ask once: pick a slot, everyone votes, done. A campaign asks the same question every week until it ends, and the asking always lands on the DM. None of it is hard. It's just there, forever, and you can love the game and still hate being the guy who posts the poll.
So I built Table Clock. It keeps asking so I don't have to.
What it does
You set the cadence once — Wednesdays at four in the afternoon, three players minimum — and every cycle it opens the poll again on its own. Reminders go out without me. Slots expire when their window passes. If a week can't lock, it rolls forward to the next one instead of stalling until a human notices.
It also knows who actually has to be in the room: no session without the DM, and an "if you must" never counts as a firm yes. That part is bookkeeping.
The part that took real work is daylight saving. A weekly game walks into it twice a year, and it's where calendar tools quietly lie to you. "Thursday at 19:00 in London" has to survive the spring-forward gap and the autumn overlap, or game night slides an hour and half the table shows up at the wrong time. So candidate times get computed in true local wall time and tested against every DST trap on every weekday — sixty-seven tests passing before there was a page to look at. You never see any of it, which is the idea.
The thing I got wrong: I wrote "no player accounts of any kind" into the project doc on day one and felt quite principled about it. Right instinct, wrong rule. The same person DMs one game and plays in two others, and I'd split them into two different kinds of user. Answering still never needs a login — tap the link, answer, close the tab. But there's an optional account now if you want your games in one place, with Discord sign-in, because that's where the tables already are.
Free, no tiers, a tip jar at the bottom. It's cheap to run — no AI, no media, a group is a handful of database rows and a few emails. A tool whose whole job is telling your group when it meets has no business being another subscription the DM has to justify.
Side by side
I like the sizes of these two. The Tower is months of work and holds an entire world; it's where the building actually happens, and where I'll keep going. Table Clock is date math and some emails.
The Tower is for the campaign. Table Clock is for the calendar. The calendar turned out to need more engineering than I expected for something nobody is ever going to look at.
