<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/src/style.css, branch fdroid-v1.7</title>
<subtitle>coinos v3 — bitcoin, Ark, Lightning and nostr wallet (web + Android)</subtitle>
<id>https://git.coinos.io/coinosv3.git/atom?h=fdroid-v1.7</id>
<link rel='self' href='https://git.coinos.io/coinosv3.git/atom?h=fdroid-v1.7'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/'/>
<updated>2026-09-17T14:57:39Z</updated>
<entry>
<title>The reply row's paperclip and preview buttons stay their size as the box grows.</title>
<updated>2026-09-17T14:57:39Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-17T14:57:39Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=16c77b192e27ab08c7aa8ee821f2b1cc41013ac9'/>
<id>urn:sha1:16c77b192e27ab08c7aa8ee821f2b1cc41013ac9</id>
<content type='text'>
Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>Feed: what arrives waits behind the pill; the count bumps; no auto-flush.</title>
<updated>2026-09-16T18:23:54Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-16T18:23:54Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=49caed082a67851fcd5479d1c462b95f1a5d4a7c'/>
<id>urn:sha1:49caed082a67851fcd5479d1c462b95f1a5d4a7c</id>
<content type='text'>
Posts a refresh found slid in a beat after the cached page painted,
moving what you had begun reading, and reaching the top of the page let
waiting posts in with a re-render under a finger on its way to the pill —
the tap landed on the post beneath. Now everything that arrives after the
first paint, the boot catch-up included, waits behind the pill wherever
you are; the pill is a keyed node whose count bumps on each change; and a
tap scrolls to the top before painting so the new posts open under your
eyes. A rebuilt follow list still rebuilds the feed in place.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>Spending coins as a headed table instead of chip rows.</title>
<updated>2026-09-16T04:25:37Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-16T04:25:37Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=0f6fd7f06d27fa9860bd04bde13fb4ae3794fdf8'/>
<id>urn:sha1:0f6fd7f06d27fa9860bd04bde13fb4ae3794fdf8</id>
<content type='text'>
Every row repeated "expiry", "exit cost", "renewal cost" as pills. The
labels now sit once in a header row over right-aligned tabular figures;
the table's wrapper scrolls sideways on a screen too narrow for it (the
page never does), and it fits a 390px phone without scrolling. A tap
anywhere on a row toggles it. A sub-satoshi renewal share reads "&lt; 1 sat".

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 pack link in chat adds the pack in place; coinos has its own share link.</title>
<updated>2026-09-15T16:38:47Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T16:38:47Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=dce411ae0a5f4f9475786b3bd4f419db0a371709'/>
<id>urn:sha1:dce411ae0a5f4f9475786b3bd4f419db0a371709</id>
<content type='text'>
Tapping "Emoji pack" on a phone opened Vector: the chip was an outbound
link to vectorapp.io, a domain the Vector app owns. The chip is now a
button — one tap adds the pack right here, nothing leaves coinos.

