{"id":15722891,"url":"https://github.com/soerenschneider/dyndns","last_synced_at":"2026-01-20T05:08:06.913Z","repository":{"id":37898193,"uuid":"373576690","full_name":"soerenschneider/dyndns","owner":"soerenschneider","description":"Automatically updates DNS records for internet connections that don't have a static IP","archived":false,"fork":false,"pushed_at":"2026-01-13T05:09:41.000Z","size":789,"stargazers_count":1,"open_issues_count":21,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-13T08:35:13.797Z","etag":null,"topics":["aws","dynamic-credentials","dynamic-dns","dyndns","dyndns-client","dyndns-server","ed25519","golang","lambda","mqtt","route53","self-hosted","sqs","vault-client"],"latest_commit_sha":null,"homepage":"","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/soerenschneider.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","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":"2021-06-03T16:39:45.000Z","updated_at":"2025-12-29T05:09:25.000Z","dependencies_parsed_at":"2023-10-16T11:10:31.692Z","dependency_job_id":"acf7779f-96ca-4bdf-bdf0-76286736510f","html_url":"https://github.com/soerenschneider/dyndns","commit_stats":null,"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"purl":"pkg:github/soerenschneider/dyndns","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soerenschneider%2Fdyndns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soerenschneider%2Fdyndns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soerenschneider%2Fdyndns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soerenschneider%2Fdyndns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soerenschneider","download_url":"https://codeload.github.com/soerenschneider/dyndns/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soerenschneider%2Fdyndns/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28596087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T02:08:49.799Z","status":"ssl_error","status_checked_at":"2026-01-20T02:08:44.148Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["aws","dynamic-credentials","dynamic-dns","dyndns","dyndns-client","dyndns-server","ed25519","golang","lambda","mqtt","route53","self-hosted","sqs","vault-client"],"created_at":"2024-10-03T22:09:37.347Z","updated_at":"2026-01-20T05:08:06.895Z","avatar_url":"https://github.com/soerenschneider.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dyndns\n[![Go Report Card](https://goreportcard.com/badge/github.com/soerenschneider/dyndns)](https://goreportcard.com/report/github.com/soerenschneider/dyndns)\n![test-workflow](https://github.com/soerenschneider/dyndns/actions/workflows/test.yaml/badge.svg)\n![release-workflow](https://github.com/soerenschneider/dyndns/actions/workflows/release-container.yaml/badge.svg)\n![golangci-lint-workflow](https://github.com/soerenschneider/dyndns/actions/workflows/golangci-lint.yaml/badge.svg)\n\nAutomatically updates DNS records for hosts that don't have a static IP\n\n## Features\n\n📣 Dynamically updates DNS records to match their public IP address\u003cbr/\u003e\n🏰 Built-in resiliency for different failure scenarios\u003cbr/\u003e\n🚢 Server component supports running on AWS Lambda\u003cbr/\u003e\n🚀 Dispatch update requests via [AWS SQS](https://aws.amazon.com/sqs/), MQTT and/or HTTP API calls\u003cbr/\u003e\n🚏 Detect public IP address by network interface's status or by calling HTTP APIs\u003cbr/\u003e\n🎭 Runs in client / server mode to limit blast-radius of leaked credentials\u003cbr/\u003e\n🔧 Customizable list of HTTP APIs to detect IP updates\u003cbr/\u003e\n❤️ Specify HTTP APIs that detect IP updates which are preferred over other API endpoints\u003cbr/\u003e\n🔐 Messages are cryptographically signed, therefore public MQTT brokers can be used\u003cbr/\u003e\n🔑 Can use either dynamic credentials using Hashicorp Vault or static credentials\u003cbr/\u003e\n🔭 Observability through Prometheus metrics\n\n## Why would I need it?\n\n📌 You don't have a static public IP address but want to connect to your home network\u003cbr/\u003e\n🤹 Ideally, you have multiple endpoints you want to assign DNS records to\u003cbr/\u003e\n\n## Installation\n\n### AWS Lambda\nRun the `lambda-server` Makefile target to build an archive for the `provided.al2` Lambda runtime and the `arm64` architecture. Either create a Lambda function using AWS cli / Console or run the Terraform code to create an API Gateway instance and Lambda function.\n\n```shell\n$ make lambda-server # build the server component\n$ terraform -chdir=deployment/terraform/envs/dev apply # this command will deploy a dyndns-server as a Lambda function which is reachable via a new API Gateway instance\n$ terraform -chdir=deployment/terraform/envs/dev output -raw gateway-url # display the url of the API endpoint\n```\n\n### Docker / Podman\n```shell\n$ docker pull ghcr.io/soerenschneider/dyndns-server:main\n$ docker pull ghcr.io/soerenschneider/dyndns-client:main\n```\n\n### Binaries\nHead over to the [prebuilt binaries](https://github.com/soerenschneider/dyndns/releases) and download the correct binary for your system.\n\n### From Source\nAs a prerequesite, you need to have [Golang SDK](https://go.dev/dl/) installed. After that, you can install dyndns from source by invoking:\n```text\n$ go install github.com/soerenschneider/dyndns@latest\n```\n\n## Configuration\n\nHead over to the [configuration section](docs/configuration.md) to see more details.\n\n\n## Getting Started\n\nFirst, you need to build a keypair. This is easily done\n```bash\n$ docker run ghcr.io/soerenschneider/dyndns-client -gen-keypair\n{\"public_key\":\"IyXH8z/+vRsIUEAldlGgKKFcVHoll8w2tzC6o9717m8=\",\"private_key\":\"h7jrhYupN0LVPnVWqFun6sN+bWNr0B0mh7/mgRaKnhsjJcfzP/69GwhQQCV2UaAooVxUeiWXzDa3MLqj3vXubw==\"}\n```\n\n# Architecture\n\n## Client Internals\nClient states and client failure scenarios and their remediation is found [here](docs/client.md).\n\n## Message format\n\nData sent over the wire is expected to have the following format, encoded as a JSON message.\n\n### `UpdateRecordRequest` reference\n| Field Name  | Description                                 | JSON Key      | Data Type   | Optional |\n|-------------|---------------------------------------------|---------------|-------------|----------|\n| `PublicIp`  | The resolved IP address.                    | `\"public_ip\"` | `DnsRecord` | No       |\n| `Signature` | The signature associated with the envelope. | `\"signature\"` | String      | No       |\n\n### `DnsRecord` reference\n| Field Name  | Description                                           | JSON Key      | Data Type | Optional |\n|-------------|-------------------------------------------------------|---------------|-----------|----------|\n| `IpV4`      | The IPv4 address (optional).                          | `\"ipv4\"`      | String    | Yes      |\n| `IpV6`      | The IPv6 address (optional).                          | `\"ipv6\"`      | String    | Yes      |\n| `Host`      | The hostname associated with the resolved IP address. | `\"host\"`      | String    | No       |\n| `Timestamp` | The timestamp when the resolution occurred.           | `\"timestamp\"` | Time      | No       |\n\n\n## Observability\nHead over to the [metrics](docs/metrics.md) to see more details.\n\n## Changelog\nThe changelog can be found [here](CHANGELOG.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoerenschneider%2Fdyndns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoerenschneider%2Fdyndns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoerenschneider%2Fdyndns/lists"}