<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinosv3.git/tools/lock-wallet-test.js, 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-13T16:48:54Z</updated>
<entry>
<title>The front door points at your own keys.</title>
<updated>2026-09-13T16:48:54Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-13T16:48:54Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=38b3d091e8e1bece958c0d7e80a5ee78434de933'/>
<id>urn:sha1:38b3d091e8e1bece958c0d7e80a5ee78434de933</id>
<content type='text'>
Four buttons of equal weight, and only the sign-in ones said what they
did. "Get started" said nothing, so the concrete offer on that screen was
Google — which is a convenience wrapped around a seed phrase, not an
alternative to one.

Now the page says what the wallet is before it offers a button, the way
in reads "Create a new wallet" with the cost under it (a minute, twelve
words), and the three sign-ins sit below a line labelled "or, if you
already have an account".

And the second half of the same problem: a wallet that arrives by sign-in
has a recovery phrase its owner has never seen and nobody can reissue.
So the wizard shows it once, right after the first login, while it still
reads as setting up rather than as a warning out of nowhere. "I've
written it down" is the way on; "Later" is a real answer, and the wallet
then keeps one quiet line — not a modal, not dismissible, gone the moment
the phrase is actually seen, here or in settings.

seedSeen records that per account: creating shows the words, importing
means they typed them, revealing in settings counts. Only a derived seed
starts false, which is exactly the case worth asking about.

tools/onboard-backup-test.js covers both halves, including that "Later"
leaves a reminder that survives a reload and leads somewhere.

The sixteen tests that clicked the old button by its text are updated,
and it has an id now so its copy can change without breaking them again.

Co-Authored-By: Claude Opus 5 (1M context) &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_019mrt228Upn9nNCwGixzSLx
</content>
</entry>
<entry>
<title>The seed takes dice: an optional entropy field folds open on the generate step, hashed with the device's own randomness so it can only strengthen the phrase — and the forget option now says all data, which is what it takes</title>
<updated>2026-08-17T15:12:34Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-17T15:12:34Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=b62ca1099ff996e333015142cb712687737d4637'/>
<id>urn:sha1:b62ca1099ff996e333015142cb712687737d4637</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
</content>
</entry>
<entry>
<title>One Log out button, one honest question: the popup offers the plain exit and the full forget, each keeping its own warnings</title>
<updated>2026-08-17T14:13:06Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-17T14:13:06Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=47dba03047b4b5b820d59fc5c1af7a1768ba7274'/>
<id>urn:sha1:47dba03047b4b5b820d59fc5c1af7a1768ba7274</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
</content>
</entry>
<entry>
<title>The profile grows a second, honest exit: Log out leaves the room, Log out &amp; forget this device burns it down — behind the Delete-all warning, which now also sweeps the cached balances and history it always implied</title>
<updated>2026-08-17T14:03:28Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-17T14:03:28Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=49ae68290099bc37bbbf6d7ad4dee9f906623a38'/>
<id>urn:sha1:49ae68290099bc37bbbf6d7ad4dee9f906623a38</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
</content>
</entry>
<entry>
<title>The wallet row's delete earns a trash can instead of an ambiguous ✕, and Clear all says Delete all — the word for what it does</title>
<updated>2026-08-17T13:57:10Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-17T13:57:10Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=ede4516e2255bb65d22dd1a74d0e8332b0417194'/>
<id>urn:sha1:ede4516e2255bb65d22dd1a74d0e8332b0417194</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
</content>
</entry>
<entry>
<title>The lock test learns the doors moved: logout is the front door and asks for a password once ever (the guard is finally wired to its comment), the padlock keeps asking because it must, and the suite walks the real UI again</title>
<updated>2026-08-17T03:22:28Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-17T03:22:28Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=16f513da8d319a8f940c713ddc8358399cd2e434'/>
<id>urn:sha1:16f513da8d319a8f940c713ddc8358399cd2e434</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JtaatFfAbx91Nh3xqKVqKz
</content>
</entry>
<entry>
<title>Offer a password the first time you lock</title>
<updated>2026-08-04T07:01:27Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-04T07:01:27Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=d8964bdf6f047d058731edfae6d07e57106661c8'/>
<id>urn:sha1:d8964bdf6f047d058731edfae6d07e57106661c8</id>
<content type='text'>
Locking with no password locks nothing — the wallets sit on the device
under an empty one and reopen with a tap. So the first deliberate lock
now asks whether to set one, explaining plainly what happens if you
don't. 'Not now' is a real answer, recorded, and never asked again: a
wallet that nags is a wallet people stop reading.

The offer rides the deliberate lock only. lock() is also where the idle
timer, the last-wallet-removed path and boot-after-expiry land, and a
password form appearing because you went to lunch is a different app
than the one you left.

Two subtleties worth naming: the offer is set after lock()'s ui reset
block, which clears ui.pw and had been swallowing it; and taking the
offer re-enters lock(), which now finds a password and lands on the
unlock screen instead of the wallet list.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>Call it 'Lock wallet', because that is what it does</title>
<updated>2026-08-04T06:54:55Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-04T06:54:55Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinosv3.git/commit/?id=5682cc88e54f00ce01fdd2ef01e5bb1a207b1be2'/>
<id>urn:sha1:5682cc88e54f00ce01fdd2ef01e5bb1a207b1be2</id>
<content type='text'>
'Logout' promises a return to a fresh app with nothing of yours left on
it. This closes the open wallet and keeps everything saved, which is why
it read as interchangeable with 'Clear all' — the one that really does
send you back to the beginning.

Renamed via a new key rather than rewording the old one: nineteen locale
tables carry their own word for 'Logout' and t() prefers the locale's
value, so reusing the key would have kept the wrong meaning in every
language but English. The dead key is dropped from those files; they
fall back to English until translated.

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