aboutsummaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* The mailbox checkpoint was a timestamp all along: receives are dated by when ↵Adam Soltys2026-08-292-9/+42
| | | | | | | the server actually delivered them (verified to the millisecond), so an import shows hours-old payments as hours old — no celebration for news that isn't; a wallet whose Savings holds nothing opens onto the Spending that holds everything; and same-payment duplicates fold at display time on every device, however the state arrived Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A payment that lands now is dated now: expiry-based age estimation applies ↵Adam Soltys2026-08-281-2/+8
| | | | | | | only to the first catch-up — it mis-dated a live receive by a month after the vtxo lifetime doubled, since the math assumes every coin began with the full current lifetime Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* One payment, one line: the settle path is idempotent (the mailbox push and ↵Adam Soltys2026-08-282-3/+21
| | | | | | | the status poll raced past each other's step checks — a toque got two history entries), movements carry their payment hash, and the sync merge folds same-preimage lightning records into the earliest telling Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The profile editor learns to take a photo, not just a URL: an Upload button ↵Adam Soltys2026-08-283-0/+22
| | | | | | | feeds the same signed nostr.build path the onboarding picker uses and fills the picture field with the result Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A name the registrar no longer grants is a costume: the wallet verifies its ↵Adam Soltys2026-08-281-0/+15
| | | | | | | cached name against the record's owner and manager keys each refresh, shedding stale ones (an evicted squat once lingered in the squatter's UI) — the /name endpoint now names the manager too Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Max learns the ark rail: an ark address gets its own Max button filling the ↵Adam Soltys2026-08-282-1/+17
| | | | | | | whole spendable Spending balance — free sends mean the maximum really is the balance Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The stickers trade coats: mainnet's v3 beta wears bitcoin orange, staging ↵Adam Soltys2026-08-281-1/+1
| | | | | | | goes purple Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The sticker gets specific: v3 betaAdam Soltys2026-08-281-1/+1
| | | | | Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The logo wears its beta sticker — purple, tilted like staging's orange ↵Adam Soltys2026-08-282-4/+6
| | | | | | | one, present from the static boot shell's very first paint so it never pops in Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Renewals earn a line in the ledger: "Renewed ↻" rows in history showing ↵Adam Soltys2026-08-283-9/+27
| | | | | | | what the round cost (or "free"), with the in-and-out detail behind them — and the toast is simply "Renewal requested" Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The advisory names both prices: "renew for 2 sats to bring that down to ↵Adam Soltys2026-08-282-3/+8
| | | | | | | about 1,060" — and stays silent when renewing wouldn't actually help; the toast learns to speak in one plain breath Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The exit-cost advisory moves to where eyes already are: a quiet line under ↵Adam Soltys2026-08-282-9/+9
| | | | | | | the Spending balance — current trustless-exit price, the renewal that shrinks it, one inline Renew now — instead of a settings card nobody would know to dig for Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The tradeoff gets a quiet advanced card, not a quiz: when coins run four or ↵Adam Soltys2026-08-282-1/+33
| | | | | | | more hops deep, Settings grows an "exit cost" card naming today's trustless-exit price and offering a one-tap renewal that flattens the history — invisible to everyone whose coins are shallow Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* An exit dearer than its cargo is not an option: when the trustless road ↵Adam Soltys2026-08-282-0/+9
| | | | | | | would cost more than it moves, the fallback says so plainly and points at Lightning — the road with no mining fees — instead of offering an 8,486-sat ticket for 928 sats of passenger Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* No exit leaves without fare money: starting one now requires Savings to ↵Adam Soltys2026-08-282-2/+10
| | | | | | | cover the estimated hop fees (named in the refusal), and a mid-flight stall says exactly how many sats the next step needs and that it resumes on its own Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A detail page doesn't survive changing accounts: switching ↵Adam Soltys2026-08-281-0/+6
| | | | | | | Spending↔Savings with a payment record open closes it and lands on Receive — the record belonged to the other side Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The explorer link stops blinking with the retry loop — it shows only for ↵Adam Soltys2026-08-282-11/+15
| | | | | | | transactions genuinely broadcast — and the ETA drops its tilde: "about 25 hours" says approximate once, in words Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The send flow chooses the road itself: cooperative always goes first, and ↵Adam Soltys2026-08-282-14/+42
| | | | | | | only when the server actually refuses does the trustless fallback appear — stating up front that the whole balance exits to Savings, how long it takes, and the mining-fee reserve Savings will pay, with the button disabled until Savings can cover it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The send page sends and history remembers: an in-flight exit is a pending ↵Adam Soltys2026-08-282-14/+83
| | | | | | | history record with its own detail card (ETA, explorer link, cancel while it's real) — pasting an address with everything mid-exit now stays on the send form with a plain no-spendable-balance error and a link to that record, and the exit page drops its double balance Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The exit page stops arguing with itself: the header names how much is ↵Adam Soltys2026-08-282-2/+12
| | | | | | | mid-exit, and the cooperative card explains that the balance is held by the exit below — and that cancelling it (while nothing has broadcast) frees the coins for the cooperative road Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A claimed gift shows you the pocket it landed in: an ark gift claim latches ↵Adam Soltys2026-08-281-3/+15
| | | | | | | the Spending side and selects it on every path into the wallet — backup, verify, skip, or straight in — instead of opening onto an empty Savings face Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A send can't quietly change accounts: pasting an on-chain address in ↵Adam Soltys2026-08-281-6/+19
| | | | | | | Spending while every coin is mid-exit now opens the exit's own status page — before, it fell through to the Savings send form, whose fee-trimmed Max read as the spending balance shrinking by half Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The details page honors the rail you rode: a Lightning payment keeps its ↵Adam Soltys2026-08-282-1/+8
| | | | | | | bolt on the detail view instead of confessing the ark underneath, and the preimage — the receipt merchants actually ask for — is shown and copyable Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The exit tells one story instead of narrating hops: a single line — total ↵Adam Soltys2026-08-282-22/+48
| | | | | | | sats, an honest ETA through chain, timelock and claim — with a block-explorer link for the tx actually out there, and one cancel button that exists only while cancelling is true (nothing broadcast, driver waiting on fees) Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Forget-all keeps its word: the delete-everything warning lives inside the ↵Adam Soltys2026-08-282-16/+31
| | | | | | | logout popup now, and confirming it wipes on the spot and lands on the front door — no detour through the Accounts page that looked like the deed was done when only a confirm screen had opened Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The switcher catches up: it says Accounts tooAdam Soltys2026-08-281-1/+1
| | | | | Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The word settles where it belongs: the things you save, unlock, rename and ↵Adam Soltys2026-08-281-21/+21
| | | | | | | remove are Accounts now — "wallet" stays for the seed, the app, and the money itself Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The shop blurb finds its final fit: "Support Coinos and wear the proof on ↵Adam Soltys2026-08-281-1/+1
| | | | | | | your avatar." Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The hat stand gets its button back: "Support Coinos, Buy a Hat!" — a ↵Adam Soltys2026-08-282-2/+2
| | | | | | | proper button beside the avatar, not a shy link Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The red dot stops being fashionably late: a device with no read watermarks ↵Adam Soltys2026-08-281-1/+10
| | | | | | | paints it from the first frame — the community is never empty and read state is local, so the fetch was only ever going to confirm it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Arrivals don't slide, only journeys do: the tab pane and balance face ↵Adam Soltys2026-08-281-3/+16
| | | | | | | animate for deliberate switches alone — the wallet's first frame after sign-in, and a background arkReady revealing Spending, simply appear in place Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The address is fetched while the key still turns in the lock: sign-in races ↵Adam Soltys2026-08-283-1/+26
| | | | | | | a registrar lookup against the seed work and seeds the name before first paint, so the Receive pane opens straight onto its QR instead of "setting up your payment address" Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The wallet remembers it has a spending side: the relay backup carries the ↵Adam Soltys2026-08-284-12/+28
| | | | | | | hint, stamped the moment spending becomes real, so a restore paints Spending from its first frame instead of reflowing when the name lookup catches up — and the sign-in toasts are gone, since a wallet appearing announces itself Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The wallet arrives without ceremony: sign-in swaps screens instantly (a ↵Adam Soltys2026-08-273-1/+13
| | | | | | | one-shot no-anim flag on the handover), and the spending-setup ask holds its tongue until the name restore has settled instead of flashing while the answer is seconds away Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* One fade, not two: the onboarding wizard hands over before the screen flips, ↵Adam Soltys2026-08-271-2/+5
| | | | | | | so signing in no longer re-animates the welcome for a beat — the wallet rises in with its content already aboard Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Steady hands at the door: during sign-in the button's icon becomes the ↵Adam Soltys2026-08-271-4/+13
| | | | | | | spinner and the label stays put — same size, no column reflow — and the passkey button now shows the same quiet work instead of just dimming Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The face arrives with the key: sign-in warms the identity's profile and ↵Adam Soltys2026-08-272-0/+14
| | | | | | | preloads the avatar bytes in parallel with the seed work, so the home screen's first paint already wears the picture instead of a blank circle Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The chosen name outranks the placeholder everywhere: a claim can no longer ↵Adam Soltys2026-08-271-1/+23
| | | | | | | release a custom name to make room for an npub default (the race that deleted passkeyguy), sign-in asks the registrar about the login identity before reaching for a placeholder, and the registrar answers /pubkey with the name the user picked rather than whichever record is younger Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Silence is the normal price: the renewal forecast only speaks when a fee is ↵Adam Soltys2026-08-272-5/+5
| | | | | | | actually coming — free renewals pass without comment Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The hat shop blurb tips its brim and says less: just "Support coinos and ↵Adam Soltys2026-08-271-1/+1
| | | | | | | wear the proof." Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Each door leads to its own room: choosing Nostr shows only the nostr ways in ↵Adam Soltys2026-08-272-5/+9
| | | | | | | — Google and passkey stay on the porch where they already stand, though link and reconnect keep the full set, since a Google-born account needs the same door back Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* One tap, one dialog: a passkey sign-in with nothing on the device rolls ↵Adam Soltys2026-08-272-24/+11
| | | | | | | straight into creating one — the browser's own passkey sheet is the confirmation, and dismissing it is a quiet cancel, not an error Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Renewal becomes a promise you can read: coins now live sixty days (pool ↵Adam Soltys2026-08-272-3/+40
| | | | | | | coins thirty, not three), the refresh base fee is gone and the brackets quartered, the app renews only the coins that need it inside the free final window — with free rescue even past expiry — and the wallet screen quietly states when the next renewal comes and what it costs, which is now almost always the word "free" Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Renewal stops billing for tidiness: six refund coins after a failed payment ↵Adam Soltys2026-08-272-2/+7
| | | | | | | no longer trigger a top-bracket consolidation (multi-input sends made fragmentation cheap to live with — the trigger moves to the 24-input ceiling), and the history line for a refresh now names the fee it paid Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The Google button keeps its own counsel: no flickering narration beneath it ↵Adam Soltys2026-08-262-13/+10
| | | | | | | — just a quiet spinner in place of the label while the popup does the talking Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* No pausing at the threshold: a fresh identity walks straight into its new ↵Adam Soltys2026-08-261-26/+7
| | | | | | | wallet — the confirmation interstitial is gone, since a brand-new key is the normal first run for Google and passkey users, not something to warn about Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The question finally gets asked out loud: the new-wallet confirmation ↵Adam Soltys2026-08-261-0/+5
| | | | | | | surfaces on the welcome screen too — a first Google sign-in was completing its whole sharding ceremony and then waiting forever on a confirm card only the unlock screen knew how to show Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Every door gets its crest: the four-colour G for Google, a person-and-key ↵Adam Soltys2026-08-261-6/+17
| | | | | | | mark for passkeys, sized and padded to stand level with the ostrich Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* All three doors on the porch: Google, passkey, and Nostr sign-in stand ↵Adam Soltys2026-08-263-23/+53
| | | | | | | directly on the welcome screen — Google and passkey act in place, the Nostr button steps into the signer list as before Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The door says what it is: "Sign in" — Google and passkeys live behind it ↵Adam Soltys2026-08-261-2/+2
| | | | | | | now, not just nostr Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi