Skip to content
Descoped Source Code Portalv2.2.13
PollingSign in

dddns

Up to date

Descoped Dynamic DNS

descoped/dddns on GitHubLast push

last commit badgerelease badgelicense badgeissues badge

CI codecov Go Report Card Release License Go Version Platform

Most home networks receive dynamic public IP addresses via DHCP lease from ISPs, which can change on lease renewal or connection reset. Dynamic DNS (DDNS) solves this by automatically updating DNS records when your IP changes, keeping your domain (like home.example.com) always pointing to your current IP.

dddns is a lightweight, secure DDNS client specifically for AWS Route53, designed to run on resource-constrained devices like Ubiquiti Dream Machines. Perfect for VPN access, home servers, remote management, or any service that needs consistent access to your home network.

Features

๐Ÿš€ Core Functionality

  • AWS Route53 Integration - Updates DNS A records automatically (Route53 only)
  • Smart IP Detection - Reliable public IP detection via checkip.amazonaws.com
  • Change Detection - Only updates when IP actually changes
  • Persistent Caching - Remembers last IP to minimize API calls
  • Proxy/VPN Protection - Detects and prevents updates when behind proxy
  • Dry Run Mode - Test changes without modifying DNS records
  • Force Updates - Override cache when needed

๐Ÿ”’ Security

  • Device-Specific Encryption - AES-256-GCM with hardware-derived keys
  • Secure Credential Storage - Encrypted configs locked to specific hardware
  • No Environment Variables - Credentials stored securely in config files
  • File Permission Enforcement - Automatic 600/400 permissions
  • Memory Wiping - Sensitive data cleared after use
  • AWS Profile Support - Integrates with AWS CLI credentials

๐Ÿ–ฅ๏ธ Platform Support

  • Ubiquiti Dream Machine - UDM/UDR with UniFi OS v3/v4
  • Linux - AMD64, ARM64, ARM architectures
  • macOS - Intel and Apple Silicon
  • Windows - AMD64 and ARM64
  • Docker - Container deployment ready
  • Automatic Platform Detection - Adjusts paths and behavior per platform

๐Ÿ“ฆ Deployment

Three deployment forms, pick whichever matches your setup:

  • Cron mode โ€” on-device polling every 30 minutes. The proven default for UDM / UDR / Raspberry Pi. Output flows through journalctl -t dddns; rotation handled by journald.
  • Serve mode โ€” on-device event-driven listener for a same-host DDNS client (ddclient, a user script, a Docker sidecar). Supervised by systemd. Experimental on UniFi Dream โ€” UniFi's built-in inadyn can't reach the loopback listener; use cron or Lambda there.
  • Lambda mode (v0.3.0+) โ€” AWS Lambda + API Gateway endpoint. Event-driven from the cloud, provisioned via OpenTofu. Ideal when UniFi UI's Custom Dynamic DNS is the push source. Costs ~$0/month at household scale. See deploy/aws-lambda/README.md.

Other deployment traits:

  • Single Binary - No dependencies, <10MB size (6MB for the Lambda zip)
  • Low Memory - <20MB runtime usage; GOMEMLIMIT=16MiB ceiling on serve + Lambda
  • Boot Persistence - Survives firmware updates on UDM
  • Cross-platform builds - GoReleaser produces Linux / macOS / Windows / UDM artefacts on every tag

Quick Start

๐Ÿ“‹ Prerequisites: Need to set up AWS Route53 first? See the AWS Setup Guide for step-by-step instructions.

Ubiquiti Dream Machine (UDM/UDR)

# One-line installation (prompts for cron or serve mode on fresh install)
bash <(curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh)

# Configure
dddns config init

# Test
dddns update --dry-run

# Privacy-safe self-diagnosis (great to paste in a GitHub issue)
bash <(curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh) --probe

โš ๏ธ Compatibility Note: Check supported models and requirements before installation.

AWS Lambda (v0.3.0+, any cloud-hosted push target)

If the DDNS push source is UniFi UI's Custom Dynamic DNS entry and you don't want to run anything on-device, deploy dddns as an AWS Lambda behind API Gateway. The OpenTofu module at deploy/aws-lambda/tofu/ provisions the whole stack in one apply โ€” Lambda, API Gateway, IAM, SSM parameter, CloudWatch log group.

