<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/tools/feed-stability-test.js, branch master</title>
<subtitle>coinos v3 — bitcoin, Ark, Lightning and nostr wallet (web + Android)</subtitle>
<id>https://git.coinos.io/coinosv3.git/atom?h=master</id>
<link rel='self' href='https://git.coinos.io/coinosv3.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/'/>
<updated>2026-10-07T19:02:51Z</updated>
<entry>
<title>Browser tests: public relays answered in the page, never reached</title>
<updated>2026-10-07T19:02:51Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-10-07T19:02:51Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=86d9818abfc160dac031bb292abe28d6f28fc624'/>
<id>urn:sha1:86d9818abfc160dac031bb292abe28d6f28fc624</id>
<content type='text'>
A suite run let ~90 throwaway test wallets subscribe and publish on public
relays from one home address, and nos.lol and relay.damus.io banned it.
tools/puppeteer.js wraps puppeteer-core: every socket to a non-local host
gets an in-page stand-in relay (EVENT -&gt; OK, REQ -&gt; EOSE). Tests that read
real content launch with { relays: 'read' } (real reads, publishes answered
in place); feed-live, chat-layout and cordn-ui launch with { relays: 'live' }.
LIVE_RELAYS=read|1|host,... overrides per run.

profile-key-qr: measure the QR again if a repaint swapped it out.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Feed tests (port 5298 group): bottom-nav Feed, Following seeded, today's prepend and editor</title>
<updated>2026-10-07T15:39:07Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-10-07T15:39:07Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=6c51dcf2542314d5fe883f756f0840ef51860d67'/>
<id>urn:sha1:6c51dcf2542314d5fe883f756f0840ef51860d67</id>
<content type='text'>
- feed-list, markdown-note: open the Feed tab, on Following; feed-list opens
  the editor from the feed's ⋯ menu
- feed-stability: the warm-up query asks kinds 1+1068 (polls); a live post with
  the header on screen goes in above the first post, held still (it no longer
  waits); the per-frame drift check uses a second post once the header is away
- relays-settings: a new identity puts out its DM inbox list at boot, and the
  page has other Save buttons; the no-change save clears the log and clicks
  the card's own Save

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Media sources wait until the node is in the page; thumbnails use the cache.</title>
<updated>2026-09-27T06:42:50Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-27T06:42:50Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=93a95d1ce45d09cb833120cd61573fd88eb8ed26'/>
<id>urn:sha1:93a95d1ce45d09cb833120cd61573fd88eb8ed26</id>
<content type='text'>
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 &lt;video&gt; and 1,416 &lt;img&gt;
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 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
</content>
</entry>
<entry>
<title>Feed: cached posts paint at once, never a spinner over them; the chat home prefetches the feed.</title>
<updated>2026-09-26T06:16:14Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-26T06:16:14Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=1c388b3897ddd36c07f70b2b7f28467fd169e924'/>
<id>urn:sha1:1c388b3897ddd36c07f70b2b7f28467fd169e924</id>
<content type='text'>
The boot gate hid everything, cached posts included, until the opening
page's faces and pictures had decoded — seconds of spinner on a feed we
already held. Cached rows now paint immediately as they are and take their
prepared presentation once the warm-up lands (the container carries
data-booting meanwhile). The relay fetch starts at once instead of after
the warm-up; arrivals still wait at the door. Opening the chat home warms
and refreshes the current feed, so the Feed tap opens on the latest posts.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Prefetch a smaller feed and bound its local cache</title>
<updated>2026-09-25T01:40:53Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-25T01:40:53Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=5511a1504e6496e8a2a100b6a6913c5e1eacf0de'/>
<id>urn:sha1:5511a1504e6496e8a2a100b6a6913c5e1eacf0de</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Feed: threads cached locally, posts never inserted under the reader, rows keep their first look.</title>
<updated>2026-09-24T05:51:58Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-24T05:51:58Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=75679fdd5d24d36e3c54316e88ccefcf954afc82'/>
<id>urn:sha1:75679fdd5d24d36e3c54316e88ccefcf954afc82</id>
<content type='text'>
Work by Codex, wrapped up and verified here.

Threads: a viewed conversation is persisted (thread-cache.js, up to 12
threads / 160 events), so a refresh or a cached note link shows the root
and ancestors at once instead of the selected reply and a spinner; relays
are re-asked in the background and an empty answer keeps the cache.

Feed window (feed-window.js): arrivals are merged without inserting
between visible rows — a gap fill under the reader's eyes waits until
that part of the feed is offscreen, prepends anchor the reading position,
the notice counts what went in above, and only its tap goes to the top.
Older pages are prepared a few screens ahead; a page's pictures and faces
are decoded before it is shown.

Rows keep the presentation they were admitted with (feedPaint): background
profile and quote refreshes no longer rewrite text or swap faces mid-read;
media dimensions are known before paint. Thumbnails queue instead of being
dropped past the first three.

Tests: thread-cache, feed-window, feed-stability; feed-live updated for
the new arrival rules (the notice counts up while you read).

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
