Built on Claude Managed Agents

An engineer that remembers

Marlo investigates incidents, runs code, reads your runbooks — and learns from every session. All you need is Python and an API key.

Getting started See how it learns
marlo
$ marlo "investigate the spike in 502s on payments-svc since 14:00 UTC"

session=sesn_8f3k2m

Checking memory for prior payments-svc incidents...
[tool: bash] grep -ri "payments" /mnt/memory/engops-learned/

Found /incidents/2026-05-02-payments-timeout.md — same upstream dependency timed out last week. Checking if the pattern matches.

[tool: bash] curl -s https://api.cloudflare.com/...
Root cause confirmed: connection pool exhaustion on the Redis sidecar, same as May 2nd. Applying the known fix from memory.

✓ Writing /incidents/2026-05-18-payments-502.md
-- idle --
How Marlo learns

Work, remember, dream, repeat

Each session leaves a trace. Periodic dreams distill those traces into durable knowledge. The agent gets better without retraining.

1

Session

Marlo runs a task in an isolated container, reading from memory and writing new findings.

2

Memory

Durable lessons — tool quirks, incident patterns, team preferences — persist across sessions.

3

Dream

An offline pass merges duplicates, surfaces patterns, and drops noise. Produces a new, cleaner store.

4

Promote

Review the dream output, diff against the old store, and promote when you're satisfied.

Four primitives

Simple pieces, composed

Managed Agents collapses what used to take custom infrastructure into four building blocks.

Agent

Versioned recipe — model, system prompt, tools, MCP servers. Created once, updated in place. agents.create()

Environment

Container template with packages, networking rules, and system config. One per profile. environments.create()

Session

One concrete run. Agent × environment × memory stores. Ephemeral container, durable event log. sessions.create()

Memory store

Persistent text-file directory mounted at /mnt/memory/. Outlives any session. The agent reads and writes it like a filesystem.

Before & after

What you no longer build

Marlo replaces custom infrastructure with API calls.

Capability Before (custom infra) Now (Managed Agents)
Sandboxed execution Modal sandbox per task, custom lifecycle Session — isolated container, one API call
Dev environment Baked VM images, 30-min refresh cron Environment config with packages + apt
Agent loop OpenCode or custom harness inside sandbox The agent itself — Claude + toolset
Session state Modal Dicts for locks + metadata First-class session resources
Message routing Modal Queues from Slack/web/Chrome events.send() / events.stream()
Persistent learning Custom DB + retrieval pipeline Memory store — file-system interface, versioned
Getting started

Five commands to running

All you need is Python 3.10+ and an API key. No Docker, no Kubernetes, no infrastructure.

setup
$ pip install -e .
$ cp .env.example .env
# paste your ANTHROPIC_API_KEY
bootstrap (once)
$ python -m marlo.bootstrap.create_agent
AGENT_ID=agent_01Xau... (v1)

$ python -m marlo.bootstrap.create_environment
ENVIRONMENT_ID=env_01Fv...

$ python -m marlo.bootstrap.create_memory_store
MEMORY_STORE_ID=memstore_01BG...

$ python -m marlo.bootstrap.seed_memory
seed /preferences/communication.md
seed /preferences/code-style.md
seed /preferences/safety.md
run a task
$ marlo "investigate the 502 spike on payments-svc"

# Works from anywhere — laptop, server, CI.
# Marlo reads memory, does the work,
# writes what it learned, and shuts down.
dream + promote (periodic)
$ python -m marlo.dream
dreaming over 12 sessions...

$ python -m marlo.review_dream_output drm_...
# Review the diff, then promote:
MEMORY_STORE_ID=memstore_new_abc123

On the internal network? console.marlo.run

Give your team
a longer memory

pip install, bootstrap, then just marlo "your task" from anywhere.

Getting started View on GitHub