-
-
Notifications
You must be signed in to change notification settings - Fork 8
App Compatibility Notes
Jacob Fu edited this page May 21, 2026
·
2 revisions
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.
| 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. |
-
Enable debug mode. Pass
-tabby-debugas a launch argument in Xcode (see Debugging Guide). -
Focus a text field in the target app.
-
Check the menu bar status. What does Tabby report? Disabled, Idle, Generating, or nothing?
-
Check the console. With
-tabby-debug, focus tracking logs will show:- Application name and bundle identifier
- Field role/subrole
- Capability result (
.supported,.blocked,.unsupportedwith reason) - Caret geometry quality
-
Diagnose the result:
-
.unsupported- the app doesn't expose enough AX data. File an issue with the console output. -
.supportedbut caret is wrong - checkCaretGeometryQuality. If.estimated, the app lacks precise caret bounds. -
.supportedand caret is correct but no suggestion - the issue is in the generation pipeline, not focus tracking. See Debugging Guide.
-
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 viaSuggestionSettingsModel.
To change how a field is evaluated:
- Add logic to
FocusCapabilityResolver(field scoring) orFocusSnapshotResolver(AX tree traversal).
To find an app's bundle identifier:
osascript -e 'id of app "AppName"'
# or
mdls -name kMDItemCFBundleIdentifier /Applications/AppName.appConcepts
Guides
Repo Docs