Gleipnir
Blog

Hello, Gleipnir

I started with a pile of cron jobs on my own computer and ended up building an agent runtime I trust with my family's data. This is how that happened.

It started with a pile of cron jobs.

I had a bunch of little scripts running on my personal computer, doing silly things I didn’t want to think about anymore. One hunted for good ways to spend my credit card points on travel, another kept my weekly menu and grocery list sorted. None of it was clever. It was just me handing off the boring parts of my week.

The problem was managing all of it. Every new job was one more cron entry and one more script to remember and go fix when it quietly broke at 3am. I didn’t really want a pile of scripts. I wanted something I could point at a problem and then mostly forget about.

So I started small. I wired up a few webhooks that could trigger Claude Code, glued together with some simple Python, so an agent could actually respond to things happening in the world instead of just firing on a timer. It worked better than I expected, and it graduated pretty quickly from finding travel deals to running updates on my homelab and dealing with stuff I’d been putting off for months.

The homelab is where it first went wrong. I had given that agent SSH access to everything, every VM, including the reverse proxy and the DNS the whole network ran on. One night a service went down, and in its haste to fix it the agent broke all of my internal networking instead. I had to get in through Proxmox at its raw IP and port, open a console on the VM the agents ran on to kill them, then repair the whole thing by hand.

That was the night I stopped handing agents the keys to everything. The homelab agent doesn’t get a shell anymore. It runs a handful of Ansible playbooks I wrote for the fixes I actually trust it to make, and when it hits something it doesn’t have a playbook for, it opens an issue on a GitHub repo asking for a new one instead of improvising. It only does the things I already decided were safe.

Then other people wanted in.

Family and friends started asking me to build things for them too. A vacation deal finder, because it turns out everyone wants cheaper flights. A reading list generator for a friend who was trying to kick his Instagram and Reddit habit and wanted something better to do with his thumbs. An agent that dug up job listings for someone in the middle of a job hunt. None of these people write code. So I stopped hacking together one-off scripts for myself and started building a little web server, somewhere a person who isn’t an engineer could set up their own agent and let it run.

The thing wasn’t running on my data anymore. It was running on theirs. If it did something dumb or careless, the person it hurt would be someone I actually knew. Around the same time, we all started reading the news stories. An AI tool that reportedly took down part of a cloud provider after it decided on its own to delete and recreate things. An agent that went after an open source maintainer and published a hit piece about him when it didn’t get its way. I didn’t want to wake up one morning having built one of those.

And it was more than the headlines. When your sibling is using the thing you made, “it usually behaves” isn’t good enough.

So, every agent got the same treatment as the homelab one. Each one only got the permissions it actually needed, nothing else, no matter how clever it got or what it talked itself into. And everything it did got recorded where I could go back and read it, so I was never guessing about what happened while I wasn’t watching.

That’s what Gleipnir turned into. It runs on your own machine, with the model you choose, including a local one, so you decide what leaves your hands. And when an agent wants to make a move it can’t take back, it stops and waits for you. I named it after the binding from Norse myth, the one thin as a ribbon that held a wolf when nothing else could.

The bar I set for myself was pretty simple. Could I go two weeks without checking on it and not worry? I didn’t want to build one more thing that needed babysitting. I’d just replaced a pile of cron jobs that needed exactly that.

These days, mostly, I can leave it alone.

This is the first post in a series about building Gleipnir, the decisions behind it and the things I got wrong on the way. If you want to follow along, there’s an RSS feed. The code is on GitHub if you’d like to poke at it.