Self-Host
Run your own copy, server included.
RadioBook talks to my server for accounts and backup — you don't have to use it. Everything here is MIT licensed: the app, and the small Node server behind it. Grab the source, point the app at your own server instead of mine, and you're fully independent.
↓ Download source (radiobook-selfhost.zip)
~171 KB · app source + server source + license, no build output included
What's in it
- app-apk/ — the Android app itself (Kotlin, Room for local storage). Your radios, channels, contacts, and log always live in a local database on the phone — that part never needs any server, yours or mine
- server/ — a small Node API: real accounts and one backup slot per account. It's a snapshot backup, not live sync — see "Things worth knowing" below
- Two screens talk to public third-party services directly from the phone, no server involved either way: Band Conditions (NOAA solar data + USGS elevation, both free and keyless) and barcode/QR scanning (fully on-device)
Quick start
- Bring the server up —
cd server && docker compose up -d. Runs on 127.0.0.1:3150 by default, no config or env file needed
- Expose it however you want your phone to reach it — a reverse proxy with a real domain, a Tailscale Funnel, a Cloudflare Tunnel, or just your LAN's plain IP if you're not leaving the house with it
- Point the app at your server — edit the
BASE constant in app-apk/app/src/main/java/com/defendtomorrow/radiochannels/net/AccountApi.kt to whatever URL you landed on
- Build it —
cd app-apk, add a local.properties pointing sdk.dir at your Android SDK, then ./gradlew assembleRelease. The APK lands in app/build/outputs/apk/release/
- Install it, open it, register an account — that's the whole setup
Things worth knowing before you go public
- Backup is a snapshot, not live sync — if the same account is edited on two devices while both are offline from each other, whichever backs up last overwrites the other's copy. Fine for "my data follows me to my other phone," not meant for two people co-editing one account at once
- Login is required to use the app at all, by design — every radio, channel, contact, and log entry lives under whichever account is signed in. Sessions stay valid for a week before asking for the password again
- Accounts are private by default — the only way one account's data ever reaches another is the explicit "Share via QR code" action, triggered on purpose
- If you're running this for people who aren't you, think about what you want to tell them about data retention —
server/api/data.json holds everyone's password hashes (scrypt, salted — never plaintext) and their latest backup blob
Questions, or hit a snag? Get in touch.