<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/tools/compose-preview-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, composer and zap tests follow today's app</title>
<updated>2026-10-07T15:27:40Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-10-07T15:27:40Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=dfb017c1b10cb52c24f4f0bcf745c6abea11b98f'/>
<id>urn:sha1:dfb017c1b10cb52c24f4f0bcf745c6abea11b98f</id>
<content type='text'>
- feed tests reach the Feed from the bottom nav (the chat-home row is
  gone) and seed this wallet's last feed as Following (new wallets open on
  Popular, c89050e) plus the author's profile (readiness gate)
- post-actions: its picture is made locally (it read another session's
  scratchpad), the post's own ⋯ (not the feed header's), a real tap on the
  DM picture (a tap beside a fitted picture is a tap on the post)
- composer-media / video-compress: intercept every public media host
  (ditto is first now; the tests were uploading for real)
- compose-preview: Preview is one toggle button (aria-pressed)
- thread-reply: harness has a wallet (else visitor: Reply asks to sign in),
  registers &lt;coinos-text&gt;, holds the root's id-only query; atomic send tap
- video-unmute: stubs what videoNode reaches outside its slice; preload
  none means the in-view clip is told to load
- zap-deep-profile: zap button scrolled to mid-screen (the bottom nav
  covered it)

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Composers take pictures from the keyboard: the reply, post and chat fields are contenteditable.</title>
<updated>2026-09-29T18:18:21Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-29T18:18:21Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=689e21d5e77765661c44d60c10b18134b995162a'/>
<id>urn:sha1:689e21d5e77765661c44d60c10b18134b995162a</id>
<content type='text'>
Android keyboards (Gboard GIFs, stickers) only offer images to fields that
accept them, and Chrome says so for contenteditable, never &lt;textarea&gt; —
hence the greyed-out GIF key and "This app does not support images here".
&lt;coinos-text&gt; (src/rich-text.js) is a contenteditable that acts like a
textarea to the code around it (value, selectionStart/End, setSelection-
Range, placeholder), keeps text plain, and hands any pasted/dropped/
keyboard picture to onMedia — the paperclip's upload. The morph syncs its
value like a field's and leaves its own editing attributes alone.

composer-media-test: types like a textarea, strips pasted formatting,
a pasted GIF uploads and lands in the reply, still editable after repaint.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Du1qT1wbkYwYK6zkGH79Rp
</content>
</entry>
<entry>
<title>The feed header keeps its room on a phone: a ⋯ menu for the feed itself, a pencil for a new post.</title>
<updated>2026-09-29T01:16:58Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-29T01:16:58Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=cfac411e3859f03af7c8c1fe4deab6ab6bae42d0'/>
<id>urn:sha1:cfac411e3859f03af7c8c1fe4deab6ab6bae42d0</id>
<content type='text'>
Save feed, Relays, Share and New post sat in the title row and wrapped on a
phone. Share, Relays and Save or Edit now live in the feed's ⋯ sheet, and
New post is a pencil; the title has the width.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
</content>
</entry>
<entry>
<title>Thread: the reply box appears on Reply, full width, with its tools on a row beneath.</title>
<updated>2026-09-26T14:50:39Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-26T14:50:39Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=a4f13b845b9dfb364bdac0932916d99c381db20e'/>
<id>urn:sha1:a4f13b845b9dfb364bdac0932916d99c381db20e</id>
<content type='text'>
A thread opened to read came with an empty field under its first post.
The box now appears under the note whose Reply was tapped (or while a
draft is pending), folds away once the reply is sent or Cancel is tapped,
and takes Amethyst's shape: the field across the full width, attach and
preview on a row beneath it with Cancel and Reply at the right.

Tests: thread-reply's helper follows the new shape and expects the box to
fold after sending; compose-preview and feed-list tap Reply before
expecting a box (the thread card carries .thread-card as the marker).

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01VhUKyXKtsJ67QAFfb7QR9D
</content>
</entry>
<entry>
<title>First run: "Create a new wallet" shows the twelve words at once.</title>
<updated>2026-09-21T19:04:25Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-21T19:04:25Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=9b4fa70a978e3685c9bb2b9a68f855626ac6f39e'/>
<id>urn:sha1:9b4fa70a978e3685c9bb2b9a68f855626ac6f39e</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
</content>
</entry>
<entry>
<title>See the post before you post it.</title>
<updated>2026-09-13T16:53:45Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-13T16:53:45Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=fda681331ae3de5abee04042caed994954e1b705'/>
<id>urn:sha1:fda681331ae3de5abee04042caed994954e1b705</id>
<content type='text'>
A draft is written as plain text but doesn't arrive as plain text: a URL
ending in .jpg becomes a picture, a youtu.be link becomes a player, a
nostr: reference becomes the note it points at, an npub becomes a name.
The only way to find out how yours would land was to send it.

The eye beside the paperclip — on the composer and on a reply — opens a
preview. It runs the draft through noteBody, the very renderer the feed
uses, so this isn't a lookalike of the real thing: it IS the real thing,
in a dashed frame with a PREVIEW label so it can never be mistaken for
the post itself. It follows the draft live while it's open (and only
while it's open — a render per keystroke is not free).

Attaching a picture opens it by itself. Showing you what you attached is
the answer to the question attaching it raises, and it costs no tap.

tools/compose-preview-test.js covers both the composer and a reply: the
picture renders rather than sitting there as a URL, the YouTube link
becomes a player, the preview tracks typing, and it puts itself away.

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