# Android app

The joinstr app for Android is written in Kotlin Multiplatform. It uses a Bitcoin Core node you run yourself for coins, signing, fee estimates and broadcast. It ships its own Tor.

![joinstr Android app screens](../assets/img/android.webp)

| | |
|---|---|
| Latest version | 0.3.0, released 2026-09-22 |
| Requires | Android 7.0 or newer, a Bitcoin Core node reachable from the phone |
| Networks | Mainnet, testnet4, signet, regtest (follows the node) |
| Transport | Tor (built in) or VPN |
| Source | [gitlab.com/invincible-privacy/joinstr-kmp](https://gitlab.com/invincible-privacy/joinstr-kmp) |

## Download and verify

Download from the [releases page](https://gitlab.com/invincible-privacy/joinstr-kmp/-/releases).

- [`Joinstr_v0.3.0_release.apk`](https://gitlab.com/invincible-privacy/joinstr-kmp/-/raw/v0.3.0/releases/Joinstr_v0.3.0_release.apk)
- [`Joinstr_v0.3.0_release.apk.asc`](https://gitlab.com/invincible-privacy/joinstr-kmp/-/raw/v0.3.0/releases/Joinstr_v0.3.0_release.apk.asc)
- [`SHA256SUMS_v0.3.0`](https://gitlab.com/invincible-privacy/joinstr-kmp/-/raw/v0.3.0/releases/SHA256SUMS_v0.3.0) and its [`.asc`](https://gitlab.com/invincible-privacy/joinstr-kmp/-/raw/v0.3.0/releases/SHA256SUMS_v0.3.0.asc)

Verify the files before installing.

```sh
gpg --keyserver hkps://keys.openpgp.org --recv-keys 9253062A4F92D63459085CA62D230520212A5901
gpg --verify Joinstr_v0.3.0_release.apk.asc Joinstr_v0.3.0_release.apk
sha256sum -c SHA256SUMS_v0.3.0
```

The APK is signed with a certificate whose SHA-256 fingerprint is the following. Tools such as `apksigner verify --print-certs` or AppVerifier show it.

```
9F:D6:8F:FB:5E:B3:2F:D6:FC:2B:5D:FB:C9:7B:23:46:C7:54:C4:62:6F:9F:44:41:19:7B:D5:73:AB:16:18:E8
```

Releases before 0.2.0 used a different certificate. If you have 0.1.x installed, uninstall it before installing 0.3.0.

## Prepare your node

The app talks to Bitcoin Core over RPC, usually on your home network. Let the node accept RPC from the phone's network and give it a user name and password. The example below is for a node at `192.168.1.10` in a `192.168.1.0/24` network.

```ini
server=1
rpcbind=127.0.0.1
rpcbind=192.168.1.10
rpcallowip=127.0.0.1
rpcallowip=192.168.1.0/24
rpcuser=<user>
rpcpassword=<a long random password>
```

Add `signet=1` or `testnet4=1` to use a test network. Then put the RPC settings under the matching `[signet]` or `[testnet4]` section. Only allow RPC from networks you trust. RPC traffic is not encrypted.

The node needs a wallet holding the coin you want to mix.

## Set up the app

1. Open **Settings**.
2. Enter a **Nostr Relay** such as `wss://nos.lol`.
3. Enter the **Node URL** (for example `http://192.168.1.10`), **RPC Port**, **RPC Username** and **RPC Password**.
4. Pick the **Wallet** to use and tap **Save**.
5. On the home screen, check that the node version and network are shown.

The app starts Tor by itself and shows **Connected to Tor** once it is ready.

## Make a coinjoin

1. Prepare a coin in the node's wallet worth the denomination plus 500 to 5000 sats.
2. Open **Pools**. Either create a pool on **Create New Pool** with a denomination and number of peers, or open **View Other Pools** and tap **Join** on an existing one.
3. When all outputs are registered, pick your coin on the input registration screen and tap **Register**. Your node signs it with `SIGHASH_ALL|ANYONECANPAY`.
4. The **Coinjoin Timeline** shows each step. When every peer has signed, the app checks and broadcasts the transaction through your node.
5. Finished coinjoins appear under **History**.

Before signing, the app refuses rounds that would cost more than 15000 sats, outputs below the dust limit and registrations that could be broadcast on their own. It only accepts pool credentials from the creator of the pool you joined.

## Notes

- Pools that require an aut-ct proof show why they cannot be joined. aut-ct works in the desktop build only.
- Pool messages go to the relay the pool names, not the one in **Settings**.
- iOS and desktop builds can be made from source. Only Android has signed releases.
