I’m writing this blog post on my Pixel 5, standing in the kitchen. Termux open, connected to my home server through three layers of infrastructure that make the whole thing feel like I’m sitting at my desk. The same Claude Code session I started on my workstation this morning is right here on a 6" screen, and I can type a prompt, put the phone down, come back in an hour, and nothing has dropped.

This is the setup I’ve landed on for running Claude Code basically everywhere, and it’s turned out to be pretty useful.

The pieces

There are four layers to this, each solving a specific problem.

Tailscale gives me a private mesh network across all my devices. My home server, a couple of laptops, the Pixel 5, a few others. Every device gets a stable IP on the tailnet regardless of where it physically is, so I can reach my server from my phone whether I’m on home wifi or on mobile data on the other side of town. No port forwarding, no dynamic DNS, no VPN server to maintain. It just works.

$ tailscale status
100.x.x.1      server               linux   -
100.x.x.2      desktop              linux   active
100.x.x.3      tablet               android offline
100.x.x.4      hitl                 linux   idle
100.x.x.5      laptop               windows active
100.x.x.6      pixel5               android active
100.x.x.7      workpc               windows -

Eternal Terminal (ET) replaces SSH for interactive sessions. It runs on port 2022 on the server and the key thing it does is survive network changes. If my phone switches from wifi to 4G, or goes to sleep for 20 minutes, or I walk through a dead spot, the session is still there when connectivity comes back. SSH would drop the connection and you’d have to reconnect and reattach. ET just resumes transparently. It’s been running on the server for over 3 months without a restart.

tmux gives me persistent terminal sessions on the server. I have a couple of aliases in my ~/.bashrc that make session management pretty painless:

1
2
alias tmxc='tmux new -A -s "$(basename $PWD)"'
alias tmxc2='tmux new -A -s "$(basename $PWD)-2"'  # second session in the same dir

tmxc2 is for when I want two independent Claude sessions working in the same project folder.

tmxc creates or reattaches a tmux session named after the current working directory. So if I cd ~/projects/micropython && tmxc, I get a session called “micropython”. If that session already exists, it reattaches. This means I can have a bunch of project sessions running in parallel and jump between them by name. Right now I have sessions spread across three machines:

server $ tmux ls
bluetooth-debug: 1 windows (created Thu Jan 15 2026)
claude-marketplace: 1 windows (created Wed Mar 25 2026)
home: 1 windows (created Mon Mar 30 2026)
micropython: 1 windows (created Thu Mar 19 2026)
github-triage: 1 windows (created Wed Mar 25 2026)
notes: 1 windows (created Tue Mar 31 2026)
...

desktop $ tmux ls
watermark-detection: 1 windows (created Mon Mar 30 2026)
nrfx-update: 1 windows (created Sat Apr 18 2026)
openmv: 1 windows (created Fri Apr 17 2026) (attached)
stm32-net-init: 1 windows (created Mon Apr 20 2026)
tinyusb-makefile: 1 windows (created Fri Apr 17 2026) (attached)
zephyr-ble: 1 windows (created Sun Apr 19 2026) (attached)
...

laptop $ tmux ls
claude-net: 1 windows (created Sat Apr 18 2026)
d2-layout: 1 windows (created Fri Apr 17 2026) (attached)

About 40 sessions across the three machines. Some on the server have been alive since January, it has 94 days of uptime and tmux sessions survive as long as the server does.

Claude Code itself runs inside these tmux sessions. I have an alias for that too:

1
alias clauded='claude --dangerously-skip-permissions'

The --dangerously-skip-permissions flag means Claude can read files, write files, and run commands without asking me to approve each one. This is the mode that makes autonomous operation practical, you fire it off with a prompt and it goes and does the work. The name is appropriately scary, it’s giving Claude full access to your shell, but for my workflow where I’m running it inside project directories with git tracking everything it’s the right trade-off.

The workflow

The connection chain from the phone looks like this:

Pixel 5 (Termux) → Tailscale → ET (port 2022) → tmux session → Claude Code

In practice I’ll et hitl from Termux, then cd to whatever project and tmxc to get into the session. If Claude is already running in that session from earlier, I’m looking at whatever it’s been doing. If not, I run clauded and start a new conversation.

The really useful part is that I can start something on my desktop, walk away, and check on it from my phone. Claude Code sessions in --dangerously-skip-permissions mode will happily keep working through a long task (writing code, running tests, iterating on failures) and tmux captures all the output. When I pick up my phone and reattach, I can scroll back through everything it did while I was away.

This also works the other way. I can start a task from my phone, a quick “investigate why this test is failing” or “write a blog post about my setup”, then sit down at my workstation later and pick it up on a proper keyboard and monitor.

Termux on the Pixel 5

Termux is pretty much a full Linux environment on Android. It has its own package manager, you can install ET and Tailscale and tmux and ssh and all the usual stuff. The phone screen is obviously small but for reviewing Claude’s output and typing short prompts it’s workable. I wouldn’t want to write a lot of code on it, but for monitoring and steering an autonomous Claude Code session it’s fine.

The Pixel 5 is also not new hardware at this point, it’s a 2020 phone. That doesn’t matter though because all the actual compute happens on the server (a Manjaro box that’s doing the heavy lifting). The phone is just a thin client.

Why this combination

I tried a couple of other approaches before landing on this. Plain SSH works but drops connections constantly on mobile. Mosh handles reconnection but doesn’t support scrollback properly and has rendering issues with Claude Code’s TUI. ET turned out to be the right balance, it handles reconnection transparently and works with everything that runs in a terminal.

Tailscale is the thing that makes the whole setup location-independent. Without it I’d need to mess around with port forwarding and dynamic DNS and firewalls. With it, et hitl works the same whether I’m at home or on a train.

The tmux + clauded aliases are small things but they reduce the friction enough that I actually use this setup daily rather than it being something I set up once and forgot about. Being able to type tmxc and immediately be in a named session for whatever project I’m working on is the kind of ergonomic shortcut that adds up.