# joinstr

joinstr is a coinjoin implementation for bitcoin that uses [nostr](https://github.com/nostr-protocol/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.

<div class="grid cards" markdown>

-   :material-rocket-launch: **[Quickstart](getting-started/quickstart.md)**

    Pick a client and make your first coinjoin.

-   :material-cog-outline: **[How it works](how-it-works/index.md)**

    Pools, rounds, signatures and what each peer checks.

-   :material-file-document-outline: **[Protocol](protocol/index.md)**

    Event kinds, message formats and validation rules.

-   :material-robot-outline: **[For LLMs and agents](llms.md)**

    `llms.txt`, markdown sources and a compact brief.

</div>

## Clients

| Client | Platform | Wallet backend | Latest release |
|---|---|---|---|
| [Electrum plugin](clients/electrum.md) | Linux, macOS, Windows | Electrum server | 0.4.2 |
| [Web UI](clients/web-ui.md) | Browser, Umbrel | Bitcoin Core | Umbrel app 0.1.2 |
| [Daemon and CLI](clients/daemon-cli.md) | Any system with Python 3 | Bitcoin Core | in repository |
| [Android app](clients/android.md) | Android 7.0 or newer | Bitcoin Core | 0.3.0 |
| [Sparrow](clients/sparrow.md) | Linux, Windows | Any Sparrow server | 0.2.0 |
| [Rust and Dart library](clients/rust.md) | 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](how-it-works/sybil-resistance.md), 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](https://joinstr.xyz), the project website
- [gitlab.com/invincible-privacy](https://gitlab.com/invincible-privacy), the source code
- [forum.joinstr.xyz](https://forum.joinstr.xyz), the community forum
- [mutinynet.joinstr.xyz](https://mutinynet.joinstr.xyz), live test pools on Mutinynet
