Works with Autodarts.
Breakfast is a self-hosted companion for your Autodarts board. It shows a live scoreboard on any screen in the room, announces the game with a built-in voice caller, adds game modes and practice drills beyond X01, keeps lifetime statistics and can drive LED displays over MQTT. It connects to the Autodarts cloud with your own account and needs no other add-on.
- Live scoreboard and TV view: full screen on a TV or tablet, with checkout suggestions and a live dartboard
- Games and drills: X01 with tournaments, Elimination, Target Battle, Killer, Field Training, Black Belt and a Checkout Trainer
- Voice caller: announces the game, with English and German voice packs and an editor for your own
- Statistics: averages, records, heatmaps and leaderboards
- Achievements: badges for milestones such as a 180 or a nine-dart leg
- Online Elimination: play one Elimination match together with players at other locations
- MQTT output for LED strips and Home Assistant, optional
- Installation on Windows, with Docker or from source, with self-update
- Settings in the browser, English or German interface
Autodarts cloud ── Breakfast ── local board connection (dart positions)
│
┌───────────┼───────────────┐
Web UI MQTT Voice caller
(phone, tablet, (LED strips, (announcements play in a
TV, PC) Home Assistant) browser on /audio, on the
device with the speakers)
Download breakfast-windows-vX.Y.Z.zip from the latest release. It contains a single folder with
breakfast.exe; Python and Docker are not needed.
- Unzip it, for example to
C:\Breakfast, and startbreakfast.exe. Your browser opens the Settings page: enter your Autodarts account under Autodarts Source, save, and press Restart. - Windows asks once whether Breakfast may use the network. Allow it for private networks so that a TV or
phone can reach
http://<pc>:8080. - Optional: run
install-autostart.ps1with PowerShell to start Breakfast when you log in (remove-autostart.ps1undoes it).
Everything Breakfast stores lives in the data folder next to breakfast.exe; back it up to keep your
statistics. The program is not signed: if Windows says "Windows protected your PC", choose More info,
then Run anyway.
git clone https://github.com/3lefeint/breakfast26.git
cd breakfast26
mkdir -p data/sessions data/sounds
cp config.toml.example data/config.toml # fill in your values
docker compose up -dAutodarts itself keeps running natively on the host; only Breakfast is containerized. The header of
docker-compose.yml explains the one setting Breakfast needs to reach the board from inside the container
(board_ws_url).
Needs Python 3.11+ and Node.js 22+.
git clone https://github.com/3lefeint/breakfast26.git
cd breakfast26
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
(cd frontend && npm ci && npm run build)
cp config.toml.example config.toml # fill in your values
python main.pyTo run it as a service on Linux, copy systemd/breakfast.service to /etc/systemd/system/, replace
YOUR_USER and the paths in it, and run sudo systemctl enable --now breakfast.
Then open http://<host>:8080.
Breakfast reads config.toml (from the project folder, or from data/ for Docker and Windows). Every option
is documented in config.toml.example and can be changed in the browser under Settings. The minimum
is your Autodarts account:
mode = "direct"
[direct]
email = "user@example.com"
password = "your-password"
board_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
[web]
port = 8080The other sections ([audio], [mqtt], [stats], [online], [logging] and more) are described in
config.toml.example. MQTT and statistics can be switched off ([mqtt] enabled = false, [stats] db = "none").
Open http://<host>:8080 from any device on your network. Play sets up and starts the games and drills,
Players lists the players with their profiles and achievements and merges a player that was created twice (for example after a name change) into another one, Stats shows the statistics, and
Settings edits everything in config.toml without touching the file. Settings also holds the voice-pack
editor, the update check and the look of the interface: language, theme, accent color and an animated
background. The TV view (/#tv) and the /audio page are described below.
![]() |
![]() |
Press Open TV in the top bar (or open http://<host>:8080/#tv) on a display near the board. Starting a game opens it by itself. It shows whichever game is running. For X01 that
is the scoreboard with the remaining score, the suggested checkout (with a "Bogey" badge for scores that
cannot be checked out) and the live average, 180s and checkout rate next to each player. With the local
board connection, a dartboard shows where each dart of the current turn landed.
The X01 view also controls the board: undo the last detected throw, skip to the next player or leg, and reset the board. To correct a misread dart, tap it and choose the right field, or click the spot on a dartboard.
- X01: played in Autodarts as usual, with Breakfast adding the scoreboard, checkout suggestions and voice calls, or started in Breakfast, which then counts the darts from the board. Choose the base score, double or master in and out, the legs to win and any number of players; a bull-off or a draw decides who starts, and the first thrower moves one place on with every leg. With a max rounds limit (15, 25 or 50, off by default) a leg that nobody has checked out after that many rounds is decided by a bull-off, the closest dart wins; such a leg counts as a win but stays out of the best-leg statistics. The match is stored like any other X01 match, and undo, the Next button and corrections of a dart work as in Elimination.
- X01 tournament: single elimination in the X01 mode of Breakfast. Pick the players (a new one can be added on the spot), the base score, the in and out mode, the max rounds, a bull-off or a draw for who throws first, and the legs to win per round, so the final can be longer than the first round. The bracket is drawn at random as soon as there are two players, byes included (it is rounded up to the next power of two, a bye moves on without a match), and any two seats can be swapped by hand. After a match its result waits half a minute, then the next pairing starts by itself; the TV view shows the whole bracket between the matches. The tournament is stored, so it survives a restart (a match in play does not), and its matches count in the statistics like any X01 match.
- Elimination: any number of players, each with a number of lives. Every turn has to beat the total of the previous turn, otherwise the player loses a life; the last player with lives left wins. Turns can be corrected and undone, and a dart the board did not detect can be entered by hand and the Next button ends a turn without pulling the darts. An optional hint on the TV view marks the fields on the board that still beat the target.
- Target Battle: in each round, all players throw at the same target number, and only a dart on that number scores. A wheel picks a random target every round, or you set the order yourself. Single, double and triple score 1, 2 and 3 points, or you practice with only one of them counting.
- Killer: every player gets a number. Hitting the double of your own number makes you a killer, and a killer takes a life from an opponent by hitting the double of that opponent's number. The last player left wins.
- Computer opponent: Elimination and Killer can be played against the computer, so one person can play a full match on the board. Add it on the setup page with a level from 10+ to 110+ (its three-dart average when it aims at the triple 20). It throws its three darts with short pauses, and the TV view, voice calls, undo and corrections work as for a player. The match is stored, but the computer has no stats, leaderboard entries or achievements.
- Field Training: one player throws a fixed number of darts at a single field, a number or the bull. The result shows the points, the hit rate and a rating.
- Black Belt: a doubles drill for one player. Hit D1 to D20 and finally the bull's eye, in order (or from D20 down to D1). If a field is not hit with its darts, you start again from the beginning. You earn the belt by getting through the whole ladder in one go.
- Checkout Trainer: three exercises for finishing. Random checkout draws a score you can finish with three darts, and you throw it on the board (the standard route can be shown while you throw). The Stats page shows which scores work and which do not. Route quiz and Setup shots are played on a virtual board without darts, also on a phone: tap the first dart of a route, or tap the darts that set up a finish and see what is left and what that rest allows.
![]() Elimination |
![]() Target Battle |
![]() Killer |
![]() Field Training |
![]() Black Belt |
With [audio] dir set, Breakfast announces X01 matches itself: the start and end of legs and matches, every
dart, turn totals, checkouts ("you require ...") and busts. The sound plays in a browser tab on /audio.
Open it on the device that is connected to the speakers, click Enable sound once and leave the tab
open.
A voice pack is a folder of plain key.mp3 files. Two ready-made packs, English (tools/voicepack_ryan.toml)
and German (tools/voicepack_leni.toml), can be generated from text with edge-tts and ffmpeg:
pip install edge-tts
python tools/generate_voicepack.py tools/voicepack_ryan.toml --out <audio dir>/profiles/ryan
# then set [audio] profile = "ryan"; your own files stay as fallbackTo change a single entry, use Settings → Voice Pack: pick a group, enter a key and one or more variants, listen to a preview and save. VOICE_PACKS.md lists every call key, explains where the names of your players are kept, and shows how to record a pack of your own.
Every turn is stored locally in stats.db. The Stats page has a view for each game mode with records,
comparisons between players and recent matches; for X01 also per-player details such as a score histogram
and a heatmap of the board. Leaderboards rank players by average, 180s and checkout rate.
Players earn achievements in their matches: a bullseye, a 180, a big checkout, streaks, a nine-dart leg and many more, some with several tiers and some secret. They appear as badges in the player profile. Only matches played after achievements were first enabled on your installation count. Most are announced as soon as they happen and made final when the match ends, so a game with many players does not end with a long run of banners.
When a match ends, the TV announces what was earned:
Play one Elimination match together with players at other locations, each on their own Breakfast
installation. One site hosts the match and receives a join code; the others join with that code and a shared
password. Each site adds its own players, and the host sets the lives and the order.
Online play needs a relay (a small Cloudflare Worker, see relay/README.md) and
[online] relay_url; without it, online play is off.
Breakfast can publish its state to an MQTT broker, for example to drive ESPHome LED strips or to feed Home
Assistant (configured in [mqtt]; ESPHome examples are in ESPHome/). MQTT is optional, everything else
works without it. All topics are published under a base topic (default autodarts):
| Topic | Value |
|---|---|
autodarts/current/..., autodarts/match/..., autodarts/players/<index>/..., autodarts/board/status |
the active player and their darts, the match, the remaining score of each player and the board status |
autodarts/<game>/active, .../state |
for elimination, target_battle, killer, field_training, black_belt and checkout_training: whether the game is running, and its full state as retained JSON |
autodarts/<game>/current/..., .../last_turn/..., .../events/... |
the turn in progress, the last finished turn and one-time events of the game |
autodarts/<game>/command |
Breakfast listens here: JSON {"action": ...} to start, stop, undo or correct a game |
- Windows: Settings → Updates checks for a newer GitHub release, downloads it, verifies its SHA-256 checksum and installs it. The old version is kept until the new one passes its health check, and is restored if it does not.
- Docker: the
updaterservice indocker-compose.ymlprovides the same function under Settings → Updates: it pulls the newest release tag, rebuilds, restarts and rolls back if the new build is not healthy. Remove the service if you do not want self-update.
Breakfast has no login. Anyone who can reach its web port can watch games, start and stop them, change the
settings and restart the app. Run it only on a trusted home or club network and do not expose port 8080 to
the internet. If you need remote access, put your own authentication in front of it (a VPN or a reverse
proxy with a login). The Autodarts and MQTT credentials are stored in plain text in config.toml, so keep
that file private. To report a vulnerability, see SECURITY.md.
- The calling behavior, the call keys and the voice-pack format are modeled on the darts-caller project, so its voice packs work unchanged.
- Breakfast is an independent project and not affiliated with or endorsed by Autodarts. It talks to the Autodarts cloud with your own account; check Autodarts' terms of use for your setup.
MIT, see LICENSE.











