What's new
All new features, improvements and fixes — chronologically. Latest changes on top.
English content moves to clean /en/* URLs
Until today the English version of pages lived behind a `?lang=en` query parameter (e.g. /pricing?lang=en). From now on it has its own clean URLs: /en/pricing, /en/dart-training, /en/dart-club. That makes English pages much easier to surface in Google search results and ensures each language gets its own listing instead of being treated as a duplicate.
Old `?lang=en` links keep working — they auto-redirect to the new path. The language toggle in the header behaves the same as before; only the URL in the address bar looks cleaner now.
Pricing info aligned across the app
Several places (FAQs on the topic pages, Terms, Pricing page, in-app help, SEO snippets) still showed older price values. The actually charged prices are now consistent everywhere: PRO €4.99/month or €49.99/year, PREMIUM €9.99/month or €99.99/year — with 2 months free on the annual plan.
Nothing changed at checkout: Stripe has always used the correct prices. This update simply ensures that the info texts across the site match the price you see at checkout.
Tier-limit dialog now offers your free trial directly
If you hit a feature on BASIC that requires an upgrade (e.g. a locked format, more players, more active tournaments), the upgrade dialog now offers your free 24-hour PREMIUM trial directly — as long as you have not used it yet. One click on "Try free for 24h" and you can use the feature immediately, without taking out a subscription.
Not logged in yet? The dialog now tells you that a free account gets you 24 hours of PREMIUM for free, and takes you straight to sign-up with one click.
Bug fix: In Checkout Training, the bust notification was shown to German users as a raw key ("training.bust") instead of the proper text. It now correctly reads "Bust! Muss auf Double auschecken" again.
Also: several English translations have been brought up to date — English users saw a few German originals in places ("Keine Matches.", "Niedrige Erkennungsqualitaet...").
Match history, best legs & resume button on the statistics page
The statistics page now shows a match history with your last 10 matches including leg score (e.g. "3:2"), opponent, date, match average and context (tournament / bot / quick match). Lost matches have a red badge, wins green.
For matches that are still in progress or that you abandoned, an orange "Continue" button now appears — one click and you jump back into the match without having to remember the match ID or navigate through other pages. Works for Quick Match and bot matches.
New with PREMIUM: a fourth tab "Best legs" in the performances section — shows your top 5 won legs sorted by darts thrown. The fewer darts to finish, the higher the rank.
Bug fix: In the "Leg won" dialog, very short legs occasionally showed "0 average / 0 darts" for one of the two players. The backend now stores a clean pre-reset snapshot of the leg stats — the display is now correct for both sides.
Stats overview after every leg and at match end
Quick Match now shows a small overview right inside the "Leg won" dialog after every leg — leg average and darts thrown for both players, side by side.
On the result screen at match end, an additional match comparison appears: match average, first-9 average, 180s, 140+, 100+ and highest checkout for both players. Rows with no data (e.g. no 180s) are automatically hidden to keep the overview compact.
Works for early-ended matches and bot games too.
New statistics page with trends & anonymous comparisons
There is now a dedicated statistics page accessible via "My Statistics" on the start page — significantly deeper than the profile boxes.
The hero shows a 0–100 performance score with a ring visualisation, plus your headline numbers (matches, wins, legs, 180s, best avg, highest checkout).
Five comparison cards put your value next to the average across all SmartDart players — with a coloured delta arrow ("+24% above average"). Compared metrics: best match average, total 180s, highest checkout, matches played and legs played. Fully anonymous — no names, no public profiles.
A 90-day GitHub-style activity heatmap shows when you played.
PRO and PREMIUM unlock trend charts: average trend over the last 30 matches, rolling 10-match win-rate trend, and 180s per week across the last 12 weeks.
PREMIUM additionally gets a weekly recap card (this week vs. last week with deltas) and your top 5 match highlights — sortable by best average, best checkout or most 180s in a single match.
End Quick Match early
Quick Match can now be ended early right after every won leg — useful when you have to stop or want to take a break.
The "Leg won" dialog now has a third button "End match" alongside "Confirm" and "Redo last throw". You get a confirmation showing the current score. The player with more legs is recorded as the winner, and the match counts toward your statistics as usual.
On a tie (e.g. 1:1), you pick the winner in the dialog. Pre-selected is the player with the better match average — but you can switch to the other player anytime. The results page shows a "Match ended early" hint to indicate that the match was not played to completion.
Bot match stats now saved after every leg
Previously, stats from bot matches only appeared once the full match was finished. If you started a best-of-5 and only played 1 leg, your profile showed nothing — even though the data was correctly stored in the database.
Now all played legs feed into the stats, including from abandoned matches. The win rate stays fair: it only counts matches with a clear result — abandoned matches don't skew your record. Same applies to regular Quick Match stats.
Also fixed: the average was always showing 0 in the stats box because it read from the wrong data field. Now correctly computed from darts thrown and points scored — same as everywhere else in the app.
Dedicated stats box for matches vs. bots
Your profile now shows a separate "Matches vs. Bots" statistics box — separated from your Quick Match stats against real opponents.
The benefit: training matches against the bot no longer skew your real Quick Match record. Both boxes show the same fields (matches, wins, win rate, average, 180s, highest checkout, legs, breaks) — aggregated independently. PRO fields and the PREMIUM match history work as before, also separated.
Player statistics on the results page
The public results page for a finished tournament (smartdart.app/results/CODE) now includes a dedicated player statistics table — one row per participant, sorted by wins and win rate.
Columns: rank, name, matches played, wins–losses, win rate, legs +/-, average, 180s, highest checkout and clean sweeps. The scoring columns (average, 180s, checkout) hide automatically when nobody tracked scoring data (legs-only mode) — so the table stays compact and only shows what was actually tracked.
More live stats in the projection ticker — including legs-only
The live stats ticker at the bottom of the projection now shows five new items:
• Most total legs won • Best leg difference • Longest match of the tournament (with number of legs played) • Total 140+ and 100+ scores
The first three also work in pure legs-only tournaments (no score tracking) — where the ticker used to be sparse, you now always see what is currently happening even without throw data.
Live average visible during play
While a match is running, the player's current average is now shown right next to their name — on the projection, in your player view and on the scoring device.
Previously the Ø only appeared on finished matches. The value now updates live with every dart, consistently everywhere — groups, knockout, grand final, third-place match, league.
Tournament stats now reliably show up in your profile
If you played tournaments while logged in with your SmartDart account, some of you did not see any data under "My statistics" in the profile — even though the matches were played and finished. The cause was that the link between a tournament participation and your account was only set reliably in one of several join paths.
Now the account is linked immediately on every path into a tournament (join by code, join via your profile, added by an admin). On top of that, already-played tournaments have been back-linked in the background — if you played matches before, your stats (matches, wins, legs, 180s, checkouts) will show up automatically on the next profile visit.
Projection jumps straight to the results view when a tournament ends
Previously, after a tournament finished, the projection view showed a huge fullscreen overlay with "Tournament finished" and the winner — and it stayed stuck. The actual results view with podium, hall of fame and QR code was not reachable.
The projection now jumps directly to the results view: podium, key stats, hall of fame and QR code to the detail page are shown without an intermediate screen. Admin device and player view still display the winner overlay (as a personal moment) — just the projection does not.
Projection: scrolling stats ticker in sports-news style
The projection view now has a rolling stats ticker at the very bottom — the kind you know from sports news channels. A red "LIVE" label on the left, and the tournament's live stats scroll endlessly from right to left next to it.
What you get: total legs played, matches currently running, progress (finished vs total plus percent), total 180s, who threw the most 180s, highest checkout, top average — and for league tournaments additionally the current leader with points. For Double Elimination, live WB/LB/Grand Final matches are flagged on top.
Speed is around 70 px/s (calm enough to read along). Hovering the ticker pauses it so spectators can catch details. Works across every tournament format and stays visible during the results view as well — entertainment even when nothing is being thrown right now.
League projection: matchday moves into the header
The league projection layout used to have a separate banner right below the header — repeating the tournament name plus a "Matchday 3 / 10" indicator.
That banner is gone. The matchday number now lives as a small chip in the regular header next to status and phase. That frees roughly 70 pixels vertically — on a beamer that means one extra row of table and matches visible without scrolling.
Projection shows the key stats at a glance when a tournament ends
When a tournament finishes, the projection view now automatically switches to the results screen. The goal: see at a glance who won and who threw the highlights — without being overwhelmed by detail tables.
What you get: the podium (1st/2nd/3rd plus 4th), a few key numbers (matches, legs, players) and a "Hall of Fame" with three cards — best average, most 180s and highest checkout, each with player name and value.
Want the full picture? Scan the new QR code on the projection or open the results URL — you will get the complete bracket tree, group standings, every match result and full leaderboards.
Also new in the developer dashboard: next to "Open admin view" there is now a "Open projection view" button — one click, and you have the correct projection URL for the selected tournament.
Fixed club boards: set up once, ready for every tournament
Each club can now register its own dartboards — with name, description and optional camera URL. When you create a tournament from the club, those boards are pre-selected and set up with one click.
Where to find it: The club detail view has a new "Boards" tab. Owners and co-admins can add, edit and delete boards there. All members can see the list (read-only).
In the tournament wizard (when you click "New tournament" from the club), the boards appear as pre-selected chips — just like the members. You can deselect individual ones if only some of the boards are in play that night. The camera URL is copied onto the new tournament board; calibration and device code are generated fresh per tournament so nothing leaks across events.
Simulate now fills averages and darts
Simulating a match or full tournament previously produced a winner and leg count, but all stat fields stayed at 0 — averages, 180s, 140s, 100s, highest checkout, dart counts. That made stat tables and leaderboards look broken after a simulation.
Now the simulate button fills realistic aggregate values. Winners trend toward higher averages (58-72) than losers (46-58), 180/140/100 counts scale with the leg count, and the highest checkout is weighted (mostly 32-80, rarely 140+).
Applies to all three simulate paths: single-match simulate, "simulate all group matches", and "finish active matches". Performance is unchanged — no extra database writes are triggered.
Club affiliation now visible everywhere
A club tournament is now immediately recognizable as such — with club name, emoji and club color as a small badge.
Where you see the badge: in the admin header (clickable, takes you to the club page), in the player subheader, and in the projection header above the tournament name. Additionally, every club-member player gets a small badge under their name in the admin "Players" tab — so you can tell at a glance who is internal and who is an external guest. The tooltip shows the club role (owner / admin / member).
Also: the club leaderboard overlay on the projection view is gone — it overlapped the game and was more distracting than useful.
Opening a club tournament now shows the correct one
Clicking a running tournament inside a club sometimes showed a completely different tournament — the last one you had administered before. Root cause was session restoration: the old admin session in your browser was reused blindly instead of switching to the tournament you clicked.
Fixed: club owners, co-admins and the tournament creator now land directly in the correct admin view on click. Members without admin rights are taken to the normal join flow (code is pre-filled).
Club tournaments: open or closed
When creating a club tournament you now decide who can join: "Club members only" for closed club championships, or "Open with join offer" for spontaneous invites.
External players in the open mode automatically get a prompt on join: "Would you like to join the club too?" — those who accept become members (public clubs instantly, private clubs with admin approval). Club-internal stats then automatically count for the leaderboard.
Dart Clubs: your player pool for recurring teams
New: Clubs. A club is a persistent player pool for regulars, clubs or friend groups. Register members once, invite via link, start as many tournaments from the pool as you want.
Features: invite link (public or private with admin approval), name-only placeholders for players without an account (with claim flow), owner and co-admin roles, per-member club statistics, club emoji and accent color, projection widget with a top-5 leaderboard.
Tier limits: BASIC 1 club / 10 members, PRO 3 clubs / 20 members, PREMIUM unlimited. Find it under "My Clubs" or directly at /clubs.
Email verification reminder
Users who register but don't verify within 24 hours now receive a friendly reminder email with a fresh verification link.
SmartDart now also stores your preferred language at signup so that follow-up mails (password reset, trial reminder, feedback requests) arrive in the correct language.
New SEO landing pages: darts league, club tournament, pub tournament
Three new landing pages for concrete use cases: /dart-liga-verwaltung (league management with home and away), /dart-vereinsturnier (groups+KO for clubs), /dart-kneipenturnier (quick setup for pub nights with QR code onboarding).
Each landing is bilingual (DE+EN), with FAQ, SEO metadata and a direct CTA to the matching format.
Bot filter for tracking + board limit clarification
Googlebot and other crawlers were previously counted as visitors — this distorted all retention numbers. All known bots are now filtered at entry, metrics are clean again.
Also: board limit on the BASIC plan set to 2 boards (previously inconsistent between code and landing pages).
Feedback or requests? Write to support@smartdart.app