Kowalski is an agent runtime in Rust that runs on your own machine. You give a "horde" (a small pipeline of agents) a spreadsheet, a few web pages or a document, and it gives you back a file: a report workbook, a morning brief, a note.

It started in March 2025 as a weekend Ollama wrapper and has mostly grown by deleting things: a five-layer architecture, a crate per agent and three databases are gone. What's left:

  • a four-crate workspace on crates.io (2.6.1) that builds one ~20 MB binary
  • tokio + axum, SQLite for run state, an MCP client for tools
  • the Vue operator UI compiled into the binary by build.rs (a generated include_bytes! table)
  • a horde is a folder of Markdown files: one file per step, TOML front matter for the kind, the prompt and the output file

Each step kind is a StepHandler, and most never call a model: fetching pages, profiling a table, running SQL and writing the xlsx are plain code. The model only writes a query or a paragraph from material it was already given, which is why a 2B model (gemma4:e2b, laptop CPU) is enough. Idle, the process sits at about 12 MB of RAM.

Two things I'd like opinions on:

  • Embedding the built UI: the build.rs table I have now, or rust-embed? Anything that bit you on crates.io, where the UI isn't part of the package?
  • Step handlers are async_trait objects in a registry keyed by kind. Would you move to an enum now that async fn in traits is stable?

MIT. Mac DMG (signed and notarized) and a one-line installer for Mac and Linux.

1 post - 1 participant

Read full topic