Discord bot for the Antistratégie server.
General-purpose, structured as a set of cogs that can be enabled per-process
via COGS. Currently:
- Girldle — daily Girldle scraper, Glicko-2 leaderboard, per-server channels, global or per-server view.
- Girldle admin — operator-only controls registered guild-restricted to the home server.
The same image also runs as a separate, public Girldle bot that other servers can invite — see "Two bots from one image" below.
uv venv --python 3.14
uv pip install -e ".[dev]"
cp .env.example .env # fill in DISCORD_TOKEN etc.
ronergatepytestCI publishes ghcr.io/antistrategie/ronergate:latest on every push to main.
On the host, you only need two files: docker-compose.yml and .env.
# docker-compose.yml
services:
ronergate:
image: ghcr.io/antistrategie/ronergate:latest
container_name: ronergate
restart: unless-stopped
env_file: .env
volumes:
- ronergate-data:/app/data
pull_policy: always
volumes:
ronergate-data:# .env (see .env.example)
DISCORD_TOKEN=your-bot-token
DB_PATH=/app/data/bot.sqlite
COGS=girldle,girldle_admin
OWNER_GUILD_ID=your-home-guild-idTo deploy a new version:
docker compose pull && docker compose up -dThe repo's deploy on ronergate.exe.xyz runs two services from the same
image, sharing one SQLite volume:
- ROnergate (this bot, in Antistratégie): loads
girldle+girldle_admin. Admin commands are guild-restricted viaOWNER_GUILD_ID. - Girldle (separate Discord application, invitable by other servers):
loads only
girldle. Same code, different token.
services:
ronergate:
image: ghcr.io/antistrategie/ronergate:latest
env_file: .env.ronergate # COGS=girldle,girldle_admin · OWNER_GUILD_ID set
volumes: [ronergate-data:/app/data]
girldle:
image: ghcr.io/antistrategie/ronergate:latest
env_file: .env.girldle # different token · COGS=girldle
volumes: [ronergate-data:/app/data]Sharing the volume means both bots see the same leaderboard data, and
ROnergate can administer Girldle's view of it via /girldleadmin (since
the admin cog reads/writes the shared DB).