Automated virtual pinball high-score competitions for your Discord community.
Turn on your VPin and play. If a competition is running on that game, your score appears on the Discord leaderboard: PinBot reads the high scores from the game itself and matches your initials to your server nickname.
- Joining: nobody signs up. Your initials in your server nickname, e.g.
Name | [ABC], are enough. - Scores: read from the game after each play. No screenshots, no forms.
- Setup: paste one line on the VPin. PinBot finds Visual Pinball X and your tables by itself.
- Updates: the PinBot server and every VPin install new signed releases by themselves. Nothing to maintain.
Your own high scores are backed up before a competition and put back exactly as they were after it (how). PinBot uses about 20 MB of memory and sleeps while a table runs.
- In your Discord server, run
/pinbot pair. Only you see the reply: a link to downloadpinbot.exeand a one-time pairing line. - Run
pinbot.exeon your VPin. If Windows warns about it (unknown publisher or Windows protected your PC), choose More info → Run anyway. - Paste the line and press Enter. PinBot installs itself and starts with Windows.
- Put your initials in your server nickname, e.g.
Name | [ABC], and enter them on the machine when you get a high score.
More: On your VPin (troubleshooting, uninstalling) and How competitions work.
About 45 minutes, once:
- Run the PinBot server on a Synology NAS or any always-on Docker host.
- Connect it to Discord: create the Discord app and choose PinBot's channels.
- Invite your members to run
/pinbot pair.
- VPin: Windows 10 or 11 with Visual Pinball X. Only ROM-based (PinMAME) tables whose ROM has a memory map; original and EM tables can't be used. A game counts once you exit the table.
- Server: an always-on Docker host (a Synology NAS guide is included) and a free Tailscale account, which gives it a public HTTPS address without opening router ports.
- Discord: Manage Server rights on your Discord server, for the setup.
- Trust: scores are read on each owner's own PC, so PinBot is for friendly communities, not prize tournaments.
| Command | What it does |
|---|---|
/pinbot start |
Start a challenge on a game, from 1 hour to 7 days |
/pinbot status |
What's running, who leads, and each VPin |
/pinbot games |
Every game you can start a challenge on |
/pinbot end |
End a challenge you started |
/pinbot guest |
Let a friend without Discord score with their own initials for 24 hours |
/pinbot pair |
Connect your VPin |
/pinbot help |
How PinBot works |
/pinbot-admin weekly |
Server managers: the automatic weekly competition |
/pinbot-admin channels |
Server managers: where PinBot posts |
- Players: On your VPin, How competitions work, How your high scores are kept safe
- Admins: Run the PinBot server, Connect it to Discord, Security
- Developers: Development, Server reference, How releases are signed
Every release is built here by GitHub Actions and signed with the project's release key; servers and VPins install an
update only when its signature matches. pinbot.exe is not signed with a Windows code-signing certificate, which is why
Windows warns the first time you run it. It sends data only to the PinBot server it was paired with. Details:
CODE-SIGNING.md.
Requires Windows and the .NET 10 SDK; the server tests also need PostgreSQL. See DEVELOPMENT.md. Issues and pull requests are welcome.
MIT. Game memory maps from Pinball Memory Maps (ODbL); see NOTICE.md.

