Skip to content

Vigie

July 2026 → August 20268 min read

For a long time, my life was spread across ten places that never talked to each other. Notes in one app, the calendar in another, tasks in a third, reminders on my phone. And since I had to pick a category before writing anything down, in the end I just didn't write.

Eventually I put everything in a single folder of markdown notes, run by Claude Code. I'd give it a raw piece of information and it would file it in the right place. It kept my journal and did a weekly review. The catch was that all of it lived on my PC, in a terminal. I wanted to jot something down from my phone, by voice if needed, and have reminders come to me.

Vigie is that folder turned into a website. A private site, on my server, with a single account, mine. I type or dictate in a chat, Claude files things away, and the interface shows what it filed. There are two halves, personal in coral and work in blue, each with its own dashboard, journal and calendar. On the work side, Claude also spots what matters in my work journal, like a delivery or a tough problem solved, and adds it to my achievements as I go, instead of me rebuilding them the night before my annual review.

There's no link to try it: the site is full of my life, and the code stays private.

A day with Vigie

In the morning, I get the summary of the day ahead on Telegram. A word about yesterday, the calendar, the weather, the tasks that are due and the emails waiting on me.

During the day, when an idea comes up, I type it or dictate it from my phone, with no category and no form. If I say "remind me Thursday at 2 pm", the reminder goes out on Telegram on Thursday at 2 pm.

In the evening, I tell it what I did. Claude updates the journal, ticks off the tasks I've dealt with and adds the ones I mentioned along the way. There's a single conversation for both personal and work, because a day doesn't split in two. At the end of the week, I close it. Claude sums up the week, updates the journals, and the next conversation starts from that summary.

Why not an existing tool

The day before the first commit, I had compared the personal agents you can host yourself, like OpenClaw or Hermes Agent. At the time, none of them ran simply on my Claude subscription from a server. I also wanted my own interface, with screens built to be read quickly on top of the conversation, and to be able to open my data without Vigie. The journals are markdown files, and the rest fits in one SQLite file. And for one person on one server, I didn't want a bloated setup.

What happens behind the scenes

So Vigie runs on my Claude subscription, with no API paid by the message. The notes folder moved from my PC to the server, and Claude Code works in it, launched by the server for each message. At first, the server ran the claude -p command and parsed its output by hand. Since August, it goes through the Agent SDK, which I had ruled out, thinking it was billed per token. It actually bundles Claude Code and runs on the same subscription.

Claude writes the markdown journals itself. For everything else (tasks, reminders, achievements), it goes through tools I wrote, exposed over MCP and wired to the database. Each tool checks what it's asked to do. A reminder in the past is refused, because it means Claude got the date wrong. And to edit or delete a row, it has to have read it during the turn, the same way Claude Code's Edit tool works with a file.

On a subscription, only one turn runs at a time across the whole site. A message sent while Claude is answering waits in a queue under the current answer, and I can remove it as long as it hasn't gone out.

The biggest speed gain came from context. At first, Claude found out about the calendar and the tasks by calling its tools one by one, and each call reread the whole context. For "what do I have planned and to do", that meant six round trips and about thirty seconds. Now the server hands it the week's calendar and the open tasks at the start of each turn, and the same question takes about twelve seconds.

On the technical side, Vigie is a Bun monorepo. The server is an ElysiaJS API with real-time updates over SSE, since nothing needs a two-way channel. Data lives in SQLite with Drizzle, login goes through Better Auth, and the front end is React 19 with Tailwind 4 and shadcn/ui. The front end reads the API's type through Eden, so a renamed route breaks its build before it breaks anything in production. It all runs in a container on my VPS, under Dokploy.

Reading without touching

Vigie also reads my calendar and my email, without ever touching them.

At first, Claude could add events to the calendar, and Vigie published a calendar that Proton subscribed to. But an event created by Claude didn't exist in Proton. The sync could neither update it nor remove it, and it stayed on screen forever. After a week, I removed all of it. I write my events in Proton Calendar, and Vigie keeps a copy, because the interface has to display it.

Emails are never copied. When an answer needs them, Claude reads them through Proton Mail Bridge, read-only. And since anyone can email me, each message reaches it fenced off as data, with the instruction never to follow what it says.

Even my questions can leave nothing behind. From the search page, a question goes into a throwaway turn, with no saved conversation and no write tool loaded at all. The catch is that Claude Code writes every exchange in plain text to its config folder. Vigie deletes those files at the end of the turn.

The morning summary

That summary is the only thing Claude does without me asking. The calendar, the tasks and the weather are fetched with plain queries, then handed to Claude with a clear instruction: this block is the authority. Claude only sorts the emails, says a word about yesterday and does the wording.

That instruction comes from a failure. During a test, the summary announced an appointment, a time and a trip that didn't exist. The calendar was empty, and Claude had filled it with what it had read in the journal. For a message you read when you wake up, it doesn't get worse than that. Now an empty day is said in one line. Same for an unreadable mailbox, which Claude had first described as quiet.

Alerts, like a failed login or an expired Proton Drive session that stops the backups, go through the same Telegram bot. The same alert isn't sent again within six hours, unless things get worse.

Locked down

The site is public so I can open it from anywhere without a VPN, but every login asks for the password and a passkey. Sign-up is closed on the server side, and only a command over SSH can unlock the account. The data lives outside the Docker image and goes to Proton Drive every six hours.

Even the name matters. HTTPS certificates are listed in public logs, and a subdomain like "journal" would have announced what's behind it. "Vigie", French for lookout, says nothing.

Built with Claude

Vigie is written with Claude Code. I started from a spec, HTML mockups of every page and one prompt per workstream, prepared with Claude, then I ran each prompt in its own session, in order. The first commit is from the evening of July 17, and Vigie was live on the 19th at half past one in the morning, with my old journals brought into the database. Right before going live, we did a full code review with my feedback, plus a security audit along the way.

Of course, not everything worked the first time. The rule meant to keep one backup per day for two months kept nothing. It looked for the 3 am archives, while backups run at midnight, 6 am, noon and 6 pm. Its test passed anyway, because it only fed it 3 am archives. Nothing had been lost yet.

Another trap: one page showed data frozen since the initial seed, while claiming to be kept up to date by Claude. Since then, whatever is displayed comes from one of Claude's tools or from a computation on the database, otherwise the block doesn't exist.

Finally, dictation changed engines. The browser's built-in dictation sent the audio to Google and got names wrong. Since October, the audio goes to Parakeet, a speech-to-text model running on my server, and Claude fixes misheard proper names using the ones in my notes.

Where the project stands

Vigie has been in production since July 19, and I use it every day. I still have one list of things to add, and another of things to simplify.

Technologies used