PluginBench
Skill
Pass
Audit score 90

wiki-update

ar9av/obsidian-wiki

Sync project knowledge into your Obsidian wiki from any directory.

What is wiki-update?

Distill architectural decisions, patterns, and reasoning from your current project into a structured Obsidian vault. Use this skill when you want to capture what you've learned and make it queryable across projects. It handles config resolution, delta detection, and cross-linking automatically.

  • Scans project structure, docs, and git history to identify what's worth capturing
  • Detects changes since last sync using git ancestry and warns if history was rewritten
  • Writes wiki pages with YAML frontmatter, provenance markers, and wikilinks to connect knowledge
  • Merges new information into existing pages rather than creating duplicates
  • Updates `.manifest.json`, `index.md`, `log.md`, and `hot.md` to track sync state
  • Works from any project directory via Config Resolution Protocol with inline `@vault` routing

How to install wiki-update

npx skills add https://github.com/ar9av/obsidian-wiki --skill wiki-update
Prerequisites
  • Obsidian vault set up with `.manifest.json` in the root
  • Config file or environment variables defining `OBSIDIAN_VAULT_PATH`, `OBSIDIAN_WIKI_REPO`, and `OBSIDIAN_LINK_FORMAT`
  • Git repository in the current project (for delta detection and commit history)
Claude Code
Cursor
Windsurf
Cline

How to use wiki-update

  1. 1.Run the skill from your project directory (any directory, not just the wiki repo)
  2. 2.Skill resolves config via inline `@vault-name` override, `.env`, `~/.obsidian-wiki/config`, or prompts you
  3. 3.Skill scans README, source structure, git log, and Claude memory files to understand the project
  4. 4.Skill checks `.manifest.json` to compute delta since last sync; warns if history was rewritten
  5. 5.Skill identifies what's worth distilling (architecture, patterns, trade-offs, integrations) and skips boilerplate
  6. 6.Skill writes or merges pages under `projects/<project-name>/` with YAML frontmatter and provenance markers
  7. 7.Skill adds wikilinks to connect new pages to existing ones and updates tracking files
  8. 8.Review the generated pages in Obsidian and adjust as needed

Use cases

Good for
  • After completing a feature, sync architectural decisions and trade-offs into your wiki
  • Capture patterns and abstractions discovered while building before context fades
  • Document why a tool or service was chosen and how it integrates with the rest of the project
  • Periodically distill lessons learned across multiple projects into a searchable knowledge base
  • Update your wiki when switching between projects to preserve context for future reference
Who it's for
  • Engineers building knowledge bases across multiple projects
  • Teams using Obsidian as a shared decision log and architecture reference
  • Developers who want to capture reasoning and patterns without manual wiki maintenance
  • Anyone practicing Karpathy's pattern of distilling 3-month-later context

wiki-update FAQ

What if I've rebased or force-pushed since the last sync?

The skill detects this by checking if the stored commit SHA is still reachable. If not, it warns you and falls back to a full re-scan, then updates the stored SHA to the current HEAD.

How does it decide what to distill?

It uses the 3-month heuristic: capture anything you'd need to re-derive by reading git blame across 20 commits. Skip boilerplate, config, and implementation details the code already makes clear.

Can I use this from projects outside my wiki repo?

Yes. The skill works from any project directory. It resolves your vault path via config file, environment, or prompt, then syncs knowledge back to your vault.

What if a page already exists in the vault?

The skill merges new information into the existing page, updates the `updated` timestamp, and adds the new source to the `sources:` frontmatter field. No duplicates.

How are pages organized in the vault?

Project-specific knowledge goes under `projects/<project-name>/` with an overview, concepts, skills, and references subdirs. General knowledge (patterns, tools, concepts) goes in global categories like `concepts/`, `skills/`, and `entities/`.

Full instructions (SKILL.md)

Source of truth, from ar9av/obsidian-wiki.


name: wiki-update description: > Sync the current project's knowledge into the Obsidian wiki. Use this skill from any project when the user says "update wiki", "sync to wiki", "save this to my wiki", "update obsidian", or wants to distill what they've been working on into their knowledge base. This is the cross-project skill that lets you push knowledge from wherever you are into the vault. Accepts inline named-vault routing like "@work update wiki" via the shared Config Resolution Protocol.

Wiki Update — Sync Any Project to Your Wiki

