-
Notifications
You must be signed in to change notification settings - Fork 0
Integrations
Eight hooks that take semantic tags out of Obsidian and into the rest of your stack. Each integration is a self-contained module under src/integrations/, registers a command, and adds a settings section.
| # | Integration | Direction | Network |
|---|---|---|---|
| 1 | AnkiConnect sync | push | localhost only |
| 2 | Dataview starter pack | scaffold | none |
| 3 | Tasks MOC | scaffold | none |
| 4 | Daily note injection | scaffold | none |
| 5 | Relation graph | scaffold | none |
| 6 | ICS calendar export | push | none |
| 7 | Tasks app push | push | Todoist / Things 3 |
| 8 | Readwise / Kindle import | pull | Readwise / file |
| (+1) | MCP server | bidirectional | localhost only |
Command: Sync cards to Anki (AnkiConnect)
Pushes every Def + Q span as one Anki card each. Requires the AnkiConnect add-on installed in Anki desktop.
- Endpoint:
http://127.0.0.1:8765(configurable). - Deck:
Semantic Reading(configurable). - Model: Basic.
- Dedup: each card gets an
srid_<block-id>tag. Re-syncs skip cards already present. - Card front: span text. Card back: source path + block ID.
Command: Create Dataview starter pack
Writes a Dataview Starter.md note with copy-paste query templates that read semantic_tags: from frontmatter. Use as a launchpad for vault dashboards. Idempotent — re-running updates the existing file.
Command: Build Actions MOC (Tasks-plugin compatible)
Writes Actions.md with one - [ ] {text} [[source#^id]] row per A-tagged span across the vault, grouped by source note. Compatible with the Tasks plugin and Obsidian's native checkboxes. Marker frontmatter (sr_hub: true) makes the indexer skip it on rescan.
Toggle: Settings → Daily note injection.
When you open a note named YYYY-MM-DD (today's date), the plugin prepends a one-line summary:
<!--sr-daily--> 📚 12 cards due · 5 open questions · 47 concepts
The HTML comment marker makes injection idempotent — never inserted twice into the same note. Delete the line to suppress reinjection today.
Commands:
Insert relation graph (Mermaid) from R-tagsExport relation graph (Canvas) from R-tags
Parses R-tagged spans in the current note for arrow keywords (causes, leads to, results in, supports, evidences, implies, entails, contradicts, blocks, requires, depends on, precedes, plus reverse forms like caused by, blocked by, follows, required by, supported by, contradicted by). Reverse forms swap left/right at parse time.
Inserted into the note as a marker-fenced block:
%% sr-relation-graph (generated — re-run the command to update)
```mermaid
flowchart TD
n_cognition["cognition"]
n_attention["attention"]
n_cognition -->|depends on| n_attention
%% sr-relation-graph-end
Re-running the command finds the marker block and replaces in place — never duplicated. On first run, appended under a new `## Relation graph` heading.
### Canvas output
Writes a sibling `<basename>.relations.canvas` file using the [JSON Canvas spec](https://jsoncanvas.org/spec/1.0/). One text node per unique concept, one edge per relation, grid-laid-out deterministically. Re-runs overwrite.
## ICS export
**Command:** `Export actions to ICS (calendar)`
Pairs every `A`-tagged span with the first parseable `D`-tagged span in the same paragraph and emits an RFC 5545 `.ics` file at the configured path (default `actions.ics`).
Date formats accepted:
- `YYYY-MM-DD` → all-day event
- `YYYY-MM-DDTHH:MM` or `YYYY-MM-DD HH:MM` → date-time event (floating, no timezone)
UID per event: `srid:<block-id>-<note-path>@semantic-reading`. Stable across runs so re-exports update events in calendar subscribers (Calendar.app, Fantastical, Google Calendar) rather than duplicating.
Event description includes a deep link back to the source paragraph: `obsidian://open?file=<note>#^<block-id>`.
## Tasks push
**Command:** `Sync actions to tasks app (Todoist / Things)`
Pushes `A`-tagged spans to an external task manager. Provider selectable in settings.
### Todoist
- API: `https://api.todoist.com/rest/v2/` with your token (Settings → Integrations → Developer).
- Auth header: `Authorization: Bearer <token>`.
- Dedup: each task carries a `srid_<block-id>_<note-path>` label. On re-sync, the integration GETs all your tasks, builds a set of existing srid labels, and only POSTs missing ones.
- Routing: a note's `semantic_domain:` is looked up in the per-domain project mapping. Default project (if set) catches anything else; Inbox catches everything else.
### Things 3 (macOS / iOS)
- Uses the `things:///add?title=…¬es=…&list=…&tags=…` x-callback-url.
- Dedup: Things can't be queried, so the plugin tracks pushed srids in `data.json` — only fires the URL for new ones.
- Routing: same per-domain mapping field, but values are Things list names instead of project IDs.
A `Clear local sync record` button in settings resets the Things dedup set when you want a full re-push.
## Readwise import
**Commands:**
- `Import Readwise highlights`
- `Import Kindle clippings from file…`
### Readwise (REST API)
- API: `https://readwise.io/api/v2/export/` with your token (Readwise → Settings → Access Token).
- Auth header: `Authorization: Token <token>`.
- Paginates via `pageCursor`; respects `updatedAfter` to limit to changes since last sync.
- Writes one note per book into the destination folder (default `Readwise/`). Frontmatter is pre-filled:
```yaml
---
source: "Readwise"
source_url: "https://example.com/article"
author: "Author Name"
category: "books"
readwise_book_id: "12345"
semantic_domain:
---
- Notes that already exist in the destination folder are skipped, not overwritten — the expectation is you've tagged the highlights with sigils after import and shouldn't lose that work.
- After each successful run, the integration writes
lastUpdated = <now>so the next run only fetches changed books.
- No API required. Click the command → file picker → select your Kindle's
My Clippings.txt. - Parses the standard format (
==========delimiters,Title (Author)+Location N+Added on …). - Groups by title, writes one note per book into the same destination folder. Frontmatter:
source: "Kindle",author, blanksemantic_domain:. - Same "skip if exists" idempotency as Readwise.
All API tokens (Anthropic, Readwise, Todoist, MCP bearer) live in this plugin's data.json inside .obsidian/plugins/semantic-reading/. They're never written to vault notes. Each token's storage location is shown in its settings description.
- Settings Reference — every integration setting in one place
- MCP Server — the 10-tool external query surface
- Troubleshooting — debugging integrations that silently fail