joinstr¶
joinstr is a coinjoin implementation for bitcoin that uses nostr relays for coordination. There is no central coordinator. Anyone can create a pool and anyone can join one. Every participant checks and broadcasts the final transaction on their own.
A pool brings together a fixed number of peers who each put in one coin of about the same value and get back one output of exactly the pool denomination at a fresh address. Inputs are signed with SIGHASH_ALL|ANYONECANPAY, which lets each peer sign their own input before seeing the others and keeps coordination to a few simple steps.
joinstr started as a proof of concept in August 2022. Today it has an Electrum plugin, a web UI available in the Umbrel app store, a REST daemon with a CLI, an Android app, a Sparrow Wallet fork and a Rust library with Dart bindings.
-
Pick a client and make your first coinjoin.
-
Pools, rounds, signatures and what each peer checks.
-
Event kinds, message formats and validation rules.
-
llms.txt, markdown sources and a compact brief.
Clients¶
| Client | Platform | Wallet backend | Latest release |
|---|---|---|---|
| Electrum plugin | Linux, macOS, Windows | Electrum server | 0.4.2 |
| Web UI | Browser, Umbrel | Bitcoin Core | Umbrel app 0.1.2 |
| Daemon and CLI | Any system with Python 3 | Bitcoin Core | in repository |
| Android app | Android 7.0 or newer | Bitcoin Core | 0.3.0 |
| Sparrow | Linux, Windows | Any Sparrow server | 0.2.0 |
| Rust and Dart library | Library | Electrum server | in repository |
Key properties¶
- No coordinator. Pools are announced and run over ordinary nostr relays. A pool uses one relay, chosen by its creator.
- One denomination per pool. Every output in the coinjoin has the same value and there are no change outputs.
- Tor by default. The Electrum plugin, web UI, daemon, Android app and Sparrow send relay traffic through Tor on separate circuits, so a relay cannot link a peer's input to their output by IP address.
- Fresh keys. Each pool has its own nostr key pair and each joining peer uses a new one, so nothing ties a pool to a long lived nostr identity.
- Optional sybil resistance. The Electrum plugin and Sparrow can require peers to prove ownership of a coin in a published set with aut-ct, without revealing which coin.
- No fees to anyone but miners. Peers share the mining fee. A paid relay may charge its own fee.
Links¶
- joinstr.xyz, the project website
- gitlab.com/invincible-privacy, the source code
- forum.joinstr.xyz, the community forum
- mutinynet.joinstr.xyz, live test pools on Mutinynet