Blog

I Spent Years Automating My Obsidian Daily Note. Now It Files Itself.

I fed it by hand for years. Now an agent files my day's captures overnight, and I wake up to what's next.

I Spent Years Automating My Obsidian Daily Note. Now It Files Itself.

Here is the part of note-taking nobody tells you about. The capture is easy. The filing is what kills you.

I have no problem dropping a thought. A line about a meeting, a task I just remembered, a bug I want to chase tomorrow. The friction is the pile. By the end of the day I have forty scraps in an inbox and zero energy to sort them. So they rot. My Obsidian vault has years of fossils in it because past me captured and never filed.

The thing all of that capture was supposed to land in is my Obsidian daily note. If you have read me for any length of time you know the daily note is a fixation of mine. I have spent years automating it. A template that scaffolds every morning. The weather pulled in through an iOS Shortcut. Meetings imported off my calendar. Readwise highlights stitched in. I have written post after post about wiring more of the world into that one file.

But every one of those automations fed into the note. I was still the one who had to take the day's loose thoughts and put them where they belonged inside it. The note filled itself with context. It never filled itself with my own captures. That was always my job, and it was the job I kept failing.

So I got tired of being the filing clerk for my own brain. I built a system that does that last part too. I talk to my notes all day. An agent files them into the daily note overnight. And the piece I just shipped means I can now set the whole thing up by talking to it instead of reaching into a database by hand.

The shape of the system

The system runs on a BlackOps feature called Comms. The idea is simple and I will keep it that way.

A Comm is a named intake channel you talk to all day. I have one called "journal" and one called "ideas". Each thing you throw at it is a drop. A drop is a quick thought, a task, an update. You add drops from anywhere. An iOS Shortcut on the lock screen, a webhook, or any Claude session through an MCP tool. The point is that capture has zero ceremony. If capture has friction, you stop capturing.

Drops pile up through the day. Then, on a policy I set, the channel fires. The policy can be on every push, on a daily schedule, or manual when I feel like it. My journal channel sweeps at 11pm. I am usually asleep.

When the channel fires, it triggers a Sortie. A Sortie is a stored webhook and token, a pre-armed action the channel can pull. That Sortie kicks off a Claude Code routine running in the cloud. The routine reads the day's drops, clones my Obsidian vault, and files each capture into the daily note where it belongs. An update about an existing meeting gets appended under that heading. A problem I want to chase gets pushed into tomorrow's note. Anything that deserves its own note gets one and a link back from the day. Then it commits to the vault.

The daily note is the destination. Everything I said all day lands there, sorted, by morning. The same file I have been hand-building for years now fills the one section I could never automate: the loose thoughts.

I wrote every word of those captures. The machine never invents a thought. It just puts my thoughts in the right place. Human-authored, AI-filed.

It knows a task from a thought

This is the part I shipped this week, and it changes what the daily note is.

The old version filed everything as notes. Good notes, sorted into the right place, but flat. A thought and a task got the same treatment: a line under a heading. Which is fine for a thought. A thought is context. It is there so that future me remembers the shape of a thing. But a task is not context. A task is something I have to do or decide, and the worst place for it is buried in the middle of a paragraph where it quietly dies.

So the filer now reads each capture and sorts it first. Is this a thought, or is this an action?

Thoughts flow in as notes, exactly like before. They are reference. They sit in the day and wait to be useful.

Actions get promoted. Each one becomes a real, tracked - [ ] checkbox in the daily note. And the substantial ones get their own standalone note holding the detail, with the checkbox wikilinked straight to it. So a half-formed line like "tighten the onboarding handoff" does not land as a sentence I will scroll past. It lands as a - [ ] I can check off, pointing at a note where the actual detail lives. The action stops being prose I have to re-read and re-decide. It becomes a thing I can work against.

That is a small-sounding change that moved the whole center of gravity. The daily note used to be a tidy record of yesterday. Now it is a sorted list of what is open, sitting next to the context that explains it.

I can set it up by talking to it

Until earlier this week, the runtime was conversational but the setup was not. The system would run beautifully once it existed. But creating a Sortie or rebinding a channel to a new schedule meant reaching into the database by hand. That is a stupid place to leave a system that is otherwise driven by talking to it.

So I added two MCP tools. create_sortie and patch_comm. Now the whole thing is configurable from a chat.

make me a journal channel that sweeps into my daily note at 11pm

That sentence is now a real, end-to-end action. The agent creates the Sortie, creates the Comm, binds them, sets the schedule. No database. No clicking through a settings panel. I describe the channel I want and it exists.

There is a security detail in here I am proud of. The bearer token that arms a Sortie stays optional and stays out of the conversation. You create the Sortie unarmed, then add the secret in the UI. The credential never lands in a chat transcript. If you have ever watched a tutorial paste a live token into a prompt and felt your stomach drop, you know why this matters. The setup is conversational. The secret is not.

The moment it clicked

I will give you a concrete one. During the day I dropped a single line into the journal channel:

ship the onboarding fixes, then send the changelog to the team

One scrap. Half a thought, really. Roughly 73 seconds after the channel fired, it showed up in my daily note as two clean checkbox tasks, filed under the right existing project heading. Not dumped in a pile at the bottom. Filed, in the note, where I would have put it if I had the patience, which I do not.

That is the whole thing in one example. I did the thinking. The machine did the clerical work. And it did the clerical work better than I do it, because it does not get tired at 11pm.

The detail you only learn by building it

Here is the kind of thing that does not show up in any design doc. The routine webhook only accepts a single freeform text field. Try to pass any other custom field and it rejects the request flat.

That constraint shaped the design. I could not send a tidy structured payload with the drops split into typed fields. So the channel bundles the entire day's drops into that one text field through a {{comms}} placeholder. Everything I said all day gets stitched into one block of text and handed off. The routine does the parsing on the other side and decides where in the daily note each piece lands, and now which pieces are tasks worth promoting.

It feels like a workaround until you sit with it. The webhook does not need to know about my schema. It just needs the words. The intelligence lives in the routine, not the contract. That is a cleaner boundary than the structured version I first reached for. I only found it because the constraint forced me to.

You learn the real shape of a system by hitting its walls. You cannot read that lesson off a whiteboard.

What actually got better

The best automation does not announce itself. It disappears into the workflow you already had. I did not change how I capture. I still drop half-formed lines all day exactly like I always did. The difference is what happens after. The pile does not rot anymore. It sorts itself into the daily note while I sleep, and in the morning that note looks like I was disciplined.

I was not disciplined. I just stopped being the filing clerk.

This is the latest chapter in a thing I have been doing for years. I automated the weather into the daily note. I automated the meetings, the highlights, the template. Every one of those poured context into the file. This is the first time the file fills itself with my own thinking, and sorts that thinking into what is reference and what is next.

That is the part that gets me. I talk to my notes all day, and tomorrow I wake up to a clear picture of what is next. The daily note is not a tidy archive of yesterday anymore. It is a prioritized starting line for today. The pile does not just get filed. The next actions surface, sorted and linked, waiting for me.

So the automation disappears, and I wake up oriented. Those used to feel like two different wishes. The system finally does both. It has stopped being a thing I built and become a thing I use, and that is the line I have been chasing. Not the feature. The fact that I never think about it, and the morning is already pointed in the right direction.

If you want the details, the Comms feature is documented at /docs/features/comms, and I wrote up the Sortie side of this in an earlier post.

I wrote this post inside BlackOps, my content operating system for thinking, drafting, and refining ideas — with AI assistance.

If you want the behind-the-scenes updates and weekly insights, subscribe to the newsletter.

Related Posts