suppress password-manager capture on all API-key fields
1Password, Bitwarden, LastPass, and Safari Keychain were treating AI
provider API-key fields as site password fields and auto-saving them as
the saved credential — on next visit they offered the API key as the
user's site password, silently corrupting the password entry.
Fix: convert all six affected inputs from type="password" to type="text"
and add data-1p-ignore + data-lpignore="true" + data-bwignore="true" +
autocomplete="off". 1Password ignores autocomplete="off" alone, and
Bitwarden/LastPass scan id/name/placeholder/label-text heuristically, so
all three vendor ignore attributes are required.
convey/templates/init.html:
- #gemini-key: type=text + the four suppression attrs, drop the
hide/show toggle entirely (button + toggleGeminiKey() function)
- flatten the .input-wrap wrapper around gemini-key (served only to
align the deleted button; .input-wrap CSS stays — password field
at line 106 still uses it)
apps/settings/workspace.html:
- five API-key inputs (field-env-{google,openai,anthropic,revai,plaud}):
type=text + the four suppression attrs
- swap each .password-toggle initial icon 👁 → 👀
(eye-with-line) and title="Show …" → "Hide …" to match the new
visible-by-default starting state
- #field-password (Security section) left untouched — still type=password
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>