winnow

The wallet on your phone

Your phone matches payments locally, keeps its keys in the device keychain, and connects to Bitcoin peers, directly or through your own Tor and I2P gateways, while the app is open and in short background checks iOS allows.

What this means for you

Unexpected payments may appear on the next sync. Fees are estimates, and a backup restores signing only when it holds this phone’s words, which the iCloud copy always does; see what a backup cannot restore. Direct connections expose your IP address to peers; your own Tor or I2P gateways can carry peer connections instead. The read guide, payment guide and recovery guide explain these tradeoffs.

2. What a phone actually is

Constraints that are load-bearing, not stylistic:

Bandwidth and battery are real but secondary. Steady-state compact filters are a few megabytes a day (approx.; see read-side §2.5). The worse mobile cost is policy: an always-on mempool subscription, a historical back-scan, or a server that answers getbalance. Those are refused even when the radio would allow them.


3. The four jobs, and two more

Job Default on this phone Paper
What’s mine? BIP157/158 filters, matched on-device, from creation height forward read-side
Where’s the tip? 80-byte headers, PoW + chainwork read-side
What fee? User override, else median of our confirmed spends, else presets; clamped by BIP133 feefilter write-side
Did my tx get out? inv → getdata → tx to the peer pool, rebroadcast until a filter match, echo-watch while Send is open write-side
Who holds the keys? This-device Keychain; Taproot key-path for the everyday wallet this paper, write-side
Shared custody? MuSig2 n-of-n or multi_a k-of-n, coordinated by PSBTv2, no server vaults
Moving a wallet in? A history bundle. There is no back-scan. import

One user-controlled escape hatch crosses several rows: a selected external explorer website. Opening an exact address or transaction requires a warning; its response never becomes wallet state.


4. What the device forces onto the wallet

4.1 Fresh, and forward-only

A new wallet and its recovery phrase are created immediately, offline. Header synchronization and automatic backup continue after onboarding; the wallet starts scanning from the last already-validated height so the interval cannot be missed. Recovering an old wallet privately from the chain would mean gigabytes of historical filters on a radio the user pays for. The product does not do that. Import requires the previous wallet’s answers to come along — descriptor, UTXOs, history, a last-known height — and the phone verifies them by scanning forward from that height. The argument and the bundle format are import.

This is the constraint that makes the rest cheap. It is not a v1 shortcut.

4.2 Taproot only

Receiving is BIP86 P2TR. There is no legacy / nested-segwit / P2WPKH path, and no ECDSA signing path. One output type means one watch-list shape, one sighash, one witness size for fee math (66 bytes for a key-path spend), and no “which address type did this contact use?” branch in the UI. The proposed P2WSH Safe is a deliberately scoped exception: an opt-in wsh(pk(KEY)) store with its own hardened keys, its own watch list and an ECDSA/BIP143 signing path, added beside the Taproot account rather than in place of it. Nothing about the account described here changes; see the Safe’s design and release criteria.

The phone can pay standard P2PKH, P2SH, P2WPKH, P2WSH and P2TR addresses. Recovery supports descriptor-derived coins; wallet files requiring unsupported signing data are refused. Keep the original wallet and backup for any unsupported coin types. See import and recovery.

4.3 Two modern multisig flavors, same read path

A vault is another descriptor and another watch list. The phone does not run a coordinator, a coinjoin server, or a notification service for cosigners. The PSBT is the coordinator; AirDrop, a file, a message are the transport. Vaults.

4.4 Mainnet by default, signet for testing

The app opens on mainnet by default; signet is available in Advanced settings with its own wallet state. The focused UI integration test and its continuous video use a disposable signet fixture. The numbers in screenshots/timings.json are historical signet measurements.


5. Trust on a phone

What the user is asked to trust, stated as mechanisms rather than intentions:

What the user is not asked to trust: an indexer operator’s retention policy or a push-notification vendor. Optional iCloud recovery adds trust in the Apple Account and iCloud Keychain recovery path. The app target enforces device authentication and the persistent backup preference. Wallet, protocol, and crypto logic are forbidden from moving into WinnowApp.


6. Deliberate absences

These are product decisions, not missing tickets:

The focused guides explain the consequences: delayed payment discovery, coarser fees, a required history backup, and transaction disclosure to relay peers.


7. How the implementation is checked

The validation appendix of the read side covers the stack. The focused signet UI integration test drives ordinary, MuSig2, and script-path 2-of-3 receive/send flows through the real binary while the host records a continuous video. The fixture provides Core cosigners and mines confirmation blocks automatically. Detailed behavior and import rules have focused app, wallet, and protocol tests. Guide illustrations and screenshots/timings.json retain their historical provenance; they are not current-run evidence.

CI combines package tests, app unit tests and the recorded iPhone journey. Website-only changes may reuse successful media when the app and test inputs match; the recording retains its original provenance.


8. Status

The app defaults to mainnet and also supports signet. Current signing choices are ordinary Taproot, MuSig2 and script-path threshold accounts. Planned features remain on the roadmap.