# luci-app-ddns-go, an OpenWrt front end for dynamic DNS updates

> sirpdboy/luci-app-ddns-go is a LuCI package for OpenWrt that puts a web interface in front of the ddns-go client, so a router can keep a domain pointing at its changing IPv4 or IPv6 address without shell access. It supports a dozen DNS providers and installs as an ipk or apk package.

**sirpdboy/luci-app-ddns-go** — luci-app-ddns-go 自动获得你的公网 IPv4 或 IPv6 地址，并解析到对应的域名服务。支持的域名服务商 阿里云 腾讯云 Dnspod Cloudflare 华为云 Callback 百度云 Porkbun GoDaddy Namecheap NameSilo Dynadot DNSLA 时代互联

- Repository: https://github.com/sirpdboy/luci-app-ddns-go
- Stars: 766 · Forks: 135
- Language: JavaScript
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/sirpdboy-luci-app-ddns-go

## What the package does and which providers it covers

luci-app-ddns-go is a LuCI application for OpenWrt that automatically obtains your public IPv4 or IPv6 address and resolves it against a domain name service. The README describes it as a dynamic domain plugin for ddns-go.

The provider list is the practical headline. The repository description names AliDNS (Alibaba Cloud), Tencent Cloud Dnspod, Cloudflare, Huawei Cloud, Callback, Baidu Cloud, Porkbun, GoDaddy, Namecheap, NameSilo, Dynadot, DNSLA and a Chinese domain registrar. That is a dozen-plus providers, and the spread matters because the API differences between them are exactly the work that would otherwise have to be written per provider.

The characteristic list adds several things worth knowing. It supports macOS, Windows and Linux as well as ARM and x86 architectures, which tells you the underlying ddns-go binary is not OpenWrt specific. It can take the address from a chosen interface or network card. It runs as a service, with a default synchronisation interval of five minutes.

Two features stand out for anyone with more than one domain. Simultaneous resolution of multiple domain names is described as a must-have for companies, and multi-level domain names are supported. That combination is what you need if you run a handful of hosts on one dynamic address and want each on its own name.

The web interface itself is configurable: you can set a login username and password, and prohibit access from the public network. The last 50 log entries are visible on the page, so you can check what the updater is doing without running Docker or logging in over SSH. There is also webhook notification support and TTL control, plus custom parameters for some providers, which the README notes enables functions such as region resolution.

## Building it into an OpenWrt firmware tree

There are two documented ways to add the package to an LEDE or OpenWrt source tree, and the first one is the feeds method.

You edit feeds.conf.default in the root of the source tree and add the source:

```bash
    # feeds Get source code：
    src-git taskplan  https://github.com/sirpdboy/luci-app-ddns-go
 ``` 
  ```bash
   # Update feeds and install themes:
    scripts/feeds update ddns-go
	scripts/feeds install luci-app-ddns-go
 ``` 	

The second method is a direct clone into the package directory:

```bash
    # downloading
    git clone https://github.com/sirpdboy/luci-app-ddns-go package/ddns-go
    make menuconfig
```

Both methods end at the configuration menu, where you navigate to LuCI, then Applications, select luci-app-ddns-go, save and exit:

```bash
    make menuconfig
	# find LuCI -> Applications, select luci-app-ddns-go, save and exit
```

The compile step is then a single package target:

```bash
    # compile
    make package/ddns-go/luci-app-ddns-go/compile V=s
```

The V=s flag is the verbose one, and you want it the first time you build, since a package that fails to compile in the OpenWrt build system tends to fail for a reason buried in the log.

The README also names where the code comes from, and there are three sources. The LuCI front end is sirpdboy/luci-app-ddns-go itself, the underlying client is jeessy2/ddns-go, and there is a packaging entry in the immortalwrt packages tree under net/ddns-go, which is the route most OpenWrt users take rather than building their own firmware.

## The release notes and what changed over time

The README carries a running release log, and reading it tells you what kind of project this is.

The 1.6.7 release in March 2026 fixed the display of the update interval in seconds, added ipk and apk installation packages for ddns-go, and updated the kernel to 6.16.2. The 1.6.5 release in January 2026 fixed an issue where the IPv6 prefix could not be obtained, and changed the logs so the newest are at the top. The 1.6.3 release in October 2025 added a version number check function, added upgraded kernel functionality, and added a password reset function with the credentials admin and admin12345.

Those entries are worth reading for what they reveal. Updating the kernel version in each release means this package tracks the OpenWrt kernel releases closely, and the separate OpenWRT Packages releases in the version list, v6.17.1 in June 2026 and v1.6.8 in March 2026, suggest a build pipeline that follows the upstream kernel numbering.

The IPv6 prefix fix in 1.6.5 is the one a user would notice most. A residential IPv6 prefix changes when your ISP reassigns it, and a DDNS client that only tracks the address suffix is fine while the prefix holds and silently wrong when it does not. Fixing that is the difference between a working dynamic AAAA record and a broken one.

The password reset default of admin and admin12345 is a small thing to be aware of, since it is a known credential pair written into the release notes.

The 1.5.1 release in May 2025 is the compatibility one, adding support for the latest OpenWrt 24.10 with a JavaScript version, while the older 18.06 releases use a Lua branch instead.

