
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
ApertoDNS CLI - Dynamic DNS management from your terminal. Manage domains, tokens, API keys and DNS updates with style.
Dynamic DNS management from your terminal. Manage domains, tokens, API keys, and DNS updates with style.
ApertoDNS is a free Dynamic DNS service that lets you point a subdomain to your dynamic IP address. Perfect for home servers, IoT devices, game servers, NAS systems, and remote access.
| Feature | ApertoDNS | Dyn (Oracle) | No-IP | DuckDNS |
|---|---|---|---|---|
| Free plan | Yes | No ($55/yr) | Yes | Yes |
| Free subdomains | Unlimited | 0 | 1 | 5 |
| API Keys with scopes | Yes | No | No | No |
| CLI tool | Yes | No | No | No |
| Docker images | Yes | No | No | No |
| IPv6 support | Yes | Paid | Paid | Yes |
| No forced renewal | Yes | N/A | 30 days | Yes |
| DynDNS2 compatible | Yes | Yes | Yes | No |
| Webhooks | Yes | No | No | No |
| Team sharing | Yes | No | No | No |
| Open Source | Yes | No | No | No |
# npm
npm install -g apertodns
# yarn
yarn global add apertodns
# pnpm
pnpm add -g apertodns
Or use without installing:
npx apertodns --help
# 1. Setup (login or register)
apertodns --setup
# 2. View your dashboard
apertodns --dashboard
# 3. List your domains
apertodns --domains
# 4. Force DNS update
apertodns --force
| Command | Description |
|---|---|
--dashboard | Complete dashboard with all info |
--domains | List all your domains |
--tokens | List all your tokens |
--stats | Statistics and metrics |
--logs | Recent activity logs |
--my-ip | Show your current public IP |
| Command | Description |
|---|---|
--add-domain <name> | Create a new subdomain |
--delete-domain | Delete a domain (interactive) |
--test <domain> | Test DNS resolution |
update <domain> | Update a specific domain's IP (use with --api-key) |
| Command | Description |
|---|---|
--txt-set <host> <name> <value> | Set a TXT record |
--txt-delete <host> <name> | Delete a TXT record |
Perfect for Let's Encrypt DNS-01 challenges:
# Set TXT record for certificate validation
apertodns --txt-set example.apertodns.com _acme-challenge "validation-token"
# Delete TXT record after certificate issuance
apertodns --txt-delete example.apertodns.com _acme-challenge
# Use with API key for automation
apertodns --api-key apertodns_live_xxx... --txt-set example.apertodns.com _acme-challenge "token" --json
| Command | Description |
|---|---|
--enable <id> | Enable a token |
--disable <id> | Disable a token |
--toggle <id> | Toggle token state |
--verify | Verify token validity |
| Command | Description |
|---|---|
--api-keys | List all API keys |
--create-api-key <name> | Create new API key |
--delete-api-key <id> | Delete an API key |
--scopes | Show available scopes |
--api-key <key> | Use API key for authentication |
| Command | Description |
|---|---|
--setup | Guided setup (login/register) |
--status | Show current status and IP |
--config | Edit configuration |
--logout | Remove local configuration |
--force | Force DNS update now |
| Command | Description |
|---|---|
--update | Standalone DynDNS2 update (no config required) |
--domain <fqdn> | Domain to update (with --update) |
--token <token> | Token for authentication (with --update) |
--ip <address> | Custom IP address (optional, auto-detected if omitted) |
| Command | Description |
|---|---|
--daemon | Start daemon mode (continuous updates) |
--interval <sec> | Update interval (default: 300s) |
| Option | Description |
|---|---|
--cron | Silent mode for cron jobs |
--quiet | Hide banner |
--json | JSON output (machine-readable) |
-v, --version | Show version |
-h, --help | Show help |
Run apertodns without arguments for an interactive menu with all options.
apertodns
You can authenticate in 3 ways:
apertodns --setup (saves JWT to ~/.config/apertodns/)--api-key <key> for single operationsAPERTODNS_API_KEYAll commands support --json flag for machine-readable output:
# Get domains as JSON
apertodns --domains --json
# Get your IP as JSON
apertodns --my-ip --json
# Combine with API key for scripting
apertodns --api-key apertodns_live_xxx... --domains --json
Run continuously to keep your DNS updated:
# Default interval (5 minutes)
apertodns --daemon
# Custom interval (60 seconds)
apertodns --daemon --interval 60
Update DNS without any saved configuration - perfect for scripts and one-off updates:
# Auto-detect IP and update
apertodns --update --domain myserver.apertodns.com --token YOUR_TOKEN
# Specify custom IP
apertodns --update --domain myserver.apertodns.com --token YOUR_TOKEN --ip 203.0.113.42
Run without installing Node.js:
# Run CLI via Docker
docker run --rm apertodns/cli --help
# Interactive setup (persisted config)
docker run -it -v apertodns_config:/root/.config/apertodns apertodns/cli --setup
# List domains
docker run -v apertodns_config:/root/.config/apertodns apertodns/cli --domains
# Standalone update (no config needed)
docker run --rm apertodns/cli --update --domain myhost.apertodns.com --token YOUR_TOKEN
For continuous updates, use the dedicated updater image:
docker run -d \
--name apertodns-updater \
--restart unless-stopped \
-e TOKEN=your_token \
-e DOMAINS=myhost.apertodns.com \
apertodns/updater
See Docker Hub for more options.
Set up automatic IP updates with cron:
# Update every 5 minutes
*/5 * * * * /usr/local/bin/apertodns --cron >> /var/log/apertodns.log 2>&1
# Or every minute for faster updates
* * * * * /usr/local/bin/apertodns --cron
Find your apertodns path with: which apertodns
ApertoDNS is compatible with routers that support DynDNS2 protocol:
Server: api.apertodns.com
Protocol: DynDNS2
Path: /nic/update
Username: your-token
Password: your-token
Hostname: yourdomain.apertodns.com
Configuration is stored in platform-specific locations:
~/.config/apertodns/ or ~/.apertodns/~/.config/apertodns/%APPDATA%\apertodns\"Unable to detect IP address"
"Authentication failed"
apertodns --logout then apertodns --setup to re-authenticate"DNS not updating"
apertodns --force to force an immediate updateapertodns --status to see current IP vs DNS IPIPv6 not working
apertodns --my-ip --json to check if IPv6 is detectedPermission denied on Linux
sudo npm install -g apertodnsDaemon mode exits unexpectedly
/var/log/apertodns.log if using cron# Show all commands
apertodns --help
# Check current status
apertodns --status
# Verify authentication
apertodns --verify
# Quick status check
apertodns --status
# Test DNS propagation
apertodns --test myserver.apertodns.com
# Create domain and get token
apertodns --add-domain newserver.apertodns.com
# List domains as JSON
apertodns --domains --json
# Use API key for automation
APERTODNS_API_KEY=apertodns_live_xxx... apertodns --domains --json
Need help?
MIT - Aperto Network
FAQs
ApertoDNS CLI - Dynamic DNS management from your terminal. Manage domains, tokens, API keys and DNS updates with style.
We found that apertodns demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.