Beta program
Sign in or register to access test builds, release notes, and detailed program information of the current development version.
Sign in or register
Use the same email and password in the Songbook Buddy Beta app after you confirm your account.
Beta rules — read before you join
Beta builds are unfinished software. By registering you accept these terms:
- Crashes, data loss, and broken features can happen. Keep backups of songs you care about.
- Use the separate Songbook Buddy Beta app and beta cloud backend — never mix test data with your release library.
- Your beta account receives Pro and Cloud for testing only. These grants do not carry over to the public release app or production cloud.
- Report bugs and ask questions only in our Discord channel — not via the public support email.
- Mobile testing is via TestFlight (iOS) and Google Play internal testing (Android) only.
- Do not share beta builds, login links, or unreleased features outside the program.
- You can delete your beta account anytime; we may revoke access when the beta ends.
Registering or signing in means you accept these rules.
Beta rules — read before you join
Beta builds are unfinished software. By registering you accept these terms:
- Crashes, data loss, and broken features can happen. Keep backups of songs you care about.
- Use the separate Songbook Buddy Beta app and beta cloud backend — never mix test data with your release library.
- Your beta account receives Pro and Cloud for testing only. These grants do not carry over to the public release app or production cloud.
- Report bugs and ask questions only in our Discord channel — not via the public support email.
- Mobile testing is via TestFlight (iOS) and Google Play internal testing (Android) only.
- Do not share beta builds, login links, or unreleased features outside the program.
- You can delete your beta account anytime; we may revoke access when the beta ends.
Registering or signing in means you accept these rules.
Cloud included in beta
Every confirmed beta account gets Pro and Cloud on the beta backend only. Sign in with the same account inside Songbook Buddy Beta to unlock Band Mode, cloud sync, and all Pro features during testing.
Latest public beta build: 1.0.25
What to test in this build
The beta channel is currently retired — there is no active beta build.
Release app and beta app side by side
You should be able to keep using the stable app for gigs while testing new builds — without mixing up your song library.
- Install the beta as a separate app with its own icon and name (Songbook Buddy Beta) once available on your platform.
- Each app keeps its own local database, settings, and device identity — edits in beta do not touch your release library.
- Cloud sync in beta uses a separate backend project, so test data never overwrites production sync data.
- On desktop you can run both apps at the same time; on mobile/tablet you switch between two installed apps.
Until the separate beta app ships on all platforms, installing a beta build may replace the current app on that device. Prefer a spare device when possible.
Beta support channels
During beta we support testers only through these channels:
- Discord — bugs, questions, and discussion
- TestFlight — iOS beta installs and updates
- Google Play internal testing — Android beta installs and updates
The public support page and support email are not for beta issues.
Recent builds
Latest entries — open the full list for older builds.
Members only
Sign in or register above to view beta release notes and downloads.
Version 1.0.25
August 31, 2026
A large release built out of three weeks of device testing: 507 commits since 1.0.24, 101 reported problems closed, verified by roughly 4,400 automated tests and 217 hands-on checks on real Macs, iPads, an Android tablet, a Windows machine and a Linux box. The password-change story is finished on the other devices, "receive only" turned into a working mirror, and these are the fixes that came out of the campaign:
- Your other devices notice a password change themselves. Detection used to hang on sign-in only, so a device that stayed signed in kept pulling rows it could not decrypt and said nothing — thousands of failed fields, no hint, no prompt. The sync cycle now recognises a rotated key, stops touching the encrypted tables and asks for the new password. A second lock in the same app run asks again instead of leaving a red icon and no way in.
- A password change is no longer rolled back by another device. While the re-encryption sweep runs the library is half rotated; a second device holding the old key pulled the half it could not read, held it back and pushed it up again under the old key. A stale local copy can no longer overwrite a newer server row.
- A password change signs out your other devices, and the dialog says so. This used to be offered as an opt-in checkbox whose hint promised that, left unticked, the other devices stay signed in. Measured on a live account on 2026-08-28 with the box off: the second machine was signed out within minutes and the account was left with one session. The server ends those sessions whatever the client asks for, so the control was inert and its sentence untrue — both are gone, replaced by a plain statement of what happens. Signing out also clears the encryption key, which used to survive the sign-out and be reloaded on the next launch.
- The password change checks its precondition before it asks. On a device with an incomplete local mirror the dialog opened, three fields were filled in and GoTrue changed the password — and only then did the sweep refuse. It now states the situation up front, with an explicit "change it anyway". The forgotten-password flow warns before sending the mail that a reset does not unlock the cloud library.
- "Receive only" is a mirror with temporary edits. A receive-only device still writes into the outbox, but every sync cycle resets those edits to the server's state: fetch the server's rows by id, drop never-pushed local creations, purge. First-edit notice, status-bar counter chip with a details sheet, reset notice with "Switch to manual". Four classes are locked instead of reset — song creation/import, synchronised preferences, band actions, permanent delete — including the band buttons themselves, which used to stay enabled and fail after the confirm dialog. Band content writes that bypassed the outbox entirely are refused. Switching direction offers "Keep and send" or "Discard". The refetch expands bulk entries into their row ids, and an offline abort marks the reset as waiting for a connection.
- End-to-end encryption reads a wrapped data key. The password-derived key now only encrypts the data key. Existing accounts were migrated at no cost, and no ciphertext was touched. Write support ships off (
kE2eeWrapWritesEnabled = false): this release reads and tolerates wraps, a password change still re-encrypts the library. Sheet blobs survive a rotation, the re-key sweep no longer strands rows, and the self-healer no longer rolls a sweep back. - Fonts get their own Preferences section, with missing bold/italic styles shown and individually re-fetchable — a failed cut used to render silently in the regular style. Intro/outro/lyrics/custom blocks now print with their own font settings, and emoji print monochrome instead of vanishing.
- The ChordPro parser and the editor agree again. A raw newline inside
{t:…}is not a title — the metadata extractor swallowed it while the tokenizer did not, so the sheet printed a lyric line while the song list mirrored a two-line title. Backslash line continuation (ChordPro 6.010) is implemented. The editor's highlighter no longer colours past what the tokenizer accepts: unclosed braces, mid-line#, open chord brackets.{socm}is a multi-line comment, not a lyrics synonym. - Wi-Fi sync answers instead of hanging. Peer search ends in a verdict, "Sync now" no longer requires a visible peer, transfer and write failures are explained and counted, a dead
synced_audiostore is probed every two minutes and named in the report footer, quitting withdraws the Bonjour announcement, and a peer that fails three times in a row is dropped. - Support reports carry what the questions actually need. A new Display/Print section (deltas only, capped) with font, display and print settings. Attachments upload rather than failing RLS, the 10 MB promise is enforced by the bucket, skipped files are named in one sentence, and a key rotation no longer floods the tail — repeating lines are collapsed instead of enumerated per field.
- Linux: the published zip starts on the oldest supported LTS base again — Ubuntu 22.04, Mint 21.x, Debian 12 (glibc 2.35 / GLIBCXX_3.4.30). 1.0.24 was built on a newer host whose headers silently raised the floor to 2.38, so it did not launch there at all. A pinned ABI floor header is pulled into every translation unit, a pre-upload check measures the finished bundle, and a bundled libmpv that cannot load now hands over to the system one instead of taking playback down with it.
- Band setlists no longer lose other members' rows. The reconcile pass took the server set as "songs owned by me" and deleted every entry contributed by someone else as an orphan — in both directions, silently, leaving the owner unable to add anything afterwards (position collision into the dead-letter queue).
- Sheet blobs: re-uploading a score no longer looks like a mismatch (ciphertext differs per encryption — the pointer is what is compared), a cloud object that was deleted reports "not on this device" instead of a failed download retried against a 404, and a discarded sweep hangs off the state rather than the upload branch.
- macOS keychain: an item owned by a differently-named bundle (
Songbook Buddy.appvs.SongbookBuddy.app) refused every delete with-25244, so a signed-out device kept handing the library key back. The app now rotates to a slot of its own, reportsstorage_cleared=falsehonestly, and the next sign-in writes an item it owns. The stale item stays behind and can be removed by hand. - Notices that carry an action disappear again. Flutter defaults such a SnackBar to
persist = true, which made itsdurationdead code — the two "receive only" hints stood indefinitely and their button led into Preferences rather than closing them. - Crash reporting: an unsent crash log is no longer evicted by newer sessions, a hard-killed session is recovered as a
crashrather than an ordinary log, a report deferred during a bad start is sent at the next healthy one, and acknowledging an incident no longer disarms the start that is still running. - macOS 12: Impeller is globally off (
FLTEnableImpeller=false) — its pipeline pre-compilation deadlocked in the Metal XPC compiler before the first frame, so the app never started. - Play Store / App Store:
.sbblsetlist import now counts against the Starter library cap. Content-identical songs merge for free, bundle-internally too; on overflow the user picks "import the first N" or cancels, and a fully blocked import gets the normal song-limit upsell. - Smaller fixes: iOS "Bold Text" no longer overrides the song display; touch line metrics match desktop (no +16 px); the footswitch hot path is a gate plus a set lookup with a key-storm counter; the shell reclaims orphaned focus after an iPad field commit; the DMX interface verdict is calibrated for iOS, where an empty enumeration proves nothing; an epoch-start pull saves a fresh cursor so the stale loop converges; an offline cycle ends at the first failure and says it once; hard delete clears local junction rows and the reconcile pass drops pre-existing orphans; a deleted chord fingering is no longer re-uploaded every cycle; the trash keeps the sheet plaintext and permanent delete clears file and bucket object; attachment paths are canonical POSIX rather than platform-dependent; quotes in the search field search exactly; the pinned insert sidebar is suppressed below the minimum editor width; the import-plan flow moved to the app shell with the wait spinner as a cancel route; PDF autoscroll re-measures after viewport changes; a missing sheet song shows the Wi-Fi route instead of an exception;
ConnectionClosedExceptionat quit counts as teardown noise; the song header is localised in both branches; the signed-out dialog can no longer become a dead end; the manual PDF renders blockquotes as hint blocks with real em dashes; the password-change progress dialog can no longer be dismissed, leaving progress and result invisible;ensure()returns only once the ready flag is actually set; 8 px of breathing room before the help block in Preferences; plus refreshed translations and rebuilt manuals for all 23 locales.
Version 1.0.24+20
August 31, 2026
Test build for the manual release checks on the Intel Mac (GF-MBPro-2016, macOS 12.7.6) — not published. First signed + notarised DMG that carries the fixes made since 1.0.24+15, which is what that machine still runs:
- A keychain item owned by another bundle no longer blocks sign-out. When deleting the encryption key returns
-25244, the slot rotates instead of silently reporting success, so the next sign-in writes its own item (…_encryption_key_s1) — BUG-2026-08-28-08. This is the fix the Intel Mac run is for. - After a password change on another device, signing back in no longer asks for the password twice — BUG-2026-08-28-09.
- Band setlist entries added by other members survive the reconcile — BUG-2026-08-30-03; ⌘S no longer reports "Saved" over a refused band write — BUG-2026-08-30-04.
- Sheet attachments: a ciphertext-sha256 mismatch proves the pointer, not the file — the sheet opens and the pointer heals (BUG-2026-08-31-03); a deleted cloud object says "not on this device" instead of retrying a known 404 (BUG-2026-08-31-02); the re-key pre-flight cleans up the plaintext it fetched (BUG-2026-08-31-01).
- Notices with an action disappear again after their duration instead of standing forever — BUG-2026-08-31-04.