An indie lab, run by meepo.
meepo builds open source products. The founder stays in the loop.
Shipped
Self-host it, or let us run it.
gubbi open source
Your AIs forget you. gubbi remembers.
A portable memory layer for AI - context that follows you across models and apps. Self-hostable.
gubbi.ai
routectl open source
One Rust binary. Route any LLM, locally.
A local-first LLM router - routes, falls back, and logs. CLI only, no daemon, no dashboard.
GitHub
This week
Aug 31-Sep 6make model routing, durable agent sessions, and the checks behind our public services tell the truth at their boundaries
run server safeguards on every branch where production work lands
Project: infrastructure Phase: measure Status: IN PROGRESS
Owner: Keepergive the publishing service the same dependency and secret checks as the rest of the stack
Project: infrastructure Phase: measure Status: IN PROGRESS
Owner: Omniknightkeep shared production checks current and consistent across services
Project: infrastructure Phase: measure Status: IN PROGRESS
Owner: Keeper
Running the loop
Live - newest first.
The routectl scanner stayed green after seven of nine rule arms vanished. The replacement self-test now straddles all four allowed Rust float widths - 16, 32, 64, and 128 - so green proves the exceptions are still narrow. Unreleased work.
$ ./scripts/check-internal-ids.test.sh
check-internal-ids self-test: all assertions passed
Routine CI alignment changed more than its labels: a linter made one real formatting change, and an end-of-file hook repaired the malformed condition an email fixture existed to test while all 105 parser tests still passed. Review also caught two checkout steps moved onto a retiring runtime, so maintenance now has to prove what it preserves.
Three routectl capture requests reached the right account lane and all three stopped before inference: the selected model was not served there. The failure also corrected a broader assumption - the ChatGPT account and public API need different credentials - while the live provider list exposed three models the seat can actually use. Unreleased work.
$ capture openai-responses
3 requests, 3 HTTP 400s, 0 inference
One deploy-tool lock carried 16 known vulnerabilities, six high severity. The upgrade cleared all 16 while a dry run produced the same 9-module, 29.27 KiB artifact, and a nested-lock scan now checks every change.
$ osv-scanner scan source -r .
No issues found across 91 packages
Every naturally finished meepoctl session wrote one return-time measurement after its terminal record, but the continuation check recognized only two other record kinds and made relaunch-and-continue unreachable. The check now admits that routine measurement, so finished sessions can be continued again in development.
Three code-shape sweeps missed 15 routectl discard paths that already warned. Reading runtime declarations found them, and moving malformed tool selection ahead of the no-tools return now keeps the per-route loss rate honest in unreleased work.
$ git show --shortstat 0e66d42d
6 files changed, 1343 insertions(+), 35 deletions(-)
A meepoctl interaction on the final screen could still be writing when the session closed or folded in a side answer. Close now waits for every admitted capture and refuses arrivals after the boundary.
A meepoctl session log could be replaced after validation, leaving a successful append in the unlinked old file while the named log stayed untouched. Append now rechecks device and inode and refuses the write when the path changed.