TL;DR: I use Tailscale and NoMachine to access my Linux laptop’s physical desktop from any Android device, securely and without exposing public ports. The result is a single, continuous development environment that follows me everywhere.
Why “always-on” access matters
Remote desktop access turns a laptop left at home into a workstation you can carry in your pocket. Instead of juggling cloud VMs, syncing dotfiles, or recreating environments, you keep using the same browser sessions, editor state, terminals, and running services.
Your development environment should move with you, especially now, when AI tools and agents can run for hours and expect human input at unpredictable moments. Being tied to a single machine breaks momentum. Your environment needs to stay accessible wherever you are.
For me, this setup optimizes for continuity, security, and low operational overhead - not novelty.
Who this setup is for
This setup is ideal if you:
- use Linux as your primary development machine
- want to resume the same desktop session across devices
- don’t want to expose ports to the public internet
- prefer simple, self-hosted tooling over managed services
- work comfortably from tablets or phones when away from your desk
If you only need terminal access, SSH + tmux is enough. This post is for people who want the full desktop, reliably.
Why this combination works
Continuity You start work on your laptop and resume exactly where you left off — same windows, same terminals, same state.
Security Tailscale provides encrypted WireGuard-based networking. No public IPs, no port forwarding.
Performance NoMachine’s compression and adaptive streaming remain usable even on mobile data.
Convenience With Tailscale Serve, you can preview
localhostservices directly on your phone’s browser without opening the desktop.
Getting started with Tailscale
Tailscale creates a private mesh network between your devices.
On your laptop:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upInstall Tailscale on Android and log in using the same account.
Find your laptop’s Tailscale IP or MagicDNS hostname:
tailscale ip -4
tailscale statusYou’ll see something like:
100.x.y.z home-laptop.tail1234.ts.net linux activeKeep this handy — you’ll use it when configuring NoMachine.
Installing and configuring NoMachine on Ubuntu
I’m running Ubuntu 24.04 with i3, and the DEB package worked best.
cd ~/Downloads
sudo dpkg -i nomachine_9.3.7_1_amd64.deb
sudo apt install -f
sudo systemctl enable nxserver
sudo systemctl start nxserverBy default, NoMachine listens on port 4000.
Why physical desktop matters
Virtual sessions are fine, but they don’t preserve context. For this workflow, you want the physical desktop — the same X session already running on the laptop.
Add your user to NoMachine and mark it as trusted:
sudo /usr/NX/bin/nxserver --useradd ankit
sudo /usr/NX/bin/nxserver --useredit ankit --trusted physical
sudo /usr/NX/bin/nxserver --userlistOnce configured, NoMachine will offer Physical desktop when you connect.
Preventing laptop suspension
Since the laptop stays plugged in with the lid closed, suspension must be disabled.
Edit:
sudo nano /etc/systemd/logind.confSet:
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignoreThen restart:
sudo systemctl restart systemd-logindThis keeps the session alive and reachable at all times.
Setting up NoMachine on Android
Install NoMachine from Google Play
Create a new connection:
- Host:
100.x.y.zorhome-laptop.tail1234.ts.net - Port:
4000 - Protocol:
NX
- Host:
Log in with your Linux username/password
Choose Physical desktop
You’ll now see your live i3 session on Android.
Why NoMachine instead of SSH, VNC, or Chrome Remote Desktop?
- SSH + tmux: excellent for terminal-only workflows, not full desktop work
- VNC: simpler, but noticeably laggier on mobile networks
- Chrome Remote Desktop: convenient, but less control and Linux-friendly tuning
NoMachine hits the sweet spot for low-latency full-desktop access.
Bonus: preview localhost services on your phone
Sometimes you just want to see your dev server without opening the desktop.
On the laptop:
tailscale serve --https=443 http://localhost:3000On your phone:
https://100.x.y.z
# or
https://home-laptop.tail1234.ts.netTo stop serving:
tailscale serve offThis is perfect for quick UI checks or demos.
How this fits into my workflow
- I start work on my laptop (code, tests, docs, long-running processes).
- I close the lid and leave it plugged in at home.
- On a couch or tablet, I connect via NoMachine on Android.
- For quick checks, I use Tailscale Serve to preview
localhostin the browser.
No new sessions. No resyncing. No context loss.
Performance and security notes
- Latency: ~50–100 ms on Wi-Fi, ~100–300 ms on mobile data
- Security: All traffic stays inside Tailscale’s encrypted mesh
- Exposure: No public ports, no inbound firewall rules
- Power: Laptop stays plugged in, acting as a personal workstation server
Key commands (quick reference)
Laptop
sudo dpkg -i nomachine_9.3.7_1_amd64.deb
sudo systemctl enable nxserver
sudo systemctl start nxserver
sudo /usr/NX/bin/nxserver --useradd ankit
sudo /usr/NX/bin/nxserver --useredit ankit --trusted physical
tailscale ip -4Localhost preview
tailscale serve --https=443 http://localhost:3000
tailscale serve offClosing thoughts
With Tailscale and NoMachine, a Linux laptop becomes a private, always-on workstation — accessible from anywhere without sacrificing security or simplicity.
This setup removed my need for cloud dev environments and drastically reduced context switching across devices. Once it’s in place, it fades into the background — which is exactly how good infrastructure should behave.