
wiki-setup
Initialize or repair an Obsidian wiki vault's required structure and configuration. Use for new-vault setup, .env/config creation, reconfiguration, or broken setup recovery.
- Installs
- 3.6K
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/ar9av/obsidian-wiki --skill wiki-setup- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads wiki-setup automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Obsidian Setup — Vault Initialization
You are setting up a new Obsidian wiki vault (or repairing an existing one).
Step 1: Create .env
If .env doesn't exist, create it from .env.example. Ask the user for:
-
Where should the vault live? →
OBSIDIAN_VAULT_PATH- Default:
~/Documents/obsidian-wiki-vault - Must be an absolute path (after expansion)
- Default:
-
Where are your source documents? →
OBSIDIAN_SOURCES_DIR- Can be multiple paths, comma-separated
- Default:
~/Documents - Local git repo clones (public or private, any host) can be listed here too — clone
the repo locally first, then add its path. See "Ingesting Git Repositories" in
wiki-ingest/SKILL.mdfor how repo sources are handled.
-
Want to import Claude history? →
CLAUDE_HISTORY_PATH- Default: auto-discovers from
~/.claude - Set explicitly if Claude data is elsewhere
- Default: auto-discovers from
-
Have QMD installed? →
QMD_WIKI_COLLECTION/QMD_PAPERS_COLLECTION/QMD_TRANSPORT- Optional. Enables semantic search in
wiki-queryand source discovery inwiki-ingest. - Default to
QMD_TRANSPORT=mcpunless the user wants the agent to call the localqmdCLI directly.
- Optional. Enables semantic search in
-
Which timezone should the wiki's timestamps use? →
timezone:inindex.md(not.env)- Optional. An IANA name such as
America/Detroit; blank means UTC in theZspelling. - Lives in the vault so it applies to every writer (CLI, server, Python API) and travels with it.
- Written by
obsidian-wiki setup --timezone <name>(step 3 below) or by hand;obsidian-wiki memory nowprints stamps in it. - If using CLI mode, set
QMD_CLI_SEARCH_MODE=qualityby default; suggestbalancedif reranking is too slow. - If unsure, skip for now — both skills fall back to
Grepautomatically. - Install instructions: see
.env.example(QMD section). - If
QMD_WIKI_COLLECTIONis set, verify the collection excludes_raw/. The wiki collection and papers collection must stay disjoint —wiki-querycites them as separate layers (compiled knowledge vs. raw staging), andOBSIDIAN_VAULT_PATHcontains_raw/, so a plainqmd collection add <vault>silently merges the two. Read~/.config/qmd/index.yml, find the entry for$QMD_WIKI_COLLECTION, and check itsignorelist includes_raw/**(and ideallylog.md, which has no semantic value). If the collection doesn't exist yet, create it (qmd collection add "$OBSIDIAN_VAULT_PATH" --name <collection-name>), then add theignoreblock toindex.ymlby hand —qmdhas no--ignoreflag and refuses a secondcollection addon a path that already has one, so editing the YAML is the only way to scope it. Runqmd updateafter editing. If the collection already exists without theignoreblock, tell the user their wiki collection is indexing_raw/(including_raw/_archived/drafts left behind bywiki-ingest) and offer to add theignoreblock and re-runqmd update.
- Optional. An IANA name such as
-
Token budget warning threshold? →
WIKI_TOKEN_WARN_THRESHOLD- Default:
100000(warn when full-wiki read would cost > 100K tokens) - Set to
0to disable the warning entirely wiki-statusshows a token footprint table and emits this warning automatically
- Default:
-
Enable staged writes? →
WIKI_STAGED_WRITES- Default: unset /
false(pages written directly to their final location) - Set to
truefor team wikis, high-stakes domains, or any vault where the human wants final say on every LLM-written page - When enabled: all new/updated pages land in
_staging/first; run/wiki-stage-committo review and promote them wiki-statusshows a "Staged writes pending" count when files are waiting
- Default: unset /
After resolving config, assign the global config directory with the exact
obsidian_wiki_config_dir algorithm from the Config Resolution Protocol in
.skills/llm-wiki/SKILL.md. Create the shared writing profile only when it does not
already exist. Preserve an existing $GLOBAL_CONFIG_DIR/WRITING.md; never overwrite it
and do not ask additional writing-style questions.
Use OBSIDIAN_WIKI_REPO when it was loaded from config. When it is absent, derive the
absolute repository/data root from this loaded skill's absolute path, distinguishing the
packaged <root>/skills/wiki-setup/SKILL.md layout from the source
<root>/.skills/wiki-setup/SKILL.md layout. Then check both canonical template layouts:
- Packaged install:
<root>/skills/llm-wiki/references/WRITING.md - Source checkout:
<root>/.skills/llm-wiki/references/WRITING.md
GLOBAL_CONFIG_DIR="$(obsidian_wiki_config_dir)"
mkdir -p "$GLOBAL_CONFIG_DIR"
SKILL_FILE="<absolute path of this loaded wiki-setup/SKILL.md>"
SKILL_DIR="$(cd "$(dirname "$SKILL_FILE")" && pwd)"
if [ -n "${OBSIDIAN_WIKI_REPO:-}" ]; then
WIKI_ROOT="${OBSIDIAN_WIKI_REPO%/}"
else
case "$SKILL_DIR" in
*/.skills/wiki-setup) WIKI_ROOT="${SKILL_DIR%/.skills/wiki-setup}" ;;
*/skills/wiki-setup) WIKI_ROOT="${SKILL_DIR%/skills/wiki-setup}" ;;
*) echo "Cannot derive writing-profile template root from $SKILL_DIR" >&2; exit 1 ;;
esac
fi
WRITING_TEMPLATE=""
for candidate in \
"$WIKI_ROOT/skills/llm-wiki/references/WRITING.md" \
"$WIKI_ROOT/.skills/llm-wiki/references/WRITING.md"
do
if [ -f "$candidate" ]; then
WRITING_TEMPLATE="$candidate"
break
fi
done
[ -n "$WRITING_TEMPLATE" ] || { echo "Writing profile template not found under $WIKI_ROOT" >&2; exit 1; }
WRITING_PROFILE="$GLOBAL_CONFIG_DIR/WRITING.md"
if [ ! -e "$WRITING_PROFILE" ]; then
cp "$WRITING_TEMPLATE" "$WRITING_PROFILE"
fi
Step 2: Create Vault Directory Structure
mkdir -p "$OBSIDIAN_VAULT_PATH"/{concepts,entities,skills,references,synthesis,journal,projects,_archives,_raw,_staging,.obsidian}
.obsidian/— Obsidian's own config. Creates vault recognition.projects/— Per-project knowledge (populated during ingest)._archives/— Stores wiki snapshots for rebuild/restore operations._raw/— Staging area for unprocessed drafts. Drop rough notes here;wiki-ingestwill promote them to proper wiki pages and move the originals into_raw/_archived/(created on first use)._staging/— Review queue for LLM-written pages whenWIKI_STAGED_WRITES=true. Pages here are not visible in Obsidian's graph until promoted via/wiki-stage-commit.
Step 3: Create Special Files
obsidian-wiki setup --vault <path> [--timezone <IANA name>] creates all of these in one go. The templates below are what it writes, for setups done by hand.
index.md
---
title: Wiki Index
---
# Wiki Index
*This index is automatically maintained. Last updated: TIMESTAMP*
## Concepts
*No pages yet. Use `wiki-ingest` to add your first source.*
## Entities
## Skills
## References
## Synthesis
## Journal
log.md
---
title: Wiki Log
---
# Wiki Log
- [TIMESTAMP] INIT vault_path="OBSIDIAN_VAULT_PATH" categories=concepts,entities,skills,references,synthesis,journal
hot.md
---
title: Hot Cache
updated: TIMESTAMP
---
# Hot Cache
*A ~500-word semantic snapshot of recent activity. Updated after every major write operation.*
## Recent Activity
- [TIMESTAMP] INIT — vault created at OBSIDIAN_VAULT_PATH
## Active Threads
*None yet — start ingesting sources to populate.*
## Key Takeaways
*None yet.*
## Flagged Contradictions
*None yet.*
.manifest.json
Create an empty manifest so ingest skills have a tracking file to append to and
obsidian-wiki doctor reports the vault as complete (it treats .manifest.json
as a required core file):
printf '{}\n' > "$OBSIDIAN_VAULT_PATH/.manifest.json"
Step 4: Create .obsidian Configuration
Create minimal Obsidian config for a good out-of-box experience:
.obsidian/app.json
{
"strictLineBreaks": false,
"showFrontmatter": false,
"defaultViewMode": "preview",
"livePreview": true
}
.obsidian/appearance.json
{
"baseFontSize": 16,
"enabledCssSnippets": ["obsidian-wiki-folders"]
}
Folder colors and graph defaults
obsidian-wiki setup also writes .obsidian/snippets/obsidian-wiki-folders.css (one color per category folder in the file explorer, _ folders dimmed) and .obsidian/graph.json (the same colors in graph view, with _raw/, _archives/, _staging/, _meta/, index, log, and hot filtered out). If the CLI is available, run obsidian-wiki setup --vault "$OBSIDIAN_VAULT_PATH" rather than writing them by hand. Never overwrite an existing .obsidian file; to recolor later, use graph-colorize.
Step 5: Recommend Obsidian Plugins
Tell the user about these recommended community plugins (they install manually):
- Dataview — Query page metadata, create dynamic tables. Essential for a wiki.
- Graph Analysis — Enhanced graph view for exploring connections.
- Templater — If they want to create pages manually using templates.
- Obsidian Git — Auto-backup the vault to a git repo.
Step 6: Verify Setup
Run a quick sanity check:
- Vault directory exists with:
concepts/,entities/,skills/,references/,synthesis/,journal/,projects/,_archives/,_raw/ -
index.mdexists at vault root -
index.mdfrontmatter carriestimezone:if the user chose one (obsidian-wiki memory statusshows the zone in use) -
log.mdexists at vault root -
hot.mdexists at vault root -
.manifest.jsonexists at vault root (empty{}is fine) -
.envhasOBSIDIAN_VAULT_PATHset -
.obsidian/directory exists -
_staging/directory exists (required even whenWIKI_STAGED_WRITESis not set — created on setup for future use) -
WRITING_PROFILEexists at the resolved global config directory - Source directories (if configured) exist and are readable
Report the results, including the resolved absolute WRITING_PROFILE path, and tell the user they can now:
- Open the vault in Obsidian (File → Open Vault → select the directory)
- Run
wiki-statusto see what's available to ingest - Run
wiki-ingestto add their first sources - Run
claude-history-ingestto mine their Claude conversations - Run
codex-history-ingestto mine their Codex sessions (if they use Codex) - Run
wiki-statusagain anytime to check the delta
Optional: Install the Stop Hook (Auto-Capture)
Ask the user: "Want to auto-capture findings at session end?"
If yes, install the Stop hook into their global Claude Code settings so that every session
with meaningful work automatically prompts /wiki-capture --quick before closing.
What the hook does: reads the session transcript on Stop, counts file edits and shell
calls, and if significant work happened, asks Claude to run /wiki-capture --quick once.
The wiki-capture quick-mode KEEP/SKIP gate prevents noise — routine or
inconclusive sessions are skipped automatically.
Installation steps:
-
Find the obsidian-wiki repo path. If
OBSIDIAN_WIKI_REPOis set in config, use that. Otherwise, check common locations:~/Documents/projects/obsidian-wiki,~/obsidian-wiki, or ask the user. -
Locate the
wiki-stop-capture.shscript. Its path differs between a pip/uv install and a source checkout, so check both layouts under<REPO_PATH>and use the first that exists:<REPO_PATH>/hooks/wiki-stop-capture.sh— packaged install (OBSIDIAN_WIKI_REPOpoints at the bundled_data/dir, which ships the hook underhooks/).<REPO_PATH>/.claude/hooks/wiki-stop-capture.sh— source checkout.
If neither exists (e.g. an older wheel that predates bundling the hook), fetch the canonical copy to a stable location and point at that instead. Use the global config dir from the Config Resolution Protocol in
llm-wiki/SKILL.md(XDG-style~/.config/obsidian-wikiby default, or the legacy~/.obsidian-wikiif that already exists):CONFIG_DIR="$( [[ -d "$HOME/.obsidian-wiki" && ! -e "${XDG_CONFIG_HOME:-$HOME/.config}/obsidian-wiki" ]] && echo "$HOME/.obsidian-wiki" || echo "${XDG_CONFIG_HOME:-$HOME/.config}/obsidian-wiki" )" mkdir -p "$CONFIG_DIR/hooks" curl -fsSL https://raw.githubusercontent.com/Ar9av/obsidian-wiki/main/.claude/hooks/wiki-stop-capture.sh \ -o "$CONFIG_DIR/hooks/wiki-stop-capture.sh" chmod +x "$CONFIG_DIR/hooks/wiki-stop-capture.sh"Use the resolved absolute path as
<HOOK_PATH>below. -
Merge the hook entry into
~/.claude/settings.json:
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash <HOOK_PATH>"
}
]
}
]
}
}
If ~/.claude/settings.json already exists and has a hooks.Stop array, append the new
entry rather than replacing — don't clobber existing hooks.
Note — expect a duplicate nudge inside this repo. The obsidian-wiki repo ships its own git-tracked
.claude/settings.jsonregistering the same Stop hook at a relative path. Claude Code merges project-level and user-level hook config rather than letting one override the other, so sessions ending inside the repo itself fire both registrations. This is expected and harmless — the hook claims an atomic per-session sentinel, so only one nudge is emitted. Leave both in place: removing the project entry dirties a tracked framework file and disables capture for anyone who clones the repo without doing the global install.
- Confirm: "Stop hook installed. Claude Code will prompt
/wiki-capture --quickat the end of any session where you write files or run ≥ 4 shell commands."
To uninstall later: remove the hook entry from ~/.claude/settings.json or set
WIKI_STOP_CAPTURE=false in your shell to skip capture for a single session
(HIVEMIND_CAPTURE=false is still honoured).
Optional: Configure GitHub Sync
Ask the user: "Want to sync your vault to a private GitHub repo?"
The vault is plain markdown, so pushing it to git gets you version history, backup, and cross-device sync for free. This is opt-in — skip it if the user declines or has no repo ready.
If yes:
- Ask for the repo URL (e.g.
https://github.com/you/my-wiki.git). Recommend it be private if the vault holds personal notes. - Run the CLI, which handles
git init, a default.gitignore, and wiring theoriginremote — this is the same code pathobsidian-wiki setup's interactive prompt andsetup.shuse, so there's one implementation to keep correct (see issue #153 for why that matters):If theobsidian-wiki sync-setup "<repo-url>" --vault "$OBSIDIAN_VAULT_PATH"obsidian-wikibinary isn't on PATH (source checkout without an install), run it from the repo instead:PYTHONPATH="$OBSIDIAN_WIKI_REPO" python3 -m obsidian_wiki.cli sync-setup ...using whichever ofOBSIDIAN_WIKI_REPOor a local checkout path is available. - Tell the user they can run
obsidian-wiki syncany time afterward to commit and push pending vault changes (stages everything, commits with a timestamp, pushes). There's no config file to check for sync status — the vault's owngit remoteis the source of truth.
Optional: Refresh QMD After Setup
If QMD_WIKI_COLLECTION is configured and the local QMD CLI is available, run qmd update after the initial vault files exist so the fresh vault is immediately queryable. No embedding pass is usually needed at setup time because the vault starts empty, so a plain update is enough unless you have already populated pages. Before running it, confirm the _raw/ exclusion described in Step 1.4 is in place — otherwise this update indexes the (currently empty) staging directory into the wiki collection too, and every future draft dropped there joins it silently.
FAQ
What does the wiki-setup skill do?
Initialize or repair an Obsidian wiki vault's required structure and configuration. Use for new-vault setup, .env/config creation, reconfiguration, or broken setup recovery.
How do I install wiki-setup?
Run npx skills add https://github.com/ar9av/obsidian-wiki --skill wiki-setup in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/wiki-setup/ (personal) or .claude/skills/wiki-setup/ (project).
Which AI agents can use wiki-setup?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is wiki-setup safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains wiki-setup?
It is published by ar9av in ar9av/obsidian-wiki. It has 3,591 recorded installs.
More from ar9av/obsidian-wiki
llm-wiki
ar9av/obsidian-wiki
Explain and apply the foundational LLM Wiki architecture and knowledge-management strategy. Use for setup, architecture, schema, or organization decisions; operational ingest/query/lint work uses dedicated skills.
wiki-ingest
ar9av/obsidian-wiki
Ingest new documents, raw text, folders, or URLs into the Obsidian wiki as distilled, linked knowledge. Use for general wiki ingestion when no more specific ingest skill applies, including processing raw/ staged content.
wiki-query
ar9av/obsidian-wiki
Search and synthesize answers from the compiled Obsidian wiki, including cited and multi-hop answers. Use for questions about existing wiki knowledge or fast index-only lookups, and for challenge requests ("challenge this", "argue against X", "poke holes in my plan") that look for the vault's own evidence against a plan. Supports named-vault routing such as wiki-query @work; not for ingesting new sources.
wiki-lint
ar9av/obsidian-wiki
Audit wiki health: broken links, orphans, contradictions, stale content, lifecycle and tag issues. Use for maintenance or health checks. Default is report-only; use wiki-dedup for page-identity merges.
wiki-status
ar9av/obsidian-wiki
Report wiki ingestion/completeness state, pending source delta, structural insights, or maintenance equilibrium. Use for remaining-work/status questions, hubs and bridges, or whether maintenance skills still have pending changes. wiki-digest summarizes learned knowledge instead.
wiki-update
ar9av/obsidian-wiki
Sync knowledge from the current project into the Obsidian wiki. Use when work already in the current project should be distilled into the vault; named-vault routing includes @work update wiki. wiki-capture saves the current conversation and wiki-ingest handles external/new sources.
Popular productivity & automation skills
agent-browser
vercel-labs/agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.
lark-doc
open.feishu.cn
飞书云文档(Docx / Wiki)内容操作:读取、创建、编辑文档,插入或下载图片附件,以及操作思维笔记。用户提供文档 URL/token(包括 doubao.com 的 /docx/、/wiki/)时使用;按 URL 路径/token 而非域名路由;/page/ 是妙搭应用,非飞书云文档。文档内嵌资源按读取参考中的统一规则分流。独立评论操作走 lark-drive;随正文读取评论使用 docs +fetch。表格或 Base 内部数据操作不在本 skill。
lark-base
open.feishu.cn
飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式(BaseApp/AppMode 页面与组件)、Workspace 目录、workflow、角色权限、模板中心(多维表格模板分类/列表/搜索);遇到 Base/多维表格/bitable、BaseApp/AppMode、/base/ 或 /app/ 链接时使用。BaseApp 不走 lark-apps;文件导入/导出转 lark-drive,认证/授权转 lark-shared。
lark-drive
open.feishu.cn
飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、查询权限设置、评论/权限/订阅、标题、版本、飞书文档密级标签(secure labels)和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token、判断链接类型/真实 token/标题,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。
lark-shared
open.feishu.cn
Use for lark-cli setup/auth tasks: auth login/status/logout, user vs bot identity, business-domain permissions (--domain, including all/docs/drive), missing scopes, revoking authorization, or handling notice JSON.
lark-im
open.feishu.cn
飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。