Packs also get a coinos share link, v3.coinos.io/emojis/pack/&lt;naddr&gt;
(copy it from the picker's pack row). The Android app already claims
every v3.coinos.io path, so on a phone that link opens coinos, which adds
the pack once the wallet is open. Pack links from any host render as the
chip; the naddr's kind is what's checked.

Pack changes now save at once (learned shortcodes stay coalesced) — a
remove followed straight away by a navigation was lost to the debounce.

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 reply's quoted line shows its custom emoji as pictures.</title>
<updated>2026-09-15T16:33:36Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T16:33:36Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=8f3ef61e4fbaf8c7cf586ed1280fd8f4bdc624ae'/>
<id>urn:sha1:8f3ef61e4fbaf8c7cf586ed1280fd8f4bdc624ae</id>
<content type='text'>
The quote above a reply bubble, the composer's reply bar, and the same
on the public /chat page rendered the raw :shortcode:. They now run the
one-line snippet through the same NIP-30 tokenizer, cutting on text so a
shortcode is never sliced in half.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>Custom emoji in chat: :shortcodes: render as pictures, packs sync with Vector.</title>
<updated>2026-09-15T16:27:45Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T16:27:45Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=c90d0f3c600802b5b4b43959df5fd2d02f78012c'/>
<id>urn:sha1:c90d0f3c600802b5b4b43959df5fd2d02f78012c</id>
<content type='text'>
A message from Vector says :pika_wave: and carries a NIP-30
["emoji", code, url] tag for it; coinos showed the bare shortcode. Now the
bubble shows the picture (in rooms, DMs, the feed and the public /chat
page), a bubble that is only one to three of them shows them big, and a
:code: reaction chip is a picture too.

Sending: every :code: you type that resolves travels with its tag, so the
other side renders it whether or not they hold the pack. Shortcodes come
from packs you hold (NIP-51 kind 30030 sets) and from what you've seen in
chat, so anyone can answer a :pika_wave: with one. The composer
autocompletes on ":pi" (Tab/Enter takes the first), the reaction picker
lists custom emoji first, and Vector's pack share link renders with an
Add button; a pasted naddr works too.

Packs live on your kind 10030 list — the one Vector reads and writes — so
a pack added in either app appears in both. tools/emoji-test.js drives the
real coinos room headlessly and checks all of the above.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>Join suggests communities from the Vector Hub, searchable, beside the paste box.</title>
<updated>2026-09-15T04:39:07Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T04:39:07Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=63b21d98e1649094802173e19f73a211f2f8c07c'/>
<id>urn:sha1:63b21d98e1649094802173e19f73a211f2f8c07c</id>
<content type='text'>
The Join panel used to be one empty box asking for a link nobody had.
It now lists the Vector Hub's public communities under it — icon, name,
member count, category, description, sorted by size, marked when you're
already in one — fetched on demand and kept for the session. The same
box takes a link or filters the list; a tapped suggestion previews
exactly like a pasted invite, since every listing is a CORD-05 link.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Invite links open in Vector, communities sync across Concord clients, and any emoji can be a reaction.</title>
<updated>2026-09-15T02:40:35Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T02:40:35Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=20673a4a7ae83f04ad843529c0c1ff1011dee93c'/>
<id>urn:sha1:20673a4a7ae83f04ad843529c0c1ff1011dee93c</id>
<content type='text'>
Vector's bundle parser has no default for a channel's key and epoch, so
a coinos invite — which sent only id and name — failed its whole JSON
parse and the link did nothing there. Every channel entry now carries
key and epoch (a public channel's key is the community_root at the base
epoch, CORD-05 §1), and bundles minted before this are re-signed at the
same coordinate once per device, so links already shared start working.

Concord clients now keep their Community List as kind 33302 fragments
(CORD-02 §8): addressable per index, NIP-44 to self, 32-byte values as
unpadded base64url, embedded join material without its community_id,
seed omitted when it equals current. coinos read and wrote only the
retired single-event 13302 on its own two relays, so a community joined
in Vector under the same key never appeared here. The fragmented list
is now read from our relays, the stock CORD set and every held
community's relays, merged, and written back in the same shape; the
home view re-syncs after a minute and a live subscription brings a
fresh write straight in. 13302 stays for older coinos devices.

The reaction row keeps its quick emojis, recents first, and a + opens
a searchable picker of a few hundred more — eyes included.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A picture can be sent to a channel or a DM, encrypted, and read by Vector.</title>
<updated>2026-09-15T02:25:06Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T02:25:06Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=b363da843ffcaea89a9ec11ce0cacc180a824f00'/>
<id>urn:sha1:b363da843ffcaea89a9ec11ce0cacc180a824f00</id>
<content type='text'>
The composer grows a paper clip. A picked file is encrypted under a
fresh AES-GCM key and 16-byte nonce, the ciphertext uploaded to a public
Blossom host that takes anonymous blobs (blossom.ditto.pub, then
nostr.download as a fallback copy), and the pointer posted the way
Vector posts it: a kind-9 with empty content and a NIP-92 imeta tag
carrying url, mime, key, nonce, both hashes, size and dimensions. In a
DM it is a NIP-17 kind-15 file message with the same fields as flat
tags and the url as content, wrapped to the peer and to ourselves.
Kind-15 file messages are now accepted on receive too, rendered like
any attachment, and previewed as a photo in the thread list.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A picture sent to a channel shows up as a picture, not an empty bubble.</title>
<updated>2026-09-15T02:18:28Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T02:18:28Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=2b63cdbd2eacbcbd031de6616147d467da8a7c3c'/>
<id>urn:sha1:2b63cdbd2eacbcbd031de6616147d467da8a7c3c</id>
<content type='text'>
Vector attaches files as NIP-92 imeta tags: the blob is encrypted with
a one-off AES-GCM key before it reaches Blossom, and the tag carries the
url, mime, key, nonce, plaintext sha256 and dimensions. Such a message
has no text, so the bubble rendered blank. The blob is now fetched
(fallback hosts too), decrypted in the browser, checked against the
hash, and shown from an object URL — a grey box its shape while it
loads, tap to view full size, other file types as a download by name.
The same tags render in DMs.

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