Skip to content

Offer security codes beside the focused field - #92

Merged
nixfred merged 5 commits into
nixfred:mainfrom
bbishdotdev:feat/extension-free-otp
Sep 16, 2026
Merged

nixfred merged 5 commits into
nixfred:mainfrom
bbishdotdev:feat/extension-free-otp

Conversation

@bbishdotdev

@bbishdotdev bbishdotdev commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

What

otp_autofill=on offers incoming security codes beside the focused field, using
Linux accessibility. The prompt shares Blip's fonts and colors, handles separate
digit boxes, and falls back to the top right when field bounds are unavailable.
Codes remain available for five minutes across focus changes. No browser
extension or clipboard is needed.

Why

The existing code toast requires a copy or keyboard shortcut. This lets the user
fill from the field they are already using. The collector and Mac bridge stay
unchanged; setup covers SMS forwarding and browser accessibility.

How it was verified

  • bun test is green (CI will check) — 539 passing after merging current main
  • Any send/receive behavior was exercised against my own number only — never a contact or a group. No send behavior changed; automated verification used synthetic codes.
  • UI change → screenshot attached
  • Touches an invariant in CLAUDE.md → named below, and the doc updated if it changed

Synthetic codes filled single fields and digit groups in Brave and Chromium,
including delayed auto-advance and a leading zero. Unrelated focus stopped
insertion. Native GTK insertion, dismissal, expiry and domain matching passed.
Six Python adapter cases and all ten existing Mac Python suites pass. Python
and shell syntax checks pass; shellcheck is unavailable locally.
Chrome, Firefox and Zen have not been live-tested.

Invariants touched: five-minute code lifetime; message text stays off disk and
argv; configuration remains in bridge.conf; only the leader starts the helper.

Blip's prompt beneath the code fields in Brave (phone number blurred):

Blip autofill prompt beneath six verification-code fields in Brave

Capture a bounded group of adjacent native accessibility inputs and follow only its expected auto-advance sequence. This fixes first-digit-only fills after browser accessibility is enabled, including JavaScript-limited boxes without maxlength declarations. Preserve anchored prompts, private code transport and per-digit window/lock checks; refuse partial groups and mismatched code lengths.

Validate with 495 Bun tests, six adapter regressions, isolated Brave and Chromium digit-box fills, unrelated-focus refusal, and existing single-field and GTK checks.
Document SMS forwarding, browser accessibility, field groups and the optional bridge.conf key in the existing feature, privacy and security docs. Keep the setup note focused and add an Unreleased entry.

Separate transport and policy Bun tests and run the native adapter cases as a Python CI step, matching the bridge suites. Include the adapter in documented deployment and the existing demo copy. No new framework or runtime behavior change.

Validation: 496 Bun tests, six adapter cases, all nine Mac Python suites, Python compilation and bash syntax pass. Shellcheck is unavailable locally. The collector and Mac bridge remain unchanged.
Bring in current window, notification, attachment and UTC timestamp fixes. Keep both Unreleased changelog sections; the autofill integration and its five-minute lifetime are unchanged.

Validation: 539 Bun tests, six desktop adapter cases and all ten Mac Python suites pass. Python compilation and shell syntax pass.
@nixfred
nixfred merged commit b20e8cd into nixfred:main Sep 16, 2026
@nixfred

nixfred commented Sep 16, 2026

Copy link
Copy Markdown
Owner

Merged as b20e8cd. Thanks @bbishdotdev. I tested it merged onto current main in an Omarchy VM, with real mouse input, synthetic codes and a synthetic sign-in page in Chromium with --force-renderer-accessibility=complete:

  • one-time-code field: prompt under the field, Fill code inserted the code exactly
  • six digit boxes: filled across all six with auto-advance, leading zero intact
  • a field labelled Message: no prompt
  • a plain field labelled Notes: manual prompt, and a click inserted the code there, which matches what SECURITY.md documents for the manual fallback
  • the clipboard never held a code

The five-minute expiry I left to your unit tests. One note for anyone writing a fake bridge: codes de-duplicate by chat.db id, so a test that reuses one id only ever sees the first code. bun test 555 pass, Python adapter 6 OK. It is deployed here with autofill left off.

nixfred added a commit that referenced this pull request Sep 16, 2026
WHAT: CHANGE.log is a running, newest-first log of every change since the last
X post, each entry naming the person with real name, GitHub login and their
X account as a https://x.com/<handle> link. X-POSTS.md is the queue of posts
for @nixfred: Post 1 (CONTRIBUTORS-X-POST.md, 2026-09-11) marked posted,
Post 2 drafted covering the 19 merged PRs since (#54 #71-#77 #80-#82 #84 #85
#87 #88 #92-#95) plus 4bad82d and 481e555.
WHY: Fred's standing rule 2026-09-16. Handles were missed before; a thank-you
without the @ never reaches the person, and a wrong @ tags a stranger.
HANDLES: verified @jondkinney (GitHub profile), @zachwilke_1 (pinefall.dev),
@bbishdotdev (bbish.dev + name), @mwhuss (name + Omarchy posts replying to
@nixfred). @jefehoser likely (same login, Omarchy posts), flagged for Fred.
Ian Swope and cjoh: none verified, recorded as checked.
.gitignore: *.log swallowed CHANGE.log, so it is re-included explicitly.

LR-T: blip, changelog, x-posts, contributors, handles
LR-D: blip, docs, community
LR-K: change-log-verified-x-handles, x-post-queue

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ainpzHJ5F7nsV4hB6HpZy
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants