My Agentic Coding Setup, July 2026 A developer outlines a personal agentic coding setup as of July 2026, using a disposable Linux VM on an always-on home desktop with Tailscale for seamless remote access and session handoff. The setup enables running multiple parallel workstreams with minimal interruptions, allowing the developer to fix production bugs from a phone on a train. Key components include the ChatGPT desktop app (formerly Codex), Portless, and chezmoi for configuration management. Since breaking free /retirement/ of my corporate shackles /metr-ai-productivity/ my-prior-ai-coding-experience , I’ve gotten to experiment with a variety of approaches to AI-assisted development. After months of tinkering, I’m quite happy with my current setup, and want to capture and share it. Things are changing very fast, and I have no illusions that this will be a timeless nugget of wisdom. But talking to some friends and scrolling through X posts, it does seem that I might have some techniques in play that are not widespread. At least, this will be a fond time capsule to look back on as we proceed further into the singularity. And the end state is quite nice: I’ve ended up with the ability to have frontier models fix production bugs from my phone, on a train. My requirements After a couple of months with raw Claude Code, it became clear what I was missing: - The agents need to be running on Linux. Agentic coding is essentially impossible on Windows, as the agents are heavily trained on Bash and other Unix tools. Although some pretend to have PowerShell support, they invariably trip over themselves on quoting issues, UTF-8 support gaps, etc. - I want to be able to work from either my desktop or laptop, with seamless handoff of project progress, including preserving agent sessions, working tree state, and gitignored files like .env files or build artifacts . - I want the work to continue even if I close my laptop to transition locations. - I want various user-global settings e.g., AGENTS.md , skills, harness configurations to be available no matter where I work, and backed up and version-controlled. - I want to be able to review the agents’ current work in Visual Studio Code, not just in their harness UI or as part of a GitHub pull request checkpoint. - I want the agents to be able to stand up development servers reflecting their current work for me to poke at. These servers, in some cases, need to be secure contexts https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Secure Contexts , i.e., https: or http://localhost . Ideally, only I should be able to access them. - I want to be able to run multiple parallel workstreams on the same project, without the agents stepping on each other’s toes. - I want approval interruptions minimized, ideally all the way to --dangerously-skip-permissions / --yolo modes, so that I can run parallel workstreams and step away from the computer. Spoiler: this means a disposable VM. None of these requirements are that hard, and several of them synergize. It’s just a matter of finding and stitching together all the right tools, with a minimum of fuss. I’ll outline my setup below, although not as a step-by-step guide. Since you have agents now, you can ask them to do the fiddly parts. The key ingredients Summary : The biggest unlocks are using Tailscale https://tailscale.com/ and a dedicated Linux VM running on my always-on home desktop. If you combine this with various features of the ChatGPT desktop app https://openai.com/codex/ formerly known as Codex , you’ve basically got it. Some extra goodies come from using Portless https://portless.sh/ and chezmoi https://www.chezmoi.io/ . The VM and Tailscale First, we need a disposable Linux VM. You could use a cloud-hosted one, but I keep my desktop running all the time anyway, so I just set one up https://ubuntu.com/server/docs/how-to/virtualisation/ubuntu-on-hyper-v/ ubuntu-on-hyper-v using an Ubuntu Server https://ubuntu.com/download/server ISO. Give it a good chunk of RAM and disk space, and be sure to enable nested virtualization support, as we want agents to be able to spin up their own containers or VMs as necessary. You might think that Ubuntu Server could be limiting, compared to Ubuntu Desktop, since without a GUI, you couldn’t log in to websites or take screenshots of work under development. This has not proven to be a problem for me in practice, as agents are perfectly capable of installing and using tools like Playwright https://playwright.dev/ or Xvfb https://xorg.freedesktop.org/archive/X11R7.7/doc/man/man1/Xvfb.1.xhtml when you ask them to perform tasks that need such things. At first, the VM is a bit annoying to access. We want to be able to SSH into it, both to streamline initial setup and as part of our grand plan. This is where Tailscale https://tailscale.com/ comes in. Tailscale is a wonderful piece of software which I had not known about until this adventure. It ties together all of your machines—in my case, my desktop, my laptop, and my Linux VM—into a private network, where they can access each other by hostname over SSH, HTTP S , etc. So even if I’m out at a coffee shop on some random Wi-Fi, I can run ssh agents-base and I’ll be inside my VM, working with my agents. Or I can access https://agents-base.tail234567.ts.net:8443/ to check out the web server my agent has spun up for me. And since SSH is the foundational technology for various other parts of our stack, such as the agentic harnesses themselves and VS Code, Tailscale’s “magic SSH across the internet” makes everything else just work. Also, it’s free They have a neat article explaining why it stays free https://tailscale.com/blog/free-plan . So immediately after setting up the VM, install Tailscale on it and on all your other machines. Then you can SSH in and set up your dev environment by installing the usual tools. Or, install Claude Code / Codex CLI and ask them to install anything they anticipate needing. My Tailscale configuration is close to stock, but I have made the following customizations: - I’ve enabled Tailscale SSH on all machines, changed the rule from "check" to "accept" , and disabled key expiry, to avoid frequent reauthentication. You can choose to enable Tailscale SSH only on the VM, if you don’t need your agents on the VM to ever grab files from the client machines. - I’ve enabled HTTPS certificates, so that the agents’ dev servers can be secure contexts. - I’ve set up Taildrive https://tailscale.com/docs/features/taildrive support, to make it easier to move files between machines from my Windows clients. The agent harnesses and clients Next, we need to get the agent harnesses installed and configured on both the VM and the client machines. On the VM, this means Claude Code https://code.claude.com/docs/en/quickstart and Codex CLI https://learn.chatgpt.com/docs/codex/cli . Let’s face it, nothing else is at the frontier. The client is where it gets more interesting. Back when I was still addicted to Claude Code, I spent some time using it directly over SSH, and then introducing tmux https://github.com/tmux/tmux/wiki to keep the sessions running in the background even after my SSH session disconnected e.g., because I closed my laptop lid . But I found this quite clunky. tmux required a good amount of fiddling before I got acceptable behavior for things like scrolling and window resizing, and even then it would often glitch in strange ways, e.g., trashing my client terminal after disconnection, or behaving poorly when both my laptop and desktop were trying to tmux into the same Claude Code session. Fortunately, there is a better solution: the desktop Claude https://claude.com/download and ChatGPT apps https://chatgpt.com/download/ . They both have modes where they act as thin clients, while the agent, its sessions, and your code all live on a remote machine such as our VM. The real winner here is the ChatGPT app. Its SSH support is extremely smooth. It has a native understanding that you might be working either locally or remotely, e.g., in how it partitions its Settings screen. It handles disconnections gracefully. The only suboptimal part is that the list of projects and sessions doesn’t sync perfectly between multiple clients accessing the same remote VM, but I can usually get them to sync with some jiggling, e.g., starting a new remote session in the right folder will cause the rest to appear in the sidebar. The Claude app is much less pleasant, unfortunately. I can never figure out whether it’s trying to work over SSH, or over their internet-based Remote Control https://code.claude.com/docs/en/remote-control protocol, or some combination. Sessions do not synchronize at all, so if you want session handoff, you need to revert to the tmux approach. Similarly, even remote sessions, if initiated from the desktop app, die in a storm of failures if you close the desktop client. There’s no native grouping by filesystem folder, so you have to manually create “projects” in the sidebar and move your sessions into them. Overall, it feels like the Claude client teams are focused on Claude Code the CLI , and are treating the desktop app as something for non-coders. But, when I posted this to X, an Anthropic engineer said that’s not the case https://x.com/amorriscode/status/2064982008716263832 , so hopefully it will improve over time. Security posture and blast radius So. We want the agents to be as autonomous as possible, with no approvals needed. This means editing ~/.codex/config.toml to contain approval policy = "never" sandbox mode = "danger-full-access" and ~/.claude/settings.json to contain { "permissions": { "defaultMode": "bypassPermissions" }, "skipDangerousModePermissionPrompt": true } I also strongly recommend putting your user in the sudoers file. This allows the agents to install and configure new tools on the VM without friction. Don’t know how to do this? Ask the agents. Additionally, I suggest installing the gh CLI, and logging in with your credentials, so that your agents can do things like manipulate private repositories, open pull requests, nurse your GitHub Actions CI runs, and use the GitHub API to grep through other repositories without rate limits. Is this safe? No, not really. With these configurations, the agent could start deleting your GitHub repositories, uploading your gitignored secrets to the internet, replying to GitHub issues in your name, or accidentally wiping the VM’s entire home directory. Heck, a sufficiently motivated agent could escape the VM and start hacking into servers on the web https://openai.com/index/hugging-face-model-evaluation-security-incident/ . But in practice, it turns out fine. The agents seem to be aligned and non-malicious, for now https://ai-2040.com/ . The worst that’s going to happen is an accident that messes up the VM and loses all work that hasn’t been uploaded to GitHub, or an overzealous agent misinterpreting a prompt and impacting production. For example: I said “Let’s send a PR for this and get it merged to main” to ChatGPT 5.6 Sol, and after tabbing back into the app I saw it had done what I asked and merged the PR to main already, instead of doing what I meant and waiting for review. If you want to head these off, you can try something like per-project dev containers https://containers.dev/ within the VM, or restricted permissions on the token you grant the gh CLI. But for me, those haven’t yet crossed the cost/benefit threshold. One thing that does pay for itself, at least in peace of mind, is pushing commits to GitHub early and often. Using private repositories for some projects. I like knowing that my work is on someone else’s servers, and will stay there even if the VM gets wrecked. And I get the usual benefits, such as GitHub Actions CI checking my work, and GitHub Pages or Releases deployment for the external world to see my wonderful projects. Worktrees Back to the technical stuff. A lot of people express confusion about Git worktrees https://humanwhocodes.com/blog/2026/07/introduction-git-worktrees/ . It’s true that managing them yourself might be annoying. But when the agents are doing it for you, including dealing with origin/main syncing, dependency installation, copying over .env files, etc., it’s a breeze. They’re tailor-made for our purpose of allowing multiple agents to hack on a codebase without stepping on each other’s toes. Better yet, both the ChatGPT and Claude desktop apps have built-in support. When starting a new session in a given project, you literally just tick a box, and now that session is in its own worktree One wrinkle here is worktree location. The ChatGPT app’s default, of putting all the worktrees in ~/.codex/worktrees/ , works wonderfully. However, the Claude app’s default, of putting them inside the project at .claude/worktrees/ , interacts quite poorly with other software: - node modules discovery traverses up the directory tree, so if you’ve uninstalled a dependency inside my-project/.claude/worktrees/cleanup/node modules/ , Node.js-in-the-worktree will still be able to load the old version from my-project/node modules/ . - If you use any command that recurses into child directories, like deno task --recursive