<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/package.json, branch fdroid-v1.6</title>
<subtitle>coinos v3 — bitcoin, Ark, Lightning and nostr wallet (web + Android)</subtitle>
<id>https://git.coinos.io/coinosv3.git/atom?h=fdroid-v1.6</id>
<link rel='self' href='https://git.coinos.io/coinosv3.git/atom?h=fdroid-v1.6'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/'/>
<updated>2026-09-17T15:19:41Z</updated>
<entry>
<title>Android: a reproducible F-Droid flavor with the web app bundled inside.</title>
<updated>2026-09-17T15:19:41Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-17T15:19:41Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=1bd3e2613641a8d2bc63c262a58cad126632459f'/>
<id>urn:sha1:1bd3e2613641a8d2bc63c262a58cad126632459f</id>
<content type='text'>
The Android builds so far were shells around the live site: a verified
APK proved nothing about the code that ran. The new `fdroid` flavor
(io.coinos.fdroid) shares the WebView shell and carries the built web
app in its assets. The page still lives at the v3.coinos.io origin — same
storage, links and gift URLs — but every file under it is answered from
the APK (Assets.java); only the site's live API paths reach the network,
and the bundled page registers no service worker (HAL_NO_SW=1).

Two clean unsigned builds give the same APK. COINOS_UNSIGNED=1 builds
without the keystore; Bun is pinned via packageManager; the Gradle wrapper
properties pin 8.12. fdroid/io.coinos.fdroid.yml is the fdroiddata recipe
(checksum-pinned Bun in sudo, prebuild web build, scandelete, our signing
key allowed for the Binaries match) and docs/REPRODUCIBLE.md the how-to.
Verified on a phone: the bundled build cold-starts in airplane mode.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JuwQqNWtDJcxPWtEm9134z
</content>
</entry>
<entry>
<title>MIT.</title>
<updated>2026-09-15T00:39:56Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-15T00:39:56Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=7a1a628366d7ef8888b49217ae04cc9bcb97799e'/>
<id>urn:sha1:7a1a628366d7ef8888b49217ae04cc9bcb97799e</id>
<content type='text'>
The licence file, the package field, a line in the README, and the
Zapstore listing's license tag — so the store says what the repo says.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QYJfZ4A1TDCEY4Foq3CApR
</content>
</entry>
<entry>
<title>Two new doors, no new locks: "Sign in with Google" (pomegranate — the nostr key FROST-sharded 2-of-3 across community operators, Google as coordinator and recovery, a plain bunker:// URI feeding the existing signer flow) and passkey sign-in (WebAuthn PRF derives the key deterministically, treated exactly like a pasted nsec, synced wherever the platform carries the passkey) — both lazy chunks, neither touching the first paint</title>
<updated>2026-08-27T04:03:07Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-27T04:03:07Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=358ffb856892bff8e99287d3debc5937ed5183ef'/>
<id>urn:sha1:358ffb856892bff8e99287d3debc5937ed5183ef</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_019eA8JRq9Wr7z2fRQk99HLi
</content>
</entry>
<entry>
<title>Remove the Hal Finney tribute</title>
<updated>2026-08-02T19:57:32Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-02T19:57:32Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=6416bd5dd79c3bdde5dfa7e7ec95fc811fbcdb28'/>
<id>urn:sha1:6416bd5dd79c3bdde5dfa7e7ec95fc811fbcdb28</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>Rebrand: hal → coinos v3</title>
<updated>2026-08-02T19:32:14Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-02T19:32:14Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=1fdaa920d7530ac2073ca50280d9531935446c7a'/>
<id>urn:sha1:1fdaa920d7530ac2073ca50280d9531935446c7a</id>
<content type='text'>
The app already presents as Coinos; this finishes the job in the repo:
package name, README, GitHub link, code comments, and the stale locale
lines that still explained the old "Hal Wallet" name (they fall back to
the English tribute line). Kept: the hal-nwc-pouch IndexedDB name (an
upgrade-compat identifier), the halwallet.app domain in the BIP-353
names feature (live infrastructure), and the Hal Finney tribute itself.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>Build profiles: HAL_FEATURES selects which features ship</title>
<updated>2026-07-04T16:10:04Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-07-04T16:10:04Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=11b2a56a320bbd66b98991fd08478d154ff6c717'/>
<id>urn:sha1:11b2a56a320bbd66b98991fd08478d154ff6c717</id>
<content type='text'>
build.js swaps src/features/index.js for a generated module importing
only the enabled features (gifts,swaps,ark,sp — unset means all,
"none" means a plain on-chain wallet), so excluded feature code and
its network endpoints never enter the bundle. Minimal profile:
476KB vs 577KB, with the Ark/gRPC, Boltz, and MuSig2 code verifiably
absent. `bun run build:minimal` builds it.

tools/minimal-smoke.js proves the minimal profile end-to-end: no
receive-mode dropdown, no gift button, no swap/Ark/SP settings cards,
no page errors, and a plain on-chain receive still lands. The two
blessed profiles are full (everything, the existing e2e suites) and
minimal (this smoke test); other combos should work but aren't CI'd.

Gift and SP primitives still live inside wallet.js, so those bytes
remain in the minimal bundle for now — extracting them is the next
step if we want the core leaner still.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01QFAcD4V284DvYZZHP7Rxxy
</content>
</entry>
<entry>
<title>Add optional password-encrypted persistence for full accounts</title>
<updated>2026-06-24T22:06:26Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-24T22:06:26Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=bdc5779b425151f47a4f5c93566a9f40f952428d'/>
<id>urn:sha1:bdc5779b425151f47a4f5c93566a9f40f952428d</id>
<content type='text'>
Per-account "Save on this device" encrypts a seed account into a
localStorage vault (scrypt KDF + XChaCha20-Poly1305 via @noble), so it
survives a browser close. On reopen, a vault prompt unlocks all saved
wallets with the password (or "Use another wallet" to skip). Default
stays session-only; the password is held only in memory for the session
and re-encrypts on save/forget. Wrong password fails closed (AEAD).
Adds @noble/ciphers dependency. New strings translated across all 19
locales.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Rebrand to Hal Wallet; roomier language-select caret</title>
<updated>2026-06-24T15:03:25Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-24T15:03:25Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=2b2e62375738e5d3f7b627e0a5d69b627194612d'/>
<id>urn:sha1:2b2e62375738e5d3f7b627e0a5d69b627194612d</id>
<content type='text'>
- Name the app "Hal Wallet" (header, title, PWA manifest, package.json).
  A nod to Hal Finney — just the name, no taglines or tributes.
- appTitle is a brand name now, so it's constant across locales (dropped
  the translated overrides; they fall back to "Hal Wallet").