You are distilling knowledge from the current project into the user's Obsidian wiki. This skill works from any project directory, not just the obsidian-wiki repo.

Before You Start

  1. Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (inline @name override → walk up CWD for .env~/.obsidian-wiki/config → prompt setup). This gives OBSIDIAN_VAULT_PATH, OBSIDIAN_WIKI_REPO, OBSIDIAN_LINK_FORMAT (wikilink default or markdown), and optional QMD settings such as QMD_WIKI_COLLECTION. Works from any project directory.
  2. Read $OBSIDIAN_VAULT_PATH/.manifest.json to check if this project has been synced before.
  3. Read $OBSIDIAN_VAULT_PATH/index.md to know what the wiki already contains.

When writing internal links in Steps 4–5, apply the link format from llm-wiki/SKILL.md (Link Format section) using the OBSIDIAN_LINK_FORMAT value.

Step 1: Understand the Project

Figure out what this project is by scanning the current working directory:

  • README.md, docs/, any markdown files
  • Source structure (frameworks, languages, key abstractions)
  • package.json, pyproject.toml, go.mod, Cargo.toml or whatever defines the project
  • Git log (focus on commit messages that signal decisions, not "fix typo" stuff)
  • Claude memory files if they exist (.claude/ in the project)

Derive a clean project name from the directory name.

Step 2: Compute the Delta

Check .manifest.json for this project:

  • First time? Full scan. Everything is new.
  • Synced before? Look at last_commit_synced. Before computing the delta, verify the stored SHA is still reachable:
    git merge-base --is-ancestor <last_commit_synced> HEAD
    
    • Exit 0 (ancestor): Safe. Run git log <last_commit_synced>..HEAD --oneline to see what changed.
    • Exit 1 (not an ancestor — rebase or force-push occurred): The stored SHA is no longer in this branch's history. Warn the user: "Stored commit <sha> is no longer reachable — branch may have been rebased or force-pushed. Falling back to full scan." Then treat as first-time sync: re-scan everything and update last_commit_synced to the current HEAD SHA at the end of Step 6.

If nothing meaningful changed since last sync, tell the user and stop.

Step 3: Decide What to Distill

This is the core question from Karpathy's pattern: what would you want to know about this project if you came back in 3 months with zero context?

