This release is a pre-release and may not be stable for production use.
Katapult provider for octoDNS
An octoDNS provider that targets Katapult, Krystal's Cloud platform, through its Core API v1.
Disclaimer: octodns-katapult is an independent project. It is not made, endorsed or supported by Krystal.
Report problems with this provider here, not to Krystal's support team.
Installation
Command line
pip install octodns-katapult
requirements.txt/setup.py
Pinning specific versions or SHAs is recommended to avoid unplanned upgrades.
Versions
octodns==1.22.0
octodns-katapult==0.0.1
SHAs
-e git+https://git@github.com/octodns/octodns.git@9da19749e28f68407a1c246dfdf65663cdc1c422#egg=octodns
-e git+https://git@github.com/DonQuinleone/octodns-katapult.git@ec9661f8b335241ae4746eea467a8509205e6a30#egg=octodns_katapult
Configuration
First, obtain an API token.
Log in at https://cloud.krystal.io, navigate to Access > API Tokens and create a new API token with the Core: Manage DNS zones/records scope, or Core: Read-only access to DNS zones/records where Katapult is only used as a source.
Then, establish your Organization's sub-domain.
This is the value after /o/ in the URL. For example, it would be acme where the URL is https://cloud.krystal.io/o/acme. It's needed only to list zones and to create zones that don't exist yet.
Enter these values into your configuration file, preferably as environment variables:
providers:
katapult:
class: octodns_katapult.KatapultProvider
token: env/KATAPULT_API_TOKEN
organization: env/KATAPULT_ORG
Or directly, keeping the file out of version control:
providers:
katapult:
class: octodns_katapult.KatapultProvider
token: <your API token>
organization: <your Organization's sub-domain>
Support Information
Records and features
- ✅ = Supported
- ⚠️ = Supported with limits (see the notes)
- ❌ = Not supported
Record types
| Record type | Supported | Notes |
|---|---|---|
| A | ✅ | |
| AAAA | ✅ | |
| ALIAS | ✅ | At the apex only |
| CAA | ✅ | |
| CNAME | ✅ | |
| DNAME | ❌ | |
| DS | ❌ | |
| HTTPS | ❌ | |
| LOC | ❌ | |
| MX | ⚠️ | Null MX (RFC 7505) records are not supported by Katapult |
| NAPTR | ❌ | |
| NS | ✅ | Including at the zone apex |
| OPENPGPKEY | ❌ | |
| PTR | ⚠️ | One value per name only |
| SPF | ❌ | Use TXT records instead |
| SRV | ⚠️ | Records with the root target . or port 0 (RFC 2782) are not supported by Katapult |
| SSHFP | ✅ | |
| SVCB | ❌ | |
| TLSA | ❌ | |
| TXT | ✅ | |
| URI | ❌ | |
| URLFWD | ❌ | |
| KatapultProvider/HTTPRedirect | ✅ | See Katapult record types below |
| KatapultProvider/VirtualMachine | ✅ | See Katapult record types below |
| SOA | ❌ | Managed by Katapult and skipped silently |
Features
| Feature | Supported | Notes |
|---|---|---|
| Root NS records | ✅ | |
| DNSSEC | ❌ | Not offered by Katapult |
| Dynamic and geo records | ❌ | Fall back to their default values |
| Listing zones | ✅ | |
| Creating missing zones | ✅ |
Katapult's minimum supported TTL is 60.
Records marked ❌, outside a ⚠️ row's limits, or with a TTL under 60 fail the plan before anything reaches Katapult. With strict_supports: false, they're adjusted or dropped with a warning instead.
Katapult record types
- HTTPRedirect
Takes anhttp_statuscode (301,302,307or308) and a singleurl(httporhttps), and redirects visitors from the record's name to that URL.
go:
type: KatapultProvider/HTTPRedirect
value:
http_status: 301
url: https://example.com/
- VirtualMachine
Takes one or more virtual machine IDs and answers with their IP addresses.
app:
type: KatapultProvider/VirtualMachine
values:
- vm_abcdEfg1h23IjK4l
- vm_mnopQrs5t67UvW8x
Zone verification
Katapult serves a zone only once it's verified, by delegating the domain to Katapult's nameservers or by adding the katapult-dns … TXT record Katapult shows. If octoDNS also manages the apex TXT records at your current DNS provider, add that record to your config, or the next sync deletes it.
Contributing
Contributions are welcome as pull requests against master. Report security vulnerabilities privately, as SECURITY.md describes, rather than in an issue.
Development
./script/bootstrap
This creates a virtual environment in env/, installs the pinned runtime and development requirements, and installs a pre-commit hook that runs the same checks as CI. The scripts follow the Scripts to Rule Them All pattern:
| Script | What it does |
|---|---|
./script/test |
Runs the tests |
./script/coverage |
Runs the tests with branch coverage; anything under 100% fails |
./script/lint |
Checks the code with pyflakes |
./script/format |
Formats the code with isort and black |
./script/cibuild |
Runs everything CI runs |
The tests never call the Katapult API; responses are fixtures in tests/fixtures, shaped after the Core API's OpenAPI schema. Check behaviour against the real API with a zone you can afford to break.
Every pull request needs a changelog entry, which CI checks. Use none for changes that don't belong in the release notes:
./script/changelog create -t <none|patch|minor|major> "What changed, as a release note"
Releasing
Versions follow SemVer, with pre-releases written 1.0.0-beta.1 and 1.0.0-rc.1. The version lives in octodns_katapult/__init__.py and the tag is v plus that version. PyPI shows pre-releases in Python's spelling (1.0.0rc1), and pip installs them only when asked with --pre.
-
Bump the version and write the changelog from the pending entries:
./script/changelog bump --version 1.0.0-rc.1 --make-changes -
Open a pull request with the result, and merge it once CI passes.
-
From an up-to-date
master, run./script/release. It refuses a dirty tree or aHEADthat isn'torigin/master, then signs and pushes the tag.
The tag starts the release workflow, which waits for approval on the pypi environment before publishing:
| Step | Pre-release | Stable |
|---|---|---|
Checks the tag is on master and matches the version, then lints, tests and builds |
✅ | ✅ |
| Publishes to PyPI through trusted publishing | ✅ | ✅ |
Pushes ghcr.io/donquinleone/octodns-katapult:<version> for amd64 and arm64 |
✅ | ✅ |
Moves the image's latest tag |
❌ | ✅ |
| Creates a GitHub release with the changelog section and built files | ✅ | ✅ |
| Opens a pull request updating the pins under Installation | ❌ | ✅ |
Workflow-opened pull requests don't start CI on their own; close and reopen them to run the checks.
The image runs octodns-sync with /config as its working directory:
docker run --rm -v "$PWD:/config" -e KATAPULT_API_TOKEN ghcr.io/donquinleone/octodns-katapult:latest --config-file=config.yaml
Metadata
Release files for octodns-katapult 1.0.0rc1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| octodns_katapult-1.0.0rc1.tar.gz | 25.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| octodns_katapult-1.0.0rc1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.5 kB
Release files / octodns_katapult-1.0.0rc1.tar.gz
| Download URL | octodns_katapult-1.0.0rc1.tar.gz |
|---|---|
| Size | 25.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
db508a9f8b04c07d76b6d359aa2c076689861e26eeaf6e14ac16e1b26e1e119c
|
|
BLAKE2b-256 checksum How to use checksums |
7d0c91abd2b65de063c725bfe684f568c4c66c682fdfaa08ae489d338a3ac825
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.
Transparency logRelease files / octodns_katapult-1.0.0rc1-py3-none-any.whl
| Download URL | octodns_katapult-1.0.0rc1-py3-none-any.whl |
|---|---|
| Size | 13.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b9153b5568ff270f141fa6a5fa5d1c7f2652f9b284de5ce57e1c5e5c8c910d3a
|
|
BLAKE2b-256 checksum How to use checksums |
073faa1c87b5d5fd21d3c7190facf39ff06830584842e63aaac2a399c8c8e4cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.
Transparency log