You finished your printer. You documented the build, you suffered the cable management, and now you deserve a real serial number — not just a sticker you made in Microsoft Paint. Serial Fork is a Discord-native system that lets community members request serials directly from a forum thread, get them approved by a moderator with a single button click, and have the result logged in a public searchable registry. No spreadsheets. No DMs. No chaos.
How It Works
- A builder posts their completed build in the community's Discord forum
- They run
/requestin the thread — the bot picks up their post and opens a request - A moderator approves or rejects it via Discord buttons or the web admin panel
- On approval, a serial number is assigned, a role is granted, and the build lands in the public registry
- The builder gets a DM, bragging rights, and the knowledge that BBP-0042 is theirs forever
Features
- Forum-thread-native workflow — everything happens where your community already lives
- Multiple serial sequences per printer type (BBP-001, CC-001, etc.) each counting independently
- One-click moderator approval and rejection via Discord buttons
- Rejection and resubmission workflow — no need to start over from scratch
- Serial number reservations with CSV bulk import (great for grandfathering legacy builds)
- Serial rescission for when things go sideways
- Discord OAuth2 login — no passwords, no separate sign-up
- Automatic role assignment on approval
- Full audit log of every action taken
- Themeable UI — BabyBelt, Printcepts, and Wave themes included out of the box
Tech Stack
- Bot: Python 3.12 + discord.py — modular cog architecture
- Web: FastAPI + Jinja2 templates — server-rendered, no build step required
- Database: SQLite with WAL mode, managed by SQLAlchemy 2.0 (async) and Alembic migrations
- Auth: Discord OAuth2 via Authlib; session cookies signed with itsdangerous
- Deployment: Docker Compose for dev, Helm chart for Kubernetes in production
Quick Start
Copy the example configs and fill in your Discord credentials:
cp config.toml.example config.toml
cp .env.example .env
Then spin it up:
docker compose up -d
Bootstrap your first owner account by Discord user ID:
python scripts/create_admin.py --discord-id 123456789012345678
Roles
- Owner — full control; manages admins, printer types, and site config
- Admin — manages mods, reservations, and can download database backups
- Mod — approves and rejects serial requests
- User — submits requests, views their own history
Roles are stored in the database, not Discord — so a Discord server outage won't accidentally promote your most enthusiastic newbie to admin.
Deployment
A full Helm chart is included for Kubernetes deployments, with ConfigMaps, Secrets, PersistentVolumeClaims, and Ingress templates ready to go. Database migrations run automatically at startup — no manual intervention needed between versions.
helm install serial-fork ./helm -f values.yaml