<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/src/app.js, branch fdroid-v1.8</title>
<subtitle>coinos v3 — bitcoin, Ark, Lightning and nostr wallet (web + Android)</subtitle>
<id>https://git.coinos.io/coinosv3.git/atom?h=fdroid-v1.8</id>
<link rel='self' href='https://git.coinos.io/coinosv3.git/atom?h=fdroid-v1.8'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/'/>
<updated>2026-09-17T04:27:00Z</updated>
<entry>
<title>Pay from a profile opens the Send form, not a lingering payment detail.</title>
<updated>2026-09-17T04:27:00Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-17T04:27:00Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=9360ca6806332a9c7e3a2e11f0b973511493c192'/>
<id>urn:sha1:9360ca6806332a9c7e3a2e11f0b973511493c192</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>Seeing the recovery phrase once dismisses the reminder on every device.</title>
<updated>2026-09-16T04:32:44Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-16T04:32:44Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=14aff677c6e091c5dd9e5f58ae7e62c855de03ae'/>
<id>urn:sha1:14aff677c6e091c5dd9e5f58ae7e62c855de03ae</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>A seed phrase or entropy typed on the start screens is never remembered.</title>
<updated>2026-09-15T05:09:05Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T05:09:05Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=b14725268da32010ed5b75735f268e014adb1cf5'/>
<id>urn:sha1:b14725268da32010ed5b75735f268e014adb1cf5</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A gift locked from Savings shows under Savings, not Spending.</title>
<updated>2026-09-15T04:58:33Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T04:58:33Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=a493b12aca18a670296f0f7142ad041b87ec1b69'/>
<id>urn:sha1:a493b12aca18a670296f0f7142ad041b87ec1b69</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Back closes a full-screen photo; it never walks a signed-in wallet to the start page.</title>
<updated>2026-09-15T04:57:06Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T04:57:06Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=6307cc6b4881b9707911ff667fa91c1ffe59757c'/>
<id>urn:sha1:6307cc6b4881b9707911ff667fa91c1ffe59757c</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Logging out leaves one identity, not everyone on the device.</title>
<updated>2026-09-15T02:14:38Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T02:14:38Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=4409629ab28372def6afb07c2fb1e124a58ab171'/>
<id>urn:sha1:4409629ab28372def6afb07c2fb1e124a58ab171</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A new window opens the wallet you last used, not the first one saved.</title>
<updated>2026-09-15T01:46:14Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T01:46:14Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=3bf5557d8ea3d45779f6643d40c18629362d78e3'/>
<id>urn:sha1:3bf5557d8ea3d45779f6643d40c18629362d78e3</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>The recovery phrase comes first, and Hide matches Reveal.</title>
<updated>2026-09-14T21:26:23Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-14T21:26:23Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=af18e4a43aa9f0ce8cd1a13fc29bebb2da2b9070'/>
<id>urn:sha1:af18e4a43aa9f0ce8cd1a13fc29bebb2da2b9070</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QYJfZ4A1TDCEY4Foq3CApR
</content>
</entry>
<entry>
<title>A new post opens up instead of appearing.</title>
<updated>2026-09-14T20:46:58Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-14T20:46:58Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=0c0ba1b0129a140dc540f0fb8588b3ffdd44350c'/>
<id>urn:sha1:0c0ba1b0129a140dc540f0fb8588b3ffdd44350c</id>
<content type='text'>
A post let in at the top of an open feed was there on the next paint —
one frame nothing, the next a whole row, the page shoved down by that
much. Now it opens over a third of a second: height from nothing to its
own, fading in as it goes, and a repaint mid-way resumes where it was.
The same happens to the posts the pill lets in.

That needed the morph to know which row is which. Children were matched
by position, so a new first row was patched onto the old first row's
node and every row below onto its neighbour's — the node the new post
was built as never reached the page. A list whose every child carries a
data-key is now reconciled by key: new rows are inserted as themselves,
the rest keep their nodes and move. Feed rows and their hairlines carry
the post id. Partially keyed lists keep the positional rule.

feed-live-test catches the arriving row mid-animation: shorter than it
will be, one animation running, and settled clean afterwards.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QYJfZ4A1TDCEY4Foq3CApR
</content>
</entry>
<entry>
<title>The feed keeps up, and stops moving the page while you read.</title>
<updated>2026-09-13T21:55:18Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-13T21:55:18Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=b11ae2e1811bd5dc6965d127414d8f4f03f248cd'/>
<id>urn:sha1:b11ae2e1811bd5dc6965d127414d8f4f03f248cd</id>
<content type='text'>
A phone freezes a backgrounded tab: timers stop and the relay sockets are
cut, so the feed came back holding whatever it had when you left and only
caught up if you pulled it down by hand. Features now hear about the
return — app.js calls f.resumed(awayMs) on focus — and the feed answers
it by forcing a pass past the thirty-second throttle and rebuilding its
subscriptions, which were talking to sockets that no longer exist. A
blink between apps (under five seconds) is left alone.

That catch-up raises the second problem rather than solving it: dropping
eight posts in at the top moves the words under the thumb of whoever was
reading. So posts that arrive on their own — live, or as a catch-up —
wait when you're scrolled away from the top. A floating pill says how
many, and the tap that lets them in also takes you up to them. Scrolling
back to the top by yourself lets them in too, since up there they cost
nothing. Anything you actually asked for still goes straight in.

Also, on profiles that still show an npub: the batch now falls back to
the relays whose whole job is indexing kind 0 (purplepag.es and friends),
which we never read notes from and so never asked. profile-batch-test's
"handful of asks" bound was a fraction of the row count, which that
fallback broke; the property it means to assert is that the number does
NOT grow with the rows, so it is a constant now.

tools/feed-live-test.js drives a real signed event down a real open
subscription — an unsigned fake is dropped by the signature gate and
would prove nothing — and checks the page does not move, the pill says
"1 new post", tapping it scrolls to the top, and coming back from hidden
re-asks the relays on its own.

Co-Authored-By: Claude Opus 5 (1M context) &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_019mrt228Upn9nNCwGixzSLx
</content>
</entry>
</feed>
