Open-source Kilter Board & MoonBoard climbing app for Android.
Browse climbs, control your Kilter Board or MoonBoard via Bluetooth, log ascents, import your Kilter logbook, and track your progress β no third-party cloud services, full control over your data.
Zapstore auto-updates, Nostr-native, verifiable builds Β·
APK release ships with a .apk.sha256 sidecar Β·
Source build reproducible from main
First-time sideload from Codeberg? Android Settings β Apps β Special app access β Install unknown apps β enable for your browser or file manager. The signing certificate is stable across releases, so future updates install on top without re-enabling.
Custom LED Colors β Choose your own hold colors on the Kilter Board. Different colors for start, hand, foot, and top holds. Visible to everyone around you.
Nearby Sharing β Share your current climb with nearby CruxCoach users over Bluetooth. No internet needed, works instantly at the Kilter Board.
Your Data, Your Device β All personal data encrypted locally. Decentralized identity via Nostr β no email, no password, no central server. No cloud accounts, no telemetry, no ads.
- 85,000+ climbs with filters for grade, angle, quality, moves, and setter β plus a combinable status filter (Neu / Versucht / Geschafft), an ungraded-only (projects) mode, ignore unwanted climbs so they stop being suggested, and a board-fit filter scoped to your board's mounted hold sets
- Variable climb angle (0.2.0+) β pick the angle to browse, send, or log a climb at across every angle the board physically supports, not only the angles that already have community stats; the original setter's angle is shown as info
- MoonBoard support (0.2.0+) β browse the MoonBoard problem catalogue (MoonBoard 2016, Masters 2017, Masters 2019, Mini 2020, and MoonBoard 2024) with the same filters as Kilter, and send problems to your board over Bluetooth; pick your MoonBoard in onboarding or Settings alongside the Kilter variants
- More boards (0.2.0+) β Tension, Grasshopper, Decoy, So iLL and Touchstone work like Kilter: browse the catalogue, render climbs, read the hold heatmap, send to the board over Bluetooth, and set your own climbs. Pick one in Settings
- Board-Locations Map (0.2.0+) β interactive world map of every known Kilter and MoonBoard installation, with filters for board brand, layout, country, public-vs-private, adjustability and size; tap a marker for contact details and a direct link into the climbs that fit that exact board
- Find-your-gym board picker (0.2.0+) β set the right board configuration in Settings by searching for your gym, no product-size codes to memorise; always-on board-fit filter then narrows the catalog to climbs your board can actually do
- BLE board control β light up holds on your Kilter Board or MoonBoard
- Climb lists β favorites, projects, custom lists
- Log ascents with grade opinions, attempts, and notes
- History (Verlauf) (0.2.0+) β the climbs you sent to the board, recorded automatically when you push one over Bluetooth; each entry shows which board it was sent on, mirrored sends are flagged, and you can multi-select and delete entries
- Hold Search β tap holds on the Kilter Board to find climbs that use them
- Heatmap β visualize hold popularity by type, sends, or all climbs, with a per-board selector to read the hold heatmap for each board you have logged on
- Kilter logbook import from your Kilter account
- Statistics β grade progression, difficulty trends, favorite angles
- Data export/import as JSON backup
- Encrypted cloud backup (0.1.3+, opt-in) β your climbing data encrypted on-device, mirrored across the open Nostr network and Blossom storage servers. The maintainer cannot decrypt it; only your CruxCoach Account key can. Survives app uninstall + device transfer.
- App-share QR code β share CruxCoach with nearby climbers by QR
- Reliable notifications β guided setup for Android battery and autostart restrictions so dev-DMs and sync updates always arrive
- In-app auto-updater β verifiable APK updates with TOFU certificate pinning (auto-disabled on Zapstore installs)
- In-app developer contact via encrypted Nostr DMs
| Channel | When to pick it | Trade-off |
|---|---|---|
| Zapstore | You already use Zapstore, want hands-off auto-updates and Nostr-native verifiable builds | Requires the Zapstore client app installed |
| Codeberg release APK | You want a direct sideload, no app-store dependency, full SHA-256 transparency | Manual install + updates (or opt into the in-app updater under Settings β Updates) |
| Source build | You want to read / patch the code first | Requires Android SDK + NDK and a few minutes |
Each Codeberg release ships an *.apk.sha256 sidecar next to the APK asset. After downloading both into the same folder:
sha256sum -c CruxCoach-v*.apk.sha256Expected output: CruxCoach-v0.1.x.apk: OK. The signing certificate is the same across every release β Android refuses installs from a different cert, which is your second integrity check on top of the SHA-256.
- Zapstore: handled by the Zapstore client.
- Codeberg APK + in-app updater: open Settings β Updates β Check for updates. The updater pulls the next release's APK + SHA-256 from Codeberg and installs over the current build (signature must match β same certificate as the original install).
- Source build:
git pull && ./gradlew :androidApp:assembleRelease.
git clone https://codeberg.org/CruxCoach/CruxCoach.git
cd CruxCoach
bash scripts/setup_dev_env.sh # installs JDK 17, Android SDK, NDK, CMake (Debian/Ubuntu)
source ~/.bashrc # or ~/.zshrc
./gradlew :androidApp:assembleDebugThe APK is at androidApp/build/outputs/apk/debug/androidApp-debug.apk.
For signing, testing, and full setup details see CONTRIBUTING.md.
| Layer | Technology |
|---|---|
| Language | Kotlin (shared + Android) |
| UI | Jetpack Compose + Material 3 |
| Database | SQLDelight (board data) + SQLCipher (personal data) |
| DI | Hilt |
| Async | kotlinx-coroutines |
| Serialization | kotlinx-serialization |
| Navigation | Jetpack Navigation Compose |
| BLE | Android BLE API (Nordic UART Service) |
| Nostr | Quartz (Vitor Pamplona) |
| Background | WorkManager |
Domain logic lives in a shared Kotlin Multiplatform module (~60β70% of code). See CONTRIBUTING.md for the full project structure.
Currently supported:
- Kilter Board β all sizes and angles (catalogue, BLE send, logbook, climb authoring).
- MoonBoard β 2016, Masters 2017, Masters 2019, Mini 2020, and 2024 (catalogue, BLE send, CruxCoach-community climb authoring). The 2024 set carries BoardSesh-community problems only for now β no official catalogue yet.
- Tension, Grasshopper, Decoy, So iLL, Touchstone β catalogue browse, render, hold heatmap, BLE send, and CruxCoach-community climb authoring (these share the Aurora protocol with Kilter).
Primarily tested on the Kilter 12x12 Original layout and MoonBoard 2016. Other sizes/variants should work but are less tested β feedback welcome!
See LEGAL.md for our position on interoperability and data usage.
Board database β community-created content distributed via Nostr Blossom. Content-addressed and verifiable by any client. See LEGAL.md.
Personal data β stored locally in an encrypted SQLCipher database. Encryption keys live in the Android Keystore and never leave the device.
Optional cloud backup (off by default) β when you turn it on, your data is encrypted on the device with a key derived from your Nostr identity, then mirrored across the open Nostr network and Blossom storage servers. No single provider holds a usable copy. Saving your CruxCoach Account key once is what makes the backup recoverable on any other device β see SECURITY.md for the full threat model.
Your identity β a Nostr key pair. No central server can lock you out. The same key pair that is your CruxCoach Account encrypts your cloud backup, so saving it once protects both.
We welcome contributions! See CONTRIBUTING.md for bug reporting, dev setup, coding standards, and PR guidelines.
For the active feature roadmap and per-release specifications, see docs/specs/.
Found a vulnerability? See SECURITY.md for responsible disclosure.
CruxCoach is not affiliated with Kilter, LLC or Aurora Climbing. See LEGAL.md.
-
Bug Reports: Codeberg Issues or in-app via Settings
-
Donate (upstream maintainer): Lightning
cruxcoach@npub.cash
Forks: this address routes to the upstream maintainer. Replace it via
local.propertiesbefore publishing your build β see CONTRIBUTING.md β Customizing for forks.
- Code: GNU General Public License v3.0 β Copyright (C) 2025-2026 CruxCoach Contributors.
- Name + logo: Reserved β see TRADEMARK.md. Forks distributing modified binaries to a wide audience must rename and replace the launcher icon.
- Bundled & vendored third-party components: see THIRD_PARTY_LICENSES.md and NOTICE.



