CruxCoach

com.cruxcoach.android
by CruxCoach cruxcoach@npub.cash

Open-source climbing-board app for Kilter, MoonBoard and more

Browse climbs, control your board — Kilter, MoonBoard and more — via Bluetooth, log ascents, import your Kilter logbook, and track your progress. No third-party cloud services, full control over your data.

First release: Apr 14, 2026, 9 total releases.

Most recent release: Sep 26, 2026.

Website Repo

Appears in 1 app stack.

2,100 sats / 1 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Sep 26, 2026 0.2.3
    # CruxCoach 0.2.3 — 2026-09-26 This release brings beta videos, quicker board navigation, a searchable board map, clearer statistics and more reliable browsing. ## Highlights - **A guided first session.** Connect your board during setup, choose catalogue downloads and optionally import your logbook. A skippable tour then highlights the real app controls, Quicklog and your saved logbook entry. Replay is available from the app menu behind the logo. - **Angle selection at hand.** Change the board angle directly in the single-row
    More…
    browser header. The filter screen keeps difficulty, status and sorting together, with additional restrictions available when needed. - **Exclude sent problems directly.** The filter switch selects unsent problems; status chips stay synchronized and show checkmarks for your selection. - **Clearer MoonBoard markings.** Light and dark outlines make the coloured rings easier to see, including on the blue holds of the MoonBoard 2024. - **Statistics count problems.** Flash, Sent and Attempt each count distinct problems using the best outcome in the selected period. Ten unsuccessful tries on one problem count as one attempted problem. Sending it moves it into Sent; a true flash takes priority. Total attempts remain available as training volume. - **Filter totals match the list.** Counts follow the same board, status, source, hold and visibility restrictions as browsing. Matching problems beyond the first 50 remain available. - **More reliable random browsing.** Random search keeps one shuffled result set while you scroll, fixing crashes caused by repeated problem IDs. - **Compact board navigation.** Switch boards from the header, open the main menu from the app logo and reach extra actions through an overflow menu on narrow screens. - **Beta videos close at hand.** Open videos from the climb detail card. Optional beta media synchronizes separately from the board catalogue; previews are verified before caching and fall back gracefully when a mirror is unavailable. - **A Kilter logbook that matches Kilter.** Imported entries now find their problem whatever spelling the catalogue stores it under, show the grade of the angle they were climbed at, render on their own board and keep their sequence. Deleting an entry removes it on Kilter too, and a deletion made offline is carried out later. Existing entries are corrected on the next sync. - **Find boards on the map.** Search the board map for gyms, cities and boards and open a venue to see every board installed there. - **Download only what you climb.** Choose which board catalogues to keep on your phone during setup or later in Settings → Board catalogs. - **Community climbs on every board.** CruxCoach community climbs show their holds, fit your board size and light the wall even for boards whose catalogue you did not download. - **Training lists play their plan.** Generated lists start with their tries and rests; the generator plans from one grade range with a rising warm-up. - **Share boards nearby, your choice.** The receiver picks which of the sender's boards to take, right on the first setup screen if needed. ## Other improvements - Board-aware quick logging and playlist generation, with candidate pools for each planned grade band and a usable initial plan while the logbook profile loads. - More consistent MoonBoard links and logged status across legacy problem IDs. - Extra space below playlists keeps the add button clear of the last card's actions. - Stronger validation and resource limits for local sharing, relay messages and downloaded app updates. - About lists the open-source licenses and links the privacy notice and source code. - Developer replies show unread badges and name their thread in notifications. - Logs of CruxCoach community climbs stay out of the Kilter upload. ## Android compatibility CruxCoach 0.2.3 requires **Android 9 or newer**. As announced in the previous release, 0.2.2 is the last version for Android 8.0 and 8.1. On Android 8, CruxCoach 0.2.2 already knows this. Its updater stops before it even checks and tells you once that this device keeps the version it has. Nothing is downloaded and nothing changes: the app stays fully usable and your data is untouched. If you are on Android 8 and still running 0.2.1 or older, update to **0.2.2** rather than to this release — 0.2.3 cannot install there. An older updater may offer it anyway; Android then refuses the package before installing it, which leaves your existing app and its data exactly as they were. Moving to a newer device: install CruxCoach there and restore your backup.
  • Aug 29, 2026 0.2.2
    # CruxCoach 0.2.2 — 2026-08-29 Your lists become training sessions you can play, your Moon logbook comes with you, Quantum Boards join CruxCoach, and CruxRelay lets the whole room use one connected wall. > **Android 8.0 and 8.1: this is the last version for your device.** 0.2.3 will need Android 9. CruxCoach now says so on affected devices instead of letting them wait for updates that can never arrive — the app keeps working and your data stays where it is. ## Highlights - **Playlists — play a list instead of scrolling it** — one climb at a time on a full-screen player, sent to the wall as it comes up, a rest countdown that already shows what's next, *Sent it* / *Attempt* logging without leaving the screen, and a summary with total, active and rest time at the end. Every list you already have can be played; sharing a playlist works like sharing a climb. - **Let CruxCoach plan the session** — pick a training type (pyramid, power endurance, volume, max strength, or working your projects), a duration, an angle and how warmed up you are. The grades come from your own logbook — the grade you repeat reliably and the one you flash — not from a fixed table. Or set the grade range, the number of climbs, the tries and the rests yourself and get exactly that. - **Import your MoonBoard logbook** — transfer ascents and projects directly from the installed Moon app through a one-time, user-enabled on-device reader, or choose a Moon CSV file. CruxCoach keeps dates, angles, send/project state and exact attempt counts, and a repeated transfer updates instead of duplicating the same training days.
    More…
    - **Quantum Boards, with live coexistence** — connect and browse Quantum walls, see every layer currently reported by the controller — including climbs sent by other apps — and filter for climbs with either zero overlaps or at most one overlap with the occupied layers. - **CruxRelay — other board apps can use the connected wall** — most controllers talk to one app at a time, so CruxCoach can stand in for the board and forward climbs from compatible apps. Sharing starts with the direct board connection and stays available even when no guest is currently connected; disconnecting the host board or explicitly stopping sharing ends it and restores the phone's Bluetooth name. - **Two more MoonBoards** — the original **MoonBoard 2010** and the **Mini MoonBoard 2025**, each on its own measured board photo. Problems now also say when the setter meant them to be climbed *footless* or *without the kickboard*, and a MoonBoard climb stays lit while you are working it instead of going dark. - **One tap back to your last board** — the board you used last is offered as a card in the connect sheet; tapping it reconnects without scanning the room again. CruxCoach also works out on connecting whether your controller takes one app or several, and you choose per case whether a climb goes to the wall the moment you open it or only when you tap. - **Updates no longer depend on one server** — CruxCoach asks every known source for the newest version and takes whichever has it, and that list is fetched at runtime, so a download server can be added or retired without anyone installing a new version first. An APK is still installed only after its checksum and signature match. You can also choose to have updates download or install themselves — off unless you turn it on. ## More improvements - **MoonBoard LED position** — choose below, above or both on every MoonBoard; finish holds safely stay below, and below remains the default. - **Delete one board's data, not all of it** — both *delete board data* and *delete logbook data* let you pick which boards they apply to. Your own climbs and community climbs are always kept. - **Auto-disconnect can be switched off** — the board connection stays open until you disconnect it yourself. - **Keep a session to yourself** — when you start one, you decide whether nearby CruxCoach users can see and join it. - **A calmer browser** — the bar echoing your active board, layout, size and angle is gone; it only repeated what Settings already shows. - **Playlists are called playlists** — the Kilter import no longer calls them "circuits". - **CruxCoach speaks up when board updates stop arriving** — a background catalogue sync that keeps failing used to look exactly like a successful one. - **Spreadsheet-friendly exports** — save or share your logbook, private climb notes, lists/playlists and own climbs as JSON, a CSV ZIP or an Excel workbook. CSV and Excel include readable Font and V grades alongside the underlying values; JSON and CSV remain importable, while Excel is clearly marked as export-only. - **An anonymous count of verified updates** — once an update is downloaded and verified, CruxCoach may report which version and which source, and nothing about you, your device or your installation. On by default, switchable off under Settings → Updates. - **Small things** — a climb's published/draft state now looks the same in the browser and on its detail screen, and browsing a board right after adding it on its own is quicker. ## Fixes & reliability - **Manual exchange says exactly what it carries** — JSON and CSV round-trip the user-facing logbook, private climb notes, lists/playlists and own climbs; older CruxCoach JSON backups remain importable. The separate encrypted cloud backup continues to carry the complete recovery payload, including internal profile and training data. - **Playlist navigation, lighting and Nearby stay in sync** — choosing a climb from the list view now selects it in the existing player instead of opening a second non-functional playlist screen. Detail-screen light actions work while a playlist is active, automatic mode sends the newly selected climb, and Nearby advertises that same current climb. - **Quantum overlap filters now filter the rows, not only the count** — live controller layers are resolved to climb geometry before the browser applies the zero-overlap or at-most-one-overlap filter. - **Older Quantum controller state reads no longer break sending** — when the optional live-state characteristic stays silent, CruxCoach keeps the healthy connection and asks for the authoritative route list through the supported command path. - **Nobody is told to climb during a shared rest** — in a session you had joined, your phone could show the next climb as ready while the host was still resting and the wall showed something else. Rests now reach everyone, including anyone joining mid-rest. - **No more downloading an update that cannot be installed** — after an interrupted update, CruxCoach could re-download and re-verify an older version on every check, only for Android to refuse it at the last step — a 34 MB download for a guaranteed failure, on mobile data too. - **Sharing CruxCoach handed out an old app** — the share QR was built from the sharing phone's own version, so an older build pointed everyone at that older build. It now opens a download page that always resolves to the current release, with a fallback host. - **Boards no longer fail on the very first download** — each catalogue retries before giving up, instead of one unlucky moment losing a whole board. - **Hold and zone filters reset when you switch boards** — a filter drawn on one board no longer survives onto the next, where it matched nothing. - **No "matching allowed" badge where nobody was ever asked** — it is a Kilter setting, so it no longer appears on MoonBoard problems or community climbs. - **Turning Bluetooth on from the connect sheet no longer closes the app.** - **The angle picker opens instantly**, swiping between climbs no longer hides the send button, and a re-download you asked for reports why it is waiting instead of appearing to do nothing. - **Deleted community climbs stay deleted** — even on devices that only sync via the catalogue. --- # CruxCoach 0.2.1 Zone search on the board photo, your Kilter circuits as lists, a share link for every climb and lists that span all your boards — plus offline sharing that actually delivers and a more reliable connect, import and updater. ## Highlights - **Zone search** — drag a frame on the board photo to find climbs that live entirely inside it; combines with the hold filter. - **Kilter circuits import as lists** — logging in with your Kilter account now also pulls your circuits as local lists. - **Share any climb** — catalogue climbs get share links too, opening straight in CruxCoach. - **Lists show all your climbs** — saved lists show every climb you added, across all boards (each with its board badge), with a multi-select board filter for mixed lists. Off-board sends are refused with a clear message instead of lighting up wrong holds. - **MoonBoard 2016 + 2024 adjustable** — both variants now offer 25° and 40°. ## More improvements - **"Newest" sort** — browse the catalogue by climb creation date, newest-first or oldest-first via the sort-direction toggle. - **Board download over mobile data** — now possible as an explicit opt-in with a data-size warning. - **Honest logbook & stats** — "Sent · 3 tries" vs "Open · 3 attempts", grade-true pyramid buckets, a flash only counts if your first-ever go was the send, day-streaks give way to weekly consistency, and sessions-per-week now divides by the full 8-week window. - **Portrait only** — landscape layouts are gone. ## Fixes & reliability - **Offline share works end-to-end now** — receiving the board database from a friend's phone no longer fails at the end of the import or times out while the sender prepares the transfer; every board's climbs arrive intact. - **Kilter login errors show up** — a wrong password or a failed logbook import no longer fails silently. - **Sturdier Kilter logbook import** — re-syncs keep your local edits, large logbooks import without crashing, transient errors retry, and failures show readable messages with a working retry. - **Calmer board connect** — retries happen quietly in the background (especially noticeable on Android 10); the "experimental" toggle is gone. - **Updater fixes** — swiped-away update notifications come back, interrupted downloads resume, checks aren't muted for hours after a reboot, a system hiccup during a download can't crash the app anymore, no more stale "install" notification after a successful update, and the install dialog arrives reliably on newer Android versions. - **Climb links always open** — a shared climb link now works even while another climb's detail is already on screen. - **Sturdier backup & dev messages** — cloud backups now target only servers verified to accept them (no more "partial" result on every backup), plus a third bootstrap relay; messages to the developer finish sending even if you leave the screen immediately. - **What's-new + announcements** — the update popup can't be dismissed by accident anymore (the 0.2.1 highlights include a short 0.2.0 board recap for anyone who missed it); read announcements stay fully readable. --- # CruxCoach 0.2.0 — the multi-board release CruxCoach now speaks **MoonBoard** alongside Kilter, adds five more Aurora boards, puts board gyms on a world map, and refreshes the default LED colours. ## New boards - **MoonBoard** — browse the full problem catalogue with the same filters as Kilter, open any problem, and light it up on your board over Bluetooth. Five variants (2016, Masters 2017, Masters 2019, Mini 2020, 2024), each shown on a real, measured board photo. - **Tension, Grasshopper, Decoy, So iLL, Touchstone** — five more boards, fully interactive: browse, send over Bluetooth, read the hold heatmap, and create your own climbs. - **One board picker** for everything — choose your board in onboarding or Settings. ## Find a board near you - **Board map** — an interactive world map of board gyms (Kilter + MoonBoard) with brand, region and access filters, gym details and opening info, and a one-tap "browse this board". Gyms at the same place share a pin; busy areas cluster. - **Find your gym** — search by gym name and pick your exact wall in one tap, no hardware knowledge needed. Plus an **egym Wellpass** filter to spot gyms that accept it. ## Climbing & logbook - **Variable angle** — for climbs that exist at several angles, pick the angle your board is actually set to. - **Sent-climbs history (Verlauf)** — your sends, logged automatically, with per-board badges and bulk delete. - **Per-board stats** — read your hold heatmap one board at a time. - **More browser filters** — combine New / Attempted / Sent, a projects-only view, hide unwanted climbs, a mounted-hold-set filter, reset-filters, and a Moves sort. ## More - **Refreshed default LED colours** (start magenta, hand blue, finish green, foot red) — your custom colours stay untouched. - A smaller, faster app, plus many fixes across the map, sync and Bluetooth. _0.1.5 was never released on its own — its work is folded into 0.2.0._
  • Jul 11, 2026 0.2.1
    # CruxCoach 0.2.1 Zone search on the board photo, your Kilter circuits as lists, a share link for every climb and lists that span all your boards — plus offline sharing that actually delivers and a more reliable connect, import and updater. ## Highlights - **Zone search** — drag a frame on the board photo to find climbs that live entirely inside it; combines with the hold filter. - **Kilter circuits import as lists** — logging in with your Kilter account now also pulls your circuits as local lists. - **Share any climb** — catalogue climbs get share links too, opening straight in CruxCoach. - **Lists show all your climbs** — saved lists show every climb you added, across all boards (each with its board badge), with a multi-select board filter for mixed lists. Off-board sends are refused with a clear message instead of lighting up wrong holds. - **MoonBoard 2016 + 2024 adjustable** — both variants now offer 25° and 40°.
    More…
    ## More improvements - **"Newest" sort** — browse the catalogue by climb creation date, newest-first or oldest-first via the sort-direction toggle. - **Board download over mobile data** — now possible as an explicit opt-in with a data-size warning. - **Honest logbook & stats** — "Sent · 3 tries" vs "Open · 3 attempts", grade-true pyramid buckets, a flash only counts if your first-ever go was the send, day-streaks give way to weekly consistency, and sessions-per-week now divides by the full 8-week window. - **Portrait only** — landscape layouts are gone. ## Fixes & reliability - **Offline share works end-to-end now** — receiving the board database from a friend's phone no longer fails at the end of the import or times out while the sender prepares the transfer; every board's climbs arrive intact. - **Kilter login errors show up** — a wrong password or a failed logbook import no longer fails silently. - **Sturdier Kilter logbook import** — re-syncs keep your local edits, large logbooks import without crashing, transient errors retry, and failures show readable messages with a working retry. - **Calmer board connect** — retries happen quietly in the background (especially noticeable on Android 10); the "experimental" toggle is gone. - **Updater fixes** — swiped-away update notifications come back, interrupted downloads resume, checks aren't muted for hours after a reboot, a system hiccup during a download can't crash the app anymore, no more stale "install" notification after a successful update, and the install dialog arrives reliably on newer Android versions. - **Climb links always open** — a shared climb link now works even while another climb's detail is already on screen. - **Sturdier backup & dev messages** — cloud backups now target only servers verified to accept them (no more "partial" result on every backup), plus a third bootstrap relay; messages to the developer finish sending even if you leave the screen immediately. - **What's-new + announcements** — the update popup can't be dismissed by accident anymore (the 0.2.1 highlights include a short 0.2.0 board recap for anyone who missed it); read announcements stay fully readable. --- # CruxCoach 0.2.0 — the multi-board release CruxCoach now speaks **MoonBoard** alongside Kilter, adds five more Aurora boards, puts board gyms on a world map, and refreshes the default LED colours. ## New boards - **MoonBoard** — browse the full problem catalogue with the same filters as Kilter, open any problem, and light it up on your board over Bluetooth. Five variants (2016, Masters 2017, Masters 2019, Mini 2020, 2024), each shown on a real, measured board photo. - **Tension, Grasshopper, Decoy, So iLL, Touchstone** — five more boards, fully interactive: browse, send over Bluetooth, read the hold heatmap, and create your own climbs. - **One board picker** for everything — choose your board in onboarding or Settings. ## Find a board near you - **Board map** — an interactive world map of board gyms (Kilter + MoonBoard) with brand, region and access filters, gym details and opening info, and a one-tap "browse this board". Gyms at the same place share a pin; busy areas cluster. - **Find your gym** — search by gym name and pick your exact wall in one tap, no hardware knowledge needed. Plus an **egym Wellpass** filter to spot gyms that accept it. ## Climbing & logbook - **Variable angle** — for climbs that exist at several angles, pick the angle your board is actually set to. - **Sent-climbs history (Verlauf)** — your sends, logged automatically, with per-board badges and bulk delete. - **Per-board stats** — read your hold heatmap one board at a time. - **More browser filters** — combine New / Attempted / Sent, a projects-only view, hide unwanted climbs, a mounted-hold-set filter, reset-filters, and a Moves sort. ## More - **Refreshed default LED colours** (start magenta, hand blue, finish green, foot red) — your custom colours stay untouched. - A smaller, faster app, plus many fixes across the map, sync and Bluetooth. _0.1.5 was never released on its own — its work is folded into 0.2.0._
  • Jun 22, 2026 0.2.0
    # CruxCoach 0.2.0 — the multi-board release CruxCoach now speaks **MoonBoard** alongside Kilter, adds five more Aurora boards, puts board gyms on a world map, and refreshes the default LED colours. ## New boards - **MoonBoard** — browse the full problem catalogue with the same filters as Kilter, open any problem, and light it up on your board over Bluetooth. Five variants (2016, Masters 2017, Masters 2019, Mini 2020, 2024), each shown on a real, measured board photo. - **Tension, Grasshopper, Decoy, So iLL, Touchstone** — five more boards, fully interactive: browse, send over Bluetooth, read the hold heatmap, and create your own climbs. - **One board picker** for everything — choose your board in onboarding or Settings. ## Find a board near you
    More…
    - **Board map** — an interactive world map of board gyms (Kilter + MoonBoard) with brand, region and access filters, gym details and opening info, and a one-tap "browse this board". Gyms at the same place share a pin; busy areas cluster. - **Find your gym** — search by gym name and pick your exact wall in one tap, no hardware knowledge needed. Plus an **egym Wellpass** filter to spot gyms that accept it. ## Climbing & logbook - **Variable angle** — for climbs that exist at several angles, pick the angle your board is actually set to. - **Sent-climbs history (Verlauf)** — your sends, logged automatically, with per-board badges and bulk delete. - **Per-board stats** — read your hold heatmap one board at a time. - **More browser filters** — combine New / Attempted / Sent, a projects-only view, hide unwanted climbs, a mounted-hold-set filter, reset-filters, and a Moves sort. ## More - **Refreshed default LED colours** (start magenta, hand blue, finish green, foot red) — your custom colours stay untouched. - A smaller, faster app, plus many fixes across the map, sync and Bluetooth. _0.1.5 was never released on its own — its work is folded into 0.2.0._
  • May 18, 2026 0.1.4
    > 0.1.4 turns CruxCoach from a Kilter-catalog viewer into a small > climbing-community-on-Nostr. You can now set your own climbs, share > them with other CruxCoach users, see what others have set, pick a > profile, and migrate your old Kilter-app data into the app. ### Added - **Climb Creator** — set your own climbs on the board image, save drafts (with autosave), publish to other CruxCoach users via Nostr (Kind-30078), optionally push to your own Kilter account so they show up in the Kilter app too. Heatmap shows where popular
    More…
    hand/start/finish holds typically go for the current layout + angle. Frames are validated before publish. - **Community climbs in BoardBrowser** — climbs other CruxCoach users have published appear next to the Kilter catalog. Origin filter chip lets you filter to CruxCoach / Kilter / All. - **Setter detail page + setters list** — see who's been publishing in the community and browse their climbs. A community badge on each climb's detail screen links to the setter. - **Edit my published climb** — load any climb you previously published into the Creator, edit, and re-publish. The Nostr d-tag stays stable so the original event is replaced, not duplicated. Kilter side does an UPDATE if previously synced there. - **Live Nostr subscription for community climbs** — climbs published while you're online appear immediately, not after the next daily Blossom snapshot. - **My-climbs filter** in BoardBrowser surfaces just your own published + draft climbs. - **Nostr profile editor** in *Settings → Profile* — display name, picture, banner, NIP-05 identifier (with on-blur verification), Lightning address (with on-blur LNURL probe), and a markdown bio. Without this, your community climbs show up as `npub:<hex>...`. - **Aurora migration** in *Settings → Migrate from Aurora* — import the JSON Aurora emails after a data-export request: ascents, attempts, circuits, and bid history land in your local logbook. Re-importing the same file is safe. - **Auto-Note** (optional) — when you publish a community climb you can also fire a Kind-1 note to your relays announcing it. Off by default; editable template per climb. - **Kilter publish (opt-in)** — *Settings → Kilter publish* toggles whether your community climbs are also pushed to Kilter. 6-hour retry worker drains transient failures. On-Kilter badge on the detail screen when a climb is synced to both surfaces. - **Homewall support** — new 7-row Homewall layout is selectable in onboarding and via the size-picker. - **Cloud-Backup now covers your own climbs** — v3 envelope includes published + draft climbs so they restore on a new device. ### Changed - **Onboarding** auto-starts the board-database download the moment you reach that step. - **Board-database import is noticeably faster on mid-range devices** — shared SQLite connection across chunks, WAL tuning, and a join-based normalisation pass. - **Internal table renames** — board DB moved from the historical `aurora_*` prefix to plain plural names (`climbs`, `climb_stats`, …). Migration runs once on first launch; BLE class names lost their Aurora prefix to match. - **Quality rating** in climb-detail accepts 1–5 stars (was 1–3) — Kilter migrated to a 5-star scale. - **Detail-screen + Logbook toolbars** cleaned up — redundant titles dropped, overflow menu consolidated so the top bar doesn't overflow on narrow screens. - **Mirror toggle moved into the climb-detail ⋮ overflow menu** — it was a full-width centered button between the stats and the board image; it's now the first item in the overflow, reclaiming that vertical band on every climb-detail view. ### Fixed - **Cloud-backup deletion now sticks across devices** — pre-fix, tapping *Delete remote backups* could silently leave a recoverable copy on the index servers, because some don't honour the standard deletion event for replaceable items: a fresh restore on a new device would still find and import the backup. CruxCoach now also publishes a deletion marker that every relay must honour, so the next restore returns "no backup found" regardless of how thoroughly the storage servers complied. The confirm-dialog copy was reworded to reflect that the marker is the privacy guarantee and a partial storage-server result (e.g. 1/2) is no longer presented as a security caveat. Transient DELETE timeouts on storage servers retry once. - **Climb detail screen now picks the right physical board for every climb** — Aurora-imported climbs and any cross-board community climb (Homewall climb on an Original-12×12 user, a cropped sub-route whose extent exceeds the user's smaller variant, etc.) now render against a board whose edges actually contain the climb's holds. Pre-fix the renderer always used the user's Settings board, which clipped start + finish holds off the canvas for cross-board entries and used coordinate edges tuned for the wrong physical wall. - **Climb detail screen no longer opens the wrong climb when navigating from Setter pages** — pre-fix tapping a climb on a setter's profile silently routed to the *first* climb of whatever browser/logbook list was last open, because the pager inherited stale list context. The detail screen now drops to a single-page render of the actual tapped climb when the cached list is no longer relevant. - **Drafts no longer present as published in the detail screen** — Aurora-imported drafts (and any other never-published row) used to show the "CruxCoach community" provenance chip and offer "Veröffentlichung löschen" as the delete action — which failed because there was no Nostr event to tombstone. The chip now only appears for climbs that actually reached a relay, and the delete menu routes drafts to a local-only delete that succeeds and matches the action label. - **Cloud-backup restore shows progress instead of freezing** — a fresh-install restore blocks on the board-database download to avoid a SQLite race; the dialog used to look like a hard freeze for the 1–3 minutes that took. It now shows a spinner with explicit "waiting for board-database download" and "restoring backup" phase copy. - **Auto-backup interval finally persists across cold restarts** — previously, the daily / weekly cadence you picked could silently revert to whatever the board-sync was on (or disappear entirely if board-sync was on Manual). - **Onboarding and Aurora-migration screens recover from internal errors** — instead of throwing you back to a fresh-install state. - **Stuck "logging in" / "importing" spinners** when a backend call threw transiently — the spinner clears, an error surfaces, and the user can retry. - **Aurora import survives bad rows** — a single malformed entry no longer rolls back the whole import; oversized files are refused with a clear message instead of crashing the import. - **Community-climb sync queue** — if an incoming climb temporarily fails to save (disk pressure, lock contention), it's parked in a durable retry queue and re-imported on the next start instead of being lost. - **Profile metadata stays correct on slow relays** — the in-app cache compares each incoming Kind-0 against the event's own timestamp, so older versions can't overwrite a newer one. - **Tombstoned climbs propagate** — upstream-deleted climbs are marked `is_deleted=1` locally instead of being silently re-inserted on the next bulk import. - **Cross-published climb deletion now actually hides the climb** — when you delete a community climb that was also pushed to your Kilter account, every other CruxCoach device used to keep the climb visible in BoardBrowser indefinitely. Three pre-fix gaps: (a) the daily catalog refresh kept re-introducing the row from Kilter's API, (b) the chunked Blossom bundle stripped tombstones before publishing them, and (c) the app-side delete handler silently no-op'd on rows whose local provenance was Kilter-flavoured. All three layers now treat the Nostr tombstone as the source of truth: an explicit delete propagates through the daily snapshot and through the live Nostr subscription within seconds. - **Deleted climbs stay useful in your logbook** — the climb's name, grade, holds, and send-count are preserved on the device after the setter deletes; only the BoardBrowser visibility flips. Pre-fix a delete erased the metadata that the logbook still wanted to render for climbs you'd already attempted. - **Live Nostr subscription doesn't flood the relay on cold start** — a fresh install now waits up to 30 s for the daily Blossom snapshot to arrive before opening the live subscription, so the relay only has to stream the ~24 h delta instead of all-of-history. Pre-fix the subscription opened first and the resulting WebSocket buffer blew up writer-lock contention against the bulk importer running in parallel. - **Setter display names update when their profile changes** — the in-app Kind-0 cache now refreshes after a 30-minute TTL instead of pinning the first-seen snapshot forever. New display names land on the next setter-page open via a two-phase load (cached snapshot immediately, fresh fetch in the background). - **CruxCoach setter-source filter shows community climbs first** — the BoardBrowser filter ran client-side over a sends-sorted SQL pagination, so low-send community climbs landed on page 50+ and were invisible without manual scroll. The filter now pre-narrows at the SQL level and orders by stat-quality. - **CruxCoach metadata preserved across Kilter blob refreshes** — your Nostr provenance, frames-hash, sync-status, and Kilter-publish flags survive the daily catalog refresh. - **Climb-creator UX** — empty-brush tap deletes the hold, drag-to- move works, V-scale slider has live validation, German climbing terms throughout, drafts re-open without showing autosave state. - **Heatmap performance** — parsed frames cached + fast IntArray parser; no frame drops on layouts with hundreds of climbs. - **Filters persist** — origin filter + "My climbs" toggle survive app restarts. - **Setter usernames** — BoardBrowser uses an npub stub when the cached display name is missing instead of an empty label. - **First launch after this update no longer looks frozen** — the one-time database preparation that runs once after updating now shows a clear "Preparing the climb database…" message with a keep-the-app-open hint instead of a bare spinner. The preparation itself is roughly 3× faster on slower devices, and it is atomic: if the app is closed mid-preparation it simply re-runs cleanly on the next launch — no data loss or corruption. ### Security - **Every incoming community-climb event is signature-verified** — Quartz `Event.fromJson` recomputes the canonical event id + `verifySignature()` runs before persisting. Mirrors the existing pattern at NostrProfileManager / BlossomSyncManager / BackupRepository. - **Author-uuid guard** — events whose d-tag prefix or content `pubkey_prefix` claims a different author than the signed pubkey are dropped; a UUID owned by author A cannot be overwritten by an event from author B (first-author wins). - **Refresh-token revocation on logout / re-login** — both the re-login path and the one-time-import path now revoke the prior Keycloak refresh token server-side before clearing it locally, closing the 30-day stolen-credential window. - **Manual backup-import pubkey binding** — importing a backup from a different Nostr key requires an explicit toggle with a persistent warning that imported climbs will publish under your current account if you republish. The default path hard-refuses the mismatch. - **Climbs imported via backup can no longer be auto-republished under your active Kilter account** — the background retry worker is now scoped to the active Nostr identity. - **Profile-editor NIP-05 + LNURL fetches bounded** — server responses capped at 64 KB and the LNURL probe refuses to follow redirects, so a hostile endpoint can't OOM the editor or redirect probes onto your LAN. - **Kilter publish payload not logged in release builds** — debug logs that previously emitted the outgoing climb JSON (name, description, username) are stripped from release APKs via ProGuard. - **Display name used on Kilter never falls back to email** — a resolution chain ensures your public Kilter handle is either your registered display name or a neutral placeholder, never the email you logged in with. ### Notes - This is the first release that publishes user-authored climbs publicly on Nostr (when you tap *Publish* in the Climb Creator). Identity defaults to your existing CruxCoach Account key (same as encrypted cloud backup). Auto-Note Kind-1 + Kilter API push are both opt-in. - The community-climb deletion path can remove a climb from CruxCoach + Nostr relays, but cannot remove it from Kilter — Kilter's API has no delete endpoint and enforces this for every client. The delete confirm-dialog warns you of this. - `SECURITY.md` has been updated with the new attack surface: community-publishing chain, Kilter API self-account writes, Auto-Note Kind-1.
  • Apr 27, 2026 0.1.3
    ### Added - **Encrypted cloud backup** — opt-in during onboarding or later in Settings. Your climbing data is encrypted on your device and stored across multiple public servers (Nostr + Blossom). Only you can decrypt it. - **Restore a backup on a new device** — during onboarding, choose "Restore backup" and import your CruxCoach Account key. CruxCoach briefly restarts and then pulls your data automatically. - Delete remote backups from Settings — "Delete remote backups…" as an explicit destructive action, with a confirmation dialog and caveats spelled out. Local data is not touched. - "What's new" upgrade dialog announces the encrypted-backups feature when you upgrade from a previous version (skipped on fresh installs and per-identity). - Smarter BLE board connect — when only one Kilter Board is in range, CruxCoach connects automatically after a short scan. Two or more boards still show the picker. - **Quick-Send mode** (Settings → Board → "Schnell-Senden") — when on, tapping the BLE icon in a climb's detail view runs the full macro: scan, auto-connect (or pick if multiple), send the climb, and disconnect — no manual connection sheet, no manual disconnect. - Always-visible status line in *Settings → Encrypted cloud backup* covers all five states (no key / disabled / disabled-with-history / enabled-no-backup / enabled-with-last-sync), so the section never goes blank after a delete. - Share via Zapstore — new QR code + shareable link in Settings → Share app, for pointing new users at the recommended app store. - Copy buttons for the online-share URL, offline-share password, and offline-share download URL — no more retyping.
    More…
    - Automatic NIP-65 relay discovery — CruxCoach now picks up the Nostr relays you've published as "yours" and uses them instead of just the three built-in defaults. Fully invisible, no settings to manage. - **Prominent "save your account key" warning** wherever you enable Cloud-Backup (onboarding, *what's new*, settings) and on *Settings → CruxCoach Account*. The same key protects both your CruxCoach Account and your cloud backup, so saving it once covers both — without it, both are gone if you lose this device. *CruxCoach Account* is now the single canonical place to view, copy, and confirm "I've saved my key". - **Backup-frequency picker in onboarding + What's new** — pick *manual* / *daily* / *weekly* right when you enable Cloud-Backup, no need to go through Settings afterwards. ### Changed - Onboarding redesigned — down from five steps to three: welcome + board-database download in one screen, privacy + backup in one coherent screen, Kilter import as an optional last step with a prominent "Skip" button. - Backup-error messages are now localized end-to-end (German + English). Pre-fix the snackbar said *"Backup fehlgeschlagen: Blob upload failed on all 2 servers"* — mixed locale; now you see a clean message in your locale regardless of which step failed. - Delete-remote dialog reports per-leg outcomes in your locale instead of English diagnostic strings. - Default Blossom servers swapped to a verified-working pair: `blossom.primal.net` + `nostr.download` (replacing `blossom.nostr.build`, which deterministically rejects encrypted blobs because of its image-only MIME policy). - BLE Auto-Disconnect + Pause-Timer settings simplified — preset chips removed; the duration stepper is now the single source of truth and reaches every value the chips used to offer plus the in-betweens (e.g. 1 m 47 s). - "Bildschirm anlassen" toggle moved into the Anzeige (Display) section where it thematically belongs. - All-locale dates throughout — *last sync* / onboarding board-sync timestamps now follow the system locale (`25.04.26, 14:32` in German, `4/25/26, 2:32 PM` in English) instead of the hardcoded German format. - *SyncInterval* chips, the *Board model* dialog, and the board-sync inline card no longer show hardcoded German labels in English locale. - Share buttons renamed for consistency: "Share online", "Share offline", "Share via Zapstore", "Share via apps". - The backup feature is now called *Encrypted cloud backup* / *Verschlüsseltes Cloud-Backup* throughout the UI (settings, onboarding, "what's new" dialog, error messages, restore + delete-remote flows). The underlying tech (Nostr + Blossom) is named explicitly in a single concise *how does this work* line in Settings, instead of bleeding through every status string. No functional change — same encryption, same servers, friendlier vocabulary for non-Nostr users. - Backup default is now **manual** when you enable the feature for the first time (during onboarding or via the "what's new" dialog). No automatic first backup, no scheduled background runs. You start the first backup yourself via *Settings → Back up now*, and choose a daily/weekly cadence there if you want one. Existing users on a daily/weekly schedule keep their setting. ### Fixed - **Empty BoardBrowser after an interrupted onboarding** — if a process kill (e.g. an Amber-pair restart while the board database was still importing) interrupted the import mid-flight, the next app start now detects the half-imported state and runs a recovery sync automatically. Pre-fix, the BoardBrowser would show zero holds until you manually tapped *Sync now*. - Backup pipeline is now serialized — periodic and manual *Jetzt sichern* runs can no longer race and orphan a Blossom blob or mis-target the cleanup delete. - *Backup gefunden* but restore immediately fails: pre-flight HEAD probe in *Backup wiederherstellen* checks that at least one Blossom server still holds the encrypted content before showing the confirm dialog. If every server reports the blob missing (e.g. after a previous opt-out), the snackbar explains it instead of showing a generic restore-failed. - Restore reliability under slow relays — the backup-pointer fetch now keeps the events that arrived before a slow third relay timed out, instead of dropping all of them. Timeout raised from 10 s to 30 s. - Process-wide Nostr cache no longer swallows the just-published backup pointer / key event when a foreground subscription saw it first — restore queries bypass the dedup cache (same fix applies to the profile-metadata refresh). - Restore could destructively replace the backup encryption key under transient relay errors (orphaning the existing blob). Auto-regeneration is now blocked when this device has any prior backup history; you'll see *"Verschlüsselungs-Schlüssel-Event konnte nicht von den Relays geladen werden — bitte erneut versuchen"* and the existing backup stays intact. - Background-backup retry storms with Amber + auto-approve disabled — the worker now distinguishes coroutine cancellation from programming bugs, and DataStore failures route to retry instead of permanent failure. - Amber sign attempts no longer hang the app forever when Amber is uninstalled mid-flight — the suspended sign call is unblocked with an empty response, and you get a real error instead of a frozen progress indicator. - *Remote-Backups löschen* now correctly counts an HTTP 404 from a Blossom server as success (the server doesn't have the blob → goal achieved) instead of confusing "1 von 2 Servern" reports when one server never accepted the upload to begin with. - Slow-loris HTTP timeouts: every Nostr / updater HTTP client now has a hard wall-clock cap (60 s call timeout) on top of the per-segment timeouts. - App-startup race where one failing background step (board sync, Kilter sync) skipped the rest of the chain — each step now runs independently. - BLE Auto-Disconnect + Pause-Timer settings no longer show stale German preset labels on English locale. ### Security - Backup pointer + key publish failures can no longer be silently stamped as success: if zero relays accept, the backup explicitly fails with a retryable error, the local *previousBlobSha256* stays unchanged, and the previous blob is **not** deleted — so a transient relay outage can never leave you with a backup pointer that no relay holds. - Backup ciphertext upload now sends BUD-06 headers (`X-SHA-256`, `X-Content-Length`, `X-Content-Type`) — content-addressed identity is asserted at every Blossom server, not just at our end. - Per-relay outcomes (success / OK-false-with-reason / timeout / connection-failure) are now logged separately so a 1-of-3-acked outcome has a per-relay explanation in `logcat` instead of looking identical to a real 2/3 failure. - D-tag derivation is serialized — concurrent first-time derivers can no longer fan out into two Amber approval prompts for what's documented as "at most once per identifier+install". - Identity switch (key import, switch-to-Amber, switch-to-local) now cancels any in-flight backup worker before swapping the signer, so a periodic run can never finish under the old identity and write into the new identity's data store. - Forgejo CI now runs the unit-test suite before every release build — a regression in `BackupPointer.validateOrThrow`, the NIP-65 relay-cap, or the key-import format detection hard-stops the release. ### Notes - After restoring a backup on a new device, you need to log in to your Kilter account once more in Settings. Kilter tokens are intentionally not part of the backup so a leaked Nostr key can't also hand over your Kilter account. - The keep-screen-on toggle is now under *Anzeige* in Settings, not *Board-Einstellungen* — the behavior didn't change, only its location. - Fresh-install users with no `Kind 10063` Blossom server list now have two working defaults (`blossom.primal.net` + `nostr.download`) instead of the previous primal-only effective coverage. Encrypted backups land on both.
  • Apr 22, 2026 0.1.2
    ### Added - In-app auto-updater — checks for new versions and walks you through install (automatically turned off when you installed CruxCoach through Zapstore, which handles updates itself) - Notification reliability setup — guides you through Android's battery and autostart settings so messages from the developer and sync updates arrive reliably even after the app has been closed for a while - App-share QR code in Settings — let nearby climbers scan a QR code to download the app ### Changed - Receiving a board database from another climber's sharing hotspot now asks for confirmation and shows the source before importing, so you can't accidentally replace your climbs - Board database updates no longer briefly freeze the app while they finish ### Fixed
    More…
    - Kilter sync could mark the wrong ascents as synced when you logged several climbs in quick succession - Nostr sync could forget recently-synced messages under heavy network activity - Outgoing Nostr messages could stay stuck as "pending" after the network connection dropped - More stable Bluetooth connection to the Kilter Board during long climbing sessions - Board database import on older devices occasionally failed with a "database is locked" error - Board browser could become slow after a board database update was interrupted — the speed-up indexes now repair themselves automatically on app start - The version number shown in Settings is now always correct - Hold heatmap on the board image is now clearly visible again, and the personal heatmap correctly shows your climbs - Activity matrix in the logbook statistics is scrollable again - Heatmap section moved to the bottom of the statistics sheet so primary stats are visible first - Default foot-hold LED color now shows a readable name ("Mint Green") instead of "Custom" - Auto-updater signature check is more robust across Android versions - Auto-updater no longer gets blocked for 24 hours after a transient network error - Local app-share hotspot now waits until its IP address is bound before reporting "ready" ### Security - Downloaded board databases are now cryptographically verified and size-limited — a malicious server can't feed you tampered or oversized data - Importing a backup file now rejects tampered or malformed data before it can corrupt your personal database - Import links (`cruxcoach://import-board-db`) only work when they point to a device on your local network — they can't be abused by a website - The local app-share mini-server only listens while you're actively sharing; no open ports at other times - Notifications can only open a fixed list of app screens — other apps can't use fake notifications to slip you into sensitive areas - Encrypted direct messages are only processed when they come from the developer account — strangers can't spoof bug-report responses - Disconnecting your Kilter account now also logs you out on Kilter's server, and your Kilter login token is excluded from Android's system backups - Lightning addresses in Nostr profiles are only trusted after signature verification — can't be spoofed by a relay - The screen for entering your Nostr private key (nsec) now blocks screenshots and screen recording - The password for local sharing hotspots now uses a cryptographically strong random source - Build tooling is now cryptographically pinned to prevent supply-chain tampering during builds - The update-download confirmation prompt only opens when there actually is a pending update — other apps on your phone can no longer trick CruxCoach into showing fake update dialogs
  • Apr 16, 2026 0.1.1
    ### Added - Move count for boulders, frame count for routes in browse and detail views - Detect already-imported board database during onboarding (skips download) - VPN and mobile data warning on local app share screen - APK downloads on Codeberg releases page ### Fixed - Local app share — receiving device can now import the shared climb database - Progress bar stuck at 0% during initial board data import - Download progress jumping back and forth in status banner
    More…
    - Import crashes on older devices with large databases - Splash logo not visible in light mode ### Changed - Consistent "Kilter Board" branding in README and Zapstore listing
  • Apr 14, 2026 0.1.0
    ### Added - Browse 85,000+ climbs with filters for grade, angle, quality, moves, and setter - BLE board control — light up holds on your Kilter Board - Custom LED colors for start, hand, foot, and top holds - Log ascents with grade opinions, attempts, and notes - Kilter logbook import from your Kilter account - Hold Search — tap holds on the board to find climbs that use them - Heatmap — visualize hold popularity by type, sends, or all climbs - Climb lists — favorites, projects, custom lists - Nearby Sharing — share climbs with nearby CruxCoach users over Bluetooth
    More…
    - Session and rest timer with auto-start after logging - Statistics — grade progression, difficulty trends, favorite angles - Data export/import as JSON backup - Decentralized identity via Nostr — no email, no password, no central server - All personal data encrypted locally with SQLCipher - Bug reports and feature requests via encrypted Nostr DMs