How I work · PKM & AI
Notes are the hub. Agents do the legwork.
I keep one Markdown vault in Git, with a daily journal at its centre. AI agents read from it, work in small, reviewable steps, and write what they learn back. Here is the setup and why it looks the way it does.
The loop
The loop
One vault, in Git
Everything lives in a single Obsidian vault of plain Markdown, organised with PARA: projects, areas, resources, archive. It syncs through Git only. On the phone, an iOS Shortcut pulls when Obsidian opens and commits when it closes, so conflicts became rare instead of weekly.
I write in whichever language the thought arrives in. Roughly half the vault is German, half English, and that is fine for me and for the agents.
The daily journal is the hub
Every day gets one note. It links to the projects I touched, the decisions I made and the notes that changed. Agents start their work there, so they see what I see. Anything worth keeping moves out into a permanent note, and the journal shrinks to a short index of the day.
One TODO.md, run like GTD
Every task I have lives in a single TODO.md at the root of the vault, grouped by area: house, family, homelab, travel, taxes. There is no second list and no task app; I dropped Todoist when this one started to work. Each daily journal shows the open tasks through a Dataview query rather than a copy, so there is one list and many views of it.
The rules come from Getting Things Done, kept small. Everything is captured first, in the journal’s inbox, and then clarified into a next action. A task is one scannable line that says what to do and where to look, never how: anything that needs more than a sentence becomes a project note or a sub-bullet, and the checkbox links to it. Agents follow the same rules. They add tasks when they find work, tick them off when they finish it, and never leave a task buried in a journal.
What I do not do yet is the part GTD rests on: the weekly review. The journals are there and the list is there, but nobody sits down once a week to go through both, so stale tasks pile up and the Now page lags behind. That is the next habit to build, with an agent preparing the review from the week’s journals and the list, and me doing the deciding.
OKF and vk
The Open Knowledge Format gives every note a small, predictable frontmatter: type, status, tags, related notes. okf backfills it and checks it, so agents never have to guess what a note is. vk installs the same skills and templates into every vault for every agent I use, from one source.
A main session and minions
One long-running Claude Code session acts as the lead. It reads the issue, plans, and hands each focused task to a minion: a fresh agent with its own worktree, one branch and one merge request. Minions report back in a file; the main session reviews, I merge. The rule that makes this work: a minion never merges, deploys or touches another minion’s branch.
A densely linked vault is great for thinking and expensive for agents: every link is a reason to read one more note. I keep agent context narrow on purpose.
One MCP gateway for my agents
This is the part I am proudest of. An agent is only as useful as what it can reach, and the Model Context Protocol (MCP) is the standard way to hand tools to one. But one server per tool means one URL, one login and one config entry per tool and per agent. So I built a gateway: a small service of my own, about five hundred lines, that runs on my cluster and is deployed by Flux like everything else. In front it offers one endpoint and one login, Authentik over OAuth. An agent signs in once and sees every tool, sorted into groups. A client that should see only one group connects to that group’s own path.
Stacked on small screens - tap Enlarge for the wide layout.
Behind the gateway sits a small fleet of MCP servers, each wrapping one tool and reachable only through the gateway:
| Server | Wraps | What agents can do | Group |
|---|---|---|---|
| Immich MCP | Immich | search photos by meaning, browse albums and people, tag and organise | photos |
| Paperless MCP | Paperless-ngx | search, read, convert and tag documents | docs |
| Linkwarden MCP | Linkwarden | search, file and tag bookmarks | docs |
| Jellyfin MCP | Jellyfin | list and curate playlists | music |
| Observability MCP | Prometheus, Loki, Tempo | query metrics and logs, search traces, read alerts | ops |
| Vast MCP | Vast.ai | list, deploy and stop GPU models | ai |
| Google Workspace MCP | Google Calendar and Contacts | read and write events and contacts | |
| UniFi MCP | UniFi Network | read the network, change selected parts after a preview | network |
Six of the eight are my own code, small Python services. Google Workspace MCP and UniFi MCP are upstream open source projects. I run Google Workspace MCP as it is; I imported UniFi MCP into my own repository with a small patch.
The payoff is that one session can cross tools that know nothing about each other: ask Prometheus why an alert fired and read the matching Loki logs, then file the fix as a bookmark. The tools stay where they are, and the gateway holds no data of its own beyond login registrations.
Why self-built? The off-the-shelf gateway I tried first came with hundreds of settings, dozens of database tables and three containers for a feature set I would use five percent of. A small gateway that is the only trust boundary, with every server behind it, is easier to reason about. The lab behind it is described in The Tools Behind My Homelab.
My setup
| Tool | Role | Why this one |
|---|---|---|
| Obsidian | Writing and linking | Plain Markdown on disk, nothing locked in |
| Git | Sync and history | Works on every device, every change reviewable |
| Claude Code | Main session and minions | Strong at planning, good at long tasks |
| MCP gateway | Agent access to the lab | One endpoint, behind SSO |
| okf, vk | Vault hygiene and shared skills | Written by me, for exactly this |