{"id":51418820,"url":"https://github.com/appthrust/dns-api","last_synced_at":"2026-07-04T22:30:45.967Z","repository":{"id":368311267,"uuid":"1270841056","full_name":"appthrust/dns-api","owner":"appthrust","description":"Kubernetes DNS API controller for managing DNS zones and records with Route 53 and Cloudflare","archived":false,"fork":false,"pushed_at":"2026-06-30T01:29:37.000Z","size":668,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-30T03:17:32.658Z","etag":null,"topics":["cloudflare","controller","dns","go","headlamp","helm","kubernetes","route53"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appthrust.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-16T05:17:54.000Z","updated_at":"2026-06-30T01:29:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/appthrust/dns-api","commit_stats":null,"previous_names":["appthrust/dns-api"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/appthrust/dns-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fdns-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fdns-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fdns-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fdns-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appthrust","download_url":"https://codeload.github.com/appthrust/dns-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fdns-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35138074,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare","controller","dns","go","headlamp","helm","kubernetes","route53"],"created_at":"2026-07-04T22:30:45.870Z","updated_at":"2026-07-04T22:30:45.944Z","avatar_url":"https://github.com/appthrust.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dns-api\n\ndns-api lets Kubernetes users manage DNS zones and DNS records with Kubernetes resources.\n\nIt is useful when platform teams want to give application teams a safe DNS workflow without giving them direct access to AWS Route 53 or Cloudflare. Platform teams define which DNS providers, hosted zones, and record names are allowed. Application teams create `Zone` and `RecordSet` resources in their own namespaces.\n\ndns-api is currently focused on:\n\n- Amazon Route 53 public hosted zones\n- Cloudflare full zones\n- `A`, `AAAA`, `TXT`, `CNAME`, `MX`, `CAA`, and delegated `NS` records\n- Route 53 `ALIAS` records\n- A Headlamp Desktop plugin for browsing and editing dns-api resources\n\n## How It Works\n\ndns-api adds custom resources to your cluster:\n\n- `Provider` describes a DNS provider and its supported features.\n- `Route53Identity` and `CloudflareIdentity` tell the controller how to use provider credentials.\n- `ZoneClass` is a platform policy. It decides which namespaces may create zones and which provider settings they use.\n- `Zone` represents one DNS zone, such as `apps.example.com`.\n- `RecordSet` represents one DNS record set inside a `Zone`.\n\nThe controller watches those resources and reconciles the real DNS provider state.\n\n## Install\n\nThe controller is distributed as a container image and a Helm chart on GitHub Container Registry. Choose the released version you want to run:\n\n```sh\nVERSION=0.2.1\n\nhelm install dns-api oci://ghcr.io/appthrust/charts/dns-api \\\n  --namespace dns-api-system \\\n  --create-namespace \\\n  --version \"$VERSION\"\n```\n\nBy default, the chart installs CRDs, the controller, RBAC, webhook resources, cert-manager integration, and the built-in Route 53 and Cloudflare provider definitions.\n\nThe chart uses the matching controller image tag by default:\n\n```text\nghcr.io/appthrust/dns-api:\u003cversion\u003e\n```\n\nFor local development or source installs, use the chart in [deploy/charts/dns-api](./deploy/charts/dns-api).\n\n## First Resources\n\nA typical setup has two sides.\n\nPlatform team:\n\n```yaml\napiVersion: route53.dns.appthrust.io/v1alpha1\nkind: Route53Identity\nmetadata:\n  namespace: tenant-a-platform\n  name: production\nspec:\n  accountID: \"123456789012\"\n  region: ap-northeast-1\n  credentials:\n    runtime: {}\n---\napiVersion: dns.appthrust.io/v1alpha1\nkind: ZoneClass\nmetadata:\n  namespace: tenant-a-platform\n  name: route53-public\nspec:\n  provider:\n    name: route53.dns.appthrust.io\n    version: v1alpha1\n  controllerName: route53.dns.appthrust.io/controller\n  identityRef:\n    name: production\n  allowedZones:\n    namespaces:\n      from: Selector\n      selector:\n        matchLabels:\n          appthrust.io/tenant: tenant-a\n  parameters:\n    zoneCreationPolicy: Create\n    zoneDeletionPolicy: Retain\n```\n\nApplication team:\n\n```yaml\napiVersion: dns.appthrust.io/v1alpha1\nkind: Zone\nmetadata:\n  namespace: tenant-a-app\n  name: apps-example-com\nspec:\n  domainName: apps.example.com\n  provider:\n    name: route53.dns.appthrust.io\n    version: v1alpha1\n  zoneClassRef:\n    namespace: tenant-a-platform\n    name: route53-public\n---\napiVersion: dns.appthrust.io/v1alpha1\nkind: RecordSet\nmetadata:\n  namespace: tenant-a-app\n  name: www\nspec:\n  zoneRef:\n    name: apps-example-com\n  provider:\n    name: route53.dns.appthrust.io\n    version: v1alpha1\n  type: A\n  name: www\n  ttl: 300\n  a:\n    addresses:\n      - 192.0.2.10\n```\n\nMore examples are in [app/operator/config/samples](./app/operator/config/samples).\n\n## Headlamp Plugin\n\n`headlamp-plugin-dns-api` adds dns-api screens to Headlamp Desktop.\n\nThe plugin uses the Kubernetes cluster selected in Headlamp. It does not call AWS, Route 53, Cloudflare, or other DNS provider APIs directly. It also does not store provider credentials in Headlamp Desktop.\n\nInstall the dns-api controller and CRDs in the target cluster before using the plugin. Installing the Headlamp plugin does not install the controller.\n\nPlugin source lives in [app/headlamp-plugin](./app/headlamp-plugin). Shared UI code lives in [pkg/ts/ui](./pkg/ts/ui).\n\n## Repository Layout\n\n```text\napp/operator          Kubernetes controller, manifests, and e2e tests\napp/headlamp-plugin   Headlamp Desktop plugin\napp/ui-mockup         UI mockup app\ninternal/go           Go code used only inside this repository\npkg/go/api            Go API packages for dns-api custom resources\npkg/ts/ui             TypeScript UI package shared by the plugin and mockup\ndeploy/charts         Helm chart\ndeploy/artifacthub    Artifact Hub metadata\ndocs/design           Design documents\n```\n\n## Development\n\nDevelopment tools are managed by devbox. The main commands are in [Taskfile.yml](./Taskfile.yml).\n\n```sh\ntask up\ntask test\ntask ci\n```\n\n`task up` creates or updates the local kind cluster and runs Tilt. The controller and webhook run inside the cluster.\n\n## Design Documents\n\nCurrent design notes are in [docs/design](./docs/design). Start with:\n\n- [Overview](./docs/design/overview.md)\n- [Core API](./docs/design/core-api.md)\n- [Route 53 provider](./docs/design/route53-provider.md)\n- [Cloudflare provider](./docs/design/cloudflare-provider.md)\n- [Headlamp plugin](./docs/design/headlamp-plugin.md)\n\n## License\n\ndns-api is licensed under Apache-2.0. See [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappthrust%2Fdns-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappthrust%2Fdns-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappthrust%2Fdns-api/lists"}