aboutsummaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
...
* 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
* Two new doors, no new locks: "Sign in with Google" (pomegranate — the ↵Adam Soltys2026-08-264-1/+307
| | | | | | | nostr key FROST-sharded 2-of-3 across community operators, Google as coordinator and recovery, a plain bunker:// URI feeding the existing signer flow) and passkey sign-in (WebAuthn PRF derives the key deterministically, treated exactly like a pasted nsec, synced wherever the platform carries the passkey) — both lazy chunks, neither touching the first paint Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The address stops waiting for the mail: your own claimed name prints ↵Adam Soltys2026-08-261-5/+14
| | | | | | | instantly, a deep link's URL already spells the address so it paints with the first frame, and the light cache now remembers nip05 and lightning address between sessions instead of shedding them at the door Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Fewer words on the hat stand: the profile link now just says "Buy your ↵Adam Soltys2026-08-261-1/+1
| | | | | | | avatar a hat" Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The hat pitch moves next door to the head it would sit on: a small "Support ↵Adam Soltys2026-08-263-3/+7
| | | | | | | Coinos — buy a hat for your avatar" link beside the profile avatar replaces the block button buried in the editor Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* No borrowed faces: the seeded profile entry is marked provisional, so the ↵Adam Soltys2026-08-261-5/+8
| | | | | | | avatar holds its quiet circle until the real kind 0 answers — punk art means "has no picture", never "picture not here yet" Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The app arrives in movements: real ESM chunks split the bundle (entry 333KB, ↵Adam Soltys2026-08-266-26/+61
| | | | | | | shared chunks alongside, 61KB of gifts/NWC/hats deferred past first paint into slots that keep their hook seniority), the lazy scripts wear IIFE coats so their names can't collide with the page's — which is what silently broke the remote-signer button — nip98 moves out of the login module so minimal builds stop hauling backup relays, and the smoke test learns the front door's new steps while the regtest stack rises from its IBD nap Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The page arrives light and paints at once: index.html shrinks to 46KB with a ↵Adam Soltys2026-08-264-7/+48
| | | | | | | static boot shell baked in — brand row, and the profile frame when the path names one — while the 789KB bundle moves to a content-addressed app-<hash>.js the browser keeps (a repeat visit re-downloads kilobytes, not the app); the nostr-tools barrel import goes subpath, and the NIP-46 signer client ships as its own lazy file fetched on first bunker login Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The landing settles as one motion: the resolving shell now holds the frame ↵Adam Soltys2026-08-262-10/+21
| | | | | | | over every screen — an auto-restored wallet no longer flashes its home page — and the animation clock stands still until the profile has replaced the shell in place, so nothing slides twice Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi