Winnow

Early access · open source · iPhone

Advanced wallet journeys

Turn on Advanced mode for explicit vault policies, signing exchanges, fee controls and replacement, and peer controls.

Your wallet connects directly to the Bitcoin network. Your private keys stay on your phone unless you choose to export them.

Combine your phone with another signer

Use 2-of-2 MuSig2 so your phone and a separate key must both approve every payment. You can also use a MuSig2 group as one cosigner in a larger threshold vault.

Winnow: Combine your phone with another signer.

Bitcoin Core 31.1 is the tested second signer. A hardware wallet needs its own compatibility test. Keep the wallet backup file, the phone’s recovery words, and a separate backup of the other signer’s key. Every key is required.

Read the guide

How we test: Combine your phone with another signer

  1. Set up an account with one key on the phone and another generated by Bitcoin Core.
  2. Receive test funds and save a backup that includes the account.
  3. Use Send to review the account, address, amount, and fee, then continue directly to the second-signer screen.
  4. Leave a signing exchange, then start again with fresh signing data.
  5. Review and approve on the phone, exchange replies with Core, and confirm a payment with one on-chain signature.
  6. Restore the earlier backup with the recovery words and check that it finds the payment and the remaining balance.
  7. In a separate flow, approve on the phone and share the raw request with a MuSig2 group acting as one signer. Import the group’s reply through Approve a request, then send.

Test code: test16MuSig2RequiresSecondDevice, test13GroupCosignerVault . View test results.

The ordered tests use the app on a private Bitcoin test network. Screenshots show test funds. Open a test run to see which version was checked, what passed, and what failed.

Read the logs and screenshots · What still needs testing

Inspect and import signing policies

Create a Taproot vault from public signer keys and coordinate approvals using PSBT text. Inspect the policy and reviewed transaction explicitly.

Winnow: Inspect and import signing policies.

Read the guide

How we test: Inspect and import signing policies

  1. Create a vault through the advanced form.
  2. Import an approval request, review it, and contribute the device’s signature.

Test code: test04VaultCreate, test07ApproveRequest . View test results.

The ordered tests use the app on a private Bitcoin test network. Screenshots show test funds. Open a test run to see which version was checked, what passed, and what failed.

Read the logs and screenshots · What still needs testing

Replace a pending payment with a higher fee

Review a replacement’s fee and change before authorizing it. The original remains visible as replaced.

How we test: Replace a pending payment with a higher fee

  1. Disconnect the test node before sending. Reopen the app, find the pending payment, then reconnect and check that the same payment reaches the node.
  2. Use Bump fee, review and sign the replacement, then confirm it and inspect the app’s history.

Test code: test15ReviewAndReplacePendingPayment . View test results.

The ordered tests use the app on a private Bitcoin test network. Screenshots show test funds. Open a test run to see which version was checked, what passed, and what failed.

Read the logs and screenshots · What still needs testing

Inspect peers and control external disclosure

Inspect connected peers and network settings. Explorer links open only after an explicit warning about the information sent to that website.

Winnow: Inspect peers and control external disclosure.

Explorer websites are not wallet backends. A single or coordinated set of peers can still withhold information; multiple connections are not proof of independent operators.

How we test: Inspect peers and control external disclosure

  1. Open the real peer settings.
  2. Open an explorer warning and cancel before leaving the app.
  3. Reset and shuffle the remembered peers, and watch fresh connections arrive.

Test code: test05SettingsPeersAndExplorerWarning, test19ResetAndShufflePeers . View test results.

The ordered tests use the app on a private Bitcoin test network. Screenshots show test funds. Open a test run to see which version was checked, what passed, and what failed.

Read the logs and screenshots · What still needs testing

Refresh the peer list

Download dated candidates from Winnow’s census without interrupting active peers. Reset and shuffle peers is a separate action.

Winnow: Refresh the peer list.

Downloads expire after seven days, then automatic selection falls back to bundled candidates. Bundled and downloaded census entries count as the same trust source. Every selected peer still undergoes normal wallet checks.

How we test: Refresh the peer list

  1. Choose Refresh peer list in Advanced settings, then read the observation date and candidate counts.
  2. Keep your active connections while the new list becomes available for future connections.
  3. If a refresh fails, keep using the previous valid list. Reset and shuffle remains a separate choice.

Test code: test20PeerCatalogRefreshAndFailureRecovery . View test results.

The ordered tests use the app on a private Bitcoin test network. Screenshots show test funds. Open a test run to see which version was checked, what passed, and what failed.

Read the logs and screenshots · What still needs testing

How we test Winnow

Local debugging tools

Use winnow-debug for environment checks, simulator diagnostics, release-data generation, and network soak runs. These are operator tools, with their own command and protocol checks.

Debugging commands and their limits