Open-source Kilter Board climbing app for Android.
Browse climbs, control your Kilter Board 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
- BLE board control β light up holds on your Kilter Board
- Climb lists β favorites, projects, custom lists
- Log ascents with grade opinions, attempts, and notes
- Hold Search β tap holds on the Kilter Board to find climbs that use them
- Heatmap β visualize hold popularity by type, sends, or all climbs
- 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).
Primarily tested on the 12x12 Original layout. Other sizes 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.



