A minimalist coding agent that works across your machines over SSH.
Run myco on your laptop. It edits files, runs shells, and searches code on
the local machine and on every concrete Host alias in your
~/.ssh/config — one session, many hosts, no setup beyond SSH itself.
- One agent, many machines. Point tools at
localor anyHostalias from your ssh config (devbox, GPU box, CI host). Remotes attach over SSH on demand; you stay in a single conversation. - Real computer use. Bash (including multi-turn sessions) and a surgical
file editor on each host; search and browsing compose from the tools already
on your machines (
rg,curl,lynx,ckfor semantic search, …) via bash. - Sessions you can resume. Titles, scratchpads, PR/worktree links, and full
conversation history live under
~/.myco/— pick up later with/resume. - Nested agents for long work. myco drives itself: start
mycoin a bash session to spin off focused agents so the main thread stays small and cheap. - Project guidance is injected. The nearest
AGENTS.md/CLAUDE.mdfrom your launch directory through the repository root is read at session start. - Coming later: multiplayer (multiple humans in the same agent workspace).
cargo install mycoNeeds stable Rust and ssh, uv, bash, tmux, fzf on PATH
(git, gh, curl recommended; ck — cargo install ck-search — for
semantic code search).
myco # runs the default model from your config.toml; --model <key> to switch
myco -p "explain src/host/protocol.rs" # print mode: one turn, answer on stdout, exit
git diff | myco -p "review this" # piped stdin becomes context for the prompt-p/--print runs one non-interactive turn: the answer streams to stdout
(raw, pipe-friendly), everything else prints to stderr, and the session is
saved like any other (session=<id> on stderr) — continue it with
--resume <id>. Bare -p takes the prompt from piped stdin.
Configure your models first: myco ships none built in. ~/.myco/config.toml
holds a small catalog — [gateways.*] (protocol + base URL + auth, e.g.
Anthropic, xAI, OpenRouter, or a local server) and [models.*] (the keys you
pass to --model). The auth value is the token itself or a source such as
{ source = "env", var_name = "XAI_API_KEY" } (.env in the cwd is loaded
at startup) or { source = "file", path = "~/.secrets/x.token" }. The exact variables are documented in the
overview article — also available as
myco --help overview once installed. Set a default model with
model = "<id>" in ~/.myco/config.toml (--model wins). Transcript
sections are colored when stdout is a TTY (--color auto|always|never;
NO_COLOR / CLICOLOR_FORCE honored), and prose is word-wrapped with light
markdown styling (--wrap auto|off|COLS caps the width at min(cap, terminal
width), default 80; resizes reflow the transcript at the next prompt; never
inside code blocks, never when piped).
Remotes just work: myco attaches lazily with ssh <alias> myco --mode host,
so a remote only needs your key in ssh-agent and myco on the PATH used by
non-interactive SSH. Runtime details: myco --help overview.
New to the codebase? Start with the guided tour.
cargo test --locked --lib
cargo run --locked --bin myco
bash scripts/install-pre-commit-hooks.sh # optional: CI bar (fmt + clippy) pre-commitmyco-model provides backend drivers and message types. myco-agent drives
headless execution using supplied tools and event sinks. The myco package
assembles sessions, host tools, and the CLI. Workspace packages share a version and lockfile.
Run cargo test --locked --workspace to test all packages.
The Publish workflow bumps the shared workspace version and exact internal
dependency pins, verifies all three package archives, then publishes them in
dependency order. Run it with dry_run: true to check a release without writing
commits, tags, or registry versions. A real release requires successful CI on
the selected main commit and pushes the version commit and tag without
overriding branch protection.
Registry publication is not atomic. If it stops after uploading some packages,
keep the release commit and tag: inspect crates.io and publish only the missing
packages from that tag with cargo publish -p <package> --locked, in order
myco-model, myco-agent, myco. Finish the GitHub Release after all three
exist. Never roll back a version that has reached the registry.