Personally I'd just whip up a quick shell script or use something like Python, it's probably like 20 lines of code to make the necessary API request and you have much more freedom than some fixed software and fixed features.
The main required feature that complicates things a bit is rate limiting since a lot of providers do not appreciate getting lots of update requests to the same IP in a short period of time if you e.g. reboot repeatedly but also will eventually delete names that are never updated.
Actually, right after posting this, I got it to work. It looks like ddclient queries checkip.dyndns.org for IP, and by default using SSL/443. HTTPS isn't working on checkip.dyndns.org at the moment, so queries were failing. I disabled SSL and it started to work.
I'm using Google Domains. Good suggestion on the API approach though, I'll consider that for next time it breaks on me.
I'm running a few services (publicly accessible media server, a matrix server, etc.). I'm also running some internal services which I VPN for.
For VPN use cases, I've considered using Tailscale a bunch of times, and still think about giving it a shot. I've always shied away due to the lack of self-hosted-ness, and because the throughput isn't great. I know that the throughput issue isn't really an issue since my requirements are low - but still.
For the public services -- could Cloudflare help with the dynamic IP issue?
Tailscale isn't really that slow once you connect it creates direct connections between nodes. There is some latency when you first connect like 100ms before derp lets the nodes directly connect. I get full link level throughput between oci nodes and my house/cellphone. I even went so far as disabling all external ports on my cloud instances.