Skip to content

feat(mobile): QR/code pairing flow with security hardening - #317

Merged
wesbillman merged 1 commit into
mainfrom
feat/mobile-pairing
Apr 14, 2026
Merged

feat(mobile): QR/code pairing flow with security hardening#317
wesbillman merged 1 commit into
mainfrom
feat/mobile-pairing

Conversation

@wesbillman

Copy link
Copy Markdown
Collaborator

Summary

  • Add mobile pairing UI with QR code scanning and manual code paste, plus auth persistence via secure storage
  • Desktop settings gets a new "Mobile Pairing" card that generates QR codes for mobile to scan
  • Security hardening from adversarial review: SSRF protection on relay URLs, HTTPS enforcement in release builds, QR scanner de-duplication, re-entrancy guard on pair(), redacted error toString()
  • Offline retry screen when network is down at startup (instead of forcing re-pairing)
  • Dev-only Env.apiToken bypass gated behind kDebugMode
  • 22 new tests (16 provider + 6 widget) covering happy paths, error states, SSRF rejection, and race conditions

Test plan

  • Scan a QR code from desktop settings and verify pairing completes
  • Paste a sprout://... code manually and verify pairing completes
  • Kill network before app launch with valid stored creds — should see offline retry screen, not pairing
  • Scan a crafted QR with a private IP relay URL — should show "private network" error
  • Verify flutter test passes (33 tests green)

🤖 Generated with Claude Code

Add mobile pairing UI (QR scan + paste code) and auth persistence via
secure storage. Includes SSRF protection on relay URLs, TLS enforcement
in release builds, QR scanner de-duplication, re-entrancy guard, and an
offline retry screen for network errors at startup. Desktop side adds a
pairing card in settings that generates QR codes for mobile to scan.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@wesbillman
wesbillman merged commit 4c37a57 into main Apr 14, 2026
10 checks passed
@wesbillman
wesbillman deleted the feat/mobile-pairing branch April 14, 2026 17:44
kaalph pushed a commit to kaalph/buzz that referenced this pull request Aug 21, 2026
# By Wes (12) and others
# Via GitHub
* main: (26 commits)
  feat(mobile): websocket streaming with real-time messaging (block#323)
  feat(markdown): add image/video preview, lightbox, and multi-image gallery (block#316)
  feat(composer): add rich text editor with formatting and mentions (block#310)
  feat(mobile): align design language with desktop and polish UI (block#321)
  fix: lock file registry (block#318)
  feat(mobile): QR/code pairing flow with security hardening (block#317)
  feat: Sprout Huddles — voice conversations with AI agents (block#299)
  feat(mobile): add channel list with relay integration (block#315)
  feat: add change member role in channel sidebar (block#313)
  feat(desktop): deterministic nested thread panels (block#308)
  fix: show private channels in channel browser when user is a member (block#311)
  Replace inline channel creation with dialog (block#312)
  chore: improve chat message layout to left-aligned design (block#309)
  Add edit dialog for managed agents with relay profile sync (block#277)
  fix(ci): build relay with optimized profile to fix flaky e2e tests (block#307)
  Update actions/checkout action to v6 (block#305)
  Update dependency @tanstack/react-query to v5.98.0 (block#304)
  Update dependency @playwright/test to v1.59.1 (block#303)
  Update react monorepo to v19.2.5 (block#302)
  feat(mobile): scaffold Flutter app with Riverpod & Catppuccin theme (block#306)
  ...

# Conflicts:
#	desktop/src-tauri/Cargo.lock
#	desktop/src-tauri/Cargo.toml
#	desktop/src-tauri/src/lib.rs
#	desktop/src/features/channels/ui/ChannelScreen.tsx
kaalph pushed a commit to kaalph/buzz that referenced this pull request Aug 21, 2026
# By Wes (12) and others
# Via GitHub
* main: (26 commits)
  feat(mobile): websocket streaming with real-time messaging (block#323)
  feat(markdown): add image/video preview, lightbox, and multi-image gallery (block#316)
  feat(composer): add rich text editor with formatting and mentions (block#310)
  feat(mobile): align design language with desktop and polish UI (block#321)
  fix: lock file registry (block#318)
  feat(mobile): QR/code pairing flow with security hardening (block#317)
  feat: Sprout Huddles — voice conversations with AI agents (block#299)
  feat(mobile): add channel list with relay integration (block#315)
  feat: add change member role in channel sidebar (block#313)
  feat(desktop): deterministic nested thread panels (block#308)
  fix: show private channels in channel browser when user is a member (block#311)
  Replace inline channel creation with dialog (block#312)
  chore: improve chat message layout to left-aligned design (block#309)
  Add edit dialog for managed agents with relay profile sync (block#277)
  fix(ci): build relay with optimized profile to fix flaky e2e tests (block#307)
  Update actions/checkout action to v6 (block#305)
  Update dependency @tanstack/react-query to v5.98.0 (block#304)
  Update dependency @playwright/test to v1.59.1 (block#303)
  Update react monorepo to v19.2.5 (block#302)
  feat(mobile): scaffold Flutter app with Riverpod & Catppuccin theme (block#306)
  ...

# Conflicts:
#	desktop/src-tauri/Cargo.lock
#	desktop/src-tauri/Cargo.toml
#	desktop/src-tauri/src/lib.rs
#	desktop/src/features/channels/ui/ChannelScreen.tsx
BradGroux pushed a commit to BradGroux/buzz that referenced this pull request Aug 23, 2026
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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.

1 participant