← All posts

I Cut My Side Project Deploy Loop From 9 Steps to 2

June 28, 2026 · 6 min read · The xShellz Team

I Cut My Side Project Deploy Loop From 9 Steps to 2

I used to treat my laptop like a production server. A quick Flask app, a long-running Node job, a scraper that needed to run overnight. I'd fire it up, minimize the terminal, and hope for the best. Inevitably the laptop would sleep, the Wi-Fi would drop, or I'd close the lid before remembering the process was still alive. My average "deploy" for a side project was about nine manual steps: start the local server, fix the ports because something else was already listening, set up a virtualenv or nvm again, remember to install that one system library that somehow wasn't there, restart, test, realize the laptop had gone to sleep and repeat. It wasn't just annoying. It was silently eating hours and killing momentum.

The Laptop-as-Server Trap

A laptop is not a server. No matter how powerful it is, the operating system is designed to suspend processes, rotate IPs, and prioritize battery life over uptime. For side projects that need to stay up, even for a day, that design is a constant source of friction. I'd demo a project to a friend and the local dev server had died 20 minutes earlier because macOS decided to reclaim memory. I'd SSH into my own machine from a coffee shop only to find it had gone to sleep. The "it works on my machine" problem wasn't about environment differences. It was about the machine not being a reliable machine.

The obvious fix was a VPS. Spin up a $5 droplet, install the dependencies, configure a reverse proxy, set up SSL, harden SSH, keep the OS patched, monitor disk usage, rotate logs, and finally deploy. For a side project that might get 3 visitors, that felt like bringing a flamethrower to light a candle. I wanted something lighter: a persistent, always-on Linux environment that I could reach from any terminal, where I could leave a process running for weeks without becoming a part-time sysadmin.

What I Changed: A Persistent Remote Shell

I moved my side projects to a managed remote Linux shell. Not a full VPS with root access and infrastructure responsibilities. Just a clean, persistent home directory on a server that never sleeps, with the standard tools I'd have on any Linux box: Python, Node, Go, tmux, git, and a package manager. The kind of environment that feels exactly like opening a terminal on a local machine, except it's always on.

The shift was immediate. Instead of the nine-step dance on my laptop, my deploy loop turned into two commands:

ssh user@my-shell
# inside the remote shell
tmux attach -t project

That's it. The process was already running. If I needed to restart, I'd hit Ctrl-C and run a single script. No port conflicts because the remote environment is isolated. No surprise library installs because the environment is exactly as I left it. I could close my laptop, board a flight, and pick up right where I left off from my phone.

The Setup, in Three Commands

Here's what it looks like in practice. I'll use a simple Python project as an example.

First, clone the repo on the remote shell:

git clone https://github.com/me/side-project.git
cd side-project

Then set up the environment and install dependencies. This is the same as local dev, but done once on a machine that won't reboot randomly:

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Finally, start the process inside tmux so it outlives my SSH session:

tmux new-session -d -s sideproject 'python app.py'

That session will stay alive until I explicitly kill it. I can detach with Ctrl-B d, log out, and go to sleep. When I come back, tmux attach -t sideproject puts me right back into the running process. If the script crashes, I see the traceback in the tmux buffer instead of losing it because my local terminal window disappeared.

This pattern works for anything that listens on a port, runs on a schedule, or needs to stay resident. IRC bouncers, small API servers, data collectors, even headless browsers. The remote shell gives me the flexibility of a server without the upkeep of a server.

Why Not Just a VPS?

A VPS gives you a full operating system, which means you also get the full responsibility for keeping it alive and secure. You'll manage SSH keys, fail2ban, firewall rules, unattended upgrades, and maybe a monitoring agent to tell you when the disk fills up. For a side project that only you use, that overhead often exceeds the project itself. I've had side projects die not because the code was broken, but because I didn't want to deal with yet another apt update on a machine I'd forgotten about.

A managed remote shell strips that down. You get a home directory on a shared, maintained system. You can install packages inside your home, run processes within your user's limits, and never worry about kernel patches or open ports. The provider handles uptime, network, and OS maintenance. You handle code. It's the right level of abstraction for the 80% of side projects that don't need a dedicated host.

There are trade-offs. You can't open arbitrary ports to the internet (although some managed shells offer reverse proxies or tunnels). You may have disk quotas, background process limits, or restricted sudo. But for the kind of work that normally lives on a laptop terminal, those constraints are rarely a real blocker. If I need to expose a service publicly, I'll use a simple SSH tunnel or a free tier of something like ngrok. If I need root, I'll graduate to a VPS when the project earns that complexity.

The "It Works on My Machine" Insurance

Another hidden win: environment consistency. My laptop runs macOS, but the remote shell runs Linux. When I develop locally, I sometimes hit macOS-specific quirks: a library that expects Linux file permissions, a shell script that uses GNU sed flags, a dependency that compiles differently on Darwin. Those mismatches lead to the classic "it works on my machine" problem when I try to run the same code on a server later.

By doing the long-running work directly on a Linux host from the start, I catch those differences early. The environment that runs the overnight job is the same one where I tested it. I can still write code on my laptop, push, and pull on the remote shell, but the runtime is Linux from day one. That closes a feedback loop that otherwise only surfaces when I try to deploy months later.

When This Won't Work

A remote shell isn't a replacement for local development entirely. You still want a fast editor, a web browser, and a GUI for certain tasks. And if your side project needs low-latency graphics or direct hardware access, this approach falls apart. But for headless processes, background jobs, and anything that should keep running while you're not looking at it, a persistent remote shell is the simplest upgrade you can make.

I've used this pattern for over a year now across a handful of side projects. The number of times I've lost a running process because my laptop went to sleep: zero. The amount of time I spend thinking about infrastructure for those projects: almost none. The deploy loop really did shrink from nine manual steps to two commands I can type from anywhere.

At xShellz we offer exactly this kind of persistent remote Linux shell, alongside always-on IRC bouncers and borg, our AI terminal coding agent. But the idea itself isn't proprietary. If you're tired of your laptop killing your side projects, a remote shell, from us or anyone else, gives your work the persistent home it needs.