aboutsummaryrefslogtreecommitdiffstats
path: root/src/app.js
Commit message (Collapse)AuthorAgeFilesLines
...
* The coinos logo always goes to the wallet home, from the vtxo page and every ↵Adam Soltys2026-09-291-0/+8
| | | | | | | | | | | other page. goHome cleared a hand-kept list of pages and the vtxo list (arkCoinsPage) wasn't on it — nor a transaction's detail, the hat shop, the till. It now clears every page the history tracks. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Du1qT1wbkYwYK6zkGH79Rp
* Fix public media uploads and feed tab navigationAdam Soltys2026-09-291-13/+21
|
* Pinch to zoom a full-screen picture.Adam Soltys2026-09-281-2/+100
| | | | | | | | | Pinch zooms around the fingers (up to 5x), one finger pans a zoomed picture within its edges, double-tap zooms in at a spot and again to reset, and the wheel zooms on a desktop. A tap still closes an unzoomed picture (after a beat, so it can be the first half of a double-tap); a gesture never does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Send suggestions keep their rows across renders, so hovering one no longer ↵Adam Soltys2026-09-281-5/+13
| | | | | | | | | | flickers. The panel was swapped for fresh nodes on every background render, which dropped :hover each time. Now it's one node for the page's life and its rows are rebuilt only when the results change. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The bottom nav rides every page: Feed, Messages, Notifications, Wallet.Adam Soltys2026-09-281-19/+5
| | | | | | | | | It now shows across the signed-in app and a visitor's public pages (never over sign-in, onboarding or the lock prompt), marks the current page, and carries the unread dot. Home is renamed Feed, and the Messages button leaves the header. Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Restore public feed state when navigating Back from WalletAdam Soltys2026-09-281-1/+1
|
* The Android app's system bars follow the system theme, and the page's theme ↵Adam Soltys2026-09-271-1/+8
| | | | | | | | | | | | | | colour follows the app's. One dark colour for both bars gave white navigation icons over a light page under gesture navigation. The wrapper (1.9, versionCode 10) now uses the page background in light mode and the dark theme colour in dark mode, for the status bar and the navigation bar alike. The page updates its theme-color meta when its own theme is applied, so a PWA's status bar and the wrapper's follow the same switch. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Browser Back leaves the Manage and exit pages: they are history entries now, ↵Adam Soltys2026-09-271-1/+2
| | | | | | | and their own Back pops one. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* A visitor who taps zap, reply, react or boost is shown the way in; the ↵Adam Soltys2026-09-271-1/+11
| | | | | | | | | | | | | | public header has Search and Sign in. Reading is free. A tap on an action without a wallet opens a sheet with the sign-in doors (Google, passkey, Nostr), Create a new wallet, and Not now; the missing-identity path lands there too instead of a toast, and zapping is never offered to a visitor as if it could go through. The header on a public page (a feed, a profile, a thread) carries Search and Sign in. The page is remembered, so a sign-in lands back on it. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* The default public feed is Popular, not the firehose: what people reacted ↵Adam Soltys2026-09-271-2/+3
| | | | | | | | | | | | | | | | | | | | | | to, in your language, with the machine posts gone. A brand-new post has no reactions yet (of 73 fresh English posts on the four relays, one had two), so Popular starts from the other end: the latest reactions, reposts and zaps, counted per post by distinct people, then the posts two or more people touched. Older pages walk the reactions back in time; new ones arrive by a two-minute poll. At the door, JSON and other machine output are dropped, and so is anything not in the reader's language (script first, then a vote of function words among the Latin-script languages the app speaks; unknown passes). The raw firehose stays at /feed/all. A language selector sits under every feed, and changing it rebuilds the curated ones. A tall video scrolled past used to let go of its media at once and collapse, shifting the page under a thumb; it now waits a moment and holds its height until the clip is back. A tap on a full-screen picture closes it. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Every feed has a public URL, and anyone can read it without a wallet.Adam Soltys2026-09-271-1/+3
| | | | | | | | | | | | | | | | /feed/<npub> is the timeline that person sees: their follow list, read from the relays, as a feed. /feed/<naddr> is a follow pack or a follow set, /feed/t/<tag> a topic, and /feed?p=…&t=…&pack=…&name=… any mix. A visitor gets the feed over the front door, can open a post's thread and come back; the composer, chips and editing stay with a wallet. Every feed has a Share button (the built-in Following shares as your own timeline), a profile page has "Their timeline", and Back/Forward walk through feeds by id. Public pages used to miss their repaint: the scheduler only painted the wallet screen, so a visitor's feed filled up invisibly. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Sending to a coinos.io name shows the person, not the ark address it became.Adam Soltys2026-09-271-3/+12
| | | | | | | | | The recipient box keeps the name, with their face beside it and "Sent instantly, no fee."; the review names them too. The ark1… the name resolved to is plumbing, and read as gibberish to anyone new to this. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Three fixes: orphaned pending coins settle with the server; a saved start ↵Adam Soltys2026-09-271-0/+4
| | | | | | | | | | | | | | | | | screen no longer shadows a restored wallet; stop() no longer throws. Reconcile now asks the server about a 'pending' coin no live action or standing renewal order holds: spendable again, or gone. Thirty zap-sized coins another device had already spent counted in a balance for weeks. A nav saved by a page with no wallet (the start screen) was restored over a wallet that had since been saved to the device, painting the start page. messages.stop() referenced feedAt, which no longer exists, so the rest of the teardown never ran on an account switch. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Copy: no more em dashes, anywhere people read.Adam Soltys2026-09-271-1/+1
| | | | | | | | | Every English string, the translations, the README and the messages the code shows people now break with a full stop, a colon or a comma instead. Only console logs and the "—" placeholder for an empty cell keep the dash. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Accounts: tapping an identity signs in as it and opens its profile; the ↵Adam Soltys2026-09-271-4/+21
| | | | | | | | | | | | padlock moves from the header to this page. The identity chip used to put the npub in the URL and leave the list on screen (the profile only paints over the wallet screen). Lock/Unlock now sits with the other device-wide actions (log out, clear); the padlock tests reach it through the Accounts page and lose their stale "Wallets" button. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Media sources wait until the node is in the page; thumbnails use the cache.Adam Soltys2026-09-261-2/+39
| | | | | | | | | | | | | | | | | | | | | Every render builds a fresh tree to diff against the live one, and a media element starts downloading the moment its src is set, even off the document: a sixteen-second feed scroll built 204 <video> and 1,416 <img> elements whose loads the morph then threw away — 375 cancelled video range requests, and full re-downloads from hosts that send no cache headers. h() now puts the source on data-lazy-src and it becomes src only once the node is in the page (render promotes it; a MutationObserver covers nodes appended by hand); the morph treats the two as one attribute. The thumbnail maker fetched every original with cache: 'reload' (38 MB in one scroll); the face was just painted from that URL, so the cache serves. holdScroll now recovers an anchor row that a large insert above pushed out of the window, from the height cache. Tests: the YouTube test accepts the in-view players autoplay loads; the stability test watches the notice for the catch-up, since the new rows land inside the window's spacer. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Keyed morph: drop stale nodes before placing survivors, so a repaint moves ↵Adam Soltys2026-09-261-0/+12
| | | | | | | | | | | | | | | | nothing. With stale nodes still in front, every kept row's position was off by the stale count and each one was pulled out and re-inserted — a remove and an add per row per repaint. The feed's window evicting rows at the top did this to every mounted row on every scroll step; a moved <video> leaves the document and comes back, restarting its loading (one clip was fetched 61 times in 40 seconds), and images were refetched. Measured with a MutationObserver on the live tab: 160 of 179 row additions during a 20-second scroll were the same key going out and back in. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
* Sign-in lands on Receive: a freshly opened wallet shows its deposit address ↵Adam Soltys2026-09-241-8/+14
| | | | | | | | | | | and QR. Creating, importing, unlocking or switching to an account (and finishing the onboarding wizard) now opens the Receive tab instead of History. A refresh still resumes wherever you were; loading a seed into a watch-only wallet mid-flow keeps its place too. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
* Preserve restored thread state across rapid refreshesAdam Soltys2026-09-241-2/+2
|
* Paint cached thread counts and header hat on refreshAdam Soltys2026-09-241-6/+12
|
* Social: NIP-51 lists as feeds, posts and people in the address bar, the ⋯ ↵Adam Soltys2026-09-231-5/+42
| | | | | | | | | | | | | | | | | | | | | | menu on every screen. Lists: a feed of hand-picked people is published under your key as a kind-30000 follow set (title, p tags, t tags), so Coracle, Nostria and friends show it; your existing follow sets from other clients turn up as feeds (relay copy wins when newer; private nip44 members read and followed, never rewritten). "Keep as a nostr list" in the editor; unticking sends a NIP-09 deletion and the feed stays. "Add to a list" from a profile or a post's ⋯; someone's lists show on their profile and open as feeds (a kind-30000 naddr works as a pack too). Links: a thread puts its nevent in the address bar, a profile its npub — copy, share, reload; Copy link / Share in the ⋯ sheet. Boot-time renders after a reload share one history slot, so Back goes to the screen before. Fix: the ⋯ sheet and the reaction picker were only drawn by the feed and notification views, so the button did nothing on a thread or a profile. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Ark server is a setting again; an address on another server falls back to ↵Adam Soltys2026-09-221-1/+2
| | | | | | | | | | | | | | | | | | | Lightning. Settings → Advanced → Ark server: coinos, Second (ark.second.tech) or a custom server, per network — the stored choice is honoured on mainnet again. Ark state is kept per server, so switching hides but never loses coins; the card says what the current server holds and asks before letting go. After a switch the reusable address, the nostr advert and the payment name's ark= instruction follow the new server. Sends between servers can't be arkoor, so an Ark address that names a different server (its first bytes hash the server key) is treated as no Ark address at all in the pay ladder — a coinos name or npub then goes over Lightning by itself — and a pasted one is refused with the reason. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Settings tiles: a receipt icon for Point of sale; Advanced's line fits on ↵Adam Soltys2026-09-211-0/+2
| | | | | | | one row. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Settings: the terminal's cards (POS tokens, tap-to-pay link) move to Point ↵Adam Soltys2026-09-211-1/+1
| | | | | | | of sale; the show/hide toggle is gone. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
* Settings: a Point of sale page of its own; Network folds into Advanced.Adam Soltys2026-09-211-2/+6
| | | | | | | | 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
* 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-211-1/+5
| | | | | 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-211-2/+21
| | | | | | | | | | | | | 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-211-3/+3
| | | | | | | | | | | | | | 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-211-2/+18
| | | | | | | | | | | | 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
* 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
* Point of sale: /pos, a per-device till mode, an on-screen pad — and off ↵Adam Soltys2026-09-211-0/+11
| | | | | | | | | | | | | | | 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
* Settings → Nostr: make coinos the browser's handler for web+nostr: and ↵Adam Soltys2026-09-201-2/+24
| | | | | | | | | | 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-201-1/+1
| | | | | | | | | | 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]>
* Zaps: the sound can be switched off — from the held bolt or Settings → ↵Adam Soltys2026-09-191-0/+8
| | | | | | | | | | Nostr. A prefs flag (zapSound, absent = on) synced with the zap amount. The strike and the tally are unchanged; only the clip stays quiet, and the clip chunk is not even fetched while it's off. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Accounts from the header, snapshot-first Spending restore, name ownership ↵Adam Soltys2026-09-181-9/+34
| | | | | | | | | | | | | | | | grants. Header buttons always leave the current feature screen; an account with no remembered nostr identity opens Accounts instead of nothing. Logout confirms in place. A scan finishing after logout or an account switch no longer drops the new session into offline mode (stateGeneration guards in sync + ark). Spending restores from the snapshot first. A migration grant names the identity that owns an address; its manager may register it without becoming that identity (names/ownership.js). Browser tests for account access, profile retry, spending restore, thread reply focus, custom-emoji reactions and registry ownership. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Pay from a profile opens the Send form, not a lingering payment detail.Adam Soltys2026-09-161-1/+12
| | | | | | | | | | | A tapped history row claims the whole tab area whichever tab is picked, so jumping to ui.tab = 'send' from a profile's Pay button (or a zap's form fallback) with a renewal's detail still open showed that detail instead of the form. showSend() closes any open detail first; the three feature paths that jump to Send use it. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
* Seeing the recovery phrase once dismisses the reminder on every device.Adam Soltys2026-09-151-5/+44
| | | | | | | | | | | | | | The "still unwritten" line keyed off a flag held only in session storage and the vault, so a silent sign-in that rebuilt the account (every app open on a phone) started it over as unseen. The flag now rides the wallet's snapshot — the local cache and the synced copy, merged commutatively so it only ever turns on — and the account directory, so a rebuilt account finds it before any sync arrives. Seeing the phrase marks every account on the same seed and saves the cache at once, so it pushes to the other devices right away. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
* A seed phrase or entropy typed on the start screens is never remembered.Adam Soltys2026-09-141-6/+17
| | | | | | | | | Switching between Create and Import, backing out of the entropy page, signing into another account or going home all drop whatever was typed; the entropy page always opens empty instead of refilling from an earlier visit. Secret material is not a draft. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* A gift locked from Savings shows under Savings, not Spending.Adam Soltys2026-09-141-10/+13
| | | | | | | | | Every feature balance line landed on the Spending face, but a gift's locked reservation is on-chain money still sitting in Savings. Lines now say which side they belong to and draw on that card: gifts on Savings beside pending incoming, ark's Moving… on Spending as before. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Back closes a full-screen photo; it never walks a signed-in wallet to the ↵Adam Soltys2026-09-141-5/+19
| | | | | | | | | | | | | | start page. The photo viewer made no history entry, so the phone's Back popped the screen underneath it instead — and on a session whose history began at the sign-in page, that was the start page, so the photo's × then looked like a logout. The viewer is now a navigation entry of its own: Back, ×, Escape and a backdrop tap all pop it and leave the room in place. And with a wallet open, Back into a pre-sign-in entry lands on the wallet home rather than the welcome screen. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* Logging out leaves one identity, not everyone on the device.Adam Soltys2026-09-141-4/+31
| | | | | | | | | | | | With several identities signed in, the profile's Log out now signs out only the current one: its accounts leave the session, directory, cache and vault, the others stay put, and the next identity takes the screen. The confirmation names who is leaving and says whether they can sign straight back in (a nostr login) or need their recovery phrase (a bare seed). Logging out of every account is a second, explicit button. Alone on the device, Log out is unchanged. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* A new window opens the wallet you last used, not the first one saved.Adam Soltys2026-09-141-5/+17
| | | | | | | | | | | The active account lived only in sessionStorage, so a link clicked from outside (a fresh tab or the installed app window) unlocked the vault and always reopened the first wallet in the directory. The last activated id is now also kept in localStorage and preferred at every fresh-session entry point: silent vault unlock, watch-only seeding, the password prompt, Skip, and the home fallback. Co-Authored-By: Claude Fable 5.1 <[email protected]>
* The recovery phrase comes first, and Hide matches Reveal.Adam Soltys2026-09-141-3/+7
| | | | | | | | | | | On the wallet settings page the phrase sat under the name and the key; it is the one thing there that matters if the phone is lost tonight, so it leads now — on the Settings tab and the per-account screen alike. Beside "Reveal the words", Hide was a small button tucked next to a big one; the two are now equal halves of the row. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01QYJfZ4A1TDCEY4Foq3CApR