Skip to content
can:~$
Back

Géri: The Second Wolf

/*Table of Contents (5Sections) ▼

I was building a sound card. A protocol came out of it.

About a month ago, while working on my own sound card hardware, I ran into the same thing again: I build all this hardware, but I can’t properly monitor or control it. The circuit is mine, the code is mine; checking what the fuck it’s doing still takes extra work. Build another board, then write another way to talk to it.

I wanted a common place to look at all of them and issue commands when necessary. Doing the same work over again was getting on my nerves.

Around then, I’d bought a router with OpenWrt support. I can flash custom firmware and run my own software. The router sitting at home got a job too.

I sat down with several AI agents and wrote Géri.

After the first week

We worked through shared iterations. Write the pieces, connect them, look again. The library came together in about a week.

The first version the AI wrote was unusable.

I spent a few more weeks reviewing and fixing it. As a side project, alongside my main work. Something I’d written in a week kept me at it for several more. I was going to use it in my own setup, so I kept fixing it.

On the Rust side, I separated the protocol, transport, and storage pieces. I wanted the messages to mean the same thing over HTTP, WebSocket, or a serial line. In Géri, a device introduces itself: the data it sends, the commands it accepts. The hub builds a panel from that declaration. I wanted to reduce the extra interface work that came with every new board. If the internet drops, unsent durable records should wait. If the same record arrives again, it shouldn’t be counted twice. I should be able to see the result of a command I’ve issued.

Each one corresponds to a job on my own desk. I wrote it to reach the hardware I’d built. Now I use it.

The comparison with MQTT/Sparkplug, ESPHome + Home Assistant, and Zenoh is in the repo too.

Not every signal is worth keeping

I fixed plenty of things over those few weeks. One that comes to mind is the unnecessary reading and writing on the Cloudflare Durable Object side.

I was reporting every intermediate counter value; whenever count moved, the system did more work. I switched to fetching the latest value and comparing it, and raised the threshold for a meaningful change. I added a mechanism for choosing which data gets recorded, keeping only what matters.

I also added live. Watching CPU jitter, for example, might tell me something while I’m looking at it. I’d send that over live. If a current sensor’s reading is critical to me, I’d record it; I need to be able to go back and inspect what happened. I separated durable history from real-time observation. I don’t have to write every signal from every sensor to storage. I choose what to keep according to what I need.

Cloudflare Durable Object storage chart showing a spike in rows read and written, followed by continuing traffic

Cloudflare Durable Object storage chart, October 9–10, 2026. Blue: rows read. Orange: rows written. The spike and what followed are on the same chart.

Freki was already there

You’ll see the name Freki in the lab too. My personal computing system. A platform running on the PCs at home.

It coordinates AI agents and carries out research and computations too. A personal AI fabric is one part of it. Its algorithms differ from those used in comparable systems on the market. I built it for my own work.

I opened lab.can-eroglu.com so I could give Freki commands and inspect existing results from anywhere. Let the computation run at home; I shouldn’t have to sit at home to see the results. Monitoring my hardware connected to the same place.

That’s where Géri’s name fell into place. Freki already existed. I put the second wolf alongside it.

Two brother wolves. They fit the setup at home.

Testing the medicine on myself

Géri now runs in that lab. Have a look. I use it to reach my own system. The address uses a Cloudflare Worker; the edge library isn’t public yet. It does what I need.

It’s like a doctor discovering a medicine, infecting himself with the disease, and testing it on himself. Fucking hell. I write a library to access my hardware and computing system, then use that same setup through it. I’m both the doctor and the test subject. 🙂

If there’s a bug, it comes back to affect my work. I keep living in the same lab as the fix I postponed. A useful way to review things: I get to sit on the user side of whatever I missed too.

There are still a few things to fix. I’ll work through them gradually, according to my needs. It came from a personal need. Maintenance will continue as I use it and need something from it.

The repo is open. If you find a bug, you can open an issue. I’m open to pull requests too.

The main work

What I’ve mainly been working on for several months is a closed-source electronic circuit engine written in Rust. Tens of thousands of lines of code.

Hundreds of agents, billions of tokens of research, debugging and review sessions lasting hours. The few weeks spent fixing Géri are small beside it. In the main project, I keep returning to research, code, and review.

I’m bored. So I’m leaving the working side project here for a moment.

The agents are there, but the time I give those sessions still comes out of my life. I’ve given it months. I’m getting close to the end.

I want to leave something of myself behind in analog electronics. A legacy.

The second wolf has found its place too. 🐺


Share this post on:

Next Post
Can's Slash Analyzer v.0.1