installation:
curl -fsSL https://raw.githubusercontent.com/imbue-ai/mng/main/scripts/install.sh | bashmng is very simple to use:
mng create # launch claude locally (defaults: agent=claude, provider=local, project=current dir)
mng create @.modal # launch claude on Modal (new host with auto-generated name)
mng create my-task # launch claude with a name
mng create my-task codex # launch codex instead of claude
mng create -- --model opus # pass any arguments through to the underlying agent
# send an initial message so you don't have to wait around:
mng create --no-connect --message "Speed up one of my tests and make a PR on github"
# or, be super explicit about all of the arguments:
mng create my-task@.modal --type claude
# tons more arguments for anything you could want! Learn more via --help
mng create --help
# or see the other commands--list, destroy, message, connect, push, pull, clone, and more!
mng --helpmng is fast:
> time mng create local-hello --message "Just say hello" --no-connect
Done.
real 0m1.472s
user 0m1.181s
sys 0m0.227s
> time mng list
NAME STATE HOST PROVIDER HOST STATE PROJECT
local-hello RUNNING @local local RUNNING mng
real 0m1.773s
user 0m0.955s
sys 0m0.166smng itself is free, and the cheapest way to run remote agents (they shut down when idle):
mng create @.modal --no-connect --message "just say 'hello'" --idle-timeout 60 -- --model sonnet
# costs $0.0387443 for inference (using sonnet)
# costs $0.0013188 for compute because it shuts down 60 seconds after the agent completesmng takes security and privacy seriously:
# by default, cannot be accessed by anyone except your modal account (uses a local unique SSH key)
mng create example-task@.modal
# you (or your agent) can do whatever bad ideas you want in that container without fear
mng exec example-task "rm -rf /"
# you can block all outgoing internet access
mng create @.modal -b offline
# or restrict outgoing traffic to certain IPs
mng create @.modal -b cidr-allowlist=203.0.113.0/24mng is powerful and composable:
# start multiple agents on the same host to save money and share data
mng create agent-1@shared-host.modal --new-host
mng create agent-2@shared-host
# run commands directly on an agent's host
mng exec agent-1 "git log --oneline -5"
# never lose any work: snapshot and fork the entire agent states
mng create doomed-agent@.modal
SNAPSHOT=$(mng snapshot create doomed-agent --format "{id}")
mng message doomed-agent "try running 'rm -rf /' and see what happens"
mng create new-agent --snapshot $SNAPSHOTmng makes it easy to see what your agents are doing:
# programmatically send messages to your agents and see their chat histories
mng message agent-1 "Tell me a joke"
mng transcript agent-1mng makes it easy to work with remote agents
mng connect my-agent # directly connect to remote agents via SSH for debugging
mng pull my-agent # pull changes from an agent to your local machine
mng push my-agent # push your changes to an agent
mng pair my-agent # or sync changes continuously!mng is easy to learn:
> mng ask "How do I create a container on modal with custom packages installed by default?"
Simply run:
mng create @.modal -b "--file path/to/Dockerfile"
mng makes it easy to create and use any AI agent (ex: Claude Code, Codex), whether you want to run locally or remotely.
mng is built on open-source tools and standards (SSH, git, tmux, docker, etc.), and is extensible via plugins to enable the latest AI coding workflows.
Quick install (installs system dependencies + mng automatically):
curl -fsSL https://raw.githubusercontent.com/imbue-ai/mng/main/scripts/install.sh | bashManual install (requires uv and system deps: git, tmux, jq, rsync, unison):
uv tool install mng
# or run without installing
uvx mngUpgrade:
uv tool upgrade mngFor development:
git clone git@github.com:imbue-ai/mng.git && cd mng && uv sync --all-packages && uv tool install -e libs/mngmng supports tab completion for commands, options, and agent names in bash and zsh.
Shell completion is configured automatically by the install script (scripts/install.sh).
To set up manually, generate the completion script and append it to your shell rc file:
Zsh (run once):
uv tool run --from mng python3 -m imbue.mng.cli.complete --script zsh >> ~/.zshrcBash (run once):
uv tool run --from mng python3 -m imbue.mng.cli.complete --script bash >> ~/.bashrcNote: mng must be installed on your PATH for completion to work (not invoked via uv run).
# without installing:
uvx mng <command> [options]
# if installed:
mng <command> [options]create: Create and run an agent in a hostdestroy: Stop an agent (and clean up any associated resources)connect: Attach to an agent
list: List active agentsstop: Stop an agentstart: Start a stopped agentsnapshot[experimental]: Create a snapshot of a host's stateexec: Execute a shell command on an agent's hostrename: Rename an agentclone: Create a copy of an existing agentmigrate: Move an agent to a different hostlimit: Configure limits for agents and hosts
pull: Pull data from agentpush: Push data to agentpair: Continually sync data with an agentmessage: Send a message to an agenttranscript: View the message transcript for an agentprovision: Re-run provisioning on an agent (useful for syncing config and auth)
cleanup: Clean up stopped agents and unused resourcesevents: View agent and host event filesgc: Garbage collect unused resources
ask: Chat with mng for helpplugin[experimental]: Manage mng pluginsconfig: View and edit mng configuration
You can interact with mng via the terminal (run mng --help to learn more).
mng uses robust open source tools like SSH, git, and tmux to run and manage your agents:
- agents are simply processes that run in tmux sessions, each with their own
work_dir(working folder) and configuration (ex: secrets, environment variables, etc) - agents run on hosts--either locally (by default), or special environments like Modal Sandboxes (
--provider modal) or Docker containers (--provider docker). Use theagent@hostaddress syntax to target an existing host. - multiple agents can share a single host.
- hosts come from providers (ex: Modal, AWS, docker, etc)
- hosts help save money by automatically "pausing" when all of their agents are "idle". See idle detection for more details.
- hosts automatically "stop" when all of their agents are "stopped"
mngis extensible via plugins--you can add new agent types, provider backends, CLI commands, and lifecycle hooks
mng stores very little state (beyond configuration and local caches for performance), and instead relies on conventions:
- any process running in window 0 of a
mng-prefixed tmux sessions is considered an agent - agents store their status and logs in a standard location (default:
$MNG_HOST_DIR/agents/<agent_id>/) - all hosts are accessed via SSH--if you can SSH into it, it can be a host
- ...and more
See architecture.md for an in-depth overview of the mng architecture and design principles.
Best practices:
- Use providers with good isolation (like Docker or Modal) when working with agents, especially those that are untrusted.
- Follow the "principle of least privilege": only expose the minimal set of API tokens and secrets for each agent, and restrict their access (eg to the network) as much as possible.
- Avoid storing sensitive data in agents' filesystems (or encrypt it if necessary).
See our security model for more details.
This is a monorepo that contains the code for mng here:
As well as the code for some plugins that we maintain, including:
The repo also contains code for some dependencies and related projects, including:
- libs/concurrency_group: a simple Python library for managing synchronous concurrent primitives (threads and processes) in a way that makes it easy to ensure that they are cleaned up.
- libs/imbue_common: core libraries that are shared across all of our projects
- apps/minds: an experimental project around scheduling runs of autonomous agents
Contributions are welcome!