# Build the Lambda zip (Linux arm64, provided.al2023)
just build-aws-lambda

# Configure your deployment (zone ID + hostname)
cd deploy/aws-lambda/tofu
cp terraform.tfvars.example terraform.tfvars
$EDITOR terraform.tfvars

# Deploy
tofu init && tofu apply

# Rotate secret and paste into UniFi UI
cd .. && ./scripts/rotate-secret.sh

Household-scale deployments stay in the AWS free tier. See deploy/aws-lambda/README.md for the full guide, cost breakdown, and teardown instructions.

macOS

# Install via Homebrew
brew tap descoped/tap
brew install dddns

# Configure and run
dddns config init
dddns update

Linux

Debian/Ubuntu

# Download and install the .deb package
curl -LO https://github.com/descoped/dddns/releases/latest/download/dddns_Linux_x86_64.deb
sudo dpkg -i dddns_Linux_x86_64.deb

# For ARM64 systems:
curl -LO https://github.com/descoped/dddns/releases/latest/download/dddns_Linux_arm64.deb
sudo dpkg -i dddns_Linux_arm64.deb

Red Hat/CentOS/Fedora

# Install the .rpm package
sudo rpm -ivh https://github.com/descoped/dddns/releases/latest/download/dddns_Linux_x86_64.rpm

# For ARM64 systems:
sudo rpm -ivh https://github.com/descoped/dddns/releases/latest/download/dddns_Linux_arm64.rpm

Configure and run

dddns config init
dddns update

Commands

dddns update [--dry-run] [--force] [--quiet]  # Update DNS record
dddns config init                              # Interactive configuration
dddns config check                             # Validate configuration
dddns ip                                       # Show current public IP
dddns verify                                   # Check DNS vs current IP
dddns secure enable                            # Enable encrypted config
dddns --version                                # Show version

Documentation

How It Works

dddns has three deployment forms. Pick one at install time; they are mutually exclusive.

