byre is open source on GitHub -- pjlsergeant/byre

Daily workflow

Run parallel agents on the same repo?

tldr: byre worktree <branch> – a linked git worktree plus a second boxed session in it, one command.

The worktree inherits the repo’s config, image, and volumes – the agent is already logged in – but runs in its own container against its own checkout, so sessions run side by side. Hand-made worktrees (git worktree add) inherit the same way. The mechanics – where worktrees live, shared state, blast radius – are on the worktrees page.

Set up two agents in a review loop?

tldr: keep one agent as agent, enable a second agent’s skill as a ride-along – byre’s own box runs Claude with codex beside it as the independent reviewer.

More than one agent skill can be enabled in a box; the config’s agent key decides which one launches, and the rest install their CLI and keep their own login. byre develops itself this way: agent = "claude", skills = ["codex", ...], plus a small skill that ships the review conventions as standing instructions – the launched agent runs the reviewer as a fresh-eyes second opinion. The live example is byre.preset in byre’s own repo.

Get a second shell in the box?

tldr: byre shell.

A second shell (as the dev user) in the running session – for logins, running tests, poking around while the agent works. It sees the same env the agent launched with.

Resume my session after a config change?

tldr: exit the agent, byre develop, then your agent’s own resume verb (Claude’s /resume).

Config edits apply on the next develop; the rebuild touches only the layers after what changed, so relaunches are quick. The agent’s history lives in its state volume, so resuming lands you back in the same conversation.

Paste or drag-and-drop images and files into my agent?

tldr: byre deliver <file> – or just byre deliver and paste (or drop a file on the window).

Anything you deliver lands in the box’s /inbox and the in-box path comes back on your clipboard, ready to Cmd-V into the agent prompt. With no arguments byre reads your clipboard – so screenshot, byre deliver, Ctrl-V, done (Ctrl-V, not Cmd-V, for images – the terminal won’t paste an image any other way). Dragging a file from Finder onto the deliver window delivers that file; whole directories arrive intact; byre deliver --install-app adds a Dock-droppable app and a Finder “Deliver to Byre” Quick Action on macOS. Works from any directory – it finds your running box. The full surface, including piping from stdin: docs/DELIVER.md.

Get files back out of the box?

tldr: byre grab <box-path> – the file lands in your current directory, never overwriting anything.

The agent made you something – a PDF, a chart, a patch – byre grab out/report.pdf copies it out and prints where it landed. Box paths count from /workspace; directories come out recursively; a second argument names the destination, and - streams to stdout (byre grab build.log - | grep error). Grab never overwrites your files: name collisions land uniquified (report-2.pdf) and byre says so. Works from any directory – it finds your running box, exactly like deliver. The full surface: docs/DELIVER.md.

Use byre on a remote machine over SSH?

tldr: byre is terminal-native, so everything works in an SSH session – and byre deliver ssh://host sends files from your laptop into the remote box.

The config TUI, the pickers, and the agent session all run in a plain SSH terminal. Delivered paths land on your local clipboard where the terminal supports OSC 52, and are always printed regardless. The one thing a terminal can’t carry is an image paste – so deliver runs a remote mode: byre deliver ssh://dev@studio shot.png streams from the laptop side, with the box picked locally and plain ssh doing transport and auth. byre must be installed on both ends (a version mismatch fails loudly before anything moves; --remote-byre points at a binary sshd can’t find).

Get tab completion for byre commands?

tldr: eval "$(byre completion bash)" in your shell’s startup file.

Completions cover every command and flag – bash, zsh, fish, and powershell. One line in your rc file regenerates the script at shell startup (~3ms), so it never goes stale across byre upgrades and needs no extra packages:

eval "$(byre completion bash)"        # ~/.bashrc
source <(byre completion zsh)         # ~/.zshrc, after compinit
byre completion fish | source         # ~/.config/fish/config.fish

byre completion --help has the powershell line and the details.