arcships / rutis
git clone https://github.com/arcships/rutis.git
v0.13.0 · 1d ago
A plugin runtime for software that iterates on itself — the substrate where agents write, swap and hot-reload their own plugins in Rust, TypeScript, Python and Go, across processes and machines.
—
stars, 24h
—
stars, 7 days
+148
stars, 30 days · #1,622
148
★ total
10
forks · 19 open issues
Star history starts 2026-10-20; the chart appears after the second daily snapshot.
LanguageRust
LicenseMIT
Created2026-09-22 (28d ago)
Last pushtoday
Watchers0
OwnerOrganization
GitHub topics
agent-frameworkai-agentsbuncordisdependency-injectiongohot-reloadlifecycleplugin-runtimeplugin-systempolyglotpythonrecursive-self-improvementrustself-evolvingtokiotypescript
Links
- GitHub: github.com/arcships/rutis
- Releases · Issues · Hacker News mentions
README excerpt
# rutis **A plugin runtime for software that iterates on itself** Agents and long-running programs write, swap and hot-reload their own plugins, and rutis keeps every change safe. A Rust core · plugins in TypeScript, Python, Go and Swift · across processes and machines Quick start · Guides · Design philosophy · API docs · 中文 When software is itself an agent, or is built by agents, it cannot wait for someone else to wrap the world for it. To reach a new API, model, tool or device, it writes a plugin, tries it, changes it and replaces it, while it keeps running. The connection then becomes part of the program: with a lifecycle, visible, and cleaned up when it goes. Doing that over and over is only safe on a runtime that guarantees a few things: nothing starts before what it depends on is there; everything a plugin registered is released exactly once when it stops; a failed load rolls back; and when an implementation is replaced, only what uses it restarts. rutis is that runtime. Plugins declare the services they need and provide, and rutis decides when they start, stop and start again. The lifecycle model comes from Cordis. rutis implements it once, in a small Rust core, and carries it to other languages, other processes and other machines. ## The loop | | What rutis gives you | | --- | --- | | **Make** a connection | `rutis-host new --lang node\|bun\|python\|go` creates a plugin project. Plugins run in the host's process, in a language runtime, or on another machine, and call each other's services by name. | | **Understand** it | `rutis-host check` lists every plugin's dependencies and what it provides, and fails on a service nothing provides. In Rust, `ctx.diagnostics()` shows each plugin's state, dependencies and bindings. | | **Iterate** on it | `rutis-host dev` reloads a plugin when its files change. Configuration updates live. Replace a provider, even with one in another language, and the plugins using it follow. | | **Without breaking** | Gated start, LIFO cleanup that runs exactly once, rollback on failure. Synchronous calls that would deadlock across runtimes are refused. Loading, unloading and replacing again and again leaves nothing behind. | ## Quick start ### Without Rust [code] The same works for other languages: `bunx --bun @arcships/rutis-host new weather --lang bun`, `uvx rutis-host new weather --lang python` (then `uv sync`, `uv run rutis-host dev`), or `rutis-host new weather --lang go` (then `go mod tidy`, `rutis-host dev`). [code] `llm` can come from another plugin in the same process, from a Python plugin, or from another machine; this plugin stays the same. The full workflow is in the guides for TypeScript, Bun, Python, Go and Swift. ### In Rust [code] [code] Nothing touched `Listener`: when the provider changed, it stopped and started again on its own. Run it from the repository with `cargo run -p rutis --example quickstart`. To run TypeScript, Python and Go plugins inside your Rust application, see embedding in Rus