- Replace the native &lt;select&gt; caret with a custom chevron spaced off the
  right border (the native one is crammed against the edge in Chrome).

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add QR scanner to the send page (lazy-loaded decoder)</title>
<updated>2026-06-24T06:05:52Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-24T06:05:52Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=d5e55c9c577feb6f8000bad3c37045a2cd7c9b4c'/>
<id>urn:sha1:d5e55c9c577feb6f8000bad3c37045a2cd7c9b4c</id>
<content type='text'>
Scan a Bitcoin address, a BIP21 URI (fills address + amount), or a
signed-transaction QR (opens a broadcast confirmation, then relays it)
from a viewfinder button on the Send form.

Decoder strategy keeps the main bundle small:
- Prefer the native BarcodeDetector (Chrome desktop/Android) — no lib.
- Otherwise lazy-load jsQR from a separate dist/jsqr.js, only when the
  scanner is opened. jsQR stays out of index.html (~424 KB vs ~551 KB)
  and off the initial load.
- The service worker precaches jsqr.js so offline scanning works for
  installed PWAs on browsers without BarcodeDetector.

The scanner needs a camera + secure context, so it never shows on a
standalone file:// page; offline air-gapped signing is unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Sync wallet state across devices via encrypted Nostr events</title>
<updated>2026-06-16T06:15:44Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-16T06:15:44Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=60db237749a1189d57b8783cd318c60d6df0cbcc'/>
<id>urn:sha1:60db237749a1189d57b8783cd318c60d6df0cbcc</id>
<content type='text'>
Persist wallet state (addresses, utxos, history, indices, fees) as a NIP-44
encrypted, parameterized-replaceable event (kind 30078) addressed to self on
relay.coinos.io. The Nostr identity is derived from the same seed (NIP-06), so
no extra secret. On load we pull the latest state from Nostr — a device with
no local cache gets full state without re-scanning, and another device's
updates propagate — using savedAt to keep the newest copy. localStorage stays
as the instant/offline cache; state is published (debounced) on every change.

(Relay note: added kind 30078 to the strfry write-policy allowlist on prod.)

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
