Skip to content
All posts
6 min read

Remote Access for Self-Hosted Services (Without a VPN)

Access Home Assistant, Plex, Nextcloud, and other self-hosted apps from outside your network. No VPN, no dynamic DNS, no exposed ports.

homelabself-hosting

You run services at home: Home Assistant, Plex, Nextcloud, Grafana, Pi-hole. They work perfectly on your local network. But the moment you leave your house, you're cut off.

The traditional solutions all have trade-offs:

  • VPN (WireGuard, Tailscale). Routes all your traffic, requires setup on every client device, overkill for checking a dashboard.
  • Reverse proxy plus dynamic DNS. Requires a public IP (CGNAT breaks this), needs cert management, exposes your home IP.
  • Cloudflare Tunnel. A good option, but requires a Cloudflare account, custom domain, and YAML config files.

Localport gives you a public URL for any local service with one command. No config files, no DNS, no exposed ports.

Quick setup

Any HTTP service

# Home Assistant (port 8123)
localport http 8123 --token YOUR_TOKEN

# Jellyfin (port 8096)
localport http 8096 --token YOUR_TOKEN

# Nextcloud (port 8080)
localport http 8080 --token YOUR_TOKEN

# Grafana (port 3000)
localport http 3000 --token YOUR_TOKEN

You get a public HTTPS URL. Open it on your phone from anywhere.

SSH access

localport tcp 22 --token YOUR_TOKEN

SSH into your home machine from a coffee shop:

ssh user@abc123.tunnel.localport.dev -p 47266

Running as a system service

Set it up once, and it runs on boot with automatic reconnection:

sudo tee /etc/systemd/system/localport.service << 'EOF'
[Unit]
Description=Localport Tunnel
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/localport http 8123 --token YOUR_TOKEN
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now localport

Multiple services

Create a separate systemd unit file for each service. Each one gets its own tunnel token and its own public URL.

Multiple services

Create a separate tunnel for each service you want to expose:

# home-assistant.service
ExecStart=/usr/local/bin/localport http 8123 --token TOKEN_1

# jellyfin.service
ExecStart=/usr/local/bin/localport http 8096 --token TOKEN_2

Or use mesh tunnels to run multiple services under one token, each with its own URL.

Security considerations

  • No inbound ports. Localport connects outbound. Your firewall stays shut.
  • No home IP exposed. Traffic routes through Localport's infrastructure. Your IP doesn't appear in DNS.
  • HTTPS by default. Valid TLS certificates on every tunnel.
  • Token rotation. Rotate tokens from the dashboard without touching your server.
  • IP allow lists (all plans). Restrict access to your office IP or your phone's carrier range.

Localport vs alternatives

LocalportWireGuardCloudflare TunnelPort Forwarding
Setup time1 minute30+ minutes15+ minutes10+ minutes
Works behind CGNATYesNo (need a relay)YesNo
Exposes home IPNoDependsNoYes
Per-client setupNoYesNoNo
Config filesNoneYesYesRouter UI
Custom domain neededNoNoYesNo

When a VPN is better

If you need your entire home network accessible, with routing to multiple devices, file shares, and printer access, a VPN is the right tool. Localport is for exposing specific services with minimal setup.

For most homelab users who just want to check their Home Assistant dashboard from the office or share a Plex link with a friend, Localport is the faster path.

Start your free trial →