From e6035849f9b88bdd8cd665b868bbe121fa77e538 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sun, 27 Sep 2026 15:07:30 -0700 Subject: Copy: no more em dashes, anywhere people read. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every English string, the translations, the README and the messages the code shows people now break with a full stop, a colon or a comma instead. Only console logs and the "—" placeholder for an empty cell keep the dash. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D --- README.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 57f96f9..25940e2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # coinos v3 A self-contained, **single-file** Bitcoin wallet that runs entirely in the -browser — think bitaddress.org, but a modern BIP84 HD wallet from a seed phrase +browser. Think bitaddress.org, but a modern BIP84 HD wallet from a seed phrase that scans history, watches for payments, spends on-chain, pays Lightning invoices, and holds an off-chain balance on **Ark**. The whole wallet is one static `index.html` you can save and run offline, forever. @@ -16,14 +16,14 @@ from the filesystem with no server). - **BIP84 / native SegWit (p2wpkh)** HD wallet from a 12-word BIP39 seed (imports any valid BIP39 phrase; optional passphrase). -- **Per-wallet networks** — each wallet is stamped with its network (mainnet, +- **Per-wallet networks**: each wallet is stamped with its network (mainnet, testnet, signet, mutinynet, regtest); switching wallets switches networks, and wallets on different networks coexist in one session. -- **One fresh address at a time** — a new receive address is only handed out +- **One fresh address at a time**: a new receive address is only handed out after the current one is paid, so used addresses stay contiguous and scans stay tiny (no 20-address gap probing). -- **Choose your data source** — Electrum-over-WebSocket servers or Esplora - REST explorers, per network, with silent failover — or point it at your own +- **Choose your data source**: Electrum-over-WebSocket servers or Esplora + REST explorers, per network, with silent failover, or point it at your own node. - **Real-time** incoming-payment push over WebSocket where the source supports it, with polling + periodic reconcile as the fallback. Replaced (RBF) @@ -31,28 +31,28 @@ from the filesystem with no server). - **Spending** with proper coin selection + fee estimation (`@scure/btc-signer`), multiple recipients, a fee-rate picker, send-max, manual coin control, and a QR scanner (address / BIP21 / signed tx). -- **Offline / air-gapped signing** — export a keyless snapshot on an online +- **Offline / air-gapped signing**: export a keyless snapshot on an online device, sign on an offline one, broadcast anywhere. - **Installable PWA**, global sats/BTC toggle, 19 languages. -### Ark — instant off-chain payments (feature: `ark`) +### Ark: instant off-chain payments (feature: `ark`) A **native-JS Ark client** (speaks gRPC-web + MuSig2 directly to -[bark/captaind](https://github.com/ark-bitcoin/bark) servers — no WASM, no new +[bark/captaind](https://github.com/ark-bitcoin/bark) servers: no WASM, no new dependencies, ~2k lines): - **Board** on-chain coins into an Ark server; **send and receive instantly** off-chain with zero mining fees; server fees shown before anything moves. - **Refresh / consolidate** vtxos (the round-based maintenance that resets expiry and chain depth). -- **Collaborative offboard** — move the whole Ark balance back to your own +- **Collaborative offboard**: move the whole Ark balance back to your own on-chain address in one server-cosigned transaction. -- **Unilateral exit** — the trustless backstop: publish the vtxo's pre-signed +- **Unilateral exit**: the trustless backstop: publish the vtxo's pre-signed transaction chain on-chain (CPFP-bumped, TRUC-aware, one confirmed hop at a time), wait out the CSV timelock, and claim with your key alone. Works even if the server is gone; live progress (hop counter, blocks-left countdown) in Settings. -- **Ark gifts** — bearer gift links whose secret *is* the link: claimed +- **Ark gifts**: bearer gift links whose secret *is* the link: claimed instantly and free, even into a brand-new empty wallet with zero on-chain footprint. Revocable until claimed. - Crash-safe by construction: every multi-step ceremony checkpoints to storage @@ -62,13 +62,13 @@ dependencies, ~2k lines): ### Lightning (feature: `swaps`) - Pay bolt11 invoices and receive over Lightning via **Boltz-compatible - submarine swaps** — non-custodial either way: a provider can fail a swap but + submarine swaps**, non-custodial either way: a provider can fail a swap but never take funds (claims/refunds are enforced on-chain). Pick a provider per network or point at your own. ### Gifts (feature: `gifts`) -- **Gift links** — presigned bearer transactions claimable by whoever opens +- **Gift links**: presigned bearer transactions claimable by whoever opens the link, straight into a fresh wallet (with seed backup flow) or an existing one. Reclaim or revoke unclaimed gifts. Optionally **lock a gift to a nostr account** (the claim code is DM'd to them; the link alone is not @@ -76,14 +76,14 @@ dependencies, ~2k lines): ### Cross-device sync (feature: `sync`) -- Optional **encrypted state sync over Nostr** — wallet state NIP-44-encrypted +- Optional **encrypted state sync over Nostr**: wallet state NIP-44-encrypted to yourself as a replaceable event, per network, on relays you choose. The nostr identity derives from the same seed (NIP-06). ## Modular builds Every feature above is a **plugin behind a build seam**. `HAL_FEATURES` -selects what ships; excluded features never enter the bundle — their code, +selects what ships; excluded features never enter the bundle: their code, their network endpoints, their crypto: ```bash @@ -95,7 +95,7 @@ bun run build:minimal # core on-chain wallet only (~320 KB) `tools/minimal-smoke.js` verifies the minimal profile is a fully working on-chain wallet with zero feature code in the bundle. Features integrate through fixed seams on the core (`registerCoinLock`, `registerInputSigner`, -cache extensions, UI hooks), so a stripped build isn't a crippled build — it's +cache extensions, UI hooks), so a stripped build isn't a crippled build, it's the same core wallet, smaller. ## Develop @@ -119,7 +119,7 @@ local regtest stack. bun run build # → dist/ (index.html + PWA sidecars) ``` -`dist/index.html` inlines all code, the crypto/QR/Nostr libraries, and the CSS — +`dist/index.html` inlines all code, the crypto/QR/Nostr libraries, and the CSS, save that one file and open it directly in a browser, no server or internet needed. The build also emits PWA extras (`manifest.webmanifest`, `sw.js`, icons, and a lazy-loaded `jsqr.js`) for the hosted site; they're optional and @@ -129,11 +129,11 @@ simply 404 when `index.html` is opened on its own. Three layers, fastest first: -1. **sessionStorage** — keeps the wallet open across a refresh (cleared on +1. **sessionStorage**: keeps the wallet open across a refresh (cleared on logout / tab close). -2. **localStorage** — caches scanned state per wallet *and per network*, so a +2. **localStorage**: caches scanned state per wallet *and per network*, so a reload shows balances instantly. -3. **Nostr** — encrypted, replaceable cross-device state per network (when +3. **Nostr**: encrypted, replaceable cross-device state per network (when sync is enabled). On load and on a timer the wallet reconciles against its data source; a manual @@ -143,10 +143,10 @@ On load and on a timer the wallet reconciles against its data source; a manual | File | Purpose | | --- | --- | -| `src/wallet.js` | BIP84 core: derivation, scanning, coin selection, signing, realtime, cache — plus the feature seams | +| `src/wallet.js` | BIP84 core: derivation, scanning, coin selection, signing, realtime, cache, plus the feature seams | | `src/api.js` | Data-source selection per network (electrum/esplora presets, throttle/cooldown/failover) | | `src/ark/` | Native-JS Ark protocol: gRPC-web codec, arkoor sends, boarding, refresh, offboard, unilateral exit, validation, crash-safe manager | -| `src/features/` | Feature plugins: `ark`, `swaps`, `gifts`(+`gifts-wallet`), `sp`(+`sp-wallet`), `sync` — and `index.js`, rewritten at build time by `HAL_FEATURES` | +| `src/features/` | Feature plugins: `ark`, `swaps`, `gifts`(+`gifts-wallet`), `sp`(+`sp-wallet`), `sync`, and `index.js`, rewritten at build time by `HAL_FEATURES` | | `src/swap.js` | Boltz submarine/reverse swap engine | | `src/silentpay.js` / `src/sp-worker.js` | BIP-352 math + its Web Worker | | `src/nostr.js` | NIP-44 state sync, NIP-17 DMs, profiles | @@ -156,23 +156,23 @@ On load and on a timer the wallet reconciles against its data source; a manual ## Security notes -- Self-custody software handling real keys — review the code before trusting +- Self-custody software handling real keys. Review the code before trusting it with funds. It's a hot wallet (keys live in the browser); for large amounts use a hardware signer or run it air-gapped. - The seed/passphrase live in memory while the page is open and in sessionStorage for the tab session; locking or closing the tab clears them. - **Ark trust model**: off-chain sends are co-signed by the Ark server, which - is the arbiter of off-chain spent/unspent state — but it can never spend + is the arbiter of off-chain spent/unspent state, but it can never spend your coins, and the pre-signed exit path means you can always return on-chain without its cooperation. Ark coins expire (weeks) if never refreshed; the wallet surfaces this, but don't park long-term savings in an Ark. - Swap providers are non-custodial by protocol: worst case a swap fails and refunds on-chain. -- Whichever data source you query sees your addresses and IP — point it at +- Whichever data source you query sees your addresses and IP. Point it at your own node for full privacy. The localStorage cache and the Nostr event hold public chain data; the Nostr copy is encrypted end-to-end. ## License -MIT — see [LICENSE](LICENSE). +MIT, see [LICENSE](LICENSE). -- cgit v1.2.3