Trustless Bitcoin UTXO ownership transfer. Two wallets swap equal-amount coins through adaptor-signature atomic settlement — no operator, no coordinator, no custody, ever.
A desktop, peer-to-peer protocol wallet. This site is an information and distribution channel only: downloads, checksums, signed parameter manifests, and the tester guide. Nothing key-touching runs here, and there is no web wallet.
SwitchBitcoin settles a two-party coin swap with a novel composition of well-understood primitives: MuSig2 (BIP 327) Taproot escrows, adaptor-signature atomic settlement, ordered refund timelocks, and baked-in fees — composed so that a funded swap always has exactly two exits: it completes, or it refunds. There is no third state, and no party who can hold your coins.
skt1… rendezvous ticket over any channel you like and connect
directly — that path publishes nothing, anywhere. Or find a stranger through
public Nostr relays over Tor (testnet):
relays carry only anonymous encrypted noise; the swap itself never touches a
relay. Either way there is no operator who can front-run, censor, or fail,
and nothing in the settlement path but the two wallets.Protocol lineage: v3.16 specification, unchanged (current spec document: v18). Pinned, audited cryptography only — MuSig2, adaptor signatures, and nonces come from libsecp256k1 bindings; nothing curve-related is hand-rolled.
A swap needs two people. If you already know your counterparty, you hand them a ticket and you're done. If you don't, you have to find one — without a company in the middle doing the matching. Here is how that works, in plain terms.
One line of text, skt1…. It says where to call and proves you
reached the right person. Give it to a partner however you like — it is the
whole handshake.
To be found by a stranger, your wallet pins a sealed note to several public boards: "someone would like to swap this size." No name on it, a fresh single-use key signs each one, and it is posted through Tor.
When someone answers your note, the two wallets meet on a one-shot onion address created for that rendezvous and nothing else. Neither side learns the other's IP, and the boards never learn the address.
The part worth being precise about: the relays only ever carry the "want to meet?" notes. Everything after that — the negotiation, the escrows, the settlement — runs directly between the two wallets over Tor, through the same code the hand-delivered path uses. No transaction id, no escrow, no ticket, and no onion address is ever published to a relay; that one is enforced by a test that inspects every relay-bound byte of a complete swap.
If you already have a partner, trading a ticket directly publishes nothing,
anywhere — no note on any board, no proof-of-work, no public infrastructure
touched at all. That remains the lowest-metadata way to use SwitchBitcoin, it is
supported forever, and discovery is an addition to it, never a replacement.
swap --make-onion gives you the Tor rendezvous with a hand-delivered
ticket: no relays, no IP.
Mainnet is structurally impossible in this build — no configuration reaches it. That stays true until the external cryptographer review clears. Treat every coin this software touches as expendable test money.
A safety pre-commitment fix is deliberately deferred to the cryptographer review. Until it clears, convention-mismatched attempts refuse and close through the refund path — funds come back automatically at the timelock. A refunded swap is the safety system working.
This is a novel composition, and novel compositions are where sound primitives are most often assembled unsoundly. The scoped external cryptographer review is the gate to everything beyond testnet — it is not substitutable by internal analysis, and its packet is ready and waiting.
Tor transport and discovery have since been built and run live (2026-07-27). Still open and still named: corpus fuzzing under sanitizers (host limitation; a seven-surface hostile-input sweep ran interim), third-party watchtower delegation, enclave custody, and the public relay population that keeps discovery from starting unaided. None quietly dropped.
The settlement core is implemented in full as a Rust crate — 608 automated tests green in the default configuration, 657 with the Bitcoin Core backend, lint-clean in both — and the claims below are backed by on-chain evidence recorded in the repository's artifact log:
MuSig2 / BIP 327 Tor rendezvous Nostr discovery (testnet) Taproot escrows Adaptor signatures TRUC / v3 + P2A anchors CPFP congestion backstop Signed-manifest governance
Pre-alpha tester package — 0.1.0 (git ce0644555, patch "-f"), Windows x86_64:
switchbitcoin-prealpha-0.1.0-ce0644555-windows-gnu.zip (~8.6 MB) ·
served directly from this site.
New in "-f": a maker's reply could silently fail to reach some relays — our
WebSocket client could not read a message a relay chose to split across frames, and
one such delivery broke that connection for good. Offers went out on fresh
connections; replies, published later on the same connection, sometimes never did.
Fixed and verified live on the relay that splits: 60 publishes, 60 acknowledgements.
Every publish outcome now names the relay it talked to and repeats what that relay
said back. Also new: the ~half of swap attempts that refuse and refund by
design now say so in plain words — the refusal names the guard, says EXPECTED
and NOT a bug, and confirms nothing was signed or released, while a real settlement
failure prints a different message that says it IS worth reporting. The tester
guide's refund window is corrected (30–45 hours; it was understated).
Carried over: discovery — your wallet can find a counterparty on public
Nostr relays over Tor (testnet, and read guide §6 first: it needs a Tor binary you
fetch and verify yourself, and it deliberately refuses to start until you add a third
relay) — plus the "-e" live-drill fixes (a no-show taker charges the anti-griefing
cooldown instead of ending the maker's whole session, and the quorum-short message
now says what actually happens).
It ships the two binaries (switchbitcoin-cli,
switchbitcoin-manifest), the tester guide, the bug-report template, the
current signed manifest, the local HTML wallet UI, and SHA256SUMS — built
by a release script that refuses to package any binary failing the full test gates or
carrying a test trust root (this cut: 608 green default, 657 with the Bitcoin Core
backend, lint-clean in both).
Source code:
github.com/abysal32-arch/switchbitcoin
(MIT) — temporarily unavailable while our hosting migrates; the link 404s
today. The public-source promise stands, and the repository returns when the
migration completes, carrying tag v0.1.0-prealpha-f =
ce0644555… so the hash chain can be checked against it. Until then,
switchbitcoin-cli version embeds the git commit the binary was built
from (current release ce0644555), cross-checkable against this page
and the package's per-file SHA256SUMS.
Zip SHA256 (verify before extracting):
Pre-alpha testers are hand-picked. Verify the zip hash and the
per-file SHA256SUMS before running anything, and check
switchbitcoin-cli version prints the pinned trust root below.
Every wallet build pins this BIP340 x-only public key at compile time. Signed
parameter manifests that do not verify against it are refused. Cross-check the key
your binary prints (switchbitcoin-cli version) against this page:
This is the SECOND operator key (generated 2026-07-16). The first
(fbb01df4…a2191e) was retired via the documented key-loss rotation;
manifests it signed no longer verify — by design.
Settlement parameters are distributed as signed constants — never wallet settings.
Each manifest is a 169-byte BIP340-signed envelope with a strictly-increasing version;
wallets refuse replays, downgrades, and anything the pinned key didn't sign. Everyone
in a test round runs the same version; ingest with
switchbitcoin-cli manifest ingest <file>.
| Version | Files | Status |
|---|---|---|
| v3 (current) | v3.manifest · v3-params.toml (readable source) | Signed 2026-07-20 by the current operator key. Id
e962918a44f7dd644985725e035675ba7f6d2db1e42c0e7066d5b3449ece0400.
Sole change vs v2: swap tier 0.01 → 0.001 tBTC (test tier for the
live testnet4 round — units fundable from ordinary faucet drips; the
production 0.01 tier returns as a future v4). |
| v2 (history) | v2.manifest · v2-params.toml | Signed 2026-07-16 by the current operator key. Id
cdda51a9…b011300e. Sole change vs v1: onboarding delay
1–2 h (testing period; the production-scale 24–72 h returns in the
first post-testing round). Tier superseded by v3 for the testing round. |
| v1 (history) | v1.manifest · v1-params.toml | Signed by the RETIRED first key — no longer verifies, kept as the governance-history record of the 2026-07-16 rotation. |
Even a compromised operator key cannot push parameters that violate the wallet-side ordering invariant — bounds are asserted signature-blind on every compose, ingest, and load.
Start with the Tester Guide — it takes you from nothing to a completed swap (own Bitcoin Core node required; there is deliberately no hosted RPC option) and keys every troubleshooting entry to the exact strings the wallet prints.
Bugs: run switchbitcoin-cli diag (redacted by construction — no seed,
mnemonic, passphrase, or RPC secrets), fill in the bug-report template shipped in the
package, and send it through the channel you were onboarded with. Pre-alpha testers
are hand-picked; there is no public tracker yet.