doruk.ch
· 5 min read

i built a CLI because infomaniak didn't have one

I wanted to manage my domains from the terminal. Infomaniak didn't have a CLI. So I built one — DNS management, terraform-style sync, security audits, propagation checking, and more. Open source on PyPI.

opensourceclipythondevtools

infomaniak CLI

it's 11pm. i'm SSHed into a server. i need to update a DNS record.

i open my phone browser. navigate to infomaniak's dashboard. log in. wait for 2FA. click through three menus. update one TXT record. close the browser.

the whole thing took 4 minutes for what should have been a 10-second command.

the problem

infomaniak is a great swiss cloud provider. i use them for domains, hosting, email, and kDrive. swiss data sovereignty, competitive pricing, good infrastructure. but they didn't have a CLI.

in 2026. a cloud provider. no CLI.

if you manage multiple domains across multiple projects (and i do — between side projects, client work, and homelab experiments), DNS management becomes a real workflow bottleneck. context switching from terminal to browser and back, every single time.

so i built one

pipx install infomaniak

that's it. infomaniak-cli wraps the Infomaniak API and gives you everything from the terminal.

first run:

infomaniak setup

the setup wizard opens the token page, validates your API key, checks which scopes are enabled, and saves the config. you never need the browser again.

what started as DNS management became... more

it started with basic DNS CRUD. but once the foundation was there, i kept adding features that i actually needed:

DNS management

infomaniak dns domains                                    # list all domains
infomaniak dns records doruk.ch                           # list DNS records
infomaniak dns records doruk.ch --type CNAME              # filter by type
infomaniak dns add doruk.ch A blog 93.184.216.34          # create a record
infomaniak dns update doruk.ch 12345 --target 1.2.3.4     # update a record
infomaniak dns delete doruk.ch 12345                      # delete with confirmation
infomaniak dns search "vercel"                            # search across ALL domains

that last one — dns search — is the feature i use most. when you have 10+ domains and you need to find which ones point to a specific target, searching across all of them in one command is a lifesaver.

terraform-style DNS sync

this is probably the most powerful feature. define your desired DNS state in a JSON file, then sync:

infomaniak dns sync doruk.ch desired.json --dry-run
DNS sync plan for doruk.ch

+ 1 to create  - 2 to delete  8 unchanged

Create:
  + A  new-app → 198.51.100.1

Delete:
  - CNAME  old-cdn → old.cdn.example.net
  - TXT  _old-verify → verify=abc123

Dry run — no changes applied.

declarative DNS management. define what you want, see the diff, apply it. like terraform but for DNS records. you can also export, import, diff, clone, and backup DNS across domains.

security auditing

infomaniak dns audit
DNS Audit
────────
Scanning 10 domain(s)...

! No SPF record found — Email spoofing protection
  → legacy-site.com

! No DMARC record found — Email authentication policy
  → legacy-site.com
  → staging.org

Summary: 10 domains scanned
  8 clean
  2 with issues (3 total findings)

scans all your domains for missing SPF, DMARC, and DKIM records. because email security is one of those things everyone forgets until their domain gets spoofed.

propagation checking

infomaniak dns propagation doruk.ch
DNS Propagation: A doruk.ch

Resolver    IP              Result
──────────  ──────────────  ───────────
Google      8.8.8.8         76.76.21.21
Cloudflare  1.1.1.1         76.76.21.21
Quad9       9.9.9.9         76.76.21.21
OpenDNS     208.67.222.222  76.76.21.21

All resolvers agree. DNS is fully propagated.

no more "is DNS propagated yet?" anxiety. check against Google, Cloudflare, Quad9, and OpenDNS in one command.

domain monitoring

infomaniak domains --warn 60

lists all your domains with expiry dates and warns you if any are expiring within your threshold. because letting a domain expire is the kind of mistake you only make once.

beyond DNS

the CLI also covers:

  • infomaniak account — account overview and product summary
  • infomaniak products — list all products, filter by service type
  • infomaniak mail list — list mail hostings and mailboxes
  • infomaniak hosting list — list web hostings
  • infomaniak drive list — list kDrive instances
  • infomaniak status — service status overview
  • --json flag on any read command for machine-readable output

what i learned

building CLIs is underrated as a learning exercise. you deal with:

  • API design and error handling across dozens of endpoints
  • UX in a constrained medium (no GUI, just text and tables)
  • packaging and distribution (PyPI, CI/CD, versioning)
  • scope creep that's actually useful (every feature exists because i needed it)

the biggest lesson: start with the simplest thing that's useful, then let real usage drive what gets built next. the DNS sync feature didn't exist in v1. it exists now because i got tired of manually reconciling records across environments.

try it

pipx install infomaniak

MIT licensed, open source, on PyPI.

github.com/peaktwilight/infomaniak-cli


build the tools you wish existed. if something annoys you three times, automate it. if the automation is useful to others, open-source it.

On this page