Troubleshooting

Everything we know about fixing TabMind / XKG when something goes sideways. Scan the table of contents; each section is one symptom + the fastest known fix.

Last revised: 2026-08-21


1. Installation

"The .deb / .dmg / .exe won't open"

On macOS you'll see "App is damaged and can't be opened" on the first install because the binary isn't yet notarized for your machine. Right-click the file in Finder, choose Open, then click Open in the dialog. The OS will remember the exception. This is fixed for all post-v1.0.0 builds.

"Chrome refused to load the extension"

The TabMind extension is unpacked during the beta. Open chrome://extensions, enable Developer mode, then Load unpacked and select the tabmind-extension/ directory inside your install path. On Brave / Edge / Arc the same toggle exists at brave://extensions, edge://extensions, etc.

"SQLite 3.40+ required"

On older Ubuntu LTS (20.04 and earlier) the system libsqlite3 is too old. We bundle SQLite 3.45 with the AppImage / .deb / .dmg so this should not happen — if it does, please open an issue with the output of ldd $(which xkg-desktop).

2. Capture

"TabMind isn't capturing my tabs"

Check the three pre-conditions, in order:

  1. The extension icon shows a violet dot (active), not grey (idle).
  2. The site's URL appears in the side panel within ~2 seconds of focus.
  3. Privacy mode tabs are excluded by design (we never see them).

If the icon is grey, click it once and re-grant the tabs + tabGroups permissions.

"Search returns 0 hits for terms I know are there"

Almost always: the FTS5 index is stale. Open Settings → Index → Rebuild now. Rebuild time is ~2 seconds per 1,000 messages; you can keep using the app while it runs.

3. Providers

"Grok key keeps getting rejected"

Grok (Free) requires a key from console.grok.x.ai. The keys from x.ai or the consumer app are different credentials and will return 401 invalid_api_key — regenerate at the developer console and paste the new one into Settings → Providers.

"Claude / ChatGPT / Gemini: 429 rate-limited"

We're rate-limited at the upstream LLM provider, not at our tier. The client will retry with exponential backoff up to 4 times (so 1s, 2s, 4s, 8s). If you burst more than ~60 requests/minute you'll start seeing 429s in the logs; either back off or upgrade to a higher upstream tier.

"My API key got logged in plaintext"

That is a bug; please email security@seele.agency with the log snippet immediately. As of v1.0.0 keys are scrubbed from the JSON-log serializer at the source — if you see one, something is bypassing the scrubber and we want to know.

4. Sync

"Devices don't converge after upload + download"

Run the built-in diagnostic:

xkg-cli sync-diag --device-a=$(hostname) --device-b=<peer>

Most common root causes:

"Envelope rejected: aes-gcm tag mismatch"

You have the right hub, the right device, the wrong key. The hub is handing back an envelope encrypted for a different device_id; either your device_id mismatches what you think, or another device of yours is on the same hub with a different key. Delete ~/.local/share/xkg-desktop/keys.json on the confused device and re-register.

"Sync stalls partway through a 3-device convergence"

You're almost certainly seeing the §1Sync property 6 ("replaying an old envelope is idempotent") exercise itself under load. The test tests/deferred/e2e_three_devices.rs::three_devices_converge_after_exchange asserts this and passes; in production it can take 20–60 seconds for larger stores. If the spin locks longer than 2 minutes, please file an issue with the output of xkg-cli sync-diag --verbose.

5. Storage

"My .xkg.sqlite is huge"

FTS5 keeps a contentless shadow table plus the main one; both grow linearly with message count. Normal range is 30–80 KB per 1,000 messages. If you're seeing > 5 MB per 1,000 messages, your store has un-pruned product-link rows — open Settings → Storage → Vacuum.

"Migration 'E' failed at version 7"

v1.0.0 ships migration v7 which renames the legacy tasks table to preserve user data. If your database is from a pre-v0.7 build the rename can fail because of leftover indexes. Run:

sqlite3 ~/.local/share/xkg-desktop/store.db \
  "DROP INDEX IF EXISTS idx_tasks_legacy;
   DROP TABLE IF EXISTS tasks_legacy;"

then relaunch — the migration will retry and succeed.

6. Reporting a bug

Open an issue at github.com/griptoad26/xkg-server/issues with:

  1. Output of xkg-cli diag --all (PII is auto-redacted).
  2. The first 50 lines of ~/.local/share/xkg-desktop/xkg-desktop.log (or the platform-equivalent path on macOS / Windows).
  3. Steps to reproduce.

For security issues, do not open a public issue — follow /acknowledgments.html for our coordinated disclosure process.