# ol.protocol53

> One Clojure API for managing DNS records across providers.

![doc](https://img.shields.io/badge/doc-outskirtslabs-orange.svg)
![status: experimental](https://img.shields.io/badge/status-experimental-red.svg)
![alt=nixbot](https://ci.outskirtslabs.com/repos/github/outskirtslabs/protocol53/badge.svg)

`ol.protocol53` gives Clojure applications one provider-independent API for querying and changing DNS records.
Applications can switch DNS services without changing their record-management code.

The shared API lives in `api/`.
Provider integrations live in `providers/` and translate the common operations into each service’s API.
Protocol53 supports:

* retrieving records from a zone
* adding records
* creating or replacing whole RRsets
* removing matching records
* listing available zones

Provider capabilities and limitations vary, but applications use the same core
abstractions across every supported integration.

Project status: **[Experimental](https://docs.outskirtslabs.com/open-source-vital-signs#experimental)**.

## Available Providers

* [Cloudflare](https://docs.outskirtslabs.com/ol.protocol53/next/providers/cloudflare)
* [deSEC](https://docs.outskirtslabs.com/ol.protocol53/next/providers/desec)
* [Porkbun](https://docs.outskirtslabs.com/ol.protocol53/next/providers/porkbun)

## Installation

Until the first release, use the API’s Git coordinate:

```clojure
{:deps {com.outskirtslabs/protocol53
        {:git/url "https://github.com/outskirtslabs/protocol53.git"
         :git/sha "4a0ad834256d7e1e1a6a95936ea5e7ca14f13988"
         :deps/root "api"}}}
```

## Quick Start

Create a provider, then pass it to the common operations with a time budget:

```clojure
(require '[ol.protocol53 :as protocol53]
         '[ol.protocol53.cloudflare :as cloudflare])
(import '[java.time Duration])

(def dns
  (cloudflare/provider {:api-token (System/getenv "CLOUDFLARE_API_TOKEN")}))

(protocol53/append-records!
 dns
 "example.com"
 [{:name "_acme-challenge"
   :type "TXT"
   :ttl  60
   :data "challenge-token"}]
 {:timeout (Duration/ofSeconds 10)})
```

Operations return either `:ol.protocol53/result` or `:ol.protocol53/error`;
expected provider failures do not throw.

## Documentation

* [Docs](https://docs.outskirtslabs.com/ol.protocol53/next/)
* [API Reference](https://docs.outskirtslabs.com/ol.protocol53/next/api)
* [Support via GitHub Issues](https://github.com/outskirtslabs/protocol53/issues)

## Scope

`ol.protocol53` targets common DNS record operations rather than every
provider-specific feature. DNS record types and provider APIs vary too much for
a universal abstraction, so Protocol53 focuses on the operations applications
use across providers.

## Related Projects

[`ol.clave`](https://docs.outskirtslabs.com/ol.clave/next/) is Outskirts Labs'
ACME client for automated HTTPS certificate management. ACME DNS-01 validation
needs temporary TXT records, which Protocol53 can manage across its supported
DNS providers.
A direct Clave adapter remains future work.

* [Clave documentation](https://docs.outskirtslabs.com/ol.clave/next/)
* [Clave source code](https://github.com/outskirtslabs/clave)

## License

Copyright (C) 2026 Casey Link mailto:casey@outskirtslabs.com[casey@outskirtslabs.com]

Distributed under the [MIT](https://spdx.org/licenses/MIT.html) license.
