⚠️ Tunneld is in heavy active development (pre-alpha phase). Expect a lot of breaking changesA single ARM64 pre-alpha build is published at a time for testing. The source code and versioned releases will become available once the project is opened. For early access and feedback, contact @toreanjoel.
Official installer script for Tunneld - a portable, ethernet-first programmable edge relay for self-hosters, developers, and edge network builders.
Here is Tunneld in action - exposing a local service to the subnet.
Install Tunneld directly:
curl -fsSL https://install.tunneld.sh -o install.sh
chmod +x install.sh
sudo ./install.shUninstall:
curl -fsSL https://install.tunneld.sh -o uninstall.sh
chmod +x uninstall.sh
sudo ./uninstall.shDuring the pre-alpha phase, the installer pulls:
releases/tunneld-pre-alpha.tar.gzreleases/checksums.txt
The installer:
- Downloads the tarball
- Downloads
checksums.txt - Shows the expected SHA256
- Attempts verification
- Extracts into
/opt/tunneld
Only one active pre-alpha build exists at any time - each new build replaces the previous one.
Current build: v0.19.21 (Caddy-backed, dual-NIC, runtime-agnostic, WireGuard overlay).
When Tunneld becomes public/open-source, this system will move to signed, tagged semantic releases (e.g. v1.0.0).
Tunneld is a portable, self-contained network edge relay that provides:
Expose local services on the subnet at <name>.tunneld.lan via a Caddy reverse proxy with backend pool load balancing - no port forwarding, no overlay clients required.
Enroll machines and discover what is listening (ss -tlnp) on them, regardless of runtime (Incus, Docker, systemd, or a bare binary). Promote any listener to a named resource. Remote machines are brought onto a WireGuard overlay (the gateway dials out) so their services are reachable as if local.
A standalone gateway that:
- Acts as its own DHCP server
- Provides an isolated local subnet
- Bridges an upstream internet link to a downstream LAN
- Requires no software installation on client devices
- DNS & DHCP - via dnsmasq, forwarding to user-configured DNS server
All traffic stays local - no reliance on central infrastructure.
The installer (install.sh) performs a guided setup:
- Detects network interfaces
- Prompts for:
- Upstream (internet-facing NIC)
- Downstream (LAN-facing NIC)
- Gateway IP
- DHCP range
Installs:
- dnsmasq
- dhcpcd
- caddy (reverse proxy/load balancer; Tunneld drives its JSON admin API)
- iptables, iproute2, bc, unzip
- systemd-timesyncd
- openssl (for the release's secret key generation)
Creates:
/etc/tunneld/interfaces.conf/etc/tunneld/dnsmasq.conf/etc/tunneld/dhcpcd.conf
Symlinks them into place:
/etc/dhcpcd.conf→/etc/tunneld/dhcpcd.conf/etc/dnsmasq.conf→/etc/tunneld/dnsmasq.conf
Notes:
- Tunneld reconciles a single Caddy JSON config (LAN plane on
:18000plus per-resource loopback listeners) through Caddy's admin API. - dnsmasq resolves any
*.tunneld.lanname to the gateway IP (via/etc/dnsmasq.d/tunneld_resources.conf) so named resources and exposed container services are reachable by name across the subnet.
- Optionally downloads the pre-alpha release
- Verifies the checksum
- Extracts files to
/opt/tunneld - Creates a
tunneld.servicesystemd unit - Restarts all relevant services
Services managed:
tunneld.service
caddy.service
dnsmasq.service
dhcpcd.service
Access dashboard:
http://10.0.0.1
Verify services:
systemctl status caddy tunneld dnsmasq dhcpcdcurl -fsSL https://raw.githubusercontent.com/toreanjoel/tunneld-installer/main/uninstall.sh -o uninstall.sh
chmod +x uninstall.sh
sudo ./uninstall.shThe uninstaller will:
-
Stop and disable:
- tunneld
-
Remove:
/opt/tunneld
/etc/tunneld
/var/lib/tunneld
/var/log/tunneld
/var/run/tunneld
- Caddy config is managed by Tunneld and reconciled automatically on restart.
- Remove the systemd unit
- Remove
/etc/dhcpcd.confor/etc/dnsmasq.confif they were symlinks to Tunneld - Remove dnsmasq drop-ins (
tunneld_dns.conf,tunneld_resources.conf) - Restart base services (best effort)
Note:
The uninstaller never removes OS packages (dnsmasq, dhcpcd, caddy, iptables, etc.). Remove them manually with apt if desired.
/opt/tunneld/ Application binaries and release files
/etc/tunneld/ Config files
/var/log/tunneld/ Logs
/var/lib/tunneld/ Persistent data
/var/run/tunneld/ Runtime files
| File | Purpose |
|---|---|
interfaces.conf |
Interface + subnet config |
dhcpcd.conf |
Gateway routing (upstream/downstream) |
dnsmasq.conf |
DNS & DHCP config |
| Caddy JSON config (Tunneld admin API) | Tunneld reconciles the LAN + loopback planes here |
The tunneld.service systemd unit passes these to the app:
| Variable | Purpose |
|---|---|
UPSTREAM_INTERFACE |
Internet-facing NIC (selected during install) |
DOWNSTREAM_INTERFACE |
LAN-facing NIC (selected during install) |
GATEWAY |
Gateway IP for the downstream subnet |
DEVICE_ID |
Unique device identifier (UUID) |
TUNNELD_DATA |
Persistent data directory (/var/lib/tunneld) |
SECRET_KEY_BASE |
Phoenix signing key (generated at install time) |
PORT |
HTTP port for the dashboard (default 80) |
Interface names are selected dynamically at install time via a whiptail menu that lists all non-virtual interfaces. They are never hardcoded in the app or the installer.
Tunneld builds on:
- dnsmasq
- dhcpcd
- caddy
- iptables
- Elixir / Phoenix
These open-source tools make Tunneld possible.

