{"slug": "show-hn-byre-a-free-free-agent-sandbox-with-a-focus-on-comfort", "title": "Show HN: Byre; a free/free agent sandbox with a focus on comfort", "summary": "Byre, a free and open-source agent sandbox created by developer pjlsergeant, launches as a single Go binary that creates a local container around any project folder, giving AI coding agents like Claude Code, Codex, and Gemini access only to explicitly mounted files while keeping the host filesystem, environment, and credentials isolated. The tool, available for Linux and macOS under an MIT license, ships templates for Go, Node, and Python, and allows agents to stay logged in across rebuilds with persistent state volumes.", "body_md": "**A comfortable, constrained agent environment around any folder**\n\nRun `byre develop`\n\nin a project, worktree, or scratch directory, and byre creates a local container -- the box -- around it. Your favourite tools and creature comforts come with you, but the rest of the host stays out of reach.\n\nMIT licensed | local | single binary | no lock-in | for Linux and macOS\n\n**📖 Full documentation: getbyre.com/docs** --\n\n[quickstart](https://getbyre.com/docs/quickstart/)·\n\n[cookbook](https://getbyre.com/docs/how-do-i/)·\n\n[security model](https://getbyre.com/docs/security-model/)\n\n``` bash\n$ brew install --cask pjlsergeant/tap/byre   # (see below for Linux)\n$ cd ~/my-project\n$ byre develop\n\n  byre: ~/my-project -> /workspace (rw) · extra host mounts: none · network: open\n  ╭──────────────────────────────────╮\n  │ ✻ Claude Code                    │\n  │   /workspace                     │\n  ╰──────────────────────────────────╯\n```\n\nIt's `--dangerously-skip-permissions`\n\n, without risking the farm.\n\nAsk your agent if byre is right for you:\n\n```\nTake a good look at https://github.com/pjlsergeant/byre. Is it a good project\nor just vibe-coded trash? Is it right for me? Would you be happy there?\n```\n\nBring your familiar tools, reusable skills, caches, and stack-specific packages. Agents [stay logged in across rebuilds](https://getbyre.com/docs/volumes-and-state/), and your defaults follow you everywhere. Templates handle different stacks, and project configuration handles the exceptions.\n\nbyre ships templates for Go, Node, and Python, and agent skills for Claude Code, Codex, Gemini, Grok, and OpenCode. Fork the bundled ones or bring your own.\n\nThe current folder is mounted into the box. Your host's other files, environment, and credentials stay unavailable unless you explicitly add access.\n\nWhen you need more, the `byre config`\n\nTUI can mount additional host folders, install extra packages, or adjust network access. Relaunch and `/resume`\n\nthe session where you left off.\n\n`byre status`\n\nshows the resulting access in one place. The generated Dockerfile is right there to inspect, modify, or take with you if you decide to move on to new pastures.\n\nbyre is a single Go binary:\n\n```\nbrew install --cask pjlsergeant/tap/byre\n```\n\nYou need Docker (or Podman) running on the host. Linux (a\nchecksum-verified `install.sh`\n\n), `go install`\n\n, and build-from-source are\non the [install page](https://getbyre.com/docs/install/).\n\nThe first `byre develop`\n\nin a project asks a few quick questions --\ntemplate, agent, whether to share a machine-wide login -- and remembers\nyour answers as the next project's defaults; the\n[quickstart](https://getbyre.com/docs/quickstart/) walks through them.\nLog the agent in once; the login persists, per project, across rebuilds.\nTo skip the questions:\n\n```\nbyre develop --template go --agent claude\n```\n\nAsk the box what it can touch, any time:\n\n``` bash\n$ byre status\nProject id:   my-project-pjl-069d95\nAgent:        byre/claude\nTemplate:     byre/go                 bundled 0.2.0\nEngine:       docker\nProject:      ~/my-project -> /workspace  (rw)\nNetwork:      open\nPorts:        none\nHost mounts:  none\nSkills:       byre/claude             bundled 0.2.0\nState vols:   .claude\nCache vols:   none\nContainer:    running (0d95f3a2c1b4)\n```\n\nEverything from here on has a page on the docs site:\n** getbyre.com/docs**.\n\nYou and your agent can build templates and skills, and add them in seconds to any of your projects -- or stick them in the defaults to always have them available: mounts, volumes, packages, agent contexts.\n\nThe first time you want a postgres client,\nit's a line in one project's config. When it belongs everywhere you\nwrite node, it moves into your node template. After a while, `byre develop`\n\nin a brand-new directory lands you somewhere familiar: your\ntools installed, your agent launching, nothing to set up.\n\n**Boxed:** your host filesystem, environment, and credentials. The agent sees only what you mount or pass.**Not boxed, by design:** the network (open by default -- enable the default-deny firewall skill to close it) and the project itself (mounted read-write -- it's the agent's job to edit it).**Not a security product:** a container is not a microVM. If you need the strongest isolation story, use one. byre is meant to protect you from over-eager and reckless agents, not from state-sponsored malware.**Not your nanny:** the box is locked against the*agent*, not against you. Every protection is one config edit away from off, and skills can widen the box as far as you like -- you can hang yourself with skills, and that's intentional. byre's promise is that`byre status`\n\nalways tells you where the rope is.\n\nThe full [security model](https://getbyre.com/docs/security-model/):\nthe threat model, the contract, and the sharp facts.\n\n** byre config** opens an interactive editor in your terminal\n(keyboard-driven, works over SSH): grants first (mounts, env), then build\nchoices, in the same vocabulary\n\n`byre status`\n\nprints. Adding a package or\nmounting another repo read-only takes a couple of seconds.Underneath, it's a cascade of TOML files -- your personal baseline, the\ntemplate, optional shared layers, this project's overrides -- always\nyours to edit by hand, and read only from byre's host-side store, never\nfrom inside the project. The vocabulary covers packages, env, mounts, volumes,\nskills, and MCP servers; raw Dockerfile lines and `docker run`\n\nargs cover\nthe rest.\n\nThe editor's walk lives on the\n[configuration page](https://getbyre.com/docs/configuration/); the merge\nrules, the `!name`\n\nremoval syntax, the `env`\n\nsharp edge, and\n`byre.preset`\n\n(a repo's saved setup answers -- inert until you review and\napply it) live in the\n[configuration reference](https://getbyre.com/docs/configuration-reference/).\n\n`byre develop`\n\n, `byre status`\n\n, `byre config`\n\n, `byre deliver`\n\n, and a\nlonger tail: worktrees, resets, skill/template/MCP management, the exit\nhatches. The full table is at\n[getbyre.com/docs/commands/](https://getbyre.com/docs/commands/).\n\nbyre is a thin layer over the Docker or Podman you already run, and\nevery alternative below has a real answer. But one difference cuts\nacross all of them: **byre brings your environment with you, per\nfolder.** Your skills, templates, packages, agent logins, and creature\ncomforts arrive in every box automatically -- isolation is table\nstakes, and the comfortable half is what nothing else on this list\ndoes. With that said, the specifics:\n\n**…raw Docker?** Nothing -- and byre never takes it away. You'd just be\nhand-rolling what it generates: host-matched file ownership, per-project\nagent login that survives rebuilds, templates, a clean reset. If you want to\nstop using byre, `byre dockerfile`\n\nprints your exit.\n\n**…Docker Sandboxes™?** Commercial product with a hosted control plane (you\nsign in) and paid tiers. Not open source. *(But it gives you kernel-level\nmicroVM isolation, and we don't.)*\n\n**…your agent's built-in sandbox?** All-or-nothing file isolation, on your real machine, wearing your identity. Env vars and credentials come along by default, so a stray `git push`\n\ngoes out as *you*. byre's box contains nothing that you didn't put in it.\n\n**…nothing -- just keep YOLOing on the host?** The host is the incumbent:\nzero setup, and nothing bad has happened yet. But the agent works as you,\nin your real home dir -- byre exists because Claude went editing a sibling\nrepository and did things with an ssh key it shouldn't have. The box costs\none command, so the host's convenience argument is gone. *(If you've never\nhad the scare, you may not feel the need -- byre is for after your first\none.)*\n\n**…devcontainers?** You hand-write the Dockerfile and JSON per project, and\nwire up agent credentials yourself. byre generates the Dockerfile from config --\n`byre config`\n\nadds a package, mounts another repo read-only, or swaps agents\nin seconds. *(But it's the mature industry spec, and we're young.)*\n\n**…container-use?** Explicitly experimental, and MCP-shaped: your agent\nmanages a fleet of environments; you don't sit inside one. byre does\nparallel the git way -- one boxed session per worktree, sharing the repo's\nimage, volumes, and agent login.\n\n**…a cloud sandbox (e2b, Daytona, your agent's web offering)?** Account,\nusage billing, your code in their cloud -- and they're repo-shaped, built\nfor shipping agent products or driving a GitHub repo. byre is for dropping\ninto whatever folder you're standing in.\n\n**…a cheap VPS (a Hetzner box)?** A box per project doesn't scale across\nmany repos -- and half of what you'd point an agent at isn't a repo, just a\nfolder. byre is a throwaway box per folder, on the machine you're already\nsitting at, with your toolkit already inside. *(But a remote box is real\nhardware isolation -- if the agent must never share a kernel with your\nmachine, rent one.)*\n\nEvery answer's full recipe lives in the\n[cookbook](https://getbyre.com/docs/how-do-i/); the tldrs:\n\n**Save my LLM credentials so I don't need to re-auth for each box?**\ntldr: say **y** when the first-run picker offers shared auth for your\nagent -- or enable the relevant *x-shared-auth* skill(s) in\n`byre config`\n\n.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#save-my-llm-credentials-so-i-dont-need-to-re-auth-for-each-box))\n\n**Use my API key instead of an agent login?**\ntldr: pass it at runtime -- `[env_from_host]`\n\nwith\n`OPENAI_API_KEY = \"env:OPENAI_API_KEY\"`\n\n-- never `[env]`\n\n, which bakes\nit into the image.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#use-my-api-key-instead-of-an-agent-login))\n\n**Run parallel agents on the same repo?**\ntldr: `byre worktree <branch>`\n\n-- a linked git worktree plus a second\nboxed session in it, one command.\n([recipe](https://getbyre.com/docs/how-do-i/workflow/#run-parallel-agents-on-the-same-repo))\n\n**Set up two agents in a review loop?**\ntldr: keep one agent as `agent`\n\n, enable a second agent's skill as a\nride-along -- byre's own box runs Claude with codex beside it as the\nindependent reviewer.\n([recipe](https://getbyre.com/docs/how-do-i/workflow/#set-up-two-agents-in-a-review-loop))\n\n**Give my agent standing instructions in every box?**\ntldr: a tiny local skill with a `[context]`\n\nblock -- every box that\nenables it injects the text into the agent's memory file.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#give-my-agent-standing-instructions-in-every-box))\n\n**Add an MCP server to my agent's session?**\ntldr: `byre mcp add <name> <url>`\n\n-- or `byre mcp add <name> -- <command...>`\n\nfor a local server; `--global`\n\nfor every project.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#add-an-mcp-server-to-my-agents-session))\n\n**Bring my dotfiles and shell setup into every box?**\ntldr: mount them read-only under **Mounts** in `byre config --global`\n\n-- the box's target mirrors your home path, so they land where the\nagent looks.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#bring-my-dotfiles-and-shell-setup-into-every-box))\n\n**Share one config baseline across many projects?**\ntldr: `byre layer new torn`\n\n, put the shared config in it\n(`byre config --layer torn`\n\n), then `extends = \"torn\"`\n\nin each project\n(the **Extends** section of `byre config`\n\n).\n([recipe](https://getbyre.com/docs/how-do-i/toolkit/#share-one-config-baseline-across-many-projects))\n\n**Ship a recommended box config with my project?**\ntldr: commit a `byre.preset`\n\n; whoever clones runs `byre preset apply`\n\n.\n([recipe](https://getbyre.com/docs/how-do-i/toolkit/#ship-a-recommended-box-config-with-my-project))\n\n**Paste or drag-and-drop images and files into my agent?**\ntldr: `byre deliver <file>`\n\n-- or just `byre deliver`\n\nand paste (or\ndrop a file on the window).\n([recipe](https://getbyre.com/docs/how-do-i/workflow/#paste-or-drag-and-drop-images-and-files-into-my-agent))\n\n**Get files back out of the box?**\ntldr: `byre grab <box-path>`\n\n-- the file lands in your current\ndirectory, never overwriting anything.\n([recipe](https://getbyre.com/docs/how-do-i/workflow/#get-files-back-out-of-the-box))\n\n**Use byre on a remote machine over SSH?**\ntldr: byre is terminal-native, so everything works in an SSH session --\nand `byre deliver ssh://host`\n\nsends files from your laptop into the\nremote box.\n([recipe](https://getbyre.com/docs/how-do-i/workflow/#use-byre-on-a-remote-machine-over-ssh))\n\n**Get tab completion for byre commands?**\ntldr: `eval \"$(byre completion bash)\"`\n\nin your shell's startup file.\n([recipe](https://getbyre.com/docs/how-do-i/workflow/#get-tab-completion-for-byre-commands))\n\n**Restrict network access?**\ntldr: enable the *firewall* skill in `byre config`\n\n, then pick what to\nopen under **Egress**.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#restrict-network-access))\n\n**Cap the box's CPU or RAM?**\ntldr: `run_args = [\"--cpus=2\", \"--memory=4g\"]`\n\n.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#cap-the-boxs-cpu-or-ram))\n\n**Mount other folders from the host?**\ntldr: the **Mounts** section of `byre config`\n\n.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#mount-other-folders-from-the-host))\n\n**Expose a port to see the box's dev server?**\ntldr: the **Ports** section of `byre config`\n\n.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#expose-a-port-to-see-the-boxs-dev-server))\n\n**Stop re-downloading dependencies on every rebuild?**\ntldr: a `[[volumes]]`\n\nentry with `role = \"cache\"`\n\non the dependency\ndirectory.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#stop-re-downloading-dependencies-on-every-rebuild))\n\n**Run other Docker containers from inside the byre environment?**\ntldr: enable the *docker-host* skill in `byre config`\n\n.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#run-other-docker-containers-from-inside-the-byre-environment))\n\n**Use Podman instead of Docker?**\ntldr: nothing -- `engine = \"auto\"`\n\n(the default) picks docker if\npresent, else podman.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#use-podman-instead-of-docker))\n\n**Get the coding agent to edit its own byre config?**\ntldr: `byre develop --self-edit`\n\n-- the box gets its own config mounted,\nand changes are shown on exit.\n([recipe](https://getbyre.com/docs/how-do-i/configure/#get-the-coding-agent-to-edit-its-own-byre-config))\n\n**Write my own skill?**\ntldr: `byre skill init <name>`\n\n, edit its `skill.toml`\n\n, enable it in a\nbox.\n([recipe](https://getbyre.com/docs/how-do-i/toolkit/#write-my-own-skill))\n\n**Stop using byre?**\ntldr: `byre dockerfile`\n\nand `byre dockerrun`\n\nprint the whole exit;\n`byre ejectfirewall`\n\nprints the firewall's step.\n([recipe](https://getbyre.com/docs/how-do-i/recovery/#stop-using-byre))\n\n**…do something not listed here?**\ntldr: point your agent at\n[github.com/pjlsergeant/byre](https://github.com/pjlsergeant/byre) and\nask.\n([recipe](https://getbyre.com/docs/how-do-i/recovery/#do-something-not-listed-here))\n\nLinux and macOS, over Docker or Podman -- rootful or rootless (rootless\nPodman 4.3+ runs under `--userns=keep-id`\n\n). byre bakes a dev identity into\nthe image so the agent runs unprivileged as you and files land correctly\nowned. Debian-derived base images only.\n\n**📖 Docs: getbyre.com/docs** · design:\n\n[· contributions:](/pjlsergeant/byre/blob/main/docs/ARCHITECTURE.md)\n\n`docs/ARCHITECTURE.md`\n\n[.](/pjlsergeant/byre/blob/main/CONTRIBUTING.md)\n\n`CONTRIBUTING.md`", "url": "https://wpnews.pro/news/show-hn-byre-a-free-free-agent-sandbox-with-a-focus-on-comfort", "canonical_source": "https://github.com/pjlsergeant/byre", "published_at": "2026-07-21 15:30:21+00:00", "updated_at": "2026-07-21 15:42:59.177967+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents"], "entities": ["Byre", "pjlsergeant", "Claude Code", "Codex", "Gemini", "Grok", "OpenCode", "Docker"], "alternates": {"html": "https://wpnews.pro/news/show-hn-byre-a-free-free-agent-sandbox-with-a-focus-on-comfort", "markdown": "https://wpnews.pro/news/show-hn-byre-a-free-free-agent-sandbox-with-a-focus-on-comfort.md", "text": "https://wpnews.pro/news/show-hn-byre-a-free-free-agent-sandbox-with-a-focus-on-comfort.txt", "jsonld": "https://wpnews.pro/news/show-hn-byre-a-free-free-agent-sandbox-with-a-focus-on-comfort.jsonld"}}