## Where the interface and the logs actually live

The screenshots in the README are not in the repository listing but the images are referenced from a separate images repository and from the doc/ directory of the author's openwrt fork, so the interface is documented visually rather than in prose.

What the interface is meant to do is set out by the feature list. You configure the provider and your records on the page, set the login username and password, and optionally forbid access from the public network so the LuCI page for the plugin is not reachable from outside your network. The last 50 log entries are shown on the page, which removes the usual reason for needing shell access to a router at all, since the interesting question is nearly always whether the updater succeeded.

Two details in the feature list are worth pulling out because they are the ones that make it usable in a real deployment. The support for simultaneous resolution of multiple domain names is described as a must-have for companies, and the support for multi-level domain names means a host.sub.example.com style record works rather than only the apex. Combined with the interface, network card selection and a five minute interval, that is enough to cover the common small-office setup where several services sit behind one dynamic address.

The webhook notification support is the other one. With it, the plugin can tell something else when the address changes or when an update fails, which matters if your DNS records feed into other automation.

The repository is MIT licensed, the default branch is main, and the last push was on 2026-06-23, so the package is being maintained against current OpenWrt releases.

## How this compares with the alternatives

There are three ways to get dynamic DNS onto a router, and this package is the middle one.

The first is running the ddns-go binary directly on the router with a hand-written configuration file. It works and it is what this package wraps, but on a device where you would rather not SSH in, every change means a terminal session. This package is that same binary with a web interface, credentials and a log view, which is the difference between something you configure once and something you can check on a phone.

The second is a generic LuCI DDNS application, of which there are several in the OpenWrt feed. Those talk to the provider APIs directly and are usually limited to the providers the OpenWrt project chose to support. ddns-go has its own provider implementations, and the wide list here, including Chinese providers such as AliDNS, Dnspod, Huawei Cloud and Baidu Cloud, is the reason to prefer it if you are on one of those.

The third is not doing it on the router at all, and running the update from a server or a container instead. That is the right answer when the router is behind a carrier NAT you do not control, since no amount of client-side updating fixes an inbound reachability problem. If your IPv4 is behind CGNAT, dynamic DNS records a public address that nobody can reach you on, and the fix is a tunnel or a reverse proxy, not a different DDNS client.

One limitation of the LuCI approach is the coupling to the router. The package is tied to the OpenWrt LuCI framework and to the version numbering of the OpenWrt packages, so it needs a rebuild or a matching package release when the firmware moves on.

## Conclusion

Adopt luci-app-ddns-go if you run OpenWrt or a compatible router firmware and want dynamic DNS configured through the LuCI web interface without touching the shell, especially on a device with a residential IPv6 prefix that changes. Skip it if your router firmware does not carry the package and you are not willing to build it into the firmware image, since the OpenWRT-packages releases are the supported route. Verify first by installing the package from the OpenWRT Packages releases, confirming the ddns-go service starts, and checking that a test record updates before you point a production domain at it.

## FAQ

### What does luci-app-ddns-go do?

It is a LuCI package for OpenWrt that automatically obtains your public IPv4 or IPv6 address and resolves it against a domain name service, giving ddns-go a web interface, a login, a log view of the last 50 entries and a five minute default synchronisation interval.

### Which DNS providers does luci-app-ddns-go support?

The provider list covers AliDNS, Dnspod, Cloudflare, Huawei Cloud, callbacks, Baidu Cloud, Porkbun, GoDaddy, Namecheap, NameSilo, Dynadot, DNSLA and a Chinese domain registrar, with custom parameters allowed for some of them to enable features such as region resolution.

### How do I add luci-app-ddns-go to an OpenWrt source tree?

Either add a src-git line pointing at the repository to feeds.conf.default and run scripts/feeds update and scripts/feeds install, or clone the repository into package/ddns-go. Then select it under LuCI -> Applications in make menuconfig and build it with make package/ddns-go/luci-app-ddns-go/compile V=s.

### Can luci-app-ddns-go update an IPv6 record when my prefix changes?

The release notes for version 1.6.5 in January 2026 record a fix for being unable to obtain the IPv6 prefix, which matters because a residential prefix can be reassigned by the provider while the address suffix stays the same.

### Is there an easier way to install luci-app-ddns-go than building firmware?

The README points to a packaging entry in the immortalwrt packages tree under net/ddns-go, and the release list includes OpenWRT Packages builds such as v6.17.1. The luci-app-ddns-go releases also add ipk and apk installation packages for ddns-go, so installing from a matching package is possible without a full firmware build.

## Sources

- [Issues](https://github.com/sirpdboy/luci-app-ddns-go/issues)
- [License: MIT](https://github.com/sirpdboy/luci-app-ddns-go/blob/main/LICENSE)
- [README](https://github.com/sirpdboy/luci-app-ddns-go/blob/main/README.md)
- [Releases](https://github.com/sirpdboy/luci-app-ddns-go/releases)
- [sirpdboy/luci-app-ddns-go on GitHub](https://github.com/sirpdboy/luci-app-ddns-go)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/sirpdboy-luci-app-ddns-go
