Skip to content

v0.132.0

Choose a tag to compare

@hughpyle hughpyle released this 09 Apr 00:21
· 202 commits to main since this release

Obsidian-compatible markdown export

An exported keep store rendered as an Obsidian knowledge graph, with SKILL.md as a central hub linked to surrounding notes

keep data export --format md now produces a directory of markdown files that Obsidian (and other wiki tools that recognize [[wikilinks]] in frontmatter) can open directly as a vault. Notes become nodes, edge-tag relationships become links, and the whole store renders as a navigable knowledge graph — the image above is a dev store of ~8000 notes opened straight in Obsidian, centered on SKILL.md.

What changed

Flat frontmatter. Exported .md frontmatter is now one flat top-level map. id is first, then any content_hash columns, then every tag (user + system) is its own top-level key. The nested tags: block is gone, and so are the duplicated created_at / updated_at / accessed_at column mirrors — those values already live in the _created / _updated / _accessed system tags. No data is lost; the representation is just honest.

Edge-tag linkages in both directions. Inverse edges (said, recipient_of, cited_by, referenced_by, …) are folded into the same flat frontmatter as multi-value YAML lists, with the source note's display name as the wikilink alias. Forward edge tags pass through as-is. Wiki tools render every value as a clickable link to the referenced note.

MediaWiki-style labeled refs. Edge-tag values now use canonical [[target|label]] syntax. This is what Obsidian, MediaWiki, and most other wiki systems understand as "link with display text", and it lines up neatly with the flat frontmatter above so the Properties pane renders it as a proper link field. A one-time startup migration rewrites any existing target[[label]] values on upgrade; parse_ref accepts both forms for backward compatibility.

Chain navigation as system frontmatter keys. Parent ↔ archived versions and parent ↔ analysis parts are linked via _prev_version / _next_version / _prev_part / _next_part system keys holding canonical part/version reference ids wrapped as [[id]] wikilinks. Chain navigation lives in the frontmatter graph, not in markdown links buried in the body — the body is now exactly the document's summary text.

Label propagation to target notes. When an edge-tag value carries a label (e.g. from: [[alice@example.com|Alice Smith]]), the label is observed and merged into the target note's name tag as a multi-valued set, append-only and preserving insertion order. Auto-vivified targets render in the graph with their human name instead of a bare machine id. Integrations that emit contact refs (Hermes, email extraction) produce canonical labeled refs by default.

Case-fold path safety. Two notes whose canonical paths collide case-insensitively (e.g. state-actions.md and STATE-ACTIONS.md on macOS APFS) are auto-disambiguated with a short hash suffix on the second one's stem, so the export runs clean on any filesystem.

Export format v3

The JSON export format is bumped to version 3. Older v1/v2 exports still import cleanly and are rewritten to canonical form on arrival.

Upgrade notes

First startup after upgrading runs a one-time migration that canonicalizes stored edge-tag values across documents, versions, and parts. It's gated by the existing _startup_maintenance_deferred flag so daemon startup is not blocked — the migration runs as part of background startup maintenance. A persistent labeled_ref_format_verified flag keeps subsequent startups at O(1).

Try it

keep data export ~/my-vault --format md --include-parts --include-versions

Then open ~/my-vault as an Obsidian vault. The graph view should look something like the image above.