Form Trigger Where dddns runs Fits when
Cron Time-based (every N minutes) On-device (UniFi, Pi, Linux, macOS) Simple, self-contained. Default choice for most installs.
Serve Event-based (dyndns v2 push) On-device, listens on 127.0.0.1 A same-host DDNS client pushes on IP change. Experimental on UniFi Dream โ€” see note below.
Lambda Event-based (HTTPS push) AWS Lambda + API Gateway Push source cannot reach a loopback listener (e.g. UniFi UI's built-in inadyn with -b eth4). Also the right choice when the router itself is unreliable.

Cron mode (polling)

flowchart LR
    A[Cron<br/>*/30 min]:::start -.-> B[dddns update]
    B --> C{WAN IP<br/>changed?}
    C -->|cache hit| G[nochg-cache]:::skip
    C -->|changed| F[Route53 GET<br/>current A]
    F --> H{DNS<br/>matches?}
    H -->|yes| J[nochg-dns]:::skip
    H -->|no| I[Route53 UPSERT]:::update
    I --> K[cache + journald]
    G --> L[exit]:::exit
    J --> L
    K --> L

    classDef start fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
    classDef update fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
    classDef skip fill:#fff9c4,stroke:#fbc02d
    classDef exit fill:#f5f5f5,stroke:#616161

Two short-circuits โ€” cache match and DNS match โ€” keep API calls near-zero when the IP is stable.

Serve mode (event-driven, on-device)

flowchart LR
    A[DDNS client<br/>same host]:::start -.->|dyndns v2 push| B[dddns serve<br/>127.0.0.1:53353]
    B --> C{CIDR<br/>allowlist}
    C -->|deny| X[403]:::deny
    C -->|allow| D{Constant-time<br/>Basic Auth}
    D -->|fail| Y[badauth]:::deny
    D -->|ok| E{Hostname<br/>match?}
    E -->|no| Z[nohost]:::deny
    E -->|yes| F[Read WAN IP<br/>from local iface]
    F --> G[Route53 UPSERT]:::update
    G --> H[audit.jsonl +<br/>status.json]
    H --> I[good]:::exit

    classDef start fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
    classDef update fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
    classDef deny fill:#ffcdd2,stroke:#c62828
    classDef exit fill:#fff9c4,stroke:#fbc02d

The handler never trusts the myip query parameter โ€” it publishes the WAN interface's actual IP (ground truth). Systemd supervises the process with Restart=always.

โš ๏ธ Experimental on UniFi Dream (UDM / UDR): UniFi's built-in inadyn binds with -b eth4, which forces every connection โ€” including to 127.0.0.1 โ€” through the WAN policy routing table (table 201.eth4). That table has no route for loopback, so the push never reaches the listener. Serve mode works on Raspberry Pi, generic Linux, macOS, and Docker with a same-host DDNS client, but not with UniFi's built-in pusher. On UniFi Dream devices, use Lambda mode instead.

Lambda mode (event-driven, cloud)

flowchart LR
    A[UniFi inadyn<br/>or any dyndns client]:::start -.->|HTTPS push| B[API Gateway<br/>HTTP API]
    B --> C[Lambda<br/>provided.al2023 arm64]:::lambda
    C --> D{SSM-cached<br/>shared secret}
    D -->|fetch/cache 60s| E[(SSM Parameter<br/>Store SecureString)]
    C --> F{Constant-time<br/>Basic Auth}
    F -->|fail| Y[badauth]:::deny
    F -->|ok| G{Hostname<br/>match?}
    G -->|no| Z[nohost]:::deny
    G -->|yes| H{dry-run?}
    H -->|true| DR[good sourceIP<br/>skipping Route53]:::skip
    H -->|false| I[Route53 UPSERT<br/>with sourceIP]:::update
    I --> J[CloudWatch Logs]
    J --> K[good sourceIP]:::exit

    classDef start fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
    classDef lambda fill:#fff3e0,stroke:#f57c00,stroke-width:2px
    classDef update fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
    classDef skip fill:#e1bee7,stroke:#8e24aa
    classDef deny fill:#ffcdd2,stroke:#c62828
    classDef exit fill:#fff9c4,stroke:#fbc02d

The IP published to Route53 is always requestContext.http.sourceIp (the TCP peer recorded by API Gateway). The myip= query parameter is ignored โ€” same "never trust client-supplied values" posture as serve mode.

Deployed via an OpenTofu module at deploy/aws-lambda/tofu/ (13 AWS resources, all configurable). The IAM policy is scoped to exactly one zone + one record + UPSERT-only + A-only + one SSM parameter + KMS aws/ssm with a kms:ViaService condition. See deploy/aws-lambda/README.md.

๐Ÿ’ก Cost Tip: Route53 hosts a zone for ~USD 0.50/month plus query fees. Lambda + API Gateway + SSM + CloudWatch at household-scale push volume stay firmly in AWS's free tier โ€” a realistic personal deployment is $0/month for the first year and single-digit cents afterwards.

Development

Prerequisites

  • Go 1.26+
  • just (brew install just on macOS)
  • OpenTofu 1.6+ (only needed to deploy the AWS Lambda form)

Building

# Clone repository
git clone https://github.com/descoped/dddns.git
cd dddns

# Build for current platform
just build

# Race build for local dev
just dev

# Run tests
just test

# Cross-platform release binaries are produced by GoReleaser on every
# tag push โ€” see .github/workflows/goreleaser.yml. To exercise it
# locally, install goreleaser and run `goreleaser build --snapshot`.

Project Structure

cmd/                  # CLI commands
internal/
โ”œโ”€โ”€ config/          # Configuration management
โ”œโ”€โ”€ crypto/          # Device-specific encryption
โ”œโ”€โ”€ dns/             # Route53 client
โ”œโ”€โ”€ profile/         # Platform detection
โ””โ”€โ”€ version/         # Version information

Release Process

Releases use GoReleaser with git tags:

git tag v1.0.0
git push origin v1.0.0

GitHub Actions automatically builds and releases binaries for all platforms.

Configuration

Need AWS Route53? Follow the AWS Setup Guide to create your hosted zone and IAM credentials first.

Example Configuration

# ~/.dddns/config.yaml
aws_region: us-east-1
hosted_zone_id: ZXXXXXXXXXXXXX  # Get this from AWS Setup Guide
hostname: home.example.com
ttl: 300

# AWS credentials (or use AWS profile)
access_key: AKIAXXXXXXXXXXXXXX
secret_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Secure Configuration

For enhanced security, use encrypted configuration:

# Convert to encrypted config
dddns secure enable

# Config is now encrypted with device-specific key
# Cannot be moved between devices

Support

Reporting Issues

If you encounter any problems:

  1. Check the Troubleshooting Guide first
  2. Search existing issues to see if it's already reported
  3. Create a new issue with:
    • Your platform (UDM model, OS version)
    • dddns version (dddns --version)
    • Error messages or logs
    • Steps to reproduce

Getting Help

  • ๐Ÿ“– Documentation - Comprehensive guides
  • ๐Ÿ› Issues - Report bugs or request features
  • ๐Ÿ’ฌ Discussions - Ask questions and share ideas

Contributing

We welcome contributions! Whether it's bug fixes, new features, or documentation improvements, your help is appreciated.

How to Contribute

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes
  4. Run tests (just test)
  5. Commit your changes (git commit -m 'feat: add amazing feature')
  6. Push to your branch (git push origin feature/amazing-feature)
  7. Open a Pull Request

Development Guidelines

  • Follow Go best practices and conventions
  • Add tests for new functionality
  • Update documentation as needed
  • Keep commits atomic and well-described
  • Ensure all tests pass before submitting PR

Areas for Contribution

  • ๐Ÿ› Bug fixes
  • ๐Ÿ“š Documentation improvements
  • ๐Ÿงช Test coverage expansion
  • ๐Ÿ”ง Performance optimizations
  • ๐ŸŽจ Code refactoring
  • ๐ŸŒ Support for more DNS providers

License

This project is licensed under the MIT License - see the LICENSE file for details.


Note: This tool is specifically designed for AWS Route53. If you need support for other DNS providers, please open an issue to discuss potential implementation.

Dependencies

go.mod github.com/descoped/dddns (5 dependencies)
NameVersionScope
github.com/aws/aws-lambda-gov1.55.1runtime
github.com/spf13/cobrav1.10.2runtime
go.yaml.in/yaml/v3v3.0.6runtime
github.com/inconshreveable/mousetrapv1.1.0indirect
github.com/spf13/pflagv1.0.10indirect

Health

Health 70Watch

Technology

Up to date
Languages
Go
Build tools
Go modules
Toolchains
go 1.26

Packages

  • github.com/descoped/dddnsGov0.3.2at proxy.golang.org

Pull requests

Up to date

1 open: Needs review 1

  1. โฌ†๏ธ update module go.yaml.in/yaml/v3 to v4

    Needs review, waits for a review#49renovate[bot] (automation)

Issues

Up to date

1 open: Needs triage 1

  1. Dependency Dashboard

    Needs triage, waits for a maintainer to look at it#4renovate[bot] (automation)idle

Releases

Up to date
  1. v0.3.2 by github-actions[bot] (automation)
    Release notes

    dddns v0.3.2 (2026-04-19T00:40:29Z)

    Changelog

    Features

    • 96260aa143a5d86ab1ed6b3e77b5e5e2dacf9c05 feat(aws-lambda): add ?dry-run=true query param + fix aws v6 deprecations

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  2. v0.3.1 by github-actions[bot] (automation)
    Release notes

    dddns v0.3.1 (2026-04-18T23:37:48Z)

    Changelog

    Features

    • 5be4d43a3b6aa85ba2a45fcb9ad0e49e388e4148 feat(installer): add --disable soft-stop action
    • 75ec285eef93089252dcc7f8ab5ed7db082898fc feat(installer): upgrade binary only when landing on a disabled state

    Bug Fixes

    • ccc2e2a6ee03878042c674a79de14be8030d1e81 fix(installer): invocation_hint handles multi-word suffixes

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  3. v0.3.0 by github-actions[bot] (automation)
    Release notes

    dddns v0.3.0 (2026-04-18T21:06:03Z)

    Changelog

    Features

    • 5696cbbc840bd44b471fdc2a48f2ba8ec0cab233 feat(dns): extend SigV4 signer for STS session tokens
    • c7a8d51918efd56692b211f3363bdec0e672a127 feat(lambda): add AWS Lambda deployment form
    • 0885334d4c61757c3b46806ce8192807160c62e5 feat(lambda): rotate-secret.sh helper
    • ed82864dbda0e8a8e8d486187bd375f21b907042 feat(lambda/tofu): OpenTofu module for Lambda + API Gateway + SSM

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  4. v0.2.1 by github-actions[bot] (automation)
    Release notes

    dddns v0.2.1 (2026-04-18T20:36:12Z)

    Changelog

    Features

    • 69e0b6375e6e37e8acbb609f1702df8535c9e726 feat(bootscript): route cron output to journald instead of flat file
    • 2c0d8b8f0f7e951faae9d483583982efd659105c feat(installer): probe reports firmware version + upstream reachability
    • 5d3082ef01cceb2008d84769cacb40f114206e0b feat(update): add --verbose flag for per-step diagnostics

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  5. v0.2.0 by github-actions[bot] (automation)
    Release notes

    dddns v0.2.0 (2026-04-18T18:51:05Z)

    Changelog

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  6. v0.2.0-rc.3Pre-release by github-actions[bot] (automation)
    Release notes

    dddns v0.2.0-rc.3 (2026-04-18T17:56:41Z)

    Changelog

    Bug Fixes

    • 694464ff610c8d879ad1b3cb24db9fafea62d893 fix(installer): bash-native ELF inspector fallback in probe
    • 1de5934b0c268141ec0b27dbaf021d012f0fd83b fix(installer): probe output bugs
    • faf320411afa88376b94920af17968f6168c36df fix(installer): route all log output to stderr
    • f2b357fe79626956794c97dcdc3b694dea4edd5a fix(installer): sensible rollback hint when invoked via curl-pipe

    Performance

    • f7f0d52c92875fa687f3c0e1c53ba1c265732d6e perf: trim binary + cap serve-mode heap via GOMEMLIMIT

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  7. v0.2.0-rc.2Pre-release by github-actions[bot] (automation)
    Release notes

    dddns v0.2.0-rc.2 (2026-04-18T15:07:20Z)

    Changelog

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  8. v0.2.0-rc.1Pre-release by github-actions[bot] (automation)
    Release notes

    dddns v0.2.0-rc.1 (2026-04-18T13:49:45Z)

    Changelog

    Features

    • 08b388ada8dd95996ac0b89d39ca0d62561fb775 feat(installer): --version flag for pre-release tags
    • 6587bc98ccea287d2f54647c814b021cb7519fc4 feat(installer): add pre-flight, state snapshot, smoke test, rollback
    • 08d16f5f33f3bc2b2fe6e224b98649ec3c6f2cd0 feat(installer): harden for RC iteration (C1/C2/R1/R3/R4)
    • 7118cd20a5d1be675b2e7d8caad9a976d3192c24 feat(wanip): fall back to interface scan when no default route
    • 4ac22de3b76e78e8a30d63184bf477c3fe20acda feat: add ARMv7 build test and centralize Go version in CI
    • d0e92a09c277d7a8376324e8a73f8fe37b28edcd feat: add Authenticator with constant-time compare and sliding-window lockout
    • 58f7f3c749c8da72c403a7dad58f9f8249963170 feat: add CIDR allowlist helper for the serve-mode handler
    • 5f89ae7b3bd8c45932e25c8ef0c5da298aab4de3 feat: add Homebrew tap support configuration
    • fd5d73159510b1ae4d1955d65c121756d7f17371 feat: add JSONL audit log with size-based rotation
    • a7ae93ea265949ce43a4fa7d8c028ea3957d16af feat: add ServerConfig struct and IPSource field to Config
    • 58f813fd29c0f103fac28a98b305b7a7abea36c3 feat: add bootscript generator and dddns config set-mode
    • c3a4363b19286b631bb4ca741858ffde66e7696f feat: add dddns config rotate-secret for serve-mode credential rotation
    • d2110706b40f4efe5020a726905518201ccce3d5 feat: add dddns serve status subcommand and status-file reader
    • d4b6827bbdc84d17983451fee98efc207c13febe feat: add dddns serve test subcommand for SSH-side debugging
    • 550425164e71cf6bfb73e02104922b423facd7dc feat: add internal/wanip and wire cron-path IP resolution to ip_source
    • 55c6f13b7f537c6d948c48830591ae5039952af3 feat: add provider architecture design and implementation roadmap
    • 271bddeedf4d9617cbd1399b7c58ecd856c65027 feat: add serve-mode HTTP Server lifecycle and dddns serve command
    • f9a1e123476277150ecf43c938ee67a6224fd22a feat: add serve-mode HTTP handler and status-file writer
    • ef38e1b0079a9c9a13a9e5bbb10c6d060dfcd711 feat: encrypt server shared secret at rest in the secure config
    • c8ad5723c536507847ded35cb41595bb35249b0a feat: enhance build-test stage with actual verification
    • 9dcbbd75ad5d18bb66bbb92086c2c32f088f65e2 feat: rewrite UniFi installer around set-mode and add SHA-256 verification

    Bug Fixes

    • 71bc8ec8dab5c4c1e9923221c69c4f93fca4d003 fix: exit non-zero when the config file has a YAML parse error
    • 0467f5071d60702ef6e3c03debfc9d91b9882a6d fix: guard against empty hostname in Route53 client
    • cd5c7ea114f13286d7d3c5e167a938953c040f83 fix: preserve existing configuration during upgrades
    • 7640f318dd26c0b24415abdb3030e0f4398034c8 fix: properly address golangci-lint errors
    • 309c0a9a43187a91b46721920c26a5ca3aee9699 fix: redirect log output to stderr in get_latest_version to prevent URL corruption
    • 3407333ff976129dac40bf46575be9bc982b4930 fix: remove log output from get_latest_version function to prevent command substitution issues
    • 9298b4e3dcbe660d2d9019bc9f7ac88a1a5c5a67 fix: resolve CI linting errors and warnings
    • aa73ba346e4b921e542fb19380a74a6b260dc669 fix: specify GoReleaser version to avoid warning
    • 294a5c2d148c6db8dd6776c0febc80535ad286d0 fix: surface ip-api.com failures instead of silently reporting "not a proxy"
    • 99184e92058c7eb5721271f09b3671e92ddd72e1 fix: use filepath.Dir for cache and config directory paths

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install-on-unifi-os.sh | bash -s
    

    macOS

    brew tap descoped/tap
    brew install dddns
    

    Manual

    Download the appropriate binary from the assets below.

  9. v0.1.1 by oranheim
    Release notes

    dddns v0.1.1 (2025-09-13T22:39:13Z)

    Changelog

    Features

    • 7cda8390d7cd960c55ebd5a8cf8e21ca5837b4e6 feat: add UniFi OS v4 support for UDR and newer UDM devices
    • 9353561d2760f71dc0cb6aabedf36917a31da313 feat: add interactive prompts to install script
    • 4d40a572fd4858a37b9bd107ff7e68930542ce43 feat: improve cron job logging visibility

    Bug Fixes

    • a4ee559a32cd2caa045fa5662a49a0a89245b640 fix: add wrapper scripts for proper interactive execution
    • e9bd665cb4723bca10c432e8034a0ac3d8433811 fix: improve UniFi OS v4 detection using actual UDR paths
    • 3b54411b577df474dde6b484633d33a00e9db45a fix: interactive prompts when piping scripts through curl
    • 9883b59d314bb8764d3466413d6194b8643dbf65 fix: remove invalid 'go' configuration option from renovate.json
    • c2ad77f355a0f502abc862809202785b474e8b58 fix: update download detection for GoReleaser archive format

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install.sh | bash
    

    macOS/Linux

    brew install descoped/tap/dddns
    

    Manual

    Download the appropriate binary from the assets below.

  10. v0.1.0 by github-actions[bot] (automation)
    Release notes

    dddns v0.1.0 (2025-09-13T16:20:01Z)

    Changelog

    Installation

    Ubiquiti Dream Machine (UDM/UDR)

    curl -fsL https://raw.githubusercontent.com/descoped/dddns/main/scripts/install.sh | bash
    

    macOS/Linux

    brew install descoped/tap/dddns
    

    Manual

    Download the appropriate binary from the assets below.

All 10 held

Latest commits

Commit log

Documentation