From d8964bdf6f047d058731edfae6d07e57106661c8 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 4 Aug 2026 00:01:27 -0700 Subject: Offer a password the first time you lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi --- src/i18n.js | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/i18n.js') diff --git a/src/i18n.js b/src/i18n.js index a1d5390..99640a3 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -82,6 +82,10 @@ const STR = { pwTooShort: 'Use at least 8 characters.', pwMismatch: 'Passwords do not match.', pwWrong: 'Wrong password.', + pwNeededToLock: 'Enter a password, or choose "Not now".', + lockPwTitle: 'Protect this device?', + lockPwDesc: 'Your wallets stay saved here when you lock. Without a password anyone holding this device can open them again — set one and it will be asked for every time.', + lockPwSkip: 'Not now', unlockSaved: 'Unlock saved wallets', unlockSavedDesc: 'Enter your password to open the wallets saved on this device.', unlock: 'Unlock', -- cgit v1.2.3