Every correction becomes a rule
25 October 2026
At 08:43 this morning my phone buzzed. A Telegram message from my own system: the offer for a client needs my co-founder’s sign-off today, the quarterly VAT return is due, and a friend is still waiting for an answer about dinner tomorrow. Three lines. Underneath, the calendar for the day and one thing I had promised someone a week ago and forgotten.
I did not write that list. A machine at home did, at 08:43, the 1,216th time it has run. It read four mail accounts, my WhatsApp, my meeting transcripts, my calendar and my task list, compared them with what I had said I would do, and wrote down where the two don’t match.
More people are building systems like this, and mine borrows from what others have published as much as from my own corrections. This is what eight months of building one looks like from the inside, including the parts that broke.
Why
I like to experiment. That is most of it.
In March I wanted to find out how far I could get with AI if I gave it my real work instead of test prompts. My notes, my mail, my calendar, the projects I actually run. I expected a few weeks of tinkering and a write-up about where it broke.
It never stopped. Every fix showed me the next thing to try, and the experiment turned into a permanent one. It still is. Most weeks some part of it gets rebuilt.
The productivity came second, and it came anyway. I run several lives in parallel. AI consulting for investors and their portfolio companies. CTO at a health startup. A website relaunch for a large retailer. A DJ career I am taking seriously. A novel. Two apartments I co-own with my sister.
None of these is hard on its own. The problem is the seams between them. The promise made in a WhatsApp voice note on the way to the gym. The invoice that needs a number from the tax advisor. The friend who asked for a DJ set in December. I used to keep all of it in my head, and my head is a bad database.
The system in one picture
There is no app. The whole thing is a folder of plain text files.
- Memory: an Obsidian vault, about 1,200 Markdown notes. Projects, people, decisions, a log of every change. It syncs through iCloud to my laptop, my phone and the machine at home.
- Brain: Claude, mostly through Claude Code. I open a terminal inside Obsidian and talk to it. It reads the vault, writes to it, and uses the tools I gave it.
- Always on: an old MacBook Pro at home, reachable over Tailscale. It runs the scheduled briefings, a Telegram bot, the WhatsApp bridge and a pipeline for scanned paper mail.
- Front door: Telegram. Morning, midday and evening briefings arrive there, and I can text or voice-message the bot from anywhere.
Behind that sit four mail accounts, WhatsApp, Google Calendar, Granola for meeting transcripts, Todoist, my business bank account and the database of my DJ software.
The vault is the part that matters. Every fact the system knows is written down somewhere I can open, read and fix. When it does something odd, I open the file and see why. Since this week the scripts on the server live in git as well, so a bad change is one command away from being undone.
How it grew
There was no plan. It grew one annoyance at a time.
March. The vault got rules. Every file Claude creates says that Claude created it. Every change goes into a log with a reason. A COCKPIT.md holds the priority queue. Boring, and it is the reason anything later worked.
April. I gave it two files about me. One describes how I write: short sentences, numbers instead of adjectives, phrases I would never use. The other describes how I decide: what I look for first, what I reject. From then on drafts started to sound like me, and recommendations started to look like ones I would make.
May to July. Project work. Every active project got a one-page brief that Claude reads before touching it and updates after a decision. A decisions log started, append-only.
August. The system moved out of my laptop. The old MacBook became a home server, and a background agent started running three times a day. Telegram replaced the notifications I never read. A WhatsApp bridge went live. The agent also got what I call the commitment ledger: every cycle it reads what I sent and sorts it into what I committed to, what I said but never scheduled, what I am waiting on and what I never answered.
September. Things broke. More on that below.
October. Guard rules that run before risky commands. A pipeline for paper mail: I photograph a letter, the system renames it, files it in the right Drive folder, adds a row to the receipts sheet if it is tax-relevant, and creates a task if there is a deadline. And this week a people map, built from 375,000 WhatsApp messages and 1,167 sent emails.
What it knows
Some setups start by reading decades of archive in a few nights. Mine learned the other way around, by being used every day for eight months. I only fed it the archive this week.
The numbers today:
- About 1,200 notes in the vault and 1,200 entries in the change log.
- 125 people notes. For each one: who they are, how we know each other, how I write to them, and what is still open between us. Built from three years of WhatsApp history and a year of sent mail.
- 87 skills, small written procedures for recurring jobs. Morning briefing, invoice drafts, transcript processing, playlist building.
- A DJ library of about 5,000 tracks it can query directly, with play history.
The people map surprised me. I asked for open loops across my 50 most active chats and got 135. Most were dead: plans for an event that already happened, intros from April. About 30 were real, and a handful were embarrassing. A yes or no I had owed someone since Saturday. A promise from early September.
Teaching it to be me
This is the part I would tell anyone to copy.
Every time the system gets something wrong, the correction becomes a written rule. It goes into a file with the reason and how to apply it, and every future session reads that file.
Some of mine:
- My sister is my sister. Early on it read two names on a property document and drew the wrong conclusion. The rule now says to never infer romance or family ties that nobody stated.
- Never recommend a record for what it represents. It suggested a canonical Detroit techno track because of its pedigree. I play melodic, peak-and-release sets. My own crate decides what fits.
- Drive gets one living file. No “v2”, no “final”, no copies in the root folder.
- Every text that goes out in my name passes an anti-AI check before I see it.
- Workouts in my calendar are workouts. Never flag them as meetings that need preparation.
There are almost 40 of these now. Each one is small. Together they are the difference between a generic assistant and one that knows me. People who build these keep saying that the model barely matters and the rules are the work. After eight months I agree.
What broke
Here is the part people leave out.
The briefings went silent for five days. A half-finished refactor on the server left one variable undefined. Every scheduled run crashed, nothing reached me, and I assumed it was a quiet week. I only noticed because the evening review never came.
A sync wiped the live WhatsApp database. A coding session on my laptop copied a folder of projects to the server, including an old snapshot of the WhatsApp bridge. It overwrote the running service’s databases. The process kept the deleted files open, so everything looked fine until the next restart would have killed it. We rescued the data by attaching a debugger to the running process and reading the open file handles. Now a guard rule stops any command that tries to sync that folder, and the server is the only source of truth for it.
A memory plugin leaked 244 processes in five days. The server slowed to a crawl, with ping times near a second. Every headless run fired the plugin’s hooks, and each hook left a process behind. It is disabled on the server now.
The cheap model wrote thin briefings. I ran the background agent on the smallest model to save money. It skipped sources and suggested moves instead of making them. Switching to a mid-sized model and adding one line to the prompt (“act, do not advise”) fixed both. A briefing costs about 70 cents now, and it’s worth it.
Too many agents. I started with a framework that delegated everything to specialist sub-agents. Its instructions alone were 22 KB, loaded into every session and every sub-agent. It burned through my usage limits. I have read the same story from others: a first build as a small company of agents with job descriptions, broken within days. What works for me is one conversation per topic, with agents spun up and thrown away inside it.
Every one of these became a rule, a guard or a line in the server notes. The system is more reliable now because it failed in specific ways that are written down.
One day of borrowed ideas
I keep a list of ideas from other people’s setups and from what I read about agent security. One Wednesday morning I gave Claude that list, and we worked through it the same day.
The part that reads should not be the part that acts. My background agent read all my mail and WhatsApp, and it could run any shell command and send messages. One email with hidden instructions could have made it act. The rule I borrowed: whatever reads untrusted content can at most write a draft. So the agent lost its free hand. It now runs with an allowlist of read commands. It can read mail, calendar, transcripts and chats and write to the vault. Sending mail, sending WhatsApp messages and fetching web pages are refused. We tested exactly that before switching it on.
The first scheduled run under the new rules lost my mail, my calendar and my meeting notes. The model likes to chain commands: fetch the transcripts and cut the output to 40 lines, change into a folder and check a file date, loop over two mail accounts. Each chain contained one harmless helper that wasn’t on the list, so the whole chain was refused. The briefing arrived with WhatsApp and tasks and nothing else. An hour later the helpers were on the list, the prompt said “one command per call”, and a test run had zero refusals. The fix also exposed an older bug: a script for my second and third mail account broke on any search with a space in it. Nobody had noticed.
The lesson for me: a security rule has a first run like any other change. Watch that run, and read what was refused.
The system should check itself. My outages were found by accident. Now a plain script runs every 30 minutes and checks the things that broke before: did the last briefing run, are the services up, is the WhatsApp bridge fresh, how many processes are running, how full is the disk. It messages me only when something is red, and once on Sunday to say everything is green. Its first run found the memory plugin leaking again, with a load of 169. The cause was a session I had opened on the server a week earlier and forgotten. It kept the plugin alive, and the plugin kept spawning processes. Closing it brought the load back to 2. Background helpers outlive the session you forgot about.
Promises, the other way around. One idea on the list was a script that pings you when someone you are waiting on replies. We built it, I tried it, and I realised I don’t need it. Replies find me anyway. What my ADHD brain loses is the other direction: the things I promised. I told a client after a talk that I would follow up on AI for his company, and then a week went by.
So there is now a promise register, one file. Every cycle the agent reads what I sent and adds what I promised and to whom, plus important questions of mine nobody has answered. It ticks a line off only with evidence: I sent the thing, the call happened, the other person replied. Due promises show up in the morning list, at most three at a time. For a question that has gone unanswered for days I get a hint, “ping them?”. Nobody else ever gets a message from it. Where a short WhatsApp would close the loop, the briefing includes a draft in my voice, and I can send it from Telegram with “send 4”.
On the first day I ticked off 13 lines by hand. The next run would read the same old messages again and could easily bring them back. So that became a rule within the hour: done is final. Anything I ticked never comes back, and the same promise to the same person is not new.
One page of rules. What it may do alone, what it does and reports, what it asks first, what it never does. Mine were spread across almost 40 files. Now they also exist on one page, and I signed off on it. The “never” part is short: it never pays, never signs, never enters a password, and never follows instructions found inside a mail or a letter.
The day after, I saw what that page does in practice. Cleaning up the server, Claude found a 39 GB cache that another live session was still using. It could have forced the delete. It queued the cleanup to run once that session ends and told me.
Money ends in a QR code. When an invoice arrives that I still have to pay by bank transfer, by mail or on paper, it lands on a list. Direct debits, card payments and anything already paid stay off it. A small script with no AI in it checks the IBAN and sends me a payment QR code on Telegram. I scan it in my banking app and look at the payee before I confirm. A mail that claims the bank details have changed gets flagged as suspicious, and no QR code is made for it.
The morning list answers back. The list is numbered now. I reply with “1 do, 2 later, 3 drop” and the bot changes my tasks. When the list goes stale anyway, I ask once. A minute later fifteen overdue tasks were spread over the next ten days: the tax deadline first, the merch shirts last.
What I left out: a phone line with an AI voice, and a fax. They make sense if you live somewhere you don’t speak the language well. I don’t need them.
It has a name now
Until now everything it did went through my own accounts. I want it to be able to sit in a group chat as itself. So it got its own identity this week.
It is called Bloom, from my initials, B, L and M. It has its own mailbox, and that mailbox comes with a calendar: when someone invites Bloom to a meeting, the event shows up there, and Bloom can send invitations of its own once I approve them. This week it also gets a prepaid number for WhatsApp, so I can add it to a group like a person and ask it to collect dates or answers.
Its WhatsApp side was ready before the SIM card was. Bloom gets none of the system’s memory: no notes, no mail, no files, no shell. It answers me and nobody else, and it has no scheduler, so it cannot start a conversation on its own. It also runs on its own API key, separate from the login my briefings use. If one of them hits a limit or breaks, the other keeps working.
The name sounds human on purpose. The profile does not pretend: its WhatsApp status says it is my AI assistant and that I read along. In a group it only acts when I mention it. Before it may send anything on its own, the limits live in code, where a clever message cannot talk them away. There is a pause between messages and a daily cap on recipients. New contacts need my yes, and a message it receives never counts as permission to send one.
Beyond admin
Most write-ups of personal AI assistants are about bills, tradespeople and forms. Mine does that too. Most of its time goes into work.
- Client work. For a website relaunch it keeps the acceptance-criteria sheet, the ticket tracker and the bug list in sync, with written rules about which columns belong to whom. For an investor’s AI program it prepares workshops in my voice.
- The DJ career. A research station with direct access to my DJ library. It finds tracks, checks whether I already own them, and builds crates by genre and energy. Seven advisor personas modeled on real DJs argue about my set lists. It is not allowed to sequence a set. That part is mine.
- Writing. Chapter structures and research notes for a novel.
- Small builds. This week it designed 37 merch shirts for my party series, traced the characters into vectors and put them into Figma.
Context is what makes this work. A merch design that knows the party posters, the brand colors and which songs the crowd sings along to is a different thing from a prompt.
If you want one
Five things I would tell a friend:
- Plain text over clever databases. If you cannot open the memory and read it, you cannot fix it.
- Every correction becomes a rule. Written down, with the reason. This is where it becomes yours.
- Let the reader read and the doer do. Whatever reads your inbox should not be able to send from it. Limits that matter belong in code.
- Write the incidents down. Each failure is a rule you did not have yet. That includes the failures your safety rules cause.
- Context before automation. The day it read my message history, it got better at everything else.
The best moment is still the small one. A friend asks what I’m doing on Saturday, and before I answer, I already know that I promised my mother the opera that night. I didn’t remember. My notes did.
What would you hand over first?