Shadowvpn Deploy Client
madeye/shadowvpn
Deploy, install, and run the ShadowVPN client in a target environment — Linux (systemd), macOS (launchd), or Windows (Wintun, foreground launcher or scheduled-task service).
Run or configure the daily wiki maintenance cycle: check source freshness, refresh the index and hot.md, and manage its scheduled 9 AM launchd/systemd/cron reminder.
$ npx skills add Ar9av/obsidian-wiki --skill daily-update -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Ar9av/obsidian-wiki daily-update --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.skills/daily-update .claude/skills/daily-update && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "daily-update" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-update into .claude/skills/daily-update/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-update", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-updateType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Ar9av/obsidian-wiki --skill daily-update -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Ar9av/obsidian-wiki daily-update --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.skills/daily-update .agents/skills/daily-update && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "daily-update" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-update into .agents/skills/daily-update/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-update", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ar9av/obsidian-wiki --skill daily-update -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Ar9av/obsidian-wiki daily-update --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.skills/daily-update .cursor/skills/daily-update && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "daily-update" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-update into .cursor/skills/daily-update/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-update", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Ar9av/obsidian-wiki.git --path .skills/daily-update--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Ar9av/obsidian-wiki --skill daily-update -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Ar9av/obsidian-wiki daily-update --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.skills/daily-update .gemini/skills/daily-update && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "daily-update" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-update into .gemini/skills/daily-update/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-update", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Ar9av/obsidian-wiki daily-updateInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Ar9av/obsidian-wiki --skill daily-update -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .github/skills && cp -r skills-src/.skills/daily-update .github/skills/daily-update && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "daily-update" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-update into .github/skills/daily-update/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-update", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ar9av/obsidian-wiki --skill daily-update -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Ar9av/obsidian-wiki daily-update --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.skills/daily-update .opencode/skills/daily-update && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "daily-update" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/daily-update into .opencode/skills/daily-update/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-update", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
daily-updateRun or configure the daily wiki maintenance cycle: check source freshness, refresh the index and hot.md, and manage its scheduled 9 AM launchd/systemd/cron reminder.
Daily Update is an agent skill from Ar9av/obsidian-wiki. Run or configure the daily wiki maintenance cycle: check source freshness, refresh the index and hot.md, and manage its scheduled 9 AM launchd/systemd/cron reminder. Use for daily or morning wiki refresh or scheduler setup and verification.
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Productivity & Automation, covering Meeting notes and agendas, Scheduled and recurring tasks and LLM wikis. It works with Linux and Obsidian. The repository describes itself as: Framework for AI agents to build and maintain a digital brain through Obsidian wiki | Memory System for Agents. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4a0630b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Daily Update loads about 2.4k tokens when it runs. Until then it costs about 63 tokens; SKILL.md has 838 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
line `@name` override → walk up CWD for `.env` → global config → prompt setup). This gives `OBSIDIAN_VAULT_PATH` and `OBged in unless lingering is on — suggest `sudo loginctl enable-linger "$USER"`.et `LINT_SCHEDULE=daily` or `manual` in `.env` to change itAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Ar9av/obsidian-wiki at commit 4a0630b, republished under its MIT licence (© Ar9av). 838 words, ~2,411 tokens.
.claude/skills/daily-update/SKILL.md (or your agent's skills folder).You run a lightweight maintenance pass over the wiki: check source freshness, refresh the index, update hot.md, and write the state file that the terminal notification reads.
llm-wiki/SKILL.md (inline @name override → walk up CWD for .env → global config → prompt setup). This gives OBSIDIAN_VAULT_PATH and OBSIDIAN_WIKI_REPO.VAULT_ID=$(echo "$OBSIDIAN_VAULT_PATH" | md5sum 2>/dev/null | cut -c1-8 || md5 -q - <<< "$OBSIDIAN_VAULT_PATH" | cut -c1-8)
STATE_DIR="$(obsidian_wiki_config_dir)/state/$VAULT_ID"
mkdir -p "$STATE_DIR"$OBSIDIAN_VAULT_PATH/.manifest.json./daily-update)Execute the maintenance cycle:
Step 1: Source freshness check
Compare each source in .manifest.json against its file's modification time. Classify as:
mtime ≤ ingested_atmtime > ingested_at (new content exists, not yet ingested)Step 2: Index refresh
obsidian-wiki memory index --vault "$OBSIDIAN_VAULT_PATH"This reconciles index.md against the pages on disk under the memory lock — missing entries added, entries for deleted pages removed, the owner's own sections left untouched. Note added/removed from the output for the log line in Step 6. Do not enumerate pages with find and edit the index by hand.
Step 3: hot.md update
obsidian-wiki memory hot --vault "$OBSIDIAN_VAULT_PATH"Recent Activity, Active Threads, and Flagged Contradictions are regenerated from the log, the todo index, and page frontmatter; ## Key Takeaways carries across unchanged. If the takeaways are older than ~48h and the vault has changed materially since, refresh them: read the 10 most recently updated pages and pass a fresh ~500-word snapshot with --takeaways - on stdin. Otherwise leave them — a rebuild without new takeaways is cheap and correct.
If either command reports the vault is unmigrated, stop and tell the user to run obsidian-wiki memory migrate (preview) then --apply; do not fall back to hand-editing.
Step 4: Write state
Write to the vault-scoped $STATE_DIR derived in "Before You Start":
date +%s > "$STATE_DIR/.last_update"
echo "<stale_count>" > "$STATE_DIR/.pending_delta"
echo "$OBSIDIAN_VAULT_PATH" > "$STATE_DIR/.vault_path"Step 4a: Scheduled health check (wiki-lint)
LINT_SCHEDULE (default weekly) controls how often this cycle also runs wiki-lint:
manual — never auto-run; skip this step entirely.daily — run wiki-lint every cycle.weekly — run wiki-lint only if $STATE_DIR/.last_lint is missing or older than 7 days.LINT_SCHEDULE="${LINT_SCHEDULE:-weekly}"
NOW=$(date +%s)
LAST_LINT=$(cat "$STATE_DIR/.last_lint" 2>/dev/null || echo 0)If the schedule says to run, invoke the wiki-lint skill, then record the run:
date +%s > "$STATE_DIR/.last_lint"Fold its summary (broken links, orphans, stale pages found) into Step 7's report as a Health check: line; omit the line entirely on a cycle where lint didn't run.
Step 5: Spawn impl-validator
After the cycle, spawn impl-validator as a subagent:
impl-validator check:
goal: "Daily wiki maintenance — index reconciled, hot.md refreshed, state file written"
artifacts:
- $OBSIDIAN_VAULT_PATH/index.md
- $OBSIDIAN_VAULT_PATH/hot.md
- $STATE_DIR/.last_update
- $STATE_DIR/.pending_delta
checks:
- Does .last_update contain a recent Unix timestamp (within the last 60 seconds)?
- Does .pending_delta contain a non-negative integer?
- Does hot.md have an updated: frontmatter field set to today?
- Does index.md list at least as many pages as exist in the vault?Apply any FAILs before logging.
Step 6: Log
Append to $OBSIDIAN_VAULT_PATH/log.md:
obsidian-wiki memory log DAILY-UPDATE fresh=<N> stale=<N> missing=<N> index_added=<N> hot_refreshed=<true|false> lint=<ran|skipped>Step 7: Report to user
## Daily Wiki Update
- Sources: N fresh · N stale · N missing
- Index: N pages (N added, N removed)
- hot.md: refreshed / up to date
- Health check: N broken links, N orphans, N stale pages (omit this line if lint didn't run this cycle)
Stale sources (run to sync):
/wiki-history-ingest claude — N sessions since last ingest
/wiki-history-ingest codex — N sessions since last ingestWalk the user through first-time setup:
Step 1: Verify script exists
Check that $OBSIDIAN_WIKI_REPO/scripts/daily-update.sh exists and is executable. If not, point the user to it.
Step 2: Install the scheduler — pick by platform (uname -s).
macOS (Darwin) — launchd:
# Replace placeholder in plist
sed "s|OBSIDIAN_WIKI_REPO|$OBSIDIAN_WIKI_REPO|g" \
"$OBSIDIAN_WIKI_REPO/scripts/com.obsidian-wiki.daily-update.plist" \
> "$HOME/Library/LaunchAgents/com.obsidian-wiki.daily-update.plist"
# Load it
launchctl load "$HOME/Library/LaunchAgents/com.obsidian-wiki.daily-update.plist"Linux with systemd (systemctl --user works) — a user timer:
UNIT_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user"
mkdir -p "$UNIT_DIR"
sed "s|OBSIDIAN_WIKI_REPO|$OBSIDIAN_WIKI_REPO|g" \
"$OBSIDIAN_WIKI_REPO/scripts/obsidian-wiki-daily-update.service" \
> "$UNIT_DIR/obsidian-wiki-daily-update.service"
cp "$OBSIDIAN_WIKI_REPO/scripts/obsidian-wiki-daily-update.timer" "$UNIT_DIR/"
systemctl --user daemon-reload
systemctl --user enable --now obsidian-wiki-daily-update.timerOn a headless server, user timers only run while the user is logged in unless lingering is on — suggest sudo loginctl enable-linger "$USER".
Anything else (no systemd, containers, WSL without systemd) — crontab. Append this line via crontab -e, skipping it if an obsidian-wiki daily-update line is already there:
0 9 * * * /bin/bash "$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh" >> /tmp/obsidian-wiki-daily.log 2>&1Write the literal repo path in place of $OBSIDIAN_WIKI_REPO — cron does not load your shell env.
Step 3: Install terminal notification (optional)
Ask the user: "Do you want a terminal reminder when your wiki is stale? (y/n)" — skip this step if they say no, or if the environment is headless/VPS.
If yes, detect the user's shell and target the right rc file:
SHELL_NAME=$(basename "$SHELL") # zsh, bash, fish, etc.
case "$SHELL_NAME" in
zsh) RC_FILE="$HOME/.zshrc" ;;
bash) RC_FILE="$HOME/.bashrc" ;;
*) echo "Shell '$SHELL_NAME' not auto-detected. Add the source line manually to your shell rc file." ; return ;;
esacCheck if wiki-notify.sh is already sourced in that rc file. If not, append:
echo "" >> "$RC_FILE"
echo "# obsidian-wiki terminal notification" >> "$RC_FILE"
echo "source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh" >> "$RC_FILE"For Fish shell, source syntax is different — provide the manual instruction:
# Add to ~/.config/fish/config.fish:
bass source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh
# (requires bass plugin, or copy the logic natively)Step 4: Run the script once
bash "$OBSIDIAN_WIKI_REPO/scripts/daily-update.sh"This initializes $STATE_DIR/.last_update so the terminal notification works immediately.
Step 5: Confirm
Tell the user:
wiki-lint health checks run on the LINT_SCHEDULE cadence (default weekly) as part of that cycle — set LINT_SCHEDULE=daily or manual in .env to change it<global config dir>/state/<vault-id>/ (XDG-style ~/.config/obsidian-wiki by default, or the legacy ~/.obsidian-wiki if that already exists) — supports multiple vaults independently/daily-update anytime to force a sync/tmp/obsidian-wiki-daily.log (launchd, cron) or journalctl --user -u obsidian-wiki-daily-update (systemd)QMD is a search index, not the source of truth. If $QMD_WIKI_COLLECTION is empty or unset, skip this step. Run it only after this skill has written or rewritten vault markdown. If QMD refresh fails, do not roll back the vault changes; report the QMD status separately.
Use $QMD_CLI if set; otherwise use qmd.
${QMD_CLI:-qmd} updateIf the output says vectors are needed or embeddings may be stale, run:
${QMD_CLI:-qmd} embedVerify the collection with either:
${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"or, when a specific page path is known:
${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5Record one of:
QMD refreshed: update + embed + verifiedQMD refreshed: update only + verifiedQMD skipped: QMD_WIKI_COLLECTION unsetQMD skipped: qmd CLI unavailableQMD failed: <short error summary>© Ar9av, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .skills/daily-update of Ar9av/obsidian-wiki.
Open the folder on GitHubat commit 4a0630b
Daily Update next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Daily Update this skillAr9av/obsidian-wiki | 3.5k | — | ~2.4k | Automated safety check: Notes | MIT | |
| Shadowvpn Deploy Clientmadeye/shadowvpn | 101 | — | ~2.4k | Automated safety check: Notes | MIT | |
| Nextclaw AutostartPeiiii/nextclaw | 260 | — | ~943 | Automated safety check: Notes | MIT | |
| Daily Journalravila4/claude-adhd-skills | 157 | — | ~2.5k | Automated safety check: Pass | MIT | |
| GranolaArtemXTech/claude-code-obsidian-starter | 224 | — | ~905 | Automated safety check: Pass | None | |
| Paperclip Distillpaperclipai/paperclip | 99k | — | ~2.8k | Automated safety check: Pass | MIT |
madeye/shadowvpn
Deploy, install, and run the ShadowVPN client in a target environment — Linux (systemd), macOS (launchd), or Windows (Wintun, foreground launcher or scheduled-task service).
Peiiii/nextclaw
A skill your agent uses when the user asks about NextClaw autostart, auto-start on login or reboot, daemon/service registration, LaunchAgent, systemd, Windows Scheduled Task, service autostart…
ravila4/claude-adhd-skills
Draft, organize, or update development journal entries. An agent skill from ravila4/claude-adhd-skills.
ArtemXTech/claude-code-obsidian-starter
Query and sync Granola meetings to Obsidian vault. An agent skill from ArtemXTech/claude-code-obsidian-starter.
paperclipai/paperclip
A skill your agent uses when an operation issue is a Paperclip cursor-window, distill, or backfill.
harperreed/dotfiles
A skill your agent uses when processing, summarizing, or extracting insights from meeting notes in the Obsidian vault.
Ar9av/obsidian-wiki
Ingest Codex CLI conversation/session history into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Ingest GitHub Copilot CLI/session history into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Ingest Hermes agent history into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Adjust the user's Obsidian visual layout with CSS snippets. An agent skill from Ar9av/obsidian-wiki.
Ar9av/obsidian-wiki
Ingest OpenClaw session/history data into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Turn the current conversation or finding into a structured permanent wiki note.
Run or configure the daily wiki maintenance cycle: check source freshness, refresh the index and hot.md, and manage its scheduled 9 AM launchd/systemd/cron reminder. Daily Update is an agent skill from Ar9av/obsidian-wiki.md, and manage its scheduled 9 AM launchd/systemd/cron reminder.
Daily Update fits situations like: morning wiki refresh; scheduler setup and verification.
Run `npx skills add Ar9av/obsidian-wiki --skill daily-update -a claude-code`. Or copy the skill folder (.skills/daily-update in Ar9av/obsidian-wiki) into .claude/skills/daily-update in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Ar9av/obsidian-wiki --skill daily-update -a codex`. Or copy the skill folder (.skills/daily-update in Ar9av/obsidian-wiki) into .agents/skills/daily-update in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Ar9av/obsidian-wiki --skill daily-update -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/daily-update, .gemini/skills/daily-update, .github/skills/daily-update and .opencode/skills/daily-update in your project.
Going by SKILL.md and its folder, Daily Update needs the command-line tools its instructions call (bash).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file; runs commands with sudo), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Daily Update is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Daily Update: Shadowvpn Deploy Client (madeye/shadowvpn, 101 stars), Nextclaw Autostart (Peiiii/nextclaw, 260 stars), Daily Journal (ravila4/claude-adhd-skills, 157 stars) and Granola (ArtemXTech/claude-code-obsidian-starter, 224 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Ar9av (a GitHub user) maintains it in Ar9av/obsidian-wiki, which has 3,538 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 8, 2026.
Source: Ar9av/obsidian-wiki on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.