Skip to content

Integrations

David edited this page May 31, 2026 · 1 revision

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

Anki sync

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.

Dataview starter

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.

Tasks MOC

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.

Daily note injection

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.

Relation graph

Commands:

  • Insert relation graph (Mermaid) from R-tags
  • Export 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.

Mermaid output

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=…&notes=…&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.

Kindle (My Clippings.txt)

  • 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, blank semantic_domain:.
  • Same "skip if exists" idempotency as Readwise.

Token storage

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.

See also

Clone this wiki locally