LoonDNS

Setup guide

Claim a name and grab a token in the dashboard, then pick your platform. Replace YOURNAME and YOUR_TOKEN in every snippet.

Why does almost everything work?

LoonDNS speaks the standard dyndns2 protocol and the DuckDNS URL format, so virtually any device with a β€œcustom / user-defined” Dynamic DNS option can update it. Don't see your exact device? Use the Generic router (dyndns2) settings β€” they work on most firmware.

Linux / macOS β€” cron

Auto-detects your public IP. Runs every 5 minutes.

cat > ~/loondns-update.sh <<'EOF' #!/bin/sh curl -fsS "https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN" >/dev/null EOF chmod +x ~/loondns-update.sh ( crontab -l 2>/dev/null; echo "*/5 * * * * ~/loondns-update.sh" ) | crontab -

Generic router (dyndns2)

In your router's Dynamic DNS settings, choose a custom / DynDNS provider:

Server / Addressloondns.com
Hostname / DomainYOURNAME
Usernameany (ignored)
PasswordYOUR_TOKEN

ddclient

Add to /etc/ddclient.conf:

protocol=dyndns2 use=web server=loondns.com ssl=yes login=any password='YOUR_TOKEN' YOURNAME

inadyn

In /etc/inadyn.conf:

provider default@loondns.com { hostname = YOURNAME username = any password = "YOUR_TOKEN" ddns-server = loondns.com ddns-path = "/nic/update?hostname=%h&myip=%i" }

OpenWrt (ddns-scripts / LuCI)

Add a service, Provider = custom, update URL:

https://loondns.com/update?domains=[DOMAIN]&token=[PASSWORD]&ip=[IP]

Domain = YOURNAME, Username = any, Password = YOUR_TOKEN.

pfSense

Services β†’ Dynamic DNS β†’ add. Service type Custom:

Update URLhttps://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN&ip=%IP%
Result MatchOK

OPNsense

Services β†’ Dynamic DNS (os-ddclient) β†’ add, Service = dyndns2 (custom):

Serverloondns.com
Username / Passwordany / YOUR_TOKEN
HostnameYOURNAME.loondns.com

MikroTik RouterOS

/system script add name=loondns source={ /tool fetch mode=https keep-result=no \ url="https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN" } /system scheduler add name=loondns interval=5m on-event=loondns

Ubiquiti EdgeOS (EdgeRouter)

configure set service dns dynamic interface eth0 service custom-loondns host-name YOURNAME set service dns dynamic interface eth0 service custom-loondns login any set service dns dynamic interface eth0 service custom-loondns password YOUR_TOKEN set service dns dynamic interface eth0 service custom-loondns protocol dyndns2 set service dns dynamic interface eth0 service custom-loondns server loondns.com commit ; save

UniFi (UDM / Dream Machine)

Settings β†’ Internet β†’ Dynamic DNS β†’ Create New:

Servicedyndns
HostnameYOURNAME
Username / Passwordany / YOUR_TOKEN
Serverloondns.com/nic/update?hostname=%h&myip=%i

ASUS / AsusWRT-Merlin

WAN β†’ DDNS β†’ Server = Custom. On Merlin, enable JFFS custom scripts and add /jffs/scripts/ddns-start:

#!/bin/sh curl -fsS "https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN&ip=$2" /sbin/ddns_custom_updated 1

DD-WRT

Services β†’ DDNS β†’ DDNS Service = Custom:

DYNDNS Serverloondns.com
Username / Passwordany / YOUR_TOKEN
HostnameYOURNAME
URL/update?domains=YOURNAME&token=YOUR_TOKEN&ip=

Tomato / FreshTomato

Basic β†’ DDNS β†’ Service = Custom URL:

https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN&ip=@IP

FRITZ!Box

Internet β†’ Permit Access β†’ DynDNS β†’ Provider = User-defined:

Update URLhttps://loondns.com/update?domains=<domain>&token=<pass>&ip=<ipaddr>
Domain nameYOURNAME
Username / Passwordany / YOUR_TOKEN

Synology DSM

Control Panel β†’ External Access β†’ DDNS β†’ Customize provider:

Query URL: https://loondns.com/update?domains=__HOSTNAME__&token=__PASSWORD__&ip=__MYIP__

Then add: Hostname = YOURNAME, Username = any, Password = YOUR_TOKEN.

QNAP

QTS's built-in DDNS is closed to custom providers, so run the updater in Container Station (see the Docker option) β€” it's the most reliable way on QNAP.

Docker

docker run -d --restart unless-stopped --name loondns-updater alpine sh -c \ 'while true; do wget -qO- "https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN"; sleep 300; done'

Home Assistant

In configuration.yaml, then trigger it from a time automation:

rest_command: loondns_update: url: "https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN"

Windows (PowerShell + Task Scheduler)

# save as C:\loondns\update.ps1 Invoke-RestMethod "https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN" # schedule every 5 minutes (run once, as admin): schtasks /create /tn LoonDNS /sc minute /mo 5 /tr "powershell -w hidden -File C:\loondns\update.ps1"

Android (Termux)

pkg install cronie crontab -e # add: */5 * * * * curl -fsS "https://loondns.com/update?domains=YOURNAME&token=YOUR_TOKEN"

Full parameter reference in the API spec. Confirm it worked with the name checker. Questions? FAQ.