Skip to content

fix: remove Input Monitoring and suppress native permission popups#68

Merged
quiet-node merged 3 commits intomainfrom
worktree-enumerated-tumbling-lovelace
Apr 8, 2026
Merged

fix: remove Input Monitoring and suppress native permission popups#68
quiet-node merged 3 commits intomainfrom
worktree-enumerated-tumbling-lovelace

Conversation

@quiet-node
Copy link
Copy Markdown
Owner

Summary

  • Remove the Input Monitoring permission requirement from onboarding, simplifying the flow from 3 steps to 2 (Accessibility + Screen Recording). The CGEventTap at HID level receives cross-app keyboard events without needing a separate TCC entry.
  • Defer CGEventTap creation until Accessibility is already granted, preventing macOS from showing the native "Thuki would like to control your computer" popup during onboarding. The activator starts cleanly on the post-Screen Recording quit+reopen when both permissions are guaranteed.

Test plan

  • Fresh launch shows onboarding with no native Accessibility popup
  • Granting Accessibility in System Settings advances to Screen Recording step
  • Clicking "Open Screen Recording Settings" still shows the native Screen Recording popup (expected, needed to register Thuki in TCC)
  • After quit+reopen, hotkey (double-tap Control) works across all apps
  • Permission revocation triggers onboarding again on next launch

🤖 Generated with Claude Code

quiet-node and others added 2 commits April 8, 2026 12:42
Simplify the onboarding permission flow from 3 steps (Accessibility,
Input Monitoring, Screen Recording) to 2 steps (Accessibility, Screen
Recording). Input Monitoring checks and IOKit FFI bindings are removed
from permissions.rs and PermissionsStep.tsx. The CGEventTap at HID
level receives cross-app keyboard events without needing a TCC entry.

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>
Gate activator.start() behind is_accessibility_granted() so the
HID-level event tap is only created when permission already exists.
This prevents macOS from showing the native Accessibility popup
during onboarding; the activator starts cleanly on the post-Screen
Recording quit+reopen when both permissions are guaranteed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>
@quiet-node
Copy link
Copy Markdown
Owner Author

Code review

Found 1 issue:

  1. Em dashes introduced in PermissionsStep.tsx (global CLAUDE.md says "Never use em dashes (---) in any output: code comments, documentation, markdown files, commit messages, or prose. Use a contextually appropriate alternative instead: a colon, comma, semicolon, or period.")

Two em dashes were introduced on lines 149 and 298:

*
* Visual direction: Warm Ambient — dark base with a warm orange radial glow.
* The outer container is transparent so the rounded panel corners are visible

{/* Logo mark + title — drag region so the user can reposition the
onboarding window when it overlaps System Settings. */}

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>
@quiet-node quiet-node merged commit 89f06b8 into main Apr 8, 2026
@quiet-node quiet-node deleted the worktree-enumerated-tumbling-lovelace branch April 8, 2026 18:53
quiet-node added a commit that referenced this pull request Apr 10, 2026
* refactor: remove Input Monitoring permission requirement from onboarding

Simplify the onboarding permission flow from 3 steps (Accessibility,
Input Monitoring, Screen Recording) to 2 steps (Accessibility, Screen
Recording). Input Monitoring checks and IOKit FFI bindings are removed
from permissions.rs and PermissionsStep.tsx. The CGEventTap at HID
level receives cross-app keyboard events without needing a TCC entry.

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

* fix: defer CGEventTap creation until Accessibility is granted

Gate activator.start() behind is_accessibility_granted() so the
HID-level event tap is only created when permission already exists.
This prevents macOS from showing the native Accessibility popup
during onboarding; the activator starts cleanly on the post-Screen
Recording quit+reopen when both permissions are guaranteed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

* style: replace em dashes with appropriate punctuation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

---------

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>
quiet-node added a commit that referenced this pull request Apr 10, 2026
* refactor: remove Input Monitoring permission requirement from onboarding

Simplify the onboarding permission flow from 3 steps (Accessibility,
Input Monitoring, Screen Recording) to 2 steps (Accessibility, Screen
Recording). Input Monitoring checks and IOKit FFI bindings are removed
from permissions.rs and PermissionsStep.tsx. The CGEventTap at HID
level receives cross-app keyboard events without needing a TCC entry.

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

* fix: defer CGEventTap creation until Accessibility is granted

Gate activator.start() behind is_accessibility_granted() so the
HID-level event tap is only created when permission already exists.
This prevents macOS from showing the native Accessibility popup
during onboarding; the activator starts cleanly on the post-Screen
Recording quit+reopen when both permissions are guaranteed.

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

* style: replace em dashes with appropriate punctuation

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

---------

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>
quiet-node added a commit that referenced this pull request Apr 11, 2026
* refactor: remove Input Monitoring permission requirement from onboarding

Simplify the onboarding permission flow from 3 steps (Accessibility,
Input Monitoring, Screen Recording) to 2 steps (Accessibility, Screen
Recording). Input Monitoring checks and IOKit FFI bindings are removed
from permissions.rs and PermissionsStep.tsx. The CGEventTap at HID
level receives cross-app keyboard events without needing a TCC entry.

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

* fix: defer CGEventTap creation until Accessibility is granted

Gate activator.start() behind is_accessibility_granted() so the
HID-level event tap is only created when permission already exists.
This prevents macOS from showing the native Accessibility popup
during onboarding; the activator starts cleanly on the post-Screen
Recording quit+reopen when both permissions are guaranteed.

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

* style: replace em dashes with appropriate punctuation

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>

---------

Signed-off-by: Logan Nguyen <lg.131.dev@gmail.com>
This was referenced Apr 11, 2026
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