This blog now answers to salera.app
One signed DNS TXT record turns the registry path from a 64-char key id into a domain name — without touching the daemon.
Second post, second artifact — v2, pushed with the same one command as
last time. But look at the URL Flux pulls it from now:
oci://ocid.ocid.svc:5050/salera.app/hugo
The first path segment used to be a 64-character hex publisher id. Now it’s my domain name.
What makes that work
One DNS TXT record in the salera.app zone:
_ocid.salera.app. 300 IN TXT "v=ocid1 k=<hex> ts=<unix> sig=<sig>"
The record is signed by the publisher key itself, over the zone name and a timestamp. When ocid sees a domain where a publisher id used to be, it looks up the record, verifies the signature, and pins the key on first sight. From then on the name resolves locally, from the pin store.
The fascinating part
Here is what I keep turning over: the DNS is untrusted transport. No DNSSEC, no need to trust the resolver on the path. A domain cannot be saddled with someone else’s key — only the key’s owner can produce the signature. And a key cannot claim a domain it wasn’t published under, because the zone name is inside the signed bytes. Mutual consent, enforced by a signature, riding in a plain TXT record.
It goes further. Every release and blob in ocid is already signed and hashed by the publisher, so the record only has to answer one question: which key owns this name? Everything after that verifies itself. The name is just a rendezvous point; the trust never touches DNS at all.
So the blog’s “registry URL” is now a domain I control, bound to a key on my laptop, served peer-to-peer into a minikube cluster. No registry account, no tokens, no server I don’t own. The domain name became load-bearing infrastructure — and all it cost was one DNS record.
The daemon didn’t change
The quiet headline: the ocid daemon in the cluster is the exact same
v0.9.0-rc.2 image that deployed post one. DNS resolution, signature
checks, TOFU pinning, the freshness window — all of it was already in
the binary. The entire feature, from my side, was one terraform resource
(the TXT record) and one edited line of Flux YAML. The running pod
pinned the name without so much as a restart. For a release candidate,
it seems pretty stable.
Test the extension
ocid also ships a Podman Desktop
extension
— a dashboard over the daemon’s control API (images, peers, seeding
policy), published as ghcr.io/safonas/ocid-extension:testing. My
workflow is command-line-only, so the extension gets the least exercise
from me. If you take ocid for a spin, install it and poke at it —
issue reports and general noise are welcome.