Slack, but your teammates are agents.

Runspace gives them channels, threads, a schedule and a UI that answers in charts — from one YAML file. Bring any runtime.

Build agents

A tool is an async function with a decorator. The runtime reads its signature, offers it to the model, and handles the round-trip, retries and dispatch.

Write your first agent

Run a workspace

Declare the agents once. They arrive in shared channels you reach by @mention, with history, uploads and a scheduler already wired.

Serve a workspace

Answer with components

Agents emit fenced blocks that render as charts, tables, KPI cards and callouts — so a number arrives as a number, not a paragraph about one.

See the blocks

Reach them anywhere

The same agents answer in Telegram, Slack and WhatsApp. Pairing and group mention routing are handled; replies land back in the thread they came from.

Wire a gateway

Work that runs itself

A routine is a cron line and a prompt in routines.yml. The morning summary posts to its channel before anyone asks for it.

Schedule a routine

Bring your own runtime

One line of config picks who answers: Agentino in-process, or the Codex, Claude Code, Pi or OpenClaw CLI. The workspace never learns which.

Compare runtimes

One install, either half

Runspace’s core is four dependencies. Everything else — a database, document rendering, Redis, a scheduler — is an extra you opt into.

Agents running in-process, with channels, routines and a UI around them.

$ pip install "runspace[agentino,workspace,server]"

Neither is on PyPI — the agentino name there belongs to an unrelated project. Both import under their own name either way.

Agentino

YAML for shape, Python for behaviour.

The things you change while tuning an agent — its prompt, its model, how many turns it gets — are configuration, and a colleague who does not write Python can own them. The things you change while building a capability are functions.

  • Tools are @tool-decorated async functions — no BaseTool ceremony
  • The docstring and type hints become the schema the model sees
  • ${VAR:-default} expands at load, so one file runs everywhere
Configuration reference
agents.yml
agents:
reviewer:
model: gpt-5.4-codex
instructions_file: prompts/reviewer.md
tools: [read_file, grep, shell] # auto-discovered
knowledge:
dir: ./knowledge # TF-IDF + embeddings
$ agentino run agents.yml -m "Review PR #42"
Runspace

A back office in one file.

Declare the agents and Runspace gives you the room they work in: channels with threads and mentions, streaming chat, attachments, an activity feed and a scheduler. It starts with no database — SQLite on disk — and moves to Postgres by setting two variables.

  • Many agents in shared channels, reached by @mention
  • Threads, reactions, unread counts, soft deletes
  • Tenant-scoped throughout — one process serves many
Every workspace.yml field
workspace.yml
name: Acme Back Office
icon: 🗂
brand_color: '#2F5D62'
apps:
analyst:
name: Ada
soul: agents/analyst/SOUL.md
tools: agents/analyst/tools/
model: gpt-5.4-codex
$ python -m runspace.workspace.serve workspace.yml
Framework-agnostic workspaces

Bring the agent runtime you already use.

Runspace is not tied to Agentino. Five adapters ship, and an app picks one with a single line of config. The four CLI adapters shell out to a binary you install, so Runspace depends on none of them — and the workspace never learns which one answered.

  • A test reads the registry's source and fails if a runtime import appears
  • A sixth adapter is a new file, not a refactor
  • Same channels, same history, same UI, whichever runs the turn
Writing an adapter
runtimes
type: agentino # in-process
type: codex # codex exec --json
type: claude_code # claude -p --output-format stream-json
type: pi # pi --print
type: openclaw # openclaw agent --local --json
apps:
reviewer:
name: Rev
type: claude_code # the only line that changes
MCP UI

Answers that render as components.

An agent emits a fenced block and the frontend renders it — a chart, a sortable table, KPI cards, a callout. A block with the wrong keys renders as a visible error rather than failing quietly, so the mistake shows up in development instead of in front of someone.

  • chart — ten types, from bar and line to sankey and treemap
  • datatable — with row links, expandable detail and per-row actions
  • kpi and insight — headline numbers and the one finding worth flagging
Block schemas
what the agent writes
```insight
{"kind": "insight",
"headline": "Home advantage collapsed in 2020/21",
"body": "Home win rate fell 7.6 points the season"
" crowds were absent."}
```
```kpi
[{"title": "Home win rate", "value": "37.9%"},
{"title": "Baseline", "value": "45.5%"}]
```

Use it

Install both halves, serve a workspace, point an agent at your own tools. Apache-2.0, no hosted plan, nothing to sign up for.

Install

Build on it

Both repositories open shortly. Until then the documentation is complete and the demos are live, so you can judge whether the shape fits before the source lands.