obsidian.md
docs/integrations/obsidian.md
Obsidian — open the compiled wiki as a real vault
<!-- translations:start -->
한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
Tesserae's Obsidian export turns your compiled typed graph into a real, opinionated Obsidian vault. Not a directory of markdown — a vault with .obsidian/ config, type-aware callouts, Dataview-queryable frontmatter, a vault dashboard, and an index of cross-vault wiki:// references.
Prerequisites
Compile the project first:
cd /path/to/your-project
tesserae init
tesserae compile
The compile produces .tesserae/graph.json (the source of truth) and a plain markdown projection at .tesserae/markdown_projection/. The Obsidian export is built on top of that projection but layers Obsidian-native enrichments on every page.
1) Export the vault
tesserae vault export --vault ~/Documents/tesserae-vault
The directory is created if it doesn't exist. Re-running overwrites it idempotently — the markdown projection is deterministic given the same graph.
What lands on disk:
tesserae-vault/
.obsidian/ # Obsidian config (app.json, graph.json, plugins)
README.md # Vault entry point
index.md # All nodes grouped by section
_bridges.md # Cross-vault wiki:// references, grouped by alias
_meta/
dashboard.md # Dataview overview tables
papers/ # Paper / Repository / SourceDocument pages
concepts/ # Concept / Topic / Field / Method / Algorithm pages
claims/ # Claim / OpenQuestion / Evidence pages
raw/ # Optional raw-source attachments (created lazily)
2) Open the directory in Obsidian
File → Open vault... → Open folder as vault → ~/Documents/tesserae-vault.
Obsidian will detect .obsidian/, recognize it as a real vault, and load. The community-plugins list includes Dataview, so Obsidian will prompt to enable it (recommended — without it the dataview blocks render as code fences).
Settings → Community plugins → Browse → "Dataview" → Install → Enable.
3) Tour the vault
Entry points
README.md— what this vault is and how to refresh itindex.md— every node by section (papers, concepts, claims) with wikilinks_meta/dashboard.md— dataview overview: recent pages, papers, concepts/claims
Per-page enrichments
Every node page now ships with:
Type-aware callouts. A semantic callout at the top of each page makes the node type visible at a glance:
> [!quote] Paper
> The paper triggered a wave of follow-on work: SuGaR aligns Gaussians...
> [!warning] Limitation
> No current method can achieve real-time display rates at 1080p...
> [!question] Open question
> How does dynamic-scene reconstruction scale...
Mapping (highlights): Paper → quote, Repository → info, Contribution → success, Performance → info, Limitation → warning, Causal → important, OpenQuestion → question, Evidence → example.
Dataview-queryable edges. Frontmatter now carries the typed edges as nested maps:
edges_out:
uses: [gaussian-splatting, volumetric-rendering]
part_of: [3d-4d-vision-and-reconstruction]
supports_claim: [performance-claim-..., comparison-...]
edges_in:
mentioned_in: [project-pulse, topic-visual-slam]
You can write queries like:
````markdown
LIST FROM "papers" WHERE contains(edges_out.uses, "nerf")
TABLE edges_out.supports_claim AS "Claims"
FROM "papers"
WHERE length(edges_out.supports_claim) > 3
SORT length(edges_out.supports_claim) DESC
LIMIT 10
````
Cross-vault bridges. Any wiki://<alias>/<kind>/<slug> URI mentioned in a node's description or metadata is surfaced both as a frontmatter field:
cross_vault: [wiki://research/concepts/rlhf, wiki://notes/papers/arxiv-2510-12323]
and as a Cross-vault references body section. The vault-level _bridges.md index aggregates every outbound reference grouped by destination alias, so you can audit cross-vault links from a single page.
Related (dataview) block. Every page ends with a query that shows pages linking back, populated automatically:
````markdown
LIST
FROM "papers" OR "concepts" OR "claims"
WHERE contains(file.outlinks, this.file.link) AND file.name != this.file.name
SORT file.name
LIMIT 25
````
Vault dashboard
_meta/dashboard.md ships dataview blocks for the most useful aggregate views: recently-updated pages, all papers with metadata columns, all concepts and claims sorted by type. Edit it freely — it's a starting point, not a fixed contract.
Vault graph view
Obsidian's built-in graph view (Ctrl/Cmd+G) already works against the wikilinks emitted in ## Outgoing / ## Incoming sections. The pre-shipped .obsidian/graph.json colour-codes papers/, concepts/, claims/ paths for orientation. You can layer dataview-filtered views on top for richer slices.
Cross-vault workflows
Register multiple Tesserae vaults so wiki:// URIs resolve across them:
tesserae projects register /path/to/research --name research
tesserae projects register /path/to/notes --name notes
Re-export each vault after registration. _bridges.md in each export will now show resolvable references between vaults grouped by alias.
Obsidian itself does not follow wiki:// URIs natively — they render as inline text — but _bridges.md plus the per-page Cross-vault references section give you a manual index until a dedicated Obsidian plugin lands.
Refresh workflow
To incorporate new sources or fixes from your source files:
# Edit source files under your project's source dirs, then:
tesserae compile
compile re-projects the vault automatically — you no longer have to run a separate export step. (tesserae vault export --vault <path> still exists for a one-off re-projection without a full recompile.) Obsidian hot-reloads the changed files on disk.
If you've added markdown notes inside the vault that aren't projected from the graph (e.g. your own personal annotations), they survive — the projector only overwrites files it owns under papers/, concepts/, claims/, plus index.md, _bridges.md, _meta/dashboard.md, and README.md. Hand-written pages (no node_id: frontmatter) and the dedicated user-notes block (<!-- user-notes:start --> … <!-- user-notes:end -->) on each projected page are preserved across recompiles.
Editing in Obsidian flows back (bidirectional sync)
As of v0.5.0 the vault is no longer a one-way export. It is a bidirectional projection: the typed graph is still the source of truth, but project compile now reads your Obsidian edits back out of the vault and overlays them onto the graph before re-projecting. Edit a node's title, aliases, description callout, or any non-system frontmatter scalar in Obsidian, recompile, and the change survives — and propagates to the static site, MCP, and every other projection.
tesserae compile
# [tesserae] vault overlay: applying 3 field override(s) from obsidian_vault/
What the overlay harvests (the vault-wins fields):
title→ nodenamealiases→ node aliases- the body description callout (or first paragraph) → node
description - every non-reserved frontmatter scalar →
metadata.<key>(reserved/system keysnode_id,title,type,aliases,source_path,edges_out,edges_in,cross_vaultare never treated as user overrides)
Every overlay run writes a .tesserae/diverged-fields.md report (## Field overrides — N across M node(s)) so you can audit exactly what was pulled back. Wikilinks you add inside the user-notes block become user_link edges. Pass tesserae compile (with compile_options.no_vault_pull = true in .tesserae/config.json) to bypass the overlay for one run — useful for recovery, or when you intentionally want the source markdown to win.
The first compile after enabling this feature gets a "free pass": with no vault_snapshot.json baseline yet, nothing is harvested; the snapshot written at the end becomes the baseline for the next compile's diff.
For a dedicated live workflow, tesserae vault sync re-applies the overlay and re-projects without a full recompile:
# Preview what a compile would pull back, without mutating the graph.
tesserae vault sync --dry-run
# Watch the vault and round-trip edits live (Ctrl-C to stop).
tesserae vault sync --watch
# After renaming/removing nodes, delete projected pages left orphaned.
tesserae vault sync --prune-orphans
See obsidian-sync.md for the full per-field ownership matrix and design rationale.
When to use this vs. the static site
The compiled HTML site (tesserae export site → .tesserae/site/) is a one-way, read-only export for sharing — push to GitHub Pages, S3, any static host. The Obsidian vault is for reading, querying, and editing locally with Dataview and Obsidian's graph view: it is the one projection whose edits flow back into the graph (see the bidirectional sync section above). Both project from the same graph, so they never drift — and corrections you make in Obsidian propagate to the site on the next compile.