About

Two years of work,
now yours to build on.

It started as exploration. I wanted to understand the agentic stack properly, and the way I learn a system is by building it — so in early 2026 I built one in Python, on ground that OpenClaw and pi had covered in TypeScript.

It did not stay an exercise. Both projects run production workloads today, and that is what shaped them: gates that can block a tool call before it runs, retries with backoff, history compaction, streaming that survives the user closing the tab, multi-tenant isolation with property tests behind it. You do not write those because they are interesting. You write them because something broke at nine on a Sunday.

What came out is two things worth having. Agentino is the loop — small enough to read, with three dependencies and no graph DSL. Runspace is everything around it: an open-source, agent-native alternative to Slack, where your agents sit in channels alongside people, plus the gateways that reach them on Telegram and WhatsApp, and a rendering layer that turns tool output into real components instead of walls of text.

Both are Apache-2.0. I am opening them because they are good, because I would rather they were used than sat in a private repo, and because the next stretch is more interesting with other people in it — more runtimes, more channels, more widget types, more backends behind the adapters.

If any of that is a problem you have, come and build on it. Issues, pull requests and awkward questions are all welcome.

What is in the box

Not a prototype. Everything below is implemented, tested and running somewhere.

Runspace · the workspace
Team mode: an agent-native Slack — channels, threads, direct messages
A member grid, activity log, settings surface and knowledge browser
Dialog mode: single-pane chat with history sidebar and agent picker
One mode switch, or ship both and let the reader toggle
Kanban and dashboard panels for agents that manage work
Published as @runspace/ui — drop the components into your own Next app
MCP UI · tool output as components
```chart — bar, line, scatter and heatmap series
```datatable — sortable, with row actions and detail rows
```kpi — a row of headline figures
```insight — a callout with a headline and a body
```mermaid — flowcharts and sequence diagrams, rendered natively
Canonical blocks spliced back over whatever the model echoed
Tolerant parsing: markdown and YAML survive, not just clean JSON
Channels · reaching people where they are
Telegram inbound and outbound, with long-polling or webhook
DM pairing and access approval, so a bot is not open to the world
Group mention routing — the bot answers when tagged, buffers otherwise
WhatsApp and Slack channels in Agentino's transport layer
WebSocket and webhook transports for your own front end
Per-channel rendering: widgets degrade to markdown for Telegram
Framework-agnostic · five runtimes, none required
agentino — in-process, the framework beside it
codex — codex exec --json
claude_code — claude -p --output-format stream-json
pi — pi --print
openclaw — openclaw agent --local --json
An MCP harness for driving an agent CLI against MCP servers
Agentino · the loop
@tool turns type hints into a JSON schema — no base class, no registry
YAML config for agents, pipelines and tool directories
StagedPipeline: multi-stage flows with verdicts and jumps between stages
Gates that approve, block or rewrite a tool call before it runs
Pre- and post-tool hooks, argument sanitizers, path-traversal guards
Retry with backoff, history compaction, a typed error taxonomy
Sessions as JSONL you can read with cat
Cron scheduler with file, SQLite or in-memory job stores
fork_agent and spawn tools for multi-agent work
Knowledge base over TF-IDF or embeddings
Usage and cost tracking per model
A JSON event stream so non-Python harnesses can drive it
Nothing is hard-wired
Store — file, in-memory or Supabase
File storage — local disk or Supabase, tenant-scoped
Vision — Codex multimodal, or a deterministic fixture for tests
Embeddings — any OpenAI-compatible endpoint, or a fixture
Transport — Telegram or a file inbox for replaying a frozen chat
Transcriber for speech, Clock for frozen time in tests
Every one chosen by an environment variable, so the same image runs in a sandbox and in production without a code change
Running it for real
Streaming that survives the client disconnecting mid-answer
File upload with extraction — PDFs, scans, spreadsheets
Scheduled routines declared in a file, run by a cron service
A/B runners with pluggable scorers, to compare two agent variants
Workload replay for testing an agent against a fixed set of tasks
Multi-tenant isolation, with property tests behind the boundary
Zero-config defaults — no database or credentials to start
IS
Iliya Slavutin
Author and maintainer of Agentino and Runspace
Get in touch

Bug reports and feature requests are better as GitHub issues — they stay visible to everyone else who hits the same thing. Security problems should go through a private advisory, not email or Telegram.

Both projects are on the front page, with the one question that tells you which of them you need.

Back to the projects →