aboutsummaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
...
* Settings: a Point of sale page of its own; Network folds into Advanced.Adam Soltys2026-09-213-5/+10
| | | | | | | | Six tiles still: Wallet, Payments, Point of sale, Nostr, Notifications, Advanced. The network and explorer cards sit at the top of Advanced. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Threads: climb to the real root, and look for it on the right relays.Adam Soltys2026-09-211-8/+39
| | | | | | | | | | | | | A client that tags only the note it answered leaves the root unnamed, so the note it replied to was taken as the root and the thread opened with its first post missing (a reply at the top wearing a "reply" badge). The loader now climbs: when the note it resolved as the root is itself a reply, it fetches that note's root and re-roots the thread, a few hops at most. The root is also looked for on the participants' relays and the e tags' relay hints, not just the reply author's. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Starter feeds: #gardenstr only until a Bitcoin follow pack is chosen.Adam Soltys2026-09-211-5/+4
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* New identities start with something to read: Adam and coinos followed, a ↵Adam Soltys2026-09-212-0/+63
| | | | | | | | | | | | | | | Bitcoin feed, and #gardenstr. A wallet the wizard made from fresh words, or a sign-in that found no wallet on its identity, gets one kind-3 update following the two coinos accounts (a sign-in identity only if it follows nobody yet), plus two starter feeds. The Bitcoin feed has a follow-pack slot (STARTER_BITCOIN_PACK) and reads the #bitcoin topic until a pack is chosen; #gardenstr shows what a topic feed is. Once per identity. The feed test now runs through the real first run, reading the words off the screen. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Send: a Lightning payment while Savings is showing asks before it pays from ↵Adam Soltys2026-09-212-0/+46
| | | | | | | | | | | | | | | Spending. Every Lightning payment passes through the Ark flow, whichever balance is on screen, and the review's "from your Spending balance" line was easy to miss. With Savings selected the flow now stops at an ask first: switch to Spending and continue, move Savings into Spending first (the existing board panel — an on-chain step, so a fresh invoice afterwards), or cancel. Pasted invoices, Lightning addresses and LNURL all pass through; autopay (a trusted, budgeted code) never asks. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Spending card: the Manage link shows whenever there are coins, warning or not.Adam Soltys2026-09-211-4/+9
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Balance: a wallet opening starts its numbers fresh, never counting from the ↵Adam Soltys2026-09-211-0/+4
| | | | | | | last account's. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* History: the page number is a picker — jump straight to any page.Adam Soltys2026-09-212-1/+6
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Receive/Send bar in light mode: paper with a hairline, the chosen tab a soft ↵Adam Soltys2026-09-211-3/+7
| | | | | | | grey pill. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* History card: no drop shadow either, to see it beside the flat balance cards.Adam Soltys2026-09-211-1/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Balance cards: no drop shadow.Adam Soltys2026-09-211-2/+5
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Spending coins: Manage opens on the first tap.Adam Soltys2026-09-211-7/+13
| | | | | | | | | | | The notice reads the persisted Ark state; the page read the live manager, which is null for the first seconds after boot — so a tap before it had connected found no coins and closed itself. The page now reads the same state, dials the manager meanwhile, and keeps Renew and Exit now disabled until it is there. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Spending coins: the unilateral exit section sits below renewal.Adam Soltys2026-09-211-5/+5
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Spending coins: "Unilateral exit", with an Exit now button behind a ↵Adam Soltys2026-09-212-4/+41
| | | | | | | | | | | | confirmation. The confirmation shows the coin count, the amount, the estimated mining fees (paid from Savings as the exit unrolls) and what Savings holds for them, refuses when Savings can't carry the fees, and says the funds only land once the timelocks run out and that an exit can't be stopped. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* First run: a new wallet is offered a Spending account before the home ↵Adam Soltys2026-09-212-2/+24
| | | | | | | | | | | | | screen, Not now one tap away. The wizard's spend step (claim a name, get a payment address) now follows the seed screen and the sign-in backup screen, wherever Spending can be set up (Ark-capable network with the names registrar, a signing account). Not now lands on Savings like before. namesAvailable answers 'yes'/'no' rather than a boolean, which featureHook would read as no answer. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Words screen: the Copy button carries the copy icon.Adam Soltys2026-09-211-1/+3
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Words screen: the button says Copy.Adam Soltys2026-09-211-1/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Words screen: Copy phrase is a full-width button.Adam Soltys2026-09-211-1/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Words screen: no Regenerate button.Adam Soltys2026-09-211-18/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* First run: a refresh on the words step shows words, not a Generate button.Adam Soltys2026-09-211-0/+4
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Seed words read down each column; the Google central is a parameter with a ↵Adam Soltys2026-09-216-11/+32
| | | | | | | | | | | | | | door to the previous one. Word grids flow down a column then the next, with the row count from the word count — on a phone the first column is 1–6, the way a hand copies a list. pomegranate.js takes the central as an option (CENTRALS.coinos is auth.coinos.io, now deployed; the default stays auth.njump.me until its Google client is live), and the sign-in card grows a "previous server" line once the default moves, so accounts made under njump keep working. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Create pane: no own-entropy button — the import door under the words has it.Adam Soltys2026-09-211-8/+0
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* First run: "Create a new wallet" shows the twelve words at once.Adam Soltys2026-09-212-2/+20
| | | | | | | | | | | | No create/import tabs and no Generate button inside the wizard: the words appear the moment the button is tapped. Underneath, "Have an existing seed or entropy to import?" swaps to the import pane (which has its own entropy door), and "Create a new wallet instead" swaps back with fresh words. The create/import card elsewhere (adding an account) keeps its tabs. Tests that entered through the old tab go through the new line. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Ark: the renewal notices and the Spending coins screen speak in sats, ↵Adam Soltys2026-09-211-8/+8
| | | | | | | whatever the display unit. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Front door: the divider is just "or" — every door below makes an account too.Adam Soltys2026-09-211-1/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Front door: the welcome card is the title and the buttons.Adam Soltys2026-09-211-6/+0
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Ark: an invoice the server hands back for a hash it already holds is not ours.Adam Soltys2026-09-211-6/+20
| | | | | | | | | | | | | StartLightningReceive on a payment hash with an unpaid invoice returns that invoice — an earlier sale's amount and memo under a fresh QR (a 0.60 CAD bill showed an 8,467-sat invoice on 2026-09-21). The returned invoice must now carry the amount asked for and a comfortable expiry, or the index is treated as spoken for and skipped. The counter is also floored above every index an ln-recv action of ours already names, so a restored or merged state can't rewind it. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: the sats sit under a fiat total, so a payer's wallet and the ↵Adam Soltys2026-09-211-1/+6
| | | | | | | counter agree by eye. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Fiat reads to the cent everywhere.Adam Soltys2026-09-211-3/+3
| | | | | | | Amounts under one unit used to get four decimals; two now, like any price. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: a sale the till never saw settle is adopted from the wallet's ↵Adam Soltys2026-09-211-0/+18
| | | | | | | own record. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: a paid sale opens its payment detail, which now says bill and ↵Adam Soltys2026-09-213-1/+31
| | | | | | | | | | | | tip. The row finds the ln-receive movement by the invoice it recorded and opens the same detail screen the history page shows; the detail asks features for more (arkMoveDetailExtra) and the till adds Bills, Tips (with the percentage) and the note. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: the amount size outranks the generic input rule.Adam Soltys2026-09-211-1/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: the amount reads across a counter.Adam Soltys2026-09-211-1/+1
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: in a currency the pad works like a till — digits shift in ↵Adam Soltys2026-09-211-2/+12
| | | | | | | | | | from the right. 5 is 0.05, 277 is 2.77, 5588 is 55.88; backspace shifts out; the "." key becomes "00". Sats are whole numbers and type plainly. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: /pos, a per-device till mode, an on-screen pad — and off ↵Adam Soltys2026-09-216-15/+60
| | | | | | | | | | | | | | | the Receive tab. v3.coinos.io/pos opens the point of sale once a wallet is up (claimed at boot before any feature reads the path), so the till can be bookmarked or put on a home screen. Settings → Payments gains "Start in point of sale on this device" (localStorage, not synced: the till, not every phone the owner carries). The amount and the custom tip get a 3×4 pad that edits the same field a keyboard or a paste would. The button under the payment address on Receive is gone. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Ark: an issued-but-unpaid invoice on a preimage index is skipped too.Adam Soltys2026-09-211-2/+5
| | | | | | | | | The ASP answers a settled hash with "already been paid" and a merely issued one with "UNIQUE constraint failed: invoices.payment_hash"; both mean the index is taken. Headroom raised to 200 skips. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: the total on the tip screen reads at a glance.Adam Soltys2026-09-212-1/+2
| | | | | Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Ark: a Lightning invoice steps past a preimage index another device already ↵Adam Soltys2026-09-211-7/+22
| | | | | | | | | | | | | | spent. The ASP answered "invoice has already been paid" for a point-of-sale invoice: the receive counter on the phone was behind the one the laptop had used. createLnInvoice now retries on that answer with the next index (the counter only moves up; the key index is allocated once an invoice exists), so the Receive tab, NWC make_invoice and the point of sale all recover instead of failing. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Point of sale: the tip screen shows an invoice error, and both screens say ↵Adam Soltys2026-09-212-3/+8
| | | | | | when the invoice is being made. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Point of sale: a bill, an optional tip prompt, one invoice, and a ledger ↵Adam Soltys2026-09-216-3/+320
| | | | | | | | | | | | | | | | | | that keeps tips apart. A new deferred feature (src/features/pos.js): type the amount in the display unit, optionally a note, Charge. With the tip prompt on, the customer sees the bill and picks a percentage (configurable, default 10/15/20), their own figure, or no tip; one Lightning invoice is made for the total through the Ark feature's receive (new hooks arkLnInvoice/arkLnWatch/arkLnUnwatch/ arkLnCancel wrap createLnInvoice and pollArkLn). Paid, expired and cancelled sales are recorded with the bill and the tip as separate figures, and the fiat rate at the time; the amount screen shows today's bills, tips and total. Doors: Settings → Payments card, and a button under the payment address on Receive (a receiveExtras hook the names pane renders). Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Profile: Messages opens the DM even when the profile sits over a thread.Adam Soltys2026-09-211-1/+5
| | | | Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Settings → Nostr: make coinos the browser's handler for web+nostr: and ↵Adam Soltys2026-09-202-2/+30
| | | | | | | | | | bitcoin: links. njump's "Your default web app" is a web+nostr: link: it opens whichever site registered that scheme. A card offers to register this app (the browser asks), and ?u= now accepts the web+nostr: form. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Deep links: /note1… and /nevent1… open the thread; nostr:note intents ↵Adam Soltys2026-09-202-4/+18
| | | | | | | | | | route there; posts name the NIP-89 handler. A NIP-89 handler event (kind 31990, d=coinos) under the coinos key points njump and other pickers at /<npub> for people and /<note> for notes. The client tag on public posts now carries that coordinate. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Feeds: a following.space link is read before any naddr in the pasted text; ↵Adam Soltys2026-09-201-6/+4
| | | | | | the test clears its field between searches. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Feeds: packs are found by a few letters of their title, and by ↵Adam Soltys2026-09-201-13/+38
| | | | | | | | | | | | following.space's real link form. NIP-50 search only knew the packs the search relay carried — 'Niche Accounts' lives on damus and nos.lol, not relay.nostr.band. So the editor now indexes the wide relays' packs once per session and matches titles and descriptions by substring. A following.space link is /d/<id>?p=<pubkey>, not an naddr; both are accepted. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Feeds: follow packs from following.space (NIP-51 kind 39089) as a feed's people.Adam Soltys2026-09-203-7/+139
| | | | | | | | | | | A feed can name packs as well as people: the pack's current members are its authors, read from the pack event itself and cached on disk, refreshed hourly when a feed using it is opened — so a curator's change reaches the feed by itself. The editor takes a pasted following.space link or naddr, or searches packs by title (NIP-50 on relay.nostr.band). parseNostrRef learned naddr. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Messages: every saved feed is a row on the home list, under Following.Adam Soltys2026-09-202-1/+22
| | | | Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Feeds: Following is one of many; topics from search and #tags; the bolt is ↵Adam Soltys2026-09-203-54/+281
| | | | | | | | | | | | | | | | | | | | | | | | amber only for your own zap. Custom feeds live in the synced messages state — a name, everyone you follow and/or hand-picked people, and topics (hashtags, any of them; with people set as well, only their posts on those topics — the way a nostr filter composes authors and #t). Each feed keeps its own notes, clock and disk cache; a chips row under the feed title switches between them and + opens the editor (people are added through the same search the Send form uses). A word in the header search is a topic too: 'Posts on this topic' opens a session feed for it, as does a #tag in any post body — Save feed keeps it. Topic-only feeds read the big public relays as well as ours, since a hashtag has no author whose outbox we could follow. The zap icon used to go amber once anyone had zapped a post; now only when you have, like the heart. tools/feed-custom-test.js drives the editor, the relay filter, a tagged post landing, the #tag link, reload persistence and delete. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Chat: list sync stops rewriting a refused document every two seconds.Adam Soltys2026-09-201-2/+30
| | | | | | | | | | | | | | | | A relay refusing the community-list write (rate limit, ban) left the remote copy stale, and every resync asked for the same write again, each write echoing back on the live fragment subscription and triggering the next — five events every two seconds, forever. That filled relay.coinos.io's per-IP budget for the whole household, and the phone behind the same IP could no longer reach its remote signer: every NIP-46 request refused as rate-limited, every incoming DM stuck undecrypted (2026-09-20). An unchanged document is re-sent at most once per five minutes; a real change goes out at once. Our own echoes are ignored, and another device's write triggers a resync no more than once every ten seconds. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Notifications: a reaction, boost or zap opens its note with the who-panel ↵Adam Soltys2026-09-201-3/+8
| | | | | | unfolded. Co-Authored-By: Claude Fable 5.1 <[email protected]>