{"id":13510212,"url":"https://github.com/serverless-dns/serverless-dns","last_synced_at":"2025-05-13T22:04:05.531Z","repository":{"id":37055552,"uuid":"346385174","full_name":"serverless-dns/serverless-dns","owner":"serverless-dns","description":"The RethinkDNS resolver that deploys to Cloudflare Workers, Deno Deploy, Fastly, and Fly.io","archived":false,"fork":false,"pushed_at":"2024-11-12T17:20:37.000Z","size":1749,"stargazers_count":2154,"open_issues_count":26,"forks_count":1962,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-04-10T00:01:59.442Z","etag":null,"topics":["adblock","cloudflare","cloudflare-workers","deno","dns-over-https","dns-over-tls","doh","fastly","fastly-compute-at-edge","flyio","nodejs","pihole","serverless","workers"],"latest_commit_sha":null,"homepage":"https://rethinkdns.com/configure","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/serverless-dns.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["serverless-dns"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://svc.rethinkdns.com/r/sponsor"]}},"created_at":"2021-03-10T14:35:30.000Z","updated_at":"2025-04-09T23:39:51.000Z","dependencies_parsed_at":"2024-09-29T18:41:05.317Z","dependency_job_id":"baee6a89-9a8d-4727-b43c-691440f612db","html_url":"https://github.com/serverless-dns/serverless-dns","commit_stats":{"total_commits":1071,"total_committers":19,"mean_commits":56.36842105263158,"dds":"0.39309056956115784","last_synced_commit":"76eb69f1955bad3b9c1448698f3932e069fe595a"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-dns%2Fserverless-dns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-dns%2Fserverless-dns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-dns%2Fserverless-dns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-dns%2Fserverless-dns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/serverless-dns","download_url":"https://codeload.github.com/serverless-dns/serverless-dns/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251338192,"owners_count":21573516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["adblock","cloudflare","cloudflare-workers","deno","dns-over-https","dns-over-tls","doh","fastly","fastly-compute-at-edge","flyio","nodejs","pihole","serverless","workers"],"created_at":"2024-08-01T02:01:29.215Z","updated_at":"2025-05-13T22:04:05.503Z","avatar_url":"https://github.com/serverless-dns.png","language":"JavaScript","readme":"#### It's a bird, it's a plane, it's... a self-hosted, pi-hole esque, DNS resolver\n\n_serverless-dns_ is a Pi-Hole esque [content-blocking](https://github.com/serverless-dns/blocklists), serverless, stub DNS-over-HTTPS (DoH) and DNS-over-TLS (DoT) resolver. Runs out-of-the-box on [Cloudflare Workers](https://workers.dev), [Deno Deploy](https://deno.com/deploy), [Fastly Compute@Edge](https://www.fastly.com/products/edge-compute), and [Fly.io](https://fly.io/). Free tiers of all these services should be enough to cover 10 to 20 devices worth of DNS traffic per month.\n\n### The RethinkDNS resolver\n\nRethinkDNS runs `serverless-dns` in production at these endpoints:\n\n| Cloud platform     | Server locations | Protocol    | Domain                    | Usage                                   |\n|--------------------|------------------|-------------|---------------------------|-----------------------------------------|\n| ⛅ Cloudflare Workers | 280+ ([ping](https://check-host.net/check-ping?host=https://sky.rethinkdns.com))           | DoH         | `sky.rethinkdns.com`    | [configure](https://rethinkdns.com/configure?p=doh)  |\n| 🦕 Deno Deploy        | 30+ ([ping](https://check-host.net/check-ping?host=https://deno.dev))                      | DoH         | _private beta_          |                                         |\n| ⏱️ Fastly Compute@Edge   | 80+ ([ping](https://check-host.net/check-ping?host=https://serverless-dns.edgecompute.app))| DoH         | _private beta_          |                                      |\n| 🪂 Fly.io             | 30+ ([ping](https://check-host.net/check-ping?host=https://max.rethinkdns.com))           | DoH and DoT | `max.rethinkdns.com`      | [configure](https://rethinkdns.com/configure?p=dot)  |\n\nServer-side processing takes from 0 milliseconds (ms) to 2ms (median), and end-to-end latency (varies across regions and networks) is between 10ms to 30ms (median).\n\n[\u003cimg src=\"https://raw.githubusercontent.com/fossunited/Branding/main/asset/FOSS%20United%20Logo/Extra/Extra%20Logo%20white%20on%20black.jpg\"\n     alt=\"FOSS United\"\n     height=\"40\"\u003e](https://fossunited.org/grants)\u0026emsp;\n\nThe *Rethink DNS* resolver on Fly.io is sponsored by [FOSS United](https://fossunited.org/grants).\n\n### Self-host\n\nCloudflare Workers is the easiest platform to setup `serverless-dns`:\n\n[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/serverless-dns/serverless-dns)\n\n[![Deploy to Fastly](https://deploy.edgecompute.app/button)](https://deploy.edgecompute.app/deploy)\n\nFor step-by-step instructions, refer:\n\n| Platform       | Difficulty | Runtime                                | Doc                                                                                     |\n| ---------------| ---------- | -------------------------------------- | --------------------------------------------------------------------------------------- |\n| ⛅ Cloudflare  | Easy       | [v8](https://v8.dev) _Isolates_        | [Hosting on Cloudflare Workers](https://docs.rethinkdns.com/dns/open-source#cloudflare) |\n| 🦕 Deno.com    | Moderate   | [Deno](https://deno.land) _Isolates_   | [Hosting on Deno.com](https://docs.rethinkdns.com/dns/open-source#deno-deploy)          |\n| ⏱️ Fastly Compute@Edge | Easy  | [Fastly JS](https://js-compute-reference-docs.edgecompute.app/)| [Hosting on Fastly Compute@Edge](https://docs.rethinkdns.com/dns/open-source#fastly) |\n| 🪂 Fly.io      | Hard       | [Node](https://nodejs.org) _MicroVM_   | [Hosting on Fly.io](https://docs.rethinkdns.com/dns/open-source#fly-io)                 |\n\nTo setup blocklists, visit `https://\u003cmy-domain\u003e.tld/configure` from your browser (it should load something similar to [RethinkDNS' _configure_ page](https://rethinkdns.com/configure)).\n\nFor help or assistance, feel free to [open an issue](https://github.com/celzero/docs/issues) or [submit a patch](https://github.com/celzero/docs).\n\n---\n\n### Development\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/serverless-dns/serverless-dns/badge)](https://securityscorecards.dev/viewer/?uri=github.com/serverless-dns/serverless-dns)\n\n#### Setup\n\nCode:\n```bash\n# navigate to work dir\ncd /my/work/dir\n\n# clone this repository\ngit clone https://github.com/serverless-dns/serverless-dns.git\n\n# navigate to serverless-dns\ncd ./serverless-dns\n```\n\nNode:\n```bash\n# install node v22+ via nvm, if required\n# https://github.com/nvm-sh/nvm#installing-and-updating\nwget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash\nnvm install --lts\n\n# download dependencies\nnpm i\n\n# (optional) update dependencies\nnpm update\n\n# run serverless-dns on node\n./run n\n\n# run a clinicjs.org profiler\n./run n [cpu|fn|mem]\n```\n\nDeno:\n```bash\n# install deno.land v2+\n# https://github.com/denoland/deno/#install\ncurl -fsSL https://deno.land/install.sh | sh\n\n# run serverless-dns on deno\n./run d\n```\n\nFastly:\n```bash\n# install node v22+ via nvm, if required\n# install the Fastly CLI\n# https://developer.fastly.com/learning/tools/cli\n\n# run serverless-dns on Fastly Compute@Edge\n./run f\n```\n\nWrangler:\n```bash\n# install Cloudflare Workers (cli) aka Wrangler\n# https://developers.cloudflare.com/workers/cli-wrangler/install-update\nnpm i wrangler --save-dev\n\n# run serverless-dns on Cloudflare Workers (cli)\n# Make sure to setup Wrangler first:\n# https://developers.cloudflare.com/workers/cli-wrangler/authentication\n./run w\n\n# profile wrangler with Chrome DevTools\n# blog.cloudflare.com/profiling-your-workers-with-wrangler\n```\n\n#### Code style\n\nCommits on this repository enforces the Google JavaScript style guide (ref: [.eslintrc.cjs](.eslintrc.cjs)).\nA git `pre-commit` hook that runs linter (eslint) and formatter (prettier) on `.js` files. Use `git commit --no-verify`\nto bypass this hook.\n\nPull requests are also checked for code style violations and fixed automatically where possible.\n\n#### Env vars\n\nConfigure [`env.js`](src/core/env.js) if you need to tweak the defaults.\nFor Cloudflare Workers, setup env vars in [`wrangler.toml`](wrangler.toml), instead.\nFor Fastly Compute@Edge, setup env vars in [`fastly.toml`](fastly.toml), instead.\n\n#### Request flow\n\n1. The request/response flow: client \u003c-\u003e `src/server-[node|workers|deno]` \u003c-\u003e [`doh.js`](src/core/doh.js) \u003c-\u003e [`plugin.js`](src/core/plugin.js)\n2. The `plugin.js` flow: `user-op.js` -\u003e `cache-resolver.js` -\u003e `cc.js` -\u003e `resolver.js`\n\n#### Auth\n\nserverless-dns supports authentication with an *alpha-numeric* bearer token for both DoH and DoT. For a token, `msg-key` (secret), append the output of `hex(hmac-sha256(msg-key|domain.tld), msg)` to `ACCESS_KEYS` env var in csv format. Note: `msg` is currently fixed to `sdns-public-auth-info`.\n\n1. DoH: place the `msg-key` at the end of the blockstamp, like so:\n`1:1:4AIggAABEGAgAA:\u003cmsg-key\u003e` (here, `1` is the version, `1:4AIggAABEGAgAA`\nis the blockstamp, `\u003cmsg-key\u003e` is the auth secret, and `:` is the delimiter).\n2. DoT: place the `msg-key` at the end of the SNI (domain-name) containing the blockstamp:\n`1-4abcbaaaaeigaiaa-\u003cmsg-key\u003e` (here `1` is the version, `4abcbaaaaeigaiaa`\nis the blockstamp, `\u003cmsg-key\u003e` is the auth secret, and `-` is the delimeter).\n\nIf the intention is to use auth with DoT too, keep `msg-key` shorter (8 to 24 chars), since subdomains may only be 63 chars long in total.\n\nYou can generate the access keys for your fork from `max.rethinkdns.com`, like so:\n```bash\nmsgkey=\"ShortAlphanumericSecret\"\ndomain=\"my-serverless-dns-domain.tld\"\ncurl 'https://max.rethinkdns.com/genaccesskey?key='\"$msgkey\"'\u0026dom='\"$domain\"\n# output\n# {\"accesskey\":[\"my-serverless-dns-domain.tld|deadbeefd3adb33fa2bb33fd3eadf084beef3b152beefdead49bbb2b33fdead83d3adbeefdeadb33f\"],\"context\":\"sdns-public-auth-info\"}\n```\n\n#### Logs and Analytics\n\nserverless-dns can be setup to upload logs via Cloudflare *Logpush*.\n\n0. Setup a *Logpush* job:\n    ```bash\n    CF_ACCOUNT_ID=\u003chex-cloudflare-account-id\u003e\n    CF_API_KEY=\u003capi-key-with-logs-edit-permission-at-account-level\u003e\n    R2_BUCKET=\u003cr2-bucket-name\u003e\n    R2_ACCESS_KEY=\u003cr2-access-key-for-the-bucket\u003e\n    R2_SECRET_KEY=\u003cr2-secret-key-with-read-write-permissions\u003e\n    # optional, setup a filter such that only logs form this worker ends up being pushed; but if you\n    # do not need a filter on Worker name (script-name), edit the \"filter\" field below accordingly.\n    SCRIPT_NAME=\u003cname-of-the-worker-as-in-wrangler-toml\u003e\n    # for more options, ref: developers.cloudflare.com/logs/get-started/api-configuration\n    # Logpush API with cURL: developers.cloudflare.com/logs/tutorials/examples/example-logpush-curl\n    # Available Logpull fields: developers.cloudflare.com/logs/reference/log-fields/account/workers_trace_events\n    curl -s -X POST \"https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/logpush/jobs\" \\\n        -H \"Authorization: Bearer ${CF_API_KEY}\" \\\n        -H 'Content-Type: application/json' \\\n        -d '{\n            \"name\": \"dns-logpush\",\n            \"logpull_options\": \"fields=EventTimestampMs,Outcome,Logs,ScriptName\u0026timestamps=rfc3339\",\n            \"destination_conf\": \"r2://'\"$R2_BUCKET\"'/{DATE}?access-key-id='\"${R2_ACCESS_KEY}\"'\u0026secret-access-key='\"${R2_SECRET_KEY}\"'\u0026account-id='\"{$CF_ACCOUNT_ID}\"',\n            \"dataset\": \"workers_trace_events\",\n            \"filter\": \"{\\\"where\\\":{\\\"and\\\":[{\\\"key\\\":\\\"ScriptName\\\",\\\"operator\\\":\\\"contains\\\",\\\"value\\\":\\\"'\"${SCRIPT_NAME}\"'\\\"},{\\\"key\\\":\\\"Outcome\\\",\\\"operator\\\":\\\"eq\\\",\\\"value\\\":\\\"ok\\\"}]}}\",\n            \"enabled\": true,\n            \"frequency\": \"low\"\n        }'\n    ```\n1. Set `wrangler.toml` property `logpush = true`, which enables *Logpush*.\n2. (Optional) env var `LOG_LEVEL = \"logpush\"`, which raises the log-level such that only *request* and error logs are emitted.\n3. (Optional) Set env var `LOGPUSH_SRC = \"csv,of,subdomains\"`, which makes [`log-pusher.js`](./src/plugins/observability/log-pusher.js) emit *request* logs only if Workers `hostname` contains one of the subdomains.\n\nLogs published to R2 can be retrieved either using [R2 Workers](https://developers.cloudflare.com/r2/data-access/workers-api/workers-api-usage), the [R2 API](https://developers.cloudflare.com/r2/data-access/s3-api/api), or the [Logpush API](https://developers.cloudflare.com/logs/r2-log-retrieval).\n\nWorkers Analytics, if enabled, is pushed against a log-key, `lid`, which if unspecified is set to hostname of the serverless deployment with periods, `.`, replaced with underscores, `_`. Auth must be setup when querying for Analytics via the API which returns a json; ex: `https://max.rethinkdns.com/1:\u003coptional-stamp\u003e:\u003cmsg-key\u003e/analytics?t=\u003ctime-interval-in-mins\u003e\u0026f=\u003cfield-name\u003e`. Possible `fields` are `ip` (client ip), `qname` (dns query name), `region` (resolver region), `qtype` (dns query type), `dom` (top-level domains), `ansip` (dns answer ips), and `cc` (ans ip country codes).\n\nLog capture and analytics isn't yet implemented for Fly and Deno Deploy.\n\n----\n\n#### A note about runtimes\n\nDeno Deploy (cloud) and Deno (the runtime) do not expose the same API surface (for example, Deno Deploy only\nsupports HTTP/S server-listeners; whereas, Deno suports raw TCP/UDP/TLS in addition to plain HTTP and HTTP/S).\n\nExcept on Node, `serverless-dns` uses DoH upstreams defined by env vars, `CF_DNS_RESOLVER_URL` / `CF_DNS_RESOLVER_URL_2`.\nOn Node, the default DNS upstream is `1.1.1.2` ([ref](https://github.com/serverless-dns/serverless-dns/blob/15f628460/src/commons/dnsutil.js#L28)) or the recursive DNS resolver at `fdaa::3` when running on Fly.io.\n\nThe entrypoints for Node and Deno are [`src/server-node.js`](src/server-node.js), [`src/server-deno.ts`](src/server-deno.ts) respectively,\nand both listen for TCP-over-TLS, HTTP/S connections; whereas, the entrypoint for Cloudflare Workers, which only listens over HTTP (cli) or\nover HTTP/S (prod), is [`src/server-workers.js`](src/server-workers.js); and for Fastly its [`src/server-fastly.js`](src/server-fastly.js).\n\nLocal (non-prod) setups on Node, `key` (private) and `cert` (public chain) files, by default, are read from\npaths defined in env vars, `TLS_KEY_PATH` and `TLS_CRT_PATH`.\n\nWhilst for prod setup on Node (on Fly.io), either `TLS_OFFLOAD` must be set to `true` or `key` and `cert` _must_ be\n_base64_ encoded in env var `TLS_CERTKEY` ([ref](https://github.com/serverless-dns/serverless-dns/blob/f57c579/src/core/node/config.js#L61-L92)), like so:\n\n```bash\n# EITHER: offload tls to fly.io and set tls_offload to true\nTLS_OFFLOAD=\"true\"\n# OR: base64 representation of both key (private) and cert (public chain)\nTLS_CERTKEY=\"KEY=b64_key_content\\nCRT=b64_cert_content\"\n```\n\nFor Deno, `key` and `cert` files are read from paths defined in env vars, `TLS_KEY_PATH` and `TLS_CRT_PATH` ([ref](https://github.com/serverless-dns/serverless-dns/blob/270d1a3c/src/server-deno.ts#L32-L35)).\n\n_Process_ bringup is different for each of these runtimes: For Node, [`src/core/node/config.js`](src/core/node/config.js) governs the _bringup_;\nwhile for Deno, it is [`src/core/deno/config.ts`](src/core/deno/config.ts), and for Workers it is [`src/core/workers/config.js`](src/core/workers/config.js).\n[`src/system.js`](src/system.js) pub-sub co-ordinates the _bringup_ phase among various modules.\n\nOn Node and Deno, in-process DNS caching is backed by [`@serverless-dns/lfu-cache`](https://github.com/serverless-dns/lfu-cache); Cloudflare Workers is backed by both [Cache Web API](https://developers.cloudflare.com/workers/runtime-apis/cache) and\nin-process lfu caches. To disable caching altogether on all three platfroms, set env var, `PROFILE_DNS_RESOLVES=true`.\n\n#### Cloud\n\nCloudflare Workers, and Deno Deploy are ephemeral, as in, the \"process\" that serves client requests is not long-lived,\nand in fact, two back-to-back requests may be served by two different [_isolates_](https://developers.cloudflare.com/workers/learning/how-workers-works) (\"processes\"). Fastly Compute@Edge is the also ephemeral but does not use isolates, instead Fastly creates and destroys a [wasmtime](https://wasmtime.dev/) sandbox for each request. Resolver on Fly.io, running Node, is backed by [persistent VMs](https://fly.io/blog/docker-without-docker/) and is hence longer-lived,\nlike traditional \"serverfull\" environments.\n\nFor Deno Deploy, the code-base is bundled up in a single javascript file with `deno bundle` and then handed off\nto Deno.com.\n\nCloudflare Workers build-time and runtime configurations are defined in [`wrangler.toml`](wrangler.toml).\n[Webpack5 bundles the files](webpack.config.cjs) in an ESM module which is then uploaded to Cloudflare by _Wrangler_.\n\nFastly Compute@Edge build-time and runtime configurations are defined in [`fastly.toml`](fastly.toml).\n[Webpack5 bundles the files](webpack.fastly.cjs) in an ESM module which is then compiled to WASM by `npx js-compute-runtime`\nand subsequently packaged and published to Fastly Compute@Edge with the _Fastly CLI_.\n\nFor Fly.io, which runs Node, the runtime directives are defined in [`fly.toml`](fly.toml) (used by `dev` and `live` deployment-types),\nwhile deploy directives are in [`node.Dockerfile`](node.Dockerfile). [`flyctl`](https://fly.io/docs/flyctl) accordingly sets\nup `serverless-dns` on Fly.io's infrastructure.\n\n```bash\n# build and deploy for cloudflare workers.dev\nnpm run build\n# usually, env-name is prod\nnpx wrangler publish [-e \u003cenv-name\u003e]\n\n# bundle, build, and deploy for fastly compute@edge\n# developer.fastly.com/reference/cli/compute/publish\nfastly compute publish\n\n# build and deploy to fly.io\nnpm run build:fly\nflyctl deploy --dockerfile node.Dockerfile --config \u003cfly.toml\u003e [-a \u003capp-name\u003e] [--image-label \u003csome-uniq-label\u003e]\n```\n\nFor deploys offloading TLS termination to Fly.io (`B1` deployment-type), the runtime directives are instead defined in\n[`fly.tls.toml`](fly.tls.toml), which sets up HTTP2 Cleartext and HTTP/1.1 on port `443`, and DNS over TCP on port `853`.\n\nRef: _[github/workflows](.github/workflows)_.\n\n### Blocklists\n\n190+ blocklists are compressed in a _Succinct Radix Trie_ ([based on Steve Hanov's impl](https://stevehanov.ca/blog/?id=120)) with modifications\nto speed up string search ([`lookup`](https://github.com/serverless-dns/trie/blob/965007a5c/src/ftrie.js#L378-L484)) at the expense of \"succintness\". The blocklists are versioned\nwith unix timestamp (defined in `src/basicconfig.json` downloaded by [`pre.sh`](src/build/pre.sh)), which is generated once every week, but we'd like to generate 'em daily / hourly,\nif possible [see](https://github.com/serverless-dns/blocklists/issues/19)), and hosted on Cloudflare R2 (env var: `CF_BLOCKLIST_URL`).\n\n`serverless-dns` downloads [3 blocklist files](https://github.com/serverless-dns/serverless-dns/blob/15f62846/src/core/node/blocklists.js#L14-L16)\nrequired to setup the radix-trie during runtime bring-up or, downloads them [lazily](https://github.com/serverless-dns/serverless-dns/blob/02f9e5bf/src/plugins/dns-op/resolver.js#L167),\nwhen serving a DNS request.\n\n`serverless-dns` compiles around ~13M entries (as of Jan 2023) from around 190+ blocklists. These are defined in the [serverless-dns/blocklists](https://github.com/serverless-dns/blocklists) repository.\n","funding_links":["https://github.com/sponsors/serverless-dns","https://svc.rethinkdns.com/r/sponsor"],"categories":["JavaScript","Repos","serverless","⚙️ Serverless"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverless-dns%2Fserverless-dns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserverless-dns%2Fserverless-dns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverless-dns%2Fserverless-dns/lists"}