github.com/AdguardTeam/AdGuardHome
Community Reviews
DNS server application, not a reusable library - embedding challenges abound
The internal APIs lack stability guarantees and change frequently between versions with no clear deprecation policy. Configuration is primarily file-based (YAML) rather than programmatic, making it awkward to integrate into existing services. Resource management is opaque - connection pools, goroutine lifecycles, and memory usage are hardcoded for the standalone application use case. There's minimal support for structured logging integration; most logging goes through their internal logger which is challenging to pipe into your observability stack.
Timeout behaviors and retry logic are scattered throughout the codebase without clear documentation. When embedding, you'll find yourself fighting the framework rather than composing with it. If you need DNS filtering capabilities in your Go application, consider using lower-level libraries like miekg/dns or coredns plugins instead.
Best for: Running the standalone AdGuardHome DNS server application as-is, not embedding in other projects.
Avoid if: You need to embed DNS filtering capabilities into an existing Go service or require stable APIs for production dependencies.
Powerful DNS filtering but not designed as an importable Go library
Attempting to import specific modules like filtering or DNS proxy functionality requires navigating internal packages with no stability guarantees. Type definitions exist but aren't organized for external consumption, making IDE autocomplete less helpful than typical Go libraries. Error handling follows application patterns rather than library patterns, often logging directly rather than returning structured errors you can handle programmatically.
If you need DNS filtering in your Go application, you're better off using the underlying libraries AdGuardHome depends on (like dnsproxy) or implementing your own filtering logic. AdGuardHome excels as a deployable service but struggles as an embeddable component.
Best for: Teams looking to fork and modify AdGuardHome itself, or study its implementation for educational purposes.
Avoid if: You need a Go library for DNS filtering or ad blocking to integrate into your application - use dnsproxy or similar instead.
Full application, not a reusable Go library - limited modularity
The internal packages aren't designed with external consumption in mind - there's minimal godoc documentation, no clear entry points for library usage, and the dependency graph is complex. Error messages are oriented toward end-users running the binary, not developers integrating the code. When things go wrong during integration attempts, you're essentially debugging application internals without adequate visibility.
If you need DNS filtering capabilities in your Go project, you'll likely need to either run AdGuardHome as a separate service and interact via its API, or look for purpose-built libraries like miekg/dns with custom filtering logic. The project excels as a standalone application but falls short as a dependency.
Best for: Teams wanting to fork and customize the entire AdGuardHome application or contribute to the project itself.
Avoid if: You need modular DNS filtering components to integrate into existing Go applications as a library dependency.
Sign in to write a review
Sign In