rune
personal project
most of my agent projects this year answer one question per call — you ask, it responds, done. rune was me building the thing i actually wanted to run instead: something that stays on, remembers things across sessions, and doesn’t burn a cloud api call on “hello.” it’s designed for hardware that can’t run a real model locally — the whole point is a local gemma 4 handling everyday queries for free, only reaching for a paid cloud tier when a request actually needs it.
a lightweight classifier (also gemma 4, running locally) reads every incoming message and sorts it into daily, coding, or reasoning before anything else happens. “hello world” has to route to the free local tier as a greeting, not a coding request — the classifier needs that nuance, not just keyword matching. coding and reasoning escalate to fireworks-hosted models (kimi k2, deepseek v4) that actually cost money per token, and if a tier fails outright, rune automatically retries one tier up instead of just erroring out.
the part i’m most glad i got right is the event bus underneath all of it. every inbound message, outbound reply, and agent-to-agent dispatch is a typed event, and outbound events get written to disk with an fsync before delivery — so a crash mid-reply doesn’t lose the message, it replays on restart. on top of that sits multi-agent dispatch: rune handles the actual conversation and delegates memory work to a second agent (ledger), which autonomously files facts into topics, projects, or daily notes instead of everything piling into one ever-growing context.
skills load progressively — a hundred words of metadata always in context, full instructions only loaded once triggered — cron jobs run scheduled work with no human in the loop, and telegram, discord, and the web dashboard all flow through the same event pipeline as the cli, so a message behaves identically regardless of where it came from. config changes — api keys, model tiers, routing — hot-reload from a filesystem watcher, which matters a lot more once you’re actually running the thing 24/7 instead of restarting it every time you tweak a setting.