{"id":"01a0fe0d-3252-7ec4-a16c-b51e8bdb4f16","slug":"dns-worker","name":"DNS Worker","oneLiner":"Filtering DNS resolver with blocklists, query logs and per-device profiles, served as DNS over HTTPS from your Cloudflare account","logoUrl":"https://obex.pages.dev/favicon.webp","primaryCategory":{"slug":"security","name":"Security"},"services":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers"},{"slug":"static-assets","name":"Workers Static Assets","shortName":"Static Assets"},{"slug":"d1","name":"Cloudflare D1","shortName":"D1"},{"slug":"cron-triggers","name":"Cron Triggers","shortName":"Cron"}],"deploy":"one_click","hasOneClick":true,"licenseName":"AGPL-3.0","licenseClass":"open_source","freeTierStatus":"usage_dependent","isTested":false,"lastTestedAt":null,"stars":22,"isArchived":false,"publishedAt":"2026-10-09T13:41:49.553Z","contentUpdatedAt":"2026-10-09T13:45:09.841Z","latestCommitAt":"2026-10-20T15:51:49Z","price":null,"screenshot":{"url":"/media/apps/01a0fe0d-3252-7ec4-a16c-b51e8bdb4f16/01a0fe11-7f84-73d8-8db6-45ae7fae572c.webp","alt":"DNS Worker analytics with query totals, blocked queries and top domains"},"sourceHealth":"changed","shortDescription":"DNS Worker answers your devices’ DNS lookups and blocks the domains on the blocklists you subscribe to, much like NextDNS or a Pi-hole you do not have to run at home. On Cloudflare it runs as one Worker with a D1 database and serves DNS over HTTPS, so phones, laptops and browsers use it through a DoH URL. A web dashboard shows query logs and statistics and manages rules, filter subscriptions and devices.","longDescription":"Each device or group of devices gets its own profile and access point with a DoH URL. A profile combines filter subscriptions, wildcard rules and custom overrides that send a domain to another answer. The setup guide in the dashboard gives the steps for browsers, Apple devices through a configuration profile, Windows, Linux and Android.\n\nThe analytics page shows total, blocked and redirected queries over time and the most allowed and blocked domains, and the query log lists each lookup. Logs are loaded into an in-browser SQLite database for filtering and charts. Sign-in uses passkeys, and the project describes its stored logs as end-to-end encrypted.\n\nOn Workers the resolver only speaks DNS over HTTPS. Classic DNS on port 53 and DNS over TLS need the standalone server, which the same project ships as an npm package for a VPS or home server. The Deploy to Cloudflare button creates the Worker and the D1 database; set a JWT_SECRET secret afterwards. A Cron Trigger runs maintenance every minute.","useCases":["Block ads, trackers and malware domains on every device","Give each device or family member its own filtering profile","See which domains your devices contact","Replace a paid DNS filtering service with one in your own account"],"targetAudience":"Privacy-minded individuals, families and small offices who want DNS filtering without a subscription or a home server","knownLimitations":"On Cloudflare it works only as a DNS over HTTPS resolver; routers and Android Private DNS need classic DNS or DNS over TLS, which only the standalone server provides. Every lookup counts as a Worker request against Workers Free’s 100,000 a day. The Cron Trigger runs every minute and uses one of the five a free account has. One maintainer, under the AGPL-3.0.","editorialNote":null,"ownershipDisclosure":null,"homepageUrl":"https://obein.github.io/DNS-Worker/","demoUrl":null,"docsUrl":null,"repository":{"provider":"github","owner":"obein","name":"dns-worker","url":"https://github.com/obein/dns-worker","defaultBranch":"main","stars":22,"forks":15,"openIssues":2,"licenseSpdx":"NOASSERTION","isArchived":false,"latestRelease":"v1.1.3.1","latestReleaseAt":"2026-10-18T08:35:42Z","latestCommitAt":"2026-10-20T15:51:49Z","metadataFetchedAt":"2026-10-21T03:51:00.058Z"},"secondaryCategories":[],"servicesDetailed":[{"slug":"workers","name":"Cloudflare Workers","shortName":"Workers","detectionKind":"explicit","note":null},{"slug":"static-assets","name":"Workers Static Assets","shortName":"Static Assets","detectionKind":"explicit","note":null},{"slug":"d1","name":"Cloudflare D1","shortName":"D1","detectionKind":"explicit","note":null},{"slug":"cron-triggers","name":"Cron Triggers","shortName":"Cron","detectionKind":"explicit","note":null}],"connectors":[],"externalRequirements":[],"deployMethods":[{"id":"01a0fe10-9e49-7715-9a31-29b9c1468bd2","methodType":"one_click","url":"https://deploy.workers.cloudflare.com/?url=https://github.com/Obein/DNS-Worker","command":null,"docsUrl":null,"branch":"main","isOneClick":true,"isPrimary":true,"requiredPlan":null,"notes":null}],"deployRequirements":[],"bindings":[{"bindingType":"d1_databases","bindingName":"DB","resourceName":"dns_worker_db"}],"envVars":[],"screenshots":[{"id":"01a0fe11-84de-7d9e-a3cc-e47e239c6376","url":"/media/apps/01a0fe0d-3252-7ec4-a16c-b51e8bdb4f16/01a0fe11-7f84-73d8-8db6-45ae7fae572c.webp","width":2560,"height":1694,"altText":"DNS Worker analytics with query totals, blocked queries and top domains","isPrimary":true,"sourceType":"repository"},{"id":"01a120e3-cfba-7558-801c-71e9393a4ea4","url":"/media/apps/01a0fe0d-3252-7ec4-a16c-b51e8bdb4f16/01a120e3-ce3a-7556-b209-12bf510939bc.webp","width":2880,"height":1906,"altText":"DNS Worker filter subscriptions","isPrimary":false,"sourceType":"repository"},{"id":"01a120e3-d388-7a01-ab33-3c95c250162a","url":"/media/apps/01a0fe0d-3252-7ec4-a16c-b51e8bdb4f16/01a120e3-d207-79cb-a367-811d5b2b2414.webp","width":2880,"height":1906,"altText":"DNS Worker rules with wildcard filters and overrides","isPrimary":false,"sourceType":"repository"},{"id":"01a0fe11-73ed-7e1e-ad65-ed5a30d69640","url":"/media/apps/01a0fe0d-3252-7ec4-a16c-b51e8bdb4f16/01a0fe11-6eaa-7419-b97f-71467a3eb18c.webp","width":2880,"height":1906,"altText":"DNS Worker setup guide with the DoH URL and per-platform instructions","isPrimary":false,"sourceType":"repository"}],"licenseUrl":"https://github.com/Obein/DNS-Worker/blob/main/LICENSE","freeTierNote":"Each DNS lookup is one Worker request, and Workers Free allows 100,000 a day; above that you need Workers Paid ($5 a month with 10 million requests included). D1 and the one Cron Trigger fit the free plan.","freeTierSourceUrl":"https://developers.cloudflare.com/workers/platform/pricing/","freeTierCheckedAt":null,"pricingNote":null,"pricingUrl":null,"pricingCheckedAt":null,"setupComplexity":"low","setupComplexityNote":"Deploy button, then set JWT_SECRET, create the first account and add the DoH URL to each device.","verification":{"status":"untested","testedAt":null,"versionRef":null,"deploymentMethod":null,"coreUseCase":null,"publicNote":null,"resources":[],"steps":[],"screenshots":[],"staleReason":null},"alternatives":[{"slug":"control-d","name":"Control D"},{"slug":"nextdns","name":"NextDNS"}],"sources":[{"sourceType":"repository","url":"https://github.com/Obein/DNS-Worker","lastSeenAt":"2026-10-13T20:25:08.848Z"},{"sourceType":"homepage","url":"https://obein.github.io/DNS-Worker/","lastSeenAt":"2026-10-21T03:55:46.820Z"}],"lastSourceRefreshAt":"2026-10-21T03:51:00.058Z","lastReviewedAt":"2026-10-09T13:41:49.553Z","seoTitle":"DNS Worker: filtering DNS over HTTPS on Cloudflare Workers","seoDescription":"DNS Worker is a self-hosted DNS filter with blocklists, query logs and per-device profiles that serves DNS over HTTPS from your Cloudflare account.","changeEvents":[{"id":"01a120e6-0c20-7df4-8544-6fa248f4ec04","kind":"listed","summary":"DNS Worker listed","createdAt":"2026-10-09T13:41:49.553Z","app":{"slug":"dns-worker","name":"DNS Worker"}}]}