My personal AI assistant is a backend I run, with ~170 tools across a dozen-plus services. I use it with multiple clients: Hermes (on my laptop and over Signal), Claude Code, Claude Desktop.

What it helps me with

  • Notes and tasks: reading, searching and writing notes, and adding and completing tasks.
  • Calendar: reading events, finding free slots, creating and moving events.
  • Email: searching, triaging, and drafting replies. Drafting only, nothing gets sent without me.
  • Linear: issues and comments directly, and the rest of Linear through a dispatcher.
  • My kids’ school and sports club: messages, homework, exams and schedules from Wilma, and training sessions, attendance and invoices from MyClub.
  • Fitness: sleep, HRV, body battery, weight and workouts from Garmin.
  • Money: filing receipts and purchase invoices into the accounting system, and tracking my investments. The investments aren’t in an outside service: accounts, holdings and balances live in a database that’s part of the backend itself.

The value isn’t in any one of these. It’s that they’re all in one place, behind one login.

Hermes is my daily driver

For most things, my client is Hermes Agent from Nous Research. The agent runs on the Mac Studio, and I use it from my laptop and over Signal.

What made it stick is fairly unglamorous: a good desktop app, proper sessions, skills, cron, and Signal. I use the desktop app on my laptop for longer sessions. Signal is for small things I want done while I’m away from a keyboard. Same assistant and same tools either way.

Any client, same tools

I work on different kinds of projects, and they need different tools. With one backend behind all of them, I don’t have to care which client has which integration.

On a coding project, the vision-level docs live in my notes in Obsidian. I write them by hand, sometimes with Hermes. Then I pull them into Claude Code, chop them into Linear issues and start agents on them. When there’s progress, the same Claude Code session updates the notes and drafts an email update to my collaborators, with all the context already in place.

Calendar, email and family logistics go through Hermes. Summarising what the school sent this week, or marking one of the kids in or out of a training, takes one message. The more involved chores have their own Hermes skills, like filing a receipt that arrived by email into the accounting system.

When I’m replying to an email, whichever client I’m in can pull context from my notes, tasks or Linear. I don’t have to go and find the latest status of something before answering a question about it. The draft just already knows.

When I plan a trip in Claude Desktop, the useful bits go straight into my notes, and the loose ends become tasks. The planning conversation can end whenever, because nothing important stays stuck in it.

And every morning at eight, a briefing lands in Signal. It covers my calendars, the inbox, tasks due today and how I slept last night, and it gets all of that with a single call to the backend.

The aim is that I never copy-paste context between tools by hand. That’s the backend’s job. I move between clients and services as I see fit, and adding a new client is just a URL and a token.

What makes it worth it

Four things are solved once, in the backend, instead of in every client.

  • Auth. Each client gets one credential for the backend, instead of doing its own OAuth dance with every service. Adding a new service is one command in the backend’s CLI, and every client can use it straight away.
  • Files. Every file gets a reference that any tool can take. An attachment from an email can go straight into the accounting system, or into a reply to someone else, without the agent working out a curl upload against yet another API each time. The file never passes through the model, and Hermes over Signal can do it the same way Claude Code can, even though only one of them has a filesystem.
  • Time. Every service has its own idea of how to write down a point in time, and two of them look identical while meaning different things. Before I fixed this, a calendar event at 07:00 got read back as 09:00. Now there’s one serialiser, and no client has to guess.
  • Guidance. This is guidance injection, grown up: the rules for a tool get delivered when the tool is called, by the backend, rather than living in a system prompt. Every client follows them without being told, because every write goes through the same place.

Tool bloat used to be a real problem with this many tools. Most clients now load tools lazily, and the big providers get a small curated set plus a dispatcher for the rest, so it mostly stopped being one.

Still undecided

I keep going back and forth on whether to build my own harness and get full control. Then I look at what Hermes keeps shipping, and a lot of it is exactly what I’d want anyway. So for now, Hermes wins. The backend makes that question cheaper to revisit, at least. Switching harness wouldn’t mean redoing a single integration.

I’m fairly sure this setup will look different a month from now. This landscape is evolving so fast that it feels like every blog post gets stale in a week.