Worth distilling:

  • Architecture decisions and why they were made
  • Patterns discovered while building (things you'd Google again otherwise)
  • What tools, services, APIs the project depends on and how they're wired together
  • Key abstractions, how they connect, what the mental model is
  • Trade-offs that were evaluated, what was picked and why
  • Things learned while building that aren't obvious from reading the code

Not worth distilling:

  • File listings, boilerplate, config that's obvious
  • Individual bug fixes with no broader lesson
  • Dependency versions, lock file contents
  • Implementation details the code already says clearly
  • Routine changes anyone could read from the diff

The heuristic: if reading the codebase answers the question, don't wiki it. If you'd have to re-derive the reasoning by reading git blame across 20 commits, wiki it.

Step 4: Distill into Wiki Pages

Project-specific knowledge

Goes under $VAULT/projects/<project-name>/:

projects/<project-name>/
├── <project-name>.md          ← project overview (named after the project, NOT _project.md)
├── concepts/                  ← project-specific ideas, architectures
├── skills/                    ← project-specific how-tos, patterns
└── references/                ← project-specific source summaries

The overview page (<project-name>.md) should have:

  • What the project is (one paragraph)
  • Key concepts and how they connect
  • Links to project-specific and global wiki pages

Global knowledge

Things that aren't project-specific go in the global categories:

What you foundWhere it goes
A general concept learnedconcepts/
A reusable pattern or techniqueskills/
A tool/service/personentities/
Cross-project analysissynthesis/

Page format

Every page needs YAML frontmatter:

---
title: >-
    Page Title
category: concepts
tags: [tag1, tag2]
sources: [projects/<project-name>]
summary: >-
    One or two sentences (≤200 chars) describing what this page covers.
provenance:
  extracted: 0.6
  inferred: 0.35
  ambiguous: 0.05
base_confidence: 0.59
lifecycle: draft
lifecycle_changed: TIMESTAMP_DATE
created: TIMESTAMP
updated: TIMESTAMP
---

Use folded scalar syntax (summary: >-) for title and summary to keep frontmatter parser-safe across punctuation (:, #, quotes) without escaping rules.
Keep the title and summary contents indented by two spaces under summary: >-.

# Page Title

- A fact the codebase or a doc actually states.
- A reason the design works this way. ^[inferred]

Use [[wikilinks]] to connect to other pages.

Write a summary: frontmatter field on every new/updated page (1–2 sentences, ≤200 chars), using >- folded style. For project sync, a good summary answers "what does this page tell me about the project I wouldn't guess from its title?" This field powers cheap retrieval by wiki-query.

Apply provenance markers per llm-wiki (Provenance Markers section). For project sync specifically:

  • Extracted — anything visible in the code, config, or a doc/commit message: file structure, dependencies, function signatures, what a file does.
  • Inferredwhy a decision was made, design rationale, trade-offs, "the team chose X because Y" — unless a commit message, doc, or ADR states it explicitly.
  • Ambiguous — when the code and docs disagree, or when there's clearly an in-progress migration with two patterns living side by side.

Compute the rough fractions and write the provenance: block on every new/updated page.

Updating vs creating

  • If a page already exists in the vault, merge new information into it. Don't create duplicates.
  • If you're adding to an existing page, update the updated timestamp and add the new source.
  • Check index.md to see what's already there before creating anything new.

Step 5: Cross-link

After creating/updating pages:

  • Add [[wikilinks]] from new pages to existing related pages
  • Add [[wikilinks]] from existing pages back to the new ones where relevant
  • Link the project overview to all project-specific pages and relevant global pages

Step 6: Update Tracking

Update .manifest.json

Add or update this project's entry:

{
  "projects": {
    "<project-name>": {
      "source_cwd": "/absolute/path/to/project",
      "last_synced": "TIMESTAMP",
      "last_commit_synced": "abc123f",
      "pages_in_vault": ["projects/<project-name>/<project-name>.md", "..."]
    }
  }
}

Update index.md

Add entries for any new pages created.

Update log.md

Append:

- [TIMESTAMP] WIKI_UPDATE project=<project-name> pages_updated=X pages_created=Y source_cwd=/path/to/project

Update hot.md

Read $OBSIDIAN_VAULT_PATH/hot.md (create from the template in wiki-ingest if missing). Rewrite Recent Activity with what was just synced — last 3 operations max. Update Active Threads if this project is an ongoing focus. Update Key Takeaways with the most important architectural insight or decision surfaced during this sync. Update updated timestamp.

Write conceptually: "Synced obsidian-wiki — added wiki-capture and wiki-research skills, core new capabilities are autonomous web research and conversation capture."

Step 7: Refresh QMD Wiki Index (optional — requires QMD_WIKI_COLLECTION)

GUARD: If $QMD_WIKI_COLLECTION is empty or unset, skip this step. The markdown vault is the source of truth; QMD is only a search index.

Run this step only after pages, .manifest.json, index.md, log.md, and hot.md have been written. If Step 2 found no meaningful changes and the sync stopped early, do not refresh QMD.

This refresh currently requires the local QMD CLI. Use $QMD_CLI if set; otherwise use qmd. If the CLI is unavailable or returns an error, do not roll back the wiki update; report that the wiki was updated but QMD refresh was skipped or failed.

For CLI refresh:

${QMD_CLI:-qmd} update

If the output says new hashes need vectors, or if pages were created/updated and embeddings may be stale, run:

${QMD_CLI:-qmd} embed

Verify at least one created or materially updated page is visible in the wiki collection:

${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/projects/<project-name>/<page>.md" -l 5

If the exact qmd:// path is uncertain, use:

${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION" | grep "<project-name>"

Record QMD refresh in the final report as one of:

  • QMD refreshed: update + embed + verified
  • QMD skipped: QMD_WIKI_COLLECTION unset
  • QMD skipped: qmd CLI unavailable
  • QMD failed: <short error summary>

Tips

  • Be aggressive about merging. If the project uses React Server Components, don't create a new page if concepts/react-server-components.md already exists. Update the existing one and add this project as a source.
  • Consult the tag taxonomy. Read $VAULT/_meta/taxonomy.md if it exists, and use canonical tags.
  • Don't copy code. Distill the knowledge, not the implementation. "This project uses a debounced search pattern with 300ms delay" is useful. Pasting the actual debounce function is not.
  • Project overview is the anchor. The <project-name>.md file is what you'd read to get oriented. Make it good.