Skip to content

About

Self-hosted darts companion for Autodarts: live scoreboard, elimination game mode, board control, built-in voice caller with custom voice-pack creation, and lifetime statistics — with optional MQTT output for LED/display control

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

157 Commits

Folders and files

Repository files navigation

Breakfast

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.

An X01 leg on the TV view: the remaining score, the suggested checkout, the darts of the turn and the dartboard

Features

  • 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, a Warm-up, 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
  • Usage reports: optional anonymous usage and error reports, off by default
  • 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

How it works

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)

Installation

Windows

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.

  1. Unzip it, for example to C:\Breakfast, and start breakfast.exe. Your browser opens the Settings page: enter your Autodarts account under Autodarts Source, save, and press Restart.
  2. 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.
  3. Optional: run install-autostart.ps1 with PowerShell to start Breakfast when you log in (remove-autostart.ps1 undoes 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.

Docker

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 -d

Autodarts 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).

From source

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.py

To 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.

Configuration

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 = 8080

The other sections ([audio], [mqtt], [stats], [online], [telemetry], [updates], [logging] and more) are described in config.toml.example. MQTT and statistics can be switched off ([mqtt] enabled = false, [stats] db = "none").

Using Breakfast

Web UI

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.

The Play page with the games and drills Settings, here the look of the interface

TV view

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, or to enter one the board did not see, tap its box and press the spot on the dartboard (a magnifier shows it); the dart is stored where you let go.

Games and drills

  • 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. A summary of the match (averages, the remaining score per turn, the darts on the board and every turn with the fields hit) opens from the result on the TV view and from the match list of the X01 statistics; it can be saved as an image.
  • 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 is offered again, see Updates), 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, Killer, X01 and X01 tournaments 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); X01 and the tournaments use five stages from beginner to pro instead (about 90 % of a beginner's darts land on the board, all of a pro's, and the pro hits the triple 20 about every third dart). It throws its three darts with short pauses, and the TV view, voice calls, undo and corrections work as for a player. In X01 it aims at the triple 20 until it can finish, then follows the checkout chart for the chosen out mode. 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.
  • Warm-up: a round over every segment of the board for one player. Throw at each field until it is hit: the big singles from 1 to 20, the bull, the small singles from 1 to 20, the bull, the doubles from 1 to 20, the bull, the triples from 1 to 20 and the bull's eye. Switch on only the stations you want, for example the big singles and the triples, or leave them all; the order stays, the bull comes between the stations. There is no limit of darts per field, and after a hit the next field is up, also for the darts left in the turn. The board lights the part of the field that is up, the result shows the darts per station and the fields that took the most, and compares the run with your earlier ones over the same stations.
  • 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 on the TV view
Elimination
Target Battle on the TV view
Target Battle
Killer on the TV view
Killer
The result of a Field Training run
Field Training
The result of a Black Belt run
Black Belt
The Warm-up on the TV view
Warm-up

Voice caller and voice packs

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 fallback

To 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.

The Voice Pack editor in Settings

Statistics

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.

The Stats page for X01

Achievements

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.

A player profile with its achievements

When a match ends, the TV announces what was earned:

The achievement banner on the TV view

Online Elimination

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.

Usage reports

Breakfast can report errors and basic usage anonymously, to help find problems on setups other than the developer's. It is off by default; switch it on under Settings → Usage reports. A report holds the version, the platform, the game modes played with their duration, and the errors that occur (type and code location), sent under a random installation ID. It never holds player names, scores, IP addresses or error messages. Show what is sent lists the queued and the recently sent reports. The reports go to the relay ([telemetry] url, by default [online] relay_url, see relay/README.md).

MQTT

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

Updates

  • 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 updater service in docker-compose.yml provides 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 looks for a newer release once after the start and then every 24 hours: a dot on the Settings button, a "vX.Y.Z available" chip at the top of Settings and a one-time notice in the corner (not in the TV view, not while a game is running, not again for a version you dismissed). Installing stays manual. [updates] check = false (or Settings → Update check) switches the automatic check off.

With [updates] auto_install = true (or Settings → Update check → Install updates automatically, off by default) a newer patch or minor release is installed by itself after the start and at 04:00 every day (in the [stats] time zone, else the server's). It is skipped while a game is running, a new major version is only announced, and a version that was tried before is not tried again automatically.

Before every update the statistics database is copied to a backups folder next to it (the last three are kept), and a rollback puts that copy back; Settings → Updates shows when the latest one was made.

After an update the changes of the new version are shown once in a dialog (once per browser, not in the TV view, not while a game is running); Settings → Updates reopens them.

A match of X01, a tournament, Elimination or Killer that is in play is saved after every change. After a restart or an update the Home app offers to Resume it or to Discard it; nothing resumes by itself, and the match goes on at the start of the turn that was in play. The Restart and Install buttons warn when a game is running.

Security

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.

Acknowledgements

  • 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.

License

MIT, see LICENSE.

About

Self-hosted darts companion for Autodarts: live scoreboard, elimination game mode, board control, built-in voice caller with custom voice-pack creation, and lifetime statistics — with optional MQTT output for LED/display control

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages