aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* 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-272-2/+30
| | | | | | | 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-267-1/+311
| | | | | | | 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-2610-78/+151
| | | | | | | 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-266-25/+135
| | | | | | | 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
* The door opens on the right room: a profile link claims the very first paint ↵Adam Soltys2026-08-261-1/+26
| | | | | | | — a shell with the asked-for name holds the frame while the registrar answers, the username seeds the avatar's fallback art so no npub prefix or empty circle shows, and an unknown name falls quietly through to the front door Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The profile page steps out front: /username resolves at page load — not ↵Adam Soltys2026-08-261-25/+42
| | | | | | | wallet open — and for a visitor with no account it renders as a truly public page over the front door, threads included, with wallet-only actions held back and Back leading into the app Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* A doormat note is read once: the profile deep link is consumed by the first ↵Adam Soltys2026-08-261-4/+9
| | | | | | | wallet to see it, so logging out and starting fresh in the same tab lands on the new home screen, not the last visitor's profile Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The old address book habit carries over: v3.coinos.io/<username> opens that ↵Adam Soltys2026-08-261-0/+29
| | | | | | | user's profile — the server already hands every stray path to the app, which now reads a lone name (or npub, or bare key) off the doormat, asks the registrar who lives there, and shows you in Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Every face is a door: note-row avatars open the author's profile again — ↵Adam Soltys2026-08-241-1/+3
| | | | | | | the thread view had them inert, and even in the feed a tap on the picture now means the person, not the post Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* Dead coins stop travelling: an expired vtxo leaves the balance and the coin ↵Adam Soltys2026-08-242-8/+61
| | | | | | | picker (sub-dust IOUs excepted), a shortfall names the dead weight it can't spend, and the names float renews any coin a day ahead of the reaper — a 100k forward left home on an expired coin and the recipient rightly refused it at the door Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
* The open tab learns the same manners as the worker: a wallet on the wrong ↵Adam Soltys2026-08-221-0/+9
| | | | | | | network holds its tongue for three seconds before erring on a pay request, giving the right device's answer the floor Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_017Fc8SHJRvBBXgMCntjNCri
* One record answers, and failure learns patience: a rewritten mirror disarms ↵Adam Soltys2026-08-224-28/+153
| | | | | | | stale sibling copies of its connections, the responder pays from the record whose network the invoice names (standing down when none fits), a ghost coin reconciles and retries instead of dying, and error replies wait out a grace period so a sibling's success reaches the client first Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_017Fc8SHJRvBBXgMCntjNCri
* The float sips instead of gulping: top-ups arrive in pool-sized chunks that ↵Adam Soltys2026-08-181-2/+5
| | | | | | | accumulate to the target, sparing the ask that dies whole on a thin vtxo pool Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* The float keeps itself fed: below low water it loops sats off the CLN ↵Adam Soltys2026-08-181-4/+106
| | | | | | | through a neighbourly circular route all by itself, the sync heartbeat drives whatever's mid-flight every minute, and an operator can board on-chain reserves in through two admin calls Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* The claim sorts its coins the way the server counts them: HTLC vtxos line up ↵Adam Soltys2026-08-181-4/+13
| | | | | | | by outpoint in internal byte order — the display-hex sort read the txid backwards and nine-coin receives bounced off the positional check Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* A many-coined receive keeps the server's own order: the claim step stops ↵Adam Soltys2026-08-181-3/+6
| | | | | | | alphabetizing HTLC vtxos the ASP matches positionally, and the expiry guard reads the true earliest deadline instead of whoever sorted first Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* A refresh learns to let go: a participation rejected for unusable inputs ↵Adam Soltys2026-08-182-4/+106
| | | | | | | asks the server which coins died and rebuilds around the survivors instead of resubmitting the doomed set every sync forever; the balance reconciles on a ten-minute cadence so ghosts can't pose as sats; and arkRescue() reclaims a round output whose action a device lost Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* Delivery moves at the speed of the best relay, not the worst: publish ↵Adam Soltys2026-08-183-21/+30
| | | | | | | resolves on the first acceptance, DMs stop idling on the peer's inbox lookup, and the dimming departs — a sent message simply appears Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* The tick bows out: delivery speaks through the dimming alone — faint in ↵Adam Soltys2026-08-182-9/+6
| | | | | | | flight, full strength once a relay has it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* A message sends the instant you let go of it: the rumor hashes synchronously ↵Adam Soltys2026-08-184-43/+68
| | | | | | | onto the screen as a dimmed bubble, crypto and relays catch up in the background, and one small tick marks the moment a relay takes it Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* The composer lets go of a sent message: the morph rightly won't rewrite a ↵Adam Soltys2026-08-181-2/+12
| | | | | | | focused field, so sending clears the live input itself, not just the draft state Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_012u4oe1KPx9faCsDBLfZYqi
* Money stops arriving without a story: the mailbox checkpoint stays local ↵Adam Soltys2026-08-183-8/+22
| | | | | | | reading progress (a merged one skipped every unprocessed message), vtxos that beat their message here get a backfilled receive, and the commit stamp takes its own footer line Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The footer reads as a sentence: Running, then the hash, and only the hash is ↵Adam Soltys2026-08-181-3/+3
| | | | | | | the link Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The footer says what it stamps: the word commit, the short hash git actually ↵Adam Soltys2026-08-182-4/+17
| | | | | | | knows, and a link to it — the build token stays where it belongs, inside the service worker Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The pom-pom earns its fluff: a soft outline and knit marks make it read ↵Adam Soltys2026-08-181-1/+1
| | | | | | | against any background instead of vanishing into the light Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The party hat leaves the party: gone from catalog and price list alike — ↵Adam Soltys2026-08-182-8/+1
| | | | | | | heads that bought one on staging simply go bare Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The toque finds its Canadian posture: perched at the crown, band kissing the ↵Adam Soltys2026-08-181-1/+1
| | | | | | | head, face free for the winter Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* A missing signer opens a door instead of a toast: the reconnect screen ↵Adam Soltys2026-08-185-3/+61
| | | | | | | offers the extension, the signer-app link, or a pasted key — same account enforced — and the silent reattach closes it on its own when it lands Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The restored shop remembers to go shopping: a session that wakes on the hat ↵Adam Soltys2026-08-181-3/+12
| | | | | | | screen refetches its data instead of filtering a collection nobody loaded — the crash that bricked every tap on the phone Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* A crashed render confesses instead of playing dead: the error goes on screen ↵Adam Soltys2026-08-181-0/+26
| | | | | | | with a Reload button, ending the silent every-tap-is-a-no-op brick Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* The collection is always wearable: every owned hat offers itself in the shop ↵Adam Soltys2026-08-181-5/+7
| | | | | | | — the crown included, for the one head it belongs to — so a new purchase never strands an old favourite Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
* Every hat learns to perch: brims ride the crown of the head instead of the ↵Adam Soltys2026-08-181-9/+9
| | | | | | | eyebrows, and the face underneath gets to be seen Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz