-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
When something looks wrong, this page tries to save you a debug session.
Symptom: Cards tab populates, but Sheet and Gaps show "No tagged spans yet" / "No questions or notes yet" even though the note has tagged spans.
Cause (≤ 1.3.0): The view looked up the active file via getActiveViewOfType(MarkdownView), which returns null when the side panel itself becomes the focused leaf. Clicking the Sheet or Gaps tab focused the panel → next refresh wiped paragraphs.
Fix: upgrade to 1.3.1+ — the view now uses workspace.getActiveFile(), which tracks the last active file across leaf switches.
Symptom: Cmd-P → Study: show due-card count shows 0 cards, or sr.api.queries.tagCounts() returns {} immediately after Obsidian loads.
Cause: the vault indexer initializes on workspace.onLayoutReady, which fires a few seconds after plugin load. If you query before that, you see an empty index.
Workaround: wait a moment, or subscribe to changes — sr.api.onIndexChange(cb) fires as soon as the first scan completes.
Check:
-
Mode filter — your tag's
inModesfield. By default custom tags appear in all five modes; if you set e.g.[5], only Regenerative mode surfaces it. -
Domain merge mode — if the active note has
semantic_domain:pointing at a profile inreplaceorsubsetmode, vault-wide custom tags don't apply. - Sigil validity — must start with a letter, 1–12 alphanumerics, not shadowing a built-in.
- Key conflict — built-in key bindings always win. Pick a different letter.
You enabled AI features but the key is empty or whitespace. Settings → AI co-reader → Anthropic API key. The key is stored in data.json (plugin folder), never in the vault.
Check the developer console (Cmd-Opt-I). Common causes:
-
Port in use — another process on
127.0.0.1:8745. Change the port in settings, orlsof -nP -iTCP:8745 -sTCP:LISTENto find the conflict. - Mobile platform — MCP is desktop-only. The toggle is a no-op on iOS/Android.
-
Token mismatch — if you set a bearer token, every client must send
Authorization: Bearer <token>. TheCopy configbutton generates a snippet with the right header.
Verify with Cmd-P → MCP server: show status.
- Provider not selected: Settings → Tasks app push → Provider dropdown.
- Token wrong scope or revoked. Generate a fresh token in Todoist's developer settings.
- All actions already synced: check the
skippedcount in the notice. Dedup usessrid_<block-id>_<note-path>labels — go to Todoist and look for these.
- Calendar app caches subscribed
.icsfiles heavily. Force a refresh or wait an hour. - The file path is configurable (Settings → Calendar). If you renamed/moved it, update your subscription URL.
- Events only emit when an
Aand aDare in the same paragraph and theDtext is parseable asYYYY-MM-DDorYYYY-MM-DDTHH:MM.
The note has no R-tagged spans whose text contains an arrow keyword (causes, supports, depends on, blocks, requires, implies, entails, contradicts, leads to, precedes, plus reverse forms). Either:
- Add R-tag spans like
{{R|attention drives cognition}}(keyword:drivesis not in the default set — usecauses/supports/depends on/etc.), or - Add your own keyword to the default map in
src/integrations/relation-graph.ts(custom mapping in settings is on the roadmap).
If the note has R-tags but they're all of the form {{R|X and Y are related}}, parsing returns no edges by design — the integration needs directional verbs to build a flowchart.
The atlas views render Def-tagged spans. If you've only used Q/A/M etc. with no Def, there's nothing to graph.
If you want to inspect the live plugin state, launch Obsidian with the CDP port open:
/Applications/Obsidian.app/Contents/MacOS/Obsidian --remote-debugging-port=9222Then in another terminal:
curl -s http://127.0.0.1:9222/json | headPick the page entry whose URL contains obsidian.md, grab its webSocketDebuggerUrl, and connect with any CDP client. For one-off probes, this Node script works:
// /tmp/probe.mjs
const TARGETS = await (await fetch('http://127.0.0.1:9222/json')).json();
const page = TARGETS.find(t => t.type === 'page' && t.url?.includes('obsidian.md'));
const ws = new WebSocket(page.webSocketDebuggerUrl);
const pending = new Map();
let nextId = 1;
const call = (method, params={}) => new Promise(r => {
const id = nextId++;
pending.set(id, r);
ws.send(JSON.stringify({ id, method, params }));
});
ws.addEventListener('open', async () => {
await call('Runtime.enable');
const res = await call('Runtime.evaluate', {
expression: process.argv[2] || '1+1',
returnByValue: true,
awaitPromise: true,
});
console.log(JSON.stringify(res.result, null, 2));
ws.close();
});
ws.addEventListener('message', e => {
const m = JSON.parse(e.data);
if (m.id && pending.has(m.id)) { pending.get(m.id)(m.result); pending.delete(m.id); }
});Run as node /tmp/probe.mjs 'app.plugins.plugins["semantic-reading"].api.queries.tagCounts()'.
This was how the 1.3.1 Sheet/Gaps bug was actually found.
If none of the above match, open an issue at https://github.com/DavidTbilisi/obsidian-semantic-reading/issues. Helpful to include:
- Plugin version (Settings → Community plugins → Semantic Reading → installed version).
- Obsidian version (
Cmd-P → Show debug info). - A minimal reproducible vault snippet (one note, the frontmatter, the tagged spans you used).
- Console output (
Cmd-Opt-I→ Console tab).
- Settings Reference
- Public API — the same probes work in any plugin/script context
- MCP Server — out-of-process verification