Skip to content

App Compatibility Notes

Jacob Fu edited this page May 21, 2026 · 2 revisions

App Compatibility Notes

Tabby does not inject code into other processes. It reads their Accessibility tree from the outside. This means behavior depends entirely on what each host app's AX implementation exposes.

Known Quirks

App / Category Behavior Details
Chrome / Electron AX node identifiers recycle between polls CFHash values are reused, making elementIdentifier unreliable. Tabby uses processIdentifier + focusChangeSequence for identity instead. See SuggestionSessionReconciler.
Electron apps Caret geometry is approximate Many Electron apps don't expose BoundsForRange. Tabby falls back to child-frame-based estimation. CaretGeometryQuality will report .derived or .estimated.
Terminal emulators Automatically blocked Terminal.app, iTerm2, Kitty, Alacritty, Ghostty, Warp, WezTerm, Hyper, Rio. These have their own completion systems. See TerminalAppDetector.
Secure text fields Automatically skipped Password fields set isSecure in the AX tree. Tabby refuses to read or assist these.
Apps without AX support No suggestions shown Some apps don't expose text fields through Accessibility at all. FocusSnapshot.capability will report .unsupported.

How to Investigate a New App

  1. Enable debug mode. Pass -tabby-debug as a launch argument in Xcode (see Debugging Guide).

  2. Focus a text field in the target app.

  3. Check the menu bar status. What does Tabby report? Disabled, Idle, Generating, or nothing?

  4. Check the console. With -tabby-debug, focus tracking logs will show:

    • Application name and bundle identifier
    • Field role/subrole
    • Capability result (.supported, .blocked, .unsupported with reason)
    • Caret geometry quality
  5. Diagnose the result:

    • .unsupported - the app doesn't expose enough AX data. File an issue with the console output.
    • .supported but caret is wrong - check CaretGeometryQuality. If .estimated, the app lacks precise caret bounds.
    • .supported and caret is correct but no suggestion - the issue is in the generation pipeline, not focus tracking. See Debugging Guide.

Adding App-Specific Rules

To block an app entirely:

  • Add its bundle identifier to TerminalAppDetector (for terminal-like apps) or guide users to the per-app disable toggle in the menu bar, which persists via SuggestionSettingsModel.

To change how a field is evaluated:

  • Add logic to FocusCapabilityResolver (field scoring) or FocusSnapshotResolver (AX tree traversal).

To find an app's bundle identifier:

osascript -e 'id of app "AppName"'
# or
mdls -name kMDItemCFBundleIdentifier /Applications/AppName.app

Clone this wiki locally