Fortuna has rolled dice, tracked coins, and kept campaigns humming on Discord servers for a long time. Behind the scenes, though, the bot had grown into a single large program juggling everything at once — and the seams were starting to show. So we did the thing every long-lived project eventually faces: we rebuilt it from the ground up.
The new Fortuna is faster to respond, steadier under load, easier for us to improve, and ready to grow with your table. Most of that work happened in places you will never see, which is exactly the point. But the results show up everywhere you actually use it. Here is the full story of what changed and why it matters.
The original Fortuna was built on a common pattern: a bot that holds a permanent, always-open connection to Discord — what Discord calls the gateway — and listens for everything happening across every server it joined, all the time. To handle the load as the bot grew, that connection was split into several parallel copies, called shards, each one a separate running process that had to be watched, restarted, and kept healthy.
This works, and it worked for years. But it carries real costs. A permanently connected bot is always consuming memory and holding state, even when nobody is typing a command. Every server, channel, and member it could see added weight. When one shard hiccuped, a chunk of servers could feel it. And every new feature had to be threaded carefully through a program that was already doing a dozen things at once.
We wanted something leaner. Something that does the work when there is work to do, stays quiet when there isn't, and is built out of small pieces we can fix or scale one at a time.
Modern Discord bots have a better option for commands: instead of holding a connection open and waiting, the bot can let Discord call it only when someone actually uses a slash command. Discord packages up the command, sends it over as a single secure web request, and the bot replies. No standing connection, no idle weight. When nothing is happening, the bot uses next to nothing.
That is the heart of the new design. We split the old monolith into two focused pieces:
Think of it like a restaurant. The old Fortuna was one frantic cook trying to take orders, manage the dining room, and run the kitchen simultaneously. The new Fortuna has a kitchen that fires up instantly when an order arrives (fortuna-http) and a single attentive host at the door watching for walk-ins (fortuna-gateway). Each does its job well, and neither slows the other down.
Architecture talk is fine, but here is what you will actually notice on your server.
Snappier responses. Because the command core does one thing and carries no idle baggage, it answers quickly and consistently. There is less for a command to wait behind.
Better reliability. The two pieces are independent. If the chat-roll helper needs a restart, your slash commands keep working without a blink. Problems stay contained instead of rippling across the whole bot.
Steadier under pressure. A stateless command core does not accumulate weight as more servers and players pile on. Busy nights behave a lot more like quiet ones.
Faster improvements. With a clean, modular core, we can add and fix features without disturbing everything around them. New commands slot in cleanly, which means updates reach you sooner.
A rebuild is also a chance to ship the things we had wanted to add for a while. The new Fortuna brings a meaningful batch of features:
/lc for members and /mod_lc for moderators to manage balances. Rewards and ranks stay scoped to your community./config command puts per-server settings in one place, so each community can tune Fortuna to fit how it plays./handouts flow, the way a good virtual table should./checkin command makes it easy to mark attendance and keep your group on track.All of this sits alongside the things Fortuna always did well: rich dice rolling (both through slash commands and by typing rolls straight into chat), the daily reward, ranks, the store, and the rest.
One of the biggest quality-of-life upgrades is built right into the new core: full localization. Fortuna now speaks all of Discord's languages — over thirty locales — and it picks the right one automatically based on each user's Discord settings. Command names, descriptions, and responses arrive in the player's own language, with a sensible fallback chain so nobody is ever left staring at a missing translation. Whether your table plays in Portuguese, English, Spanish, French, Japanese, or anything in between, Fortuna meets each person where they are.
If you like the technical details, here are a few of the choices we are proud of — and you can safely skip this section if you don't.
Every command request from Discord is cryptographically verified using Ed25519 signatures before Fortuna acts on it, so the bot only ever responds to genuine, untampered requests. The command core runs on Bun with the lightweight Hono framework; the chat-roll helper is a small, statically compiled Go program that idles at a tiny footprint. Both ship as clean, containerized images, which makes deployments fast and repeatable. And we wired in proper error monitoring so that when something does go wrong, we hear about it and can fix it quickly — while being careful never to log anything sensitive.
The shared dice engine is the same trusted math that powers our other tools, so a roll means exactly the same thing whether you make it on Discord or anywhere else in the ecosystem.
None of this changes the spirit of Fortuna. It is still the friendly bot that rolls your dice and keeps your campaign organized. What changed is the foundation underneath: leaner, steadier, and built so we can keep making it better without getting in your way.
Add Fortuna to your server, try the new commands, and let us know what you would like to see next. The dice are ready when you are.