I moved my entire development workflow to a remote Linux box (and my MacBook fan hasn't spun up since)
I used to treat my laptop like a miniature datacenter. Node, Python, Rust toolchains, Docker, PostgreSQL, plus VSCode with a dozen extensions. Every npm install pegged the fan at 6000 RPM, and switching branches meant waiting for language servers to reindex. I knew something had to change when I closed a single Docker container and reclaimed 4 GB of RAM.
A year ago I moved my entire development environment onto a remote Linux box. Today my laptop runs a browser, a terminal emulator, and not much else. My working state lives in a tmux session on a $20/month server, always connected, always compiling, never sleeping. The headless workflow didn't just free up hardware resources; it changed how I think about development machines and where my tools belong.
The local overhead nobody talks about
Modern graphical IDEs are resource hogs by design. VSCode alone can eat 2 GB once you add language extensions and a couple of integrated terminals. Then there's Docker Desktop, which on macOS runs a Linux VM that constantly syncs filesystem events, burning CPU even at idle. Add a local database, a dev server, and a browser with 30 tabs, and a 16 GB machine feels cramped.
The real cost isn't just RAM. It's context loss. Your laptop goes to sleep, Docker restart takes 45 seconds. You switch Wi-Fi networks, your SSH tunnels drop. You close the lid at a coffee shop, then reopen it at home, and tmux sessions on the remote server pick up right where you left off, but the local IDE has to reinitialize everything. If you've ever killed nodemon because you had to reboot, you know the pain.
Moving the compute to a remote host solves this. The remote machine doesn't hibernate. It has a stable, fast connection to the internet. Package caches stay warm. Compilation happens on bare-metal Linux (or a near-native VM) without a middle layer like Docker Desktop's filesystem driver, which is notorious for slow I/O.
What a headless environment looks like in practice
Here's my typical day: I open Kitty (or iTerm2) on my MacBook, ssh devbox, and immediately tmux attach. The tmux session has been running for weeks. Panel 1 holds neovim with LSP and Treesitter talking to a TypeScript language server, panel 2 has a build watcher, panel 3 is a shell for git and ad-hoc commands, and panel 4 runs a local dev database. All on a 4-core, 8 GB cloud VM that costs about the same as two fancy coffees a month.
The editor is neovim, but you can use any terminal-native editor: Helix, Emacs in a terminal, or even a heavily configured vim. I connect to the Language Server Protocol (LSP) over localhost inside the remote box, so completion, diagnostics, and navigation feel instant because the source files and dependencies all reside on fast NVMe storage there, not on my laptop's disk. The only thing my local machine has to render is text, so it never breaks a sweat.
When I need a GUI for something like a database explorer or a browser preview, I launch the app locally but point it at the remote service via SSH tunnels or Tailscale. For tasks that require a full browser, I just keep a local browser open. My laptop is still a decent client; it's just not the workhorse.
This setup also makes it trivial to hop between physical machines. I can close the lid on my MacBook, walk to my desktop, and reattach the same tmux session. My entire development state is exactly as I left it. There's no syncing repos or re-cloning; the filesystem is persistent and always online.
Why an AI agent fits better on the server than on your laptop
The recent wave of AI coding agents, including xShellz's borg, Copilot, and others, typically runs alongside your editor. But when the agent needs to execute code, run tests, or apply patches by shelling out, doing that locally can be slow and risky. A local agent might run pip install torch in a contaminated environment, or it might consume all your CPU while you're trying to do something else.
When the AI agent operates directly on the remote Linux box, it has access to the exact same filesystem, toolchain, and runtime as your project. Borg, for example, is a terminal-native agent that lives on the server. You can tell it, "Inspect the build error in the tmux pane 2 and propose a fix," and it reads the build output, looks at the relevant source files, and opens a diff in your neovim session. No data leaves the server. The agent executes commands in sandboxed subprocesses on the remote host, so it can install packages, run tests, and even spin up temporary services without polluting your local laptop.
I used to try Copilot inside VSCode on my local machine, but that meant I still had to run the full project locally to let the AI test its suggestions. Now with borg living on the same box as the code, the loop is shorter: ask, test, apply. And my laptop remains free for research, Slack, and other lightweight tasks.
The trade-offs (and when this doesn't make sense)
Headless development isn't a silver bullet. Latency matters. If you're on a flaky connection, typing in neovim over SSH can become frustrating. I mitigate this with mosh (mobile shell) for high-latency situations, but it's still a compromise. For very graphics-intensive work like mobile app development with an emulator that needs a local display, a headless workflow falls apart. If you're doing lots of WYSIWYG tasks, you'll still need a local GUI.
Another pain point is initial setup. You have to configure your dotfiles, install system packages, and get used to terminal multiplexing. But once it's done, the environment is reproducible. I keep my entire server configuration in a few Ansible playbooks, so I can rebuild the box from scratch in 10 minutes if needed.
Some developers prefer the discoverability of an IDE with its point-and-click settings. I get that. But if you've already spent years in the terminal, this shift feels more like homecoming than sacrifice.
Where to get a remote shell that fits the bill
You can provision a cheap VPS from any cloud provider and configure it yourself. That's what I did initially. But if you want an always-on Linux shell with tmux persistence, built-in backup, and a pre-integrated AI coding agent, xShellz has a product that bundles exactly that. Their remote shells come with persistent storage, a static IP, and borg preinstalled so you can start chatting with your codebase immediately. I've been using their service for my side projects and it's been rock solid. The shell never sleeps, you can attach from anywhere, and borg is genuinely useful for refactoring PRs without leaving the terminal.
Even if you don't use xShellz, I encourage you to try moving your daily driver to a remote box for a week. Keep your IDE around for the moments you truly need it, but see how much cleaner the headless approach feels. You might end up, like me, treating your laptop as a glorified thin client and wondering why you ever put up with the fan noise.