aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* Profile posts read as a feed: avatar and name on every note, hairlines ↵Adam Soltys2026-08-151-8/+20
| | | | | | | between them, one scrollable pane instead of scattered cards Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* The DOM is patched, not replaced: renders morph the live tree in place so ↵Adam Soltys2026-08-152-8/+184
| | | | | | | hover, focus, selection and scroll simply persist — with a smoke test that walks the app and proves node identity survives Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Background repaints breathe at 200ms instead of strobing at frame rate — a ↵Adam Soltys2026-08-151-7/+12
| | | | | | | resting cursor keeps its hover through a boot burst Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* A downed notifier no longer vetoes new connections — only the user's own ↵Adam Soltys2026-08-151-3/+6
| | | | | | | denial does; self-hosted builds create tab-answering connections and arm background when they can Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* A claim with an ark address that doesn't decode is refused at the door — a ↵Adam Soltys2026-08-151-0/+9
| | | | | | | corrupt one recorded is a payment black hole Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* A failed forward retry says why — the goyslop 190k spent a day failing in ↵Adam Soltys2026-08-151-1/+2
| | | | | | | a bare catch Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* An invoice's name mapping lives as long as the invoice can settle, and a ↵Adam Soltys2026-08-151-2/+13
| | | | | | | nameless settle leaves a trace — one paid 1000 sats vanished into a silent continue behind a 1-hour sweep Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Zaps too gather what they need: several coins each lock an HTLC under one ↵Adam Soltys2026-08-142-53/+101
| | | | | | | payment hash and the server sums them — the fragmented-balance error is gone from Lightning as well Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* A send covers itself from as many coins as it needs: one atomic package ↵Adam Soltys2026-08-142-39/+102
| | | | | | | cosign spends them all, the recipient receives several vtxos, and "consolidate with refresh() first" retires from the vocabulary Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* A mailbox backlog claimed at sign-in reads as the old payments they are, not ↵Adam Soltys2026-08-143-21/+86
| | | | | | | a wall of seconds-ago windfalls; a gift send knows itself in history — status shown, link recopyable, revoke at hand Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Settings grows a Notifications page — per-category switches the notifier ↵Adam Soltys2026-08-1410-13/+90
| | | | | | | honours server-side — and the status bar gets a real coinos badge instead of a black blob Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Money leaving while you're not looking gets a notification: NWC pays from ↵Adam Soltys2026-08-144-2/+30
| | | | | | | the worker or a hidden tab announce themselves — amount, fee, and which app asked Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Sub-sat routes round back up: a zero quote just fails its first attempt and ↵Adam Soltys2026-08-141-5/+7
| | | | | | | pays 1 sat on retry anyway — true free needs the ASP to bring the msats Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* A route that costs less than a sat quotes as free — the ASP eats the ↵Adam Soltys2026-08-141-2/+8
| | | | | | | msats, which mostly land back on our own node Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Holding backspace works in the recipient field: search results and reveals ↵Adam Soltys2026-08-142-14/+36
| | | | | | | stop rebuilding the focused input mid-keypress; the profile npub is itself the copy button Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Pay what the route costs: sends quote the network fee up front (zero between ↵Adam Soltys2026-08-143-20/+84
| | | | | | | coinos wallets), lock exactly that, and a refunded miss retries with one more sat Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* The network fee gets asked, not assumed: /lnquote prices a lightning payment ↵Adam Soltys2026-08-131-0/+77
| | | | | | | through askrene before anything locks — zero to ourselves and direct peers Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* No notifications, no connection: creating one asks to allow them first, and ↵Adam Soltys2026-08-132-6/+43
| | | | | | | a denial explains itself instead of leaving a dead connection spinning in the other app Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* Answering while closed becomes the default: a new connection asks once, and ↵Adam Soltys2026-08-132-5/+38
| | | | | | | anywhere permission is already granted it arms itself — only an explicit Off is honored forever Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_014tE4U5nEjGTQy8PwYqamfv
* The rename page stops calling your name generated: it's just Change usernameAdam Soltys2026-08-131-2/+2
| | | | Co-Authored-By: Claude Fable 5 <[email protected]>
* Spending waits to be asked for: a wallet is born on-chain only, the toggle ↵Adam Soltys2026-08-133-114/+51
| | | | | | and Move money appear once it's set up (or money's already there), and the tour is gone Co-Authored-By: Claude Fable 5 <[email protected]>
* A passphrase is typed twice, while the field to fix it is still on screen; ↵Adam Soltys2026-08-132-30/+59
| | | | | | the tour stops flickering under a busy first scan and finds the balance card it lost Co-Authored-By: Claude Fable 5 <[email protected]>
* The passphrase explains itself: a tap on "What's this?" says it's an ↵Adam Soltys2026-08-132-1/+11
| | | | | | optional 13th word, not a login or encryption Co-Authored-By: Claude Fable 5 <[email protected]>
* The door asks less: Get started shows your seed, and the wallet greets you ↵Adam Soltys2026-08-132-67/+110
| | | | | | in Savings — naming yourself waits until after the tour, as an offer to set up Spending Co-Authored-By: Claude Fable 5 <[email protected]>
* The float reads its mail: sync at startup and before each retry round, so a ↵Adam Soltys2026-08-091-0/+6
| | | | | | | top-up is seen without a restart Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DbA53PJA8fgSvMcEzfuw22
* A waiting board says what it waits for: the Moving line counts ↵Adam Soltys2026-08-093-11/+30
| | | | | | | confirmations, a snag shows itself, and one stuck action no longer starves the queue behind it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DbA53PJA8fgSvMcEzfuw22
* A stuck forward now holds its tongue: retries back off to an hour, and an ↵Adam Soltys2026-08-092-4/+18
| | | | | | | offer knock reads as money arriving, not leaving Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DbA53PJA8fgSvMcEzfuw22
* Switching accounts hangs up first: feature runtimes stop on lock and ↵Adam Soltys2026-08-082-0/+10
| | | | | | | activate, so no one inherits another wallet's chats or steals its inbox Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DbA53PJA8fgSvMcEzfuw22
* Choose your look shows the look: one big avatar previews the pick — punks ↵Adam Soltys2026-08-082-2/+9
| | | | | | | and uploads just change it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01DbA53PJA8fgSvMcEzfuw22
* The wizard waits out a signer login; a picked recipient shows its work, and ↵Adam Soltys2026-08-084-30/+108
| | | | | | search answers from memory before the network Co-Authored-By: Claude Fable 5 <[email protected]>
* Profiles wear their latest notes, each one zappable; a zap with no ark ↵Adam Soltys2026-08-0812-45/+509
| | | | | | address to land on becomes a gift only their key can open Co-Authored-By: Claude Fable 5 <[email protected]>
* Boards show the server their funding tx, as mainnet now insistsAdam Soltys2026-08-052-1/+8
| | | | | Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01M5kFodm9azZJVTQxnkDdKe
* hal speaks pver 5: preimages prove their size, and fees round up as oneAdam Soltys2026-08-058-54/+118
| | | | | | | | | | 0.6.0 servers require the new hashlock clauses (OP_SIZE 32 guard) for Lightning and rounds. New policies/transitions carry the v1 scripts and type bytes; _v0 variants keep old vtxos reconstructing and exiting. The retired third-party HTLC policy is dropped (upstream took 0x08). Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01M5kFodm9azZJVTQxnkDdKe
* Spending trusts its own ledger: gifts read persisted ark state, and Savings ↵Adam Soltys2026-08-054-5/+21
| | | | | | | keeps its pending line to itself Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01M5kFodm9azZJVTQxnkDdKe
* The Nostr card owns its built-in account; the exported key opens this wallet ↵Adam Soltys2026-08-044-6/+84
| | | | | | | anywhere Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01M5kFodm9azZJVTQxnkDdKe
* A wallet too small to renew warns before its coins expire; dust never diesAdam Soltys2026-08-045-2/+156
| | | | | | | | | | | | | | | | | | The warning: when the Spending balance minus round fee is under the 330-sat round minimum AND a vtxo enters the renewal window, auto-refresh can't save the coins — a wallet-screen notice (and a daily local notification, when permitted) says to receive any amount or spend before the deadline. New walletNotices feature hook renders under the balance card. The amnesty: sub-dust vtxos have no unilateral exit to protect, and regtest proves captaind keeps cosigning their spends past expiryHeight — even after the watchman claims the backing on-chain (tools/ark/expired-dust-test.js). Only hal's own receive validation stood in the way; it now exempts sub-330 vtxos from the expiry check. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015QwAtBSpKvECqp1rHLHjJk
* Ark gifts go down to 1 sat; negative amounts can't OOM the encoderAdam Soltys2026-08-044-1/+142
| | | | | | | | | | | | | | | | | | Regtest-proven (tools/ark/dust-gift-test.js): the ASP cosigns all-dust arkoor sends, so a sub-dust bearer vtxo sweeps to its claimer fine, and dust folds into rounds alongside bigger siblings. The 330-sat gift floor guarded a failure that can't happen — dropped to 1 sat. The experiment also caught a live bug: refresh() of a balance smaller than the round fee computed a negative output amount, and pbWriter's varint sign-extends negatives into an infinite loop — auto-refresh would OOM the tab of any wallet too small to renew. varint now throws on negatives and refresh() refuses cleanly, before marking coins pending, when balance minus fee is under the server's 330-sat output minimum. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015QwAtBSpKvECqp1rHLHjJk
* More options also points at Savings for a plain on-chain addressAdam Soltys2026-08-043-2/+10
| | | | | | | | | Not a pane of its own: a regular Bitcoin address means receiving to Savings, so the entry switches the account selector over and lets the savings receive view show its fresh address. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015QwAtBSpKvECqp1rHLHjJk
* The chat log follows its bottom edge through viewport resizesAdam Soltys2026-08-041-0/+16
| | | | | | | | | | | The keyboard shrinks the viewport-sized chat card: the composer stayed on screen but the log kept its old scroll offset, hiding the newest messages. Re-stick on every viewport resize and on composer focus — unless the reader has deliberately scrolled up, which msgStick already remembers. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015QwAtBSpKvECqp1rHLHjJk
* One More-options link replaces the BOLT 12 link on ReceiveAdam Soltys2026-08-042-16/+137
| | | | | | | | | Behind it: a one-time BOLT 11 invoice (minted by the ASP), the reusable BOLT 12 offer flow, the wallet's raw ark address, and the CLINK offer code — each on its own pane so only one scannable code shows at a time. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015QwAtBSpKvECqp1rHLHjJk
* Seeing the message list clears the badge; rows keep their own dotsAdam Soltys2026-08-042-9/+49
| | | | | | | | | | The header dot cleared only per-conversation, so a channel or thread you never clicked into kept it lit forever. Now the list screen has its own watermark: visiting it answers the header dot, while each DM and community row shows an unread dot of its own until actually opened. Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015QwAtBSpKvECqp1rHLHjJk
* The npub default never displaces a custom nameAdam Soltys2026-08-041-1/+9
| | | | | | | | | | | adoptIdentity claimed the identity npub whenever the local name differed — and claim() releases the previous name, so a nostr login could delete the user's custom address from the registrar (it did). It now asks the registrar first and yields to any custom name. The registrar's /pubkey lookup also matches manager keys now and prefers real names over npub defaults, so restored wallets find their name again. Co-Authored-By: Claude Fable 5 <[email protected]>
* The wizard offers a profile, it doesn't overwrite oneAdam Soltys2026-08-042-4/+15
| | | | | | | | | Finishing the avatar step published name = the payment-address name and the default punk under the user's real nostr identity — renaming (and re-facing) profiles that already existed. Wizard-suggested fields are fill-only now: they land only where the profile has nothing. Co-Authored-By: Claude Fable 5 <[email protected]>
* No logo in the wizard; every step has a way back insteadAdam Soltys2026-08-041-5/+8
| | | | Co-Authored-By: Claude Fable 5 <[email protected]>
* The logo rides along on every wizard stepAdam Soltys2026-08-041-1/+5
| | | | Co-Authored-By: Claude Fable 5 <[email protected]>
* The wizard can no longer trap anyoneAdam Soltys2026-08-042-2/+11
| | | | | | | | | Publishing the profile on the avatar step is best-effort now — a signer that can't sign (a sleeping phone bunker) skips it with a toast instead of erroring the Continue button forever. And once a wallet exists, the logo leads home even out of a resumed wizard. Co-Authored-By: Claude Fable 5 <[email protected]>
* Five conversations, then 'show all' — communities stay in reachAdam Soltys2026-08-042-1/+14
| | | | Co-Authored-By: Claude Fable 5 <[email protected]>
* Your own npub stays out of the profile editorAdam Soltys2026-08-041-1/+3
| | | | Co-Authored-By: Claude Fable 5 <[email protected]>
* Avatars stop flashing everywhere: backgrounds, not <img>Adam Soltys2026-08-043-2/+7
| | | | | | | | A recreated <img> decodes async — one blank frame per render, and boot renders in bursts. A CSS background paints synchronously from cache, so the profile page, chat rows, and send candidates all hold steady now. Co-Authored-By: Claude Fable 5 <[email protected]>
* The bio edits in a textarea, and only appears once on your own profileAdam Soltys2026-08-041-5/+7
| | | | Co-Authored-By: Claude Fable 5 <[email protected]>