I've been using Obsidian for a while — daily notes, interview prep, career research, random thoughts. But all of it was siloed on my laptop behind Obsidian Sync, invisible to Hank. Hank is my AI assistant, running on OpenClaw on a remote server — and I wanted him to be able to read my notes, create new ones, and eventually help me keep them organized. That meant getting the vault onto that server. Here's how we did it, and what we built on top of it.
Why Not Just Use Obsidian Sync?
Obsidian Sync is great on paper — real-time, encrypted, works across all your devices. But it's a closed system. There's no API, no way for a server-side process to access your vault. Everything lives in Obsidian's own sync infrastructure, and the only clients are the Obsidian apps themselves.
I also realized I was paying for Sync across three devices, but only ever using it on one — my laptop. I have Obsidian on my phone but basically never open it. I use Apple Notes on iOS instead. Once I understood that git could replace the cross-device sync for my actual usage pattern, canceling Sync was an easy call.
The Stack We Used
obsidian-cli — A Go CLI by yakitrak that lets you search, create, move, and delete notes from the command line. We built it from source after auditing the code — no network calls, clean dependency list.
Obsidian Git plugin — A community plugin that auto-commits and pushes your vault to a GitHub repo on a schedule. Set it to 5 minutes and forget it.
Private GitHub repo — The sync layer. Free, unlimited private repos, and git history is actually better version tracking than Obsidian Sync's history.
Auditing obsidian-cli
Before installing anything that touches my notes, I wanted to verify it wasn't making any outbound network calls. The concern: a malicious CLI could silently exfiltrate note contents.
We cloned the repo and ran a grep across all Go source files for any HTTP, network, or URL imports:
grep -rn "http\|net\.\|url\." --include="*.go" pkg/ cmd/ main.go
The only hit was url.PathEscape in the URI builder — used to construct obsidian:// URIs that open the local Obsidian app. No HTTP clients, no outbound connections. The dependency list confirmed it: just a CLI framework, a fuzzy finder, some YAML/TOML parsers, and terminal UI libraries. Clean bill of health.
We also built it from source rather than using the prebuilt Homebrew binary — the compiled binary might not match the audited source if the author's release pipeline got compromised. Building from source closes that gap. Since it's a Go project with vendored dependencies, it's one command:
go build -o $(which obsidian-cli) .
Pushing the Vault to GitHub
On my laptop, I initialized a git repo inside the vault folder and pushed it to a new private GitHub repo:
git init
echo ".obsidian/workspace.json" >> .gitignore
git add .
git commit -m "initial vault commit"
gh repo create obsidian-vault --private --source=. --push
Then installed the Obsidian Git community plugin, set auto-commit interval to 5 minutes, and enabled pull on startup. The plugin handles everything from there — commit, push, pull, all automatic.
One thing worth noting: we added .DS_Store to .gitignore early. Mac metadata files have no business in a git repo.
Connecting obsidian-cli on the Server
The CLI expects Obsidian's config file (obsidian.json) to exist — normally written by the Obsidian desktop app to track vault locations. Since the server doesn't have Obsidian installed, we created a minimal stub to satisfy it:
# ~/.config/obsidian/obsidian.json
{
"vaults": {
"abc123": {
"path": "/path/to/repos/obsidian-vault",
"ts": 1709078400000,
"open": true
}
}
}
obsidian-cli set-default "obsidian-vault"
# Default vault set to: obsidian-vault
After that, obsidian-cli list returned all my notes. Hank can now search, read, and create notes from the server side.
Reorganizing into PARA
Before setting up any automation, I wanted to get the vault organized. Twenty-something notes scattered across a flat folder isn't a knowledge system — it's a pile.
We adopted the PARA method (Tiago Forte): four buckets that sort everything by actionability.
Projects/ — Active work with a finish line. Job search, timeshare sale.
Areas/ — Ongoing responsibilities. Home Depot history, tech setup.
Resources/ — Reference by topic. Cloud architecture, general notes.
Archive/ — Anything inactive. Old daily notes, completed projects.
Hank mapped all 20+ existing notes to the right buckets, moved them using git mv (which preserves history), and pushed the reorganized vault in a single commit. We also added a PARA Guide.md at the vault root with a plain-English decision tree for where new notes should go.
Daily Notes Automation
I keep a running daily note — one file per day where I jot things throughout the day. The naming convention is YYYY-MM-DD.md, which sorts chronologically in any file browser.
Rather than creating each day's note manually, we set up two cron jobs:
6:00 AM ET — Create today's note — Creates YYYY-MM-DD.md in the Daily Notes/ folder with a blank template (Notes, Tasks, Journal sections), commits, and pushes. The note is ready before I'm awake.
6:30 AM ET — Archive old notes — Keeps only the 3 most recent daily notes in the active folder. Anything older moves to Archive/Daily Notes/. Notes don't get deleted — they just graduate out of the active view.
Obsidian Git pulls the new note down to my laptop automatically on startup (or within 5 minutes), so it's just there when I open Obsidian.
Yesterday's Notes in the Morning Briefing
Hank already sends me a morning briefing — weather, calendar events, anything worth knowing before the day starts. We extended it to include a summary of the previous day's note.
Each morning, before sending the report, Hank reads yesterday's YYYY-MM-DD.md. If there's real content beyond the blank template headings, it gets summarized and appended to the report under a "📓 Yesterday's Notes" section. If the note was empty, that section is skipped.
If anything in the note looks like it belongs in a permanent PARA file — a reference worth keeping, a project update, a contact — the briefing includes a nudge asking whether to file it. No automatic filing without approval.
What We Learned
Audit before you install — Reading the source before running it cost 10 minutes and gave real confidence. For a tool with read/write access to all your notes, that's time well spent.
Build from source when you can — The Homebrew tap had v0.2.3. Building from the audited source got us v0.3.1 — newer, and we know exactly what's in it. The update alias makes staying current low-effort.
Git is a better sync layer than you'd expect — Obsidian Sync's killer feature is real-time cross-device sync. If you're not actually using multiple devices, git + Obsidian Git gives you history, a remote backup, and programmatic access — for free.
Structure before automation — Automating a disorganized vault would have just automated the mess. Getting PARA set up first meant the daily note job had a sensible place to put things from day one.
Tools: Obsidian · obsidian-cli · Obsidian Git · GitHub · OpenClaw cron
Method: PARA (Tiago Forte)
Originally published at https://www.paulbrennaman.me/lab/obsidian-ai-setup

