A gamification engine for Discord communities
Vroshik turns everyday activity into progress: levels and daily streaks, a collectible stone dragon, a seasonal battle pass, arcade mini-games on virtual credits and in-house match lobbies — one Discord bot plus a web dashboard.
- 186
- slash commands
- 38
- bot modules
- 316
- web dashboard routes
- 27
- feature flags
Counted from the source code.
Members earn coins and XP for showing up, playing and helping out — and spend them on a companion, cosmetics and events. Every number on screen comes from the server.
What it does
Twelve systems that feed each other. The riskier ones sit behind their own switch in the owner panel.
Levels & leaderboards
XP from messages, voice minutes, matches, quests and the daily gift; server and global tops.
level = ⌊√(XP / 100)⌋
Daily gift & streaks
A free chest every day and a bigger one for every 7-day streak, with a 48-hour grace window so one missed evening is forgiven.
7-day streak chest
Two-currency economy
Coins are earned by activity and spent in-game; crystals are the premium currency for cosmetics and status. Transfers carry a small tax.
coins + crystals
Companion & lair
Collect, feed and level up VRoshik companions; the lair grows with your strongest one.
44 designs · 7 rarities
Chests with published odds
Every chest shows its exact odds; a pity meter guarantees Epic and Legendary drops; weekly limits.
Epic guaranteed by 15,000
Seasonal battle pass
Free and premium tracks with season quests; pass XP flows from the same actions as regular XP.
seasons + quests
Arcade mini-games
Coinflip, Crash, Mines and two cascade-reel games, played with virtual coins at published payout rates.
virtual credits only
Pick'em & predictions
Pro Dota 2 schedule from PandaScore and OpenDota; members predict results with virtual coins; each match is settled exactly once.
idempotent settlement
In-house match lobbies
Queue with one command, captains pick teams, a Steam bot creates the real Dota 2 lobby; every played lobby pays coins and XP.
30 lobby commands
Tournaments
Battle Cup sign-ups with slot limits for big nights, plus community tournaments on the web.
Battle Cup
Rooms & social
Join-to-create private voice rooms, rentable rooms, duo pairs and a cross-server chat bridged to the web.
voice rooms
Cosmetics & status
Profile backgrounds, titles, custom roles and server-rendered profile cards; a Hall of legends for long-time supporters.
server-rendered cards
A companion worth collecting
VRoshik is a little stone dragon that lives in every member's lair. Daily gifts, streaks and earned chests bring new looks — 44 designs across 7 rarities, each with a rare shiny variant.
- Lair in three tiers — feed and level up your companions; as the best one grows, the cave becomes a vault and then a throne room.
- Duplicates have a use — they turn into dust for crafting, and enough copies merge into a shiny variant.
- Fair by design — odds are published, a pity meter guarantees rare drops, weekly limits keep it a hobby.














The odds, carved in stone
Chest odds are not a secret: the same numbers the server rolls with are published to every player. The table below is generated from the production config.
| Chest | Common | Uncommon | Rare | Epic | Legendary | Mythic | Price · limit |
|---|---|---|---|---|---|---|---|
| 64% | 28% | 8% | — | — | — | Free · every 7-day streak; the first one is at least Rare | |
| 70% | 27% | 3% | — | — | — | 500 coins · 3 / week | |
| 24% | 45% | 26% | 5% | — | — | 1,500 coins · 2 / week · Epic from day 8 | |
| — | — | 42.2% | 45% | 12% | 0.8% | 3,000 coins · 1 / week · from day 8 | |
| — | — | — | 60% | 36% | 4% | 10,000 coins · 1 / 28 days · from day 29 |
Paid chests open only with coins earned by activity — never with crystals or real money. Config version: vroshik-econ-v2. Open one in the demo
Play it, right here
Four production front-end modules, running in your browser on local engines with the production math. Nothing is sent anywhere.
VRosh Camp
A 6 × 5 cascade-reel game. Four Aegis shields wake the dragon: an 8-second transformation video, a burning camp and free spins with a growing multiplier. Rounds were played in advance by the production engine.
- Canvas 2D
- video ceremony
- beat-synced audio
- payout rate 94.8%
The demo did not load. Open it in a new tab.
Coinflip 3D
A WebGL coin with procedural relief, reflections and motion blur. The result is decided first; the physics then lands the coin exactly on that side.
- WebGL 1
- 2D fallback
- 50/50 · ×1.96
The demo did not load. Open it in a new tab.
Crash
A rocket climbs on an exponential curve; collect before it explodes. The hidden crash point follows the production formula with a 2 % edge.
- Canvas 2D
- auto-collect
- P(≥ m) = 0.98 / m
The demo did not load. Open it in a new tab.
Companion chests
Open the four paid chests with demo coins. The reel travels to a result rolled with the published odds, and the pity meters fill as you go.
- published odds
- pity meters
- Shiny 0.5%
The demo did not load. Open it in a new tab.
An economy built to resist abuse — with no way to cash out
Players treat virtual coins like money, so the engine does too: every rule below is enforced on the server and covered by tests.
- try_charge · tx()
Atomic ledger
Every coin movement is one conditional update inside a transaction: a charge happens in full or not at all, so parallel requests cannot overdraw a balance.
- operation keys
Idempotent by default
Chest opens carry an operation key, match settlements are claimed once and payment callbacks credit once — a retry can never pay twice.
- server-side RNG
The server decides, the screen animates
Outcomes are rolled on the server before any animation starts — chests with a cryptographic RNG, reel rounds from a stored seed; scenes only travel to the result they were given.
- 429 · Retry-After
Rate limits
Per-user cooldowns and per-minute caps; autoplay waits for the server instead of failing.
- no exit to cash
No cash-out, ever
Coins and crystals cannot be withdrawn or sold. Paid chests take only coins earned by activity, and a launch switch closes the crystal-to-coin exchange.
- 18+ · caps
Purchase guards
Crystal packs (Telegram Stars or crypto) can sit behind an 18+ confirmation, a monthly spending cap and a minimum Discord account age — all checked on the server.
Competition that runs itself
Events are where communities come alive. Vroshik runs the sign-ups, the lobbies and the results, so moderators can play too.

