WardyBot 03
Moderation, anti-spam and game mechanics for large Telegram chats — 2.1 million users served from a single $24-a-month server.
A chat with 28,000 people in it cannot be moderated by a human
Picture a Telegram chat with 28,000 people in it. Someone is spamming ads, someone is picking fights, someone is running bots. A human admin physically cannot keep up.
WardyBot takes that job: it catches spam, screens bots at the door, moderates toxicity and keeps the statistics. Then it does the other half — keeping people there. An in-chat currency, reputation, achievements, collectibles with a marketplace, duels, giveaways and an AI assistant give a community reasons to come back, and give its owner something to sell.
The number I care about is the ratio: two million users, one $24 virtual machine, a thousand days without a break. Not because cheap hosting is a virtue in itself — because every architectural decision below was made under that constraint, and the constraint is what makes them interesting.
One Rails process, N bots, four currencies and a ledger that cannot drift
950 service objects, 52k lines of code against 110k lines of tests, one VPS with 2 vCPU and 3.8 GB of RAM.
One core, many bots — until it did not need to be
Aggregate, don’t archive
Immutable financial ledger
Reflective command router
Moderation pipeline before routing
ПpNB1т is still caught.Cross-language RPC · AI billed at cost
Who worked on it · 7 contributors
Danyil Shkoropad
- Product and architecture from a blank page; the immutable ledger and all 196 deploys.
- Set the process ten developers work inside: ticket branches, review, CI, mandatory tests.
Oleksandr Shemberko
- Skins — the collectibles with their shop, drops, sales and moderation — plus duels and the captcha quiz at the door.
- The web admin on Vue 3 + TypeScript, and the Mini App’s move to React with its premium shop.
Oleksii Mikhno
- The Mini App view layer and the donation flow behind it.
- Worked on the giveaway and achievement mechanics.
Vladyslav Fomenko
- The quotes surface — menu, categories, backgrounds — and the API endpoint that hands a quote to the render service.
- Hardened the error paths: Telegram client failures, AI-filter job errors, Rollbar under rate limiting.
Nataliia Makarenko
- The OpenRouter features, the background jobs behind them, and the backup routine.
- Kept both languages of the interface in step as the command surface grew.
Mykhail Yun
- Turns chat owners’ complaints into tickets — most of the moderation rules started as a customer call.
- Sold and onboarded the 17 white-label bots that ran on the shared core.
Claude
- Review the moment a pull request opens for review — never on a draft, never twice on the same push.
- Most useful on the ledger: flags any migration that could mutate a transaction.
Read to the end and want to talk it over?





