<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/dev.js, 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-06-29T14:22:30Z</updated>
<entry>
<title>Dev: proxy all regtest backends through the dev server for LAN/phone testing</title>
<updated>2026-06-29T14:22:30Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-29T14:22:30Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=729690e58a2601ec9c96f5b4431944c1d8f999c7'/>
<id>urn:sha1:729690e58a2601ec9c96f5b4431944c1d8f999c7</id>
<content type='text'>
The dev server already binds 0.0.0.0, but the app's regtest data source + SP
indexer pointed at localhost, which on a phone means the phone's own localhost.
Proxy them all through the dev server (same-origin), like /boltz already was:
HTTP by prefix (/boltz, /esplora, /sp) and WebSocket by exact path (/electrum →
Fulcrum, /sp/ws → SP indexer), with a Bun websocket relay. The regtest presets
become relative paths, and a small absWsUrl() resolves '/path' WS URLs to
ws(s)://&lt;page-host&gt;/path so they work from any device hitting the dev server.

No per-device config, no CORS. Verified: /electrum relays Fulcrum 2.1.1, /esplora
returns the tip height, and the desktop wallet still loads (balance 98,444) and
connects through the proxy with no errors.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Swaps(regtest dev): proxy boltz through the dev server to fix CORS 'failed to fetch'</title>
<updated>2026-06-29T04:59:07Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-29T04:59:07Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=fcd971da0c110607ccdc7637667beb0fa79d42a7'/>
<id>urn:sha1:fcd971da0c110607ccdc7637667beb0fa79d42a7</id>
<content type='text'>
The regtest boltz API (localhost:9001) sends no CORS headers, so the browser
blocked cross-origin fetches — creating a Lightning invoice failed with 'failed
to fetch', and the limits GET silently fell back to defaults (min showed 25k
instead of regtest's real 50k). bun E2E tests didn't hit this (no CORS enforced).

dev.js now proxies /boltz/* to localhost:9001 (adding CORS + handling the OPTIONS
preflight), and the 'local' boltz preset points at the same-origin /boltz path.
Public providers (mainnet/testnet) already send CORS and are unaffected.

Verified: GET limits via proxy returns the real 50k/40.29M with CORS; POST
create-reverse succeeds; the browser swap form now shows Min 50,000.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>dev: send no-store so the browser never pins stale dev code</title>
<updated>2026-06-27T17:03:56Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-27T17:03:56Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=5082edae2a89c202016dc8337ba432aa3409d1ba'/>
<id>urn:sha1:5082edae2a89c202016dc8337ba432aa3409d1ba</id>
<content type='text'>
Relaunching Chrome restores tabs from session cache without re-fetching, so
old inlined code (e.g. the pre-fix _rpcId path that sent id:null) kept running.
no-store also disables bfcache, forcing a fresh build on every load.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Split translations into per-language files, lazy-loaded</title>
<updated>2026-06-24T15:59:31Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-24T15:59:31Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=17acf5ec80a0c0b0acc44a6a8373e154c68d4748'/>
<id>urn:sha1:17acf5ec80a0c0b0acc44a6a8373e154c68d4748</id>
<content type='text'>
Only English is bundled in index.html now; the other 19 languages are
emitted as dist/locales/&lt;code&gt;.json and fetched on demand when a visitor
actually uses one (via auto-detect, the picker, or ?lang=xx). This drops
index.html from ~511KB to ~318KB; a non-English visitor fetches just
their one ~8-10KB locale, which the service worker then caches for
offline use. t() falls back to English until a locale resolves.

- i18n.js keeps only en + a loadLocale() fetcher; locale data moved to
  src/locales/*.json.
- build.js emits dist/locales/; dev.js serves /locales/&lt;code&gt;.json.
- Deploy hook publishes the locales/ subdir.

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>Rebuild as single-file offline BIP84 wallet</title>
<updated>2026-06-15T06:01:03Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-06-15T06:01:03Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=c5443946031ec32a7b3008fa751eb7916654a9f6'/>
<id>urn:sha1:c5443946031ec32a7b3008fa751eb7916654a9f6</id>
<content type='text'>
Replace the SvelteKit/daisyUI prototype with a vanilla JS + hand-rolled CSS
app that Bun bundles (code + scure/noble crypto + QR + CSS) into one
self-contained dist/index.html runnable offline from file://.

Wallet core (src/wallet.js):
- BIP84 native-segwit HD wallet from BIP39 seed (+optional passphrase)
- gap-limit scan of receive/change chains, aggregate balance, tx history
- fresh receive/change addresses; signs with witnessUtxo only (enables
  offline signing with no prev-tx fetch)
- coin selection + fee estimation via btc-signer selectUTXO; send-max;
  manual coin control
- offline JSON snapshot export/import (keyless) + signed-tx hex/QR export
- realtime mempool.space WebSocket: track-addresses -&gt; debounced auto
  refresh of balances/history (no polling); live status badge

UI (src/app.js): clean light paper-wallet; create (with optional, skippable
backup verification) / import flow; receive (QR) / send / history / coins /
tools tabs; clickable logo returns home.

API (src/api.js): mempool.space wrapper with retry/backoff for scan-burst
rate limiting; single network choke-point for offline enforcement.

Verified: BIP84 spec vectors, build/sign/parse for auto/max/manual flows,
snapshot roundtrip, live scan + WebSocket, headless-Chrome UI smoke tests.

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