In-house lobbies
Sign-ups, captains' draft, swaps and bans from slash commands; the Steam bridge creates the Dota 2 lobby and the bot pays every player.

Battle Cup
Large sign-ups with slot limits for tournament nights.

Pick'em
Predict pro matches with virtual coins; results settle automatically and exactly once.

Battle pass seasons
Season quests turn everyday activity into rewards.

Leaderboards
Server and global tops keep the competition visible.





Status you can see: long-time supporters get a statue in the Hall of legends — stone, bronze, gold and finally lava.
Every feature has an off switch
The owner panel holds 27 feature flags — from whole modules down to single risky options. The bot and the site read the same switches live, so nothing ships to players before the owner says yes.
- 12 roles, one source of truth — ranks map to capabilities in one module used by both the bot and the site.
- One audit log — staff actions from Discord and from the web land in the same log.
- Fail closed — if a switch cannot be read, it falls back to its shipped default — off for anything risky.
- Mini-games moduleOn
- Pick'em & predictionsOn
- Companion core & lairOff
- Companion chests (earned coins only)Off
- VRosh Camp: launchOff
- VRosh Camp: dragon wild in free spinsOff
- Cross-server global chatOff
- Room rentals on the webOn
- Telegram Stars paymentsOff
- 18+ check & monthly spending capOff
- Launch switch: close crystal → coin exchangeOff
- Let server roles manage the economyOff
Architecture
Three services around one database. The bot and the dashboard import the same economy, odds and game math, so a rule changes in exactly one place; the lobby bridge talks to the dashboard over an authenticated API.
Discord
Slash commands, buttons and voice; commands sync per server.
Browser
The web dashboard over HTTPS, signed in with Discord OAuth.
Steam · Dota 2
Real Dota 2 lobbies, created by a dedicated Steam account.
Discord bot
Python · discord.py — 38 modules, 186 slash commands, background loops for lobbies, chat relay and rentals.
systemd serviceWeb dashboard
Python · Flask + Jinja on gunicorn — 316 routes: wallet, games, collection, owner panel.
one worker · 8 threadsLobby bridge
Node.js · node-dota2 — polls the dashboard with a shared token, creates lobbies, reports results back.
token authShared core
One dual-dialect data layer (SQLite in WAL mode or PostgreSQL) with atomic money primitives, plus pure engines for mini-games, reels, odds and the companion — imported by both processes.
Payments
A Telegram Stars bot and Crypto Pay invoices credit crystals exactly once per order.
Match data
PandaScore and OpenDota for schedules, results and player stats.
Streams & media
Twitch for live streams; yt-dlp for the music module.
Tech stack
Backend
- Python 3
- discord.py 2
- Flask 3
- Jinja2
- gunicorn
- aiosqlite
Data
- SQLite · WAL
- PostgreSQL dialect
- versioned JSON config
Front-end
- Vanilla JS · ES modules
- Canvas 2D
- WebGL 1
- Web Audio API
- CSS custom properties
Media
- Pillow-rendered cards
- procedural 3D coin
- sprite audio · beat sync
Integrations
- Discord API · OAuth
- Steam · node-dota2
- Telegram Bot API · Stars
- Crypto Pay
- PandaScore
- OpenDota
- Twitch
Ops & quality
- Linux · systemd
- Caddy
- Cloudflare
- offsite backups
- unit + race tests
- Monte Carlo calibration
179 commands in 11 modules
Generated from the bot's source: every slash command with its parameters and who can use it. 70 are for every member, 21 for moderators, 88 for admins.
| Command | What it does | Who |
|---|---|---|
/profile | Profile card: level, stats and collectibles usermember | Everyone |
/balance | Show a coin balance usermember | Everyone |
/daily | Claim your daily coins (every 24 h) | Everyone |
/top | Global player leaderboards categorychoice | Everyone |
/arcade crash | Multiplier climbs: collect before it crashes amountnumber | Everyone |
/close pick | Captain's pick: draft a player by number numbernumber | Everyone |
/pay | Send coins to another player usermemberamountnumber | Everyone |

Built by Oleh Makukh
Product, backend, front-end and art direction — end to end
I designed the economy and the progression, wrote the bot and the dashboard, built the real-time game front-ends and the Steam lobby bridge, and run it in production. Vroshik grew inside a live gaming community; this page presents it as a standalone product.