Breaking changes
This release contains breaking changes to the public API, the CLI, and configuration handling.
1. PorkbunDDNS constructor signature
- Before:
PorkbunDDNS(config, domain, ipv4=..., ipv6=...) - After:
PorkbunDDNS(credentials, retry, domain, public_ips=..., ipv4=..., ipv6=...)
The single monolithic Config is split into AppConfig with three sub-configs:
Credentials—apikey,secretapikey,endpointRetryPolicy—retry_count,retry_delayWebhookConfig—webhook_url,webhook_template,webhook_template_file
Load a full config object via AppConfig/extract_config, and pass app.credentials and app.retry to the constructor.
2. --fritzbox / -f CLI flag removed
Fritz!Box IP discovery is no longer core. It lives in a new fritzbox-ips console-script sidecar.
Migrate:
# before
porkbun-ddns domain.com --fritzbox fritz.box
# after
porkbun-ddns domain.com --public-ips "$(fritzbox-ips fritz.box)"3. Credentials.endpoint default
Credentials.endpoint now defaults to the real Porkbun endpoint (https://api.porkbun.com/api/json/v3) instead of raising when unset.
New features
PublicIPResolver— public IPv4/IPv6 discovery via public HTTP endpointsfritzbox-ipssidecar console-script for Fritz!Box device retrieval- Dedicated
PorkbunAPIClientwith typed DNS endpoints - Webhook configuration extracted into
WebhookConfig(Jinja templating)
Bug fixes
- Fixed dual-IPv4 (Dual-Stack) replacement intents being duplicated
- Fixed an IPv6-only Fritz!Box crash
- Restored DEBUG logging in the
update_recordsdriver
Internal refactors
Config→AppConfigwithCredentials/RetryPolicy/WebhookConfig- Reconciliation logic extracted into a pure
reconcilefunction returningEnsureintents - Migration of tests away from the private
_apito the client seam - Docs updated (README, AGENTS.md, ADR-0003)