← All posts

Running TorinBot for 470k users

On 11th May 2020 I created a Discord bot. No plan, no roadmap. Just curiosity about what you could build with discord.js and a bit of JavaScript. By the end of that summer the bot was verified, in hundreds of servers, and I was fixing filesystem issues at 2am on an old laptop under my desk. Two years later it had served nearly half a million users.

Building in public, one command at a time

The first commands were small and personal. A meme command for my friends. A ping command because every bot has one. Then uptime so people could see how long it had been running, and recentupdate so I could tell them what I'd changed. Nothing revolutionary. But people started adding it to their servers, and they asked for more.

So I kept going. I built moderation tools (ban, kick, warn) because server admins asked. I added custom prefixes so communities could make the bot feel like theirs. By September 2020 the bot hit 150 servers and Discord accepted it into their verification programme. At that point it wasn't really a side project anymore.

October and November brought the features that actually drove growth. I built a full music system with queue support, added an economy layer with roulette and robbing mechanics, set up polls, added multilingual support, and launched a website at torinbot.com. I integrated with top.gg for discovery, set up OAuth invites, wrote documentation, added SSL, even built a URL shortener. Some of these shipped fast, some took weeks. What mattered was that I was shipping constantly, and each update brought in another few hundred users. By December the bot was in 420 servers. By May 2021 it crossed 500, and by July it hit 100,000 users.

Running a service from a laptop

For a long time the "infrastructure" was an AMD Ryzen 3 2200G with Radeon Vega graphics. An old laptop. It had 4 cores, 3.5GHz clock, and about 142 MB of total memory available to Node. The bot ran on Node.js v12 on Windows, hosted under my desk. When Windows forced an update overnight, the bot went down. When the Wi-Fi dropped, the bot went down. When I needed to reboot for any reason, the bot went down.

This was not sustainable at scale, obviously. So I migrated to a proper VPS. Then migrated again when that one had issues. Each migration taught me something about uptime planning and what breaks when you move a live service. The bot ran v2.2.0 on discord.js v12.3.1, with 42 commands serving roughly 200,000 users across 438 servers. It was modest by big tech standards but it was mine, and people relied on it. That weight matters when you're pushing fixes at midnight before an exam the next morning.

What I actually learned

Building features is the easy part. The hard part is keeping them running. Rate limits, memory leaks that only show up after six days of uptime, command queues backing up during peak hours, users who rely on a feature you haven't touched in months suddenly reporting it broken. When you run a service solo, you are the developer, the SRE, and the support team. Nobody else is going to notice the CPU spiking at 4am on a Sunday.

The biggest thing I learned is that an API is a contract. When 500 servers depend on a command working the way it did yesterday, you can't just change its behaviour because you thought of a cleaner implementation. Breaking changes have real consequences for real people. That lesson transferred directly into the backend work I did for KingdomCraft, and it still shapes how I design anything that other people touch.

On 22nd April 2022 I took TorinBot offline. Not because it failed. Because I was moving to Edinburgh to study Arabic and Spanish, and I needed to put my energy there. The bot had run for nearly two years, served roughly 470,000 users, and earned me the Early Verified Bot Developer badge. It ran on an old laptop, survived multiple host migrations, and never asked for a cent in donations. It was the best education in software I could have asked for.