-
-
Notifications
You must be signed in to change notification settings - Fork 8
Debugging Guide
Pass -tabby-debug as a launch argument in Xcode:
- Product > Scheme > Edit Scheme > Run > Arguments
- Add
-tabby-debugto "Arguments Passed On Launch"
This enables TabbyDebugOptions.isEnabled, which turns on:
- Detailed service-level logging (prompt input, raw model output, normalized output)
- Verbose focus-tracking diagnostics
- Additional runtime metadata in console output
Debug logging is gated so that user content never appears in production logs.
Work through this decision tree:
1. Check the menu bar. Open Tabby's menu - does the status say anything useful?
2. Is Tabby disabled?
- Globally turned off? Check the "Enable Globally" toggle.
- App-disabled? The focused app may be in the disabled list. Check Settings > Disabled Apps.
- Terminal? Tabby automatically blocks terminal emulators (
TerminalAppDetector). - Secure field? Tabby refuses to operate on password fields.
- Missing permissions? Input Monitoring and Accessibility must both be granted.
All these checks live in SuggestionAvailabilityEvaluator.disabledReason().
3. Is the field recognized?
- Check
FocusSnapshot.capability- is it.supported? - If
.unsupportedor.blocked, the AX tree isn't exposing a usable text field. See App Compatibility Notes.
4. Is generation running?
- With
-tabby-debug, check Xcode console for prompt/generation output. - If the model isn't loaded, check
LlamaRuntimeManagerbootstrap state in the menu bar.
5. Is the result being suppressed?
-
SuggestionTextNormalizerstrips empty or prefix-echoing output. -
SuggestionSessionReconcilerinvalidates sessions when editor content diverges from the expected state.
Check the caret geometry quality:
| Quality | Meaning | Accuracy |
|---|---|---|
.exact |
App provides precise BoundsForRange
|
Pixel-accurate |
.derived |
Computed from child frame geometry | Usually close |
.estimated |
Fallback from field frame | Approximate |
If .estimated, the host app doesn't expose precise caret bounds via Accessibility. Check AXTextGeometryResolver and GhostSuggestionLayout.
Two systems prevent this:
-
SuggestionTextNormalizerstrips leading text that echoes the prefix. -
SuggestionSessionReconcilerinvalidates sessions when the editor text has changed since generation started.
Check both if you see stale or repeated output.
-
Empty output: Check
-tabby-debugconsole for the raw model response. The normalizer may be stripping everything. If the model returns thinking tokens (e.g.,<think>) the prompt should suppress them (seeLlamaPromptRenderer). -
Crashes: Check for
ggml_abortin the crash log - this usually means an oversized prompt exceeded the context window. Verify model file integrity withModelFileValidator.
Chrome and Electron apps recycle Accessibility node identifiers (CFHash values) between polls. This makes elementIdentifier unreliable for tracking which field is focused.
Tabby works around this using processIdentifier + focusChangeSequence instead. If you're debugging focus identity issues in these apps, check:
-
SuggestionSessionReconciler- session continuity logic -
ContextBuffer- context accumulation across polls
-
Restart the app.
PermissionManagerchecks are cached at startup. - Check signing. When running from Xcode, your development team must be configured for entitlements to activate. If the app isn't properly signed, macOS may silently deny Accessibility access.
- Check System Settings. Verify Tabby appears in Privacy & Security > Accessibility and Privacy & Security > Input Monitoring with checkmarks.
Concepts
Guides
Repo Docs