
Wiki Export
Export an Obsidian vault wikilink graph into JSON, GraphML, Neo4j Cypher, and an interactive HTML view for analysis or publishing.
Install
npx skills add https://github.com/ar9av/obsidian-wiki --skill wiki-exportWhat is this skill?
- Writes graph.json, graph.graphml, cypher.txt, and graph.html under wiki-export/ at the vault root
- Resolves Obsidian path via the obsidian-wiki Config Resolution Protocol before export
- Optional filtered mode for public/user-facing exports that excludes visibility/internal and visibility/pii tags
- Warns and stops when the vault has fewer than five pages
- Targets Gephi, Neo4j, custom scripts, and in-browser graph visualization
Adoption & trust: 2.1k installs on skills.sh; 1.8k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Lark Doclarksuite/cli
Lark Wikilarksuite/cli
Opensource Guide Coachxixu-me/skills
Readme I18nxixu-me/skills
Doc Coauthoringanthropics/skills
Obsidian Markdownkepano/obsidian-skills
Journey fit
Common Questions / FAQ
Is Wiki Export safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Wiki Export
# Wiki Export — Knowledge Graph Export You are exporting the wiki's wikilink graph to structured formats so it can be used in external tools (Gephi, Neo4j, custom scripts, browser visualization). ## Before You Start 1. **Resolve config** — follow the Config Resolution Protocol in `llm-wiki/SKILL.md` (walk up CWD for `.env` → `~/.obsidian-wiki/config` → prompt setup). This gives `OBSIDIAN_VAULT_PATH` 2. Confirm the vault has pages to export — if fewer than 5 pages exist, warn the user and stop ## Visibility Filter (optional) By default, **all pages are exported** regardless of visibility tags. This preserves existing behavior. If the user requests a filtered export — phrases like **"public export"**, **"user-facing export"**, **"exclude internal"**, **"no internal pages"** — activate **filtered mode**: - Build a **blocked tag set**: `{visibility/internal, visibility/pii}` - Skip any page whose frontmatter tags contain a blocked tag when building the node list - Skip any edge where either endpoint was excluded - Note the filter in the summary: `(filtered: visibility/internal, visibility/pii excluded)` Pages with no `visibility/` tag, or tagged `visibility/public`, are always included. ## Step 1: Build the Node and Edge Lists Glob all `.md` files in the vault (excluding `_archives/`, `_raw/`, `.obsidian/`, `index.md`, `log.md`, `_insights.md`). In filtered mode, also skip pages whose tags contain `visibility/internal` or `visibility/pii`. For each page, extract from frontmatter: - `id` — relative path from vault root, without `.md` extension (e.g. `concepts/transformers`) - `label` — `title` field from frontmatter, or filename if missing - `category` — directory prefix (`concepts`, `entities`, `skills`, `references`, `synthesis`, `projects`, or `journal`) - `tags` — array from frontmatter tags field - `summary` — frontmatter `summary` field if present This is your **node list**. For each page, Grep the body for `\[\[.*?\]\]` to extract all wikilinks: - Parse each `[[target]]` or `[[target|display]]` — use the target part only - Resolve the target to a node id (normalize: lowercase, spaces→hyphens, strip `.md`) - Skip links that point outside the node list (broken links) - Each resolved link becomes an edge: `{source: page_id, target: linked_id, relation: "wikilink", confidence: "EXTRACTED"}` - If the linking sentence ends with `^[inferred]` or `^[ambiguous]`, override `confidence` accordingly **Typed edge enrichment:** After building the wikilink edge list, read each page's `relationships:` frontmatter block. For each `{target, type}` entry: - The `target` YAML value is a quoted wikilink string such as `"[[concepts/lstm]]"`. Strip the surrounding `[[` and `]]` characters, then apply the same normalization (lowercase, spaces→hyphens, strip `.md`) to get the node id. - Skip entries whose resolved target is not in the node list (broken link) - If an edge for this `(source, target)` pair already exists, override its `relation` field with the typed value (e.g., `"contradicts"`) and set `typed: true` - If no edge exists yet for this pair, add one: `{source: page_id, target: target_id, relation: <type>, confidence: "EXTRACTED", typed: true}` This means `relation: "wikilink"` is the default for plain untyped links; a `relationships:` entry promotes it to a named semantic type. Edges that originated from both a body wikilink and a `relationships:` entry keep a single record — the typed version wins. This is y