Vroshik
ENUK
VRoshik, a small stone dragon with wings, sits on a hoard of gold coins in a dark vault

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 third-tier lair: a throne room with banners, gold and rune pedestals
Lair, tier 3 — the throne room
VRoshikBasic
Birthday BoyCommon
GamerCommon
FrostyUncommon
MinerUncommon
Magma PilotRare
SorcererRare · Shiny
ThundererRare
Lava HeartEpic
Amethyst MageEpic
Aegis KeeperLegendary
Golden IdolLegendary
Dark KingLegendary
StarbornMythic

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 odds by rarity
ChestCommonUncommonRareEpicLegendaryMythicPrice · limit
7-day streak chest 64%28%8%——— Free · every 7-day streak; the first one is at least Rare
Stone chest 70%27%3%——— 500 coins · 3 / week
Copper chest 24%45%26%5%—— 1,500 coins · 2 / week · Epic from day 8
Gem chest ——42.2%45%12%0.8% 3,000 coins · 1 / week · from day 8
Treasury ———60%36%4% 10,000 coins · 1 / 28 days · from day 29
15,000coins spent without an Epic guarantee the next Epic-or-better drop
60,000coins spent without a Legendary guarantee a Legendary-or-better drop
0.5%chance that any drop comes as a shiny variant

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 during free spins: the camp burns, a wild VRoshik on the board

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%
Demo — virtual credits, no real money

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.

98%CoinflipExact: a fair 50/50 that pays ×1.96.
98%CrashClosed form: P(crash ≥ m) = 0.98 / m for every cash-out point.
94.8%VRosh CampRegular rounds; bonus rounds 96.2%. Measured by Monte Carlo on the production engine, 2 million rounds per mode.

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.

A burning night camp in a mountain gorge — the bonus scene of VRosh Camp
Stone
Bronze
Gold
Lava

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.
Feature flagsdefaults as shipped · preview
  • 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.

28test suites: engines, money, permissions, payments, pages
8race-test suites that fire parallel requests at every money path
160+database tables behind one dual-dialect data layer
Seededengine tests pin payouts to fixed seeds, so a visual change can never move the math

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.

A few commands
CommandWhat it doesWho
/profileProfile card: level, stats and collectibles
usermember
Everyone
/balanceShow a coin balance
usermember
Everyone
/dailyClaim your daily coins (every 24 h)Everyone
/topGlobal player leaderboards
categorychoice
Everyone
/arcade crashMultiplier climbs: collect before it crashes
amountnumber
Everyone
/close pickCaptain's pick: draft a player by number
numbernumber
Everyone
/paySend coins to another player
usermemberamountnumber
Everyone

Full command reference

Author photo placeholder: the Vroshik emblem

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.