Noureddine RAMDI / Caddy: a dynamic, extensible Go web server focused on automatic HTTPS and modularity

Created Sat, 02 May 2026 20:07:04 +0000 Modified Sat, 23 May 2026 20:41:27 +0000

caddyserver/caddy

Caddy takes a different approach to web server configuration and extensibility compared to traditional servers. Instead of relying solely on static configuration files or external tools, Caddy treats its configuration as a dynamic, API-driven process. This shift enables real-time updates, seamless integration with Go modules, and robust automatic HTTPS management.

What Caddy is and how it works

Caddy is an open-source web server written in Go, designed to serve HTTP/1.1, HTTP/2, and HTTP/3 traffic with a focus on automation and extensibility. One of its standout features is automatic HTTPS provisioning and renewal, using ZeroSSL and Let’s Encrypt behind the scenes, which removes much of the operational burden around managing TLS certificates.

Architecturally, Caddy is built around a modular design where every component is a Go module that plugs into its core platform. This includes “apps”—modular features or services implemented as Caddy modules—that can be loaded or replaced without bloating the core. The server’s configuration can be provided in multiple ways: a familiar Caddyfile for users coming from traditional web servers, native JSON for programmatic control, or a dynamic JSON API that allows runtime configuration changes without restarting.

This modular architecture is designed to scale. Caddy has been proven in production to manage millions of TLS certificates and serve trillions of requests, handling hundreds of thousands of sites. It runs without any external dependencies, benefiting from Go’s memory safety and concurrency model to provide a stable and performant platform.

What sets Caddy apart technically

The technical strength of Caddy lies in its dynamic, API-driven configuration model and its modular architecture. Unlike traditional servers where configuration changes typically require reloads or restarts, Caddy supports graceful online configuration changes via its JSON API. This dynamic configuration system allows operators to programmatically modify routes, TLS settings, and modules in real-time.

The modular design means that functionality is composed of independent Go modules rather than monolithic components. This reduces bloat and makes it easy to extend or customize the server for specific use cases. For example, you can add new apps or extend existing ones without touching the core codebase.

From a code quality perspective, Caddy benefits from Go’s strong typing and memory safety guarantees, which reduces the risk of common bugs such as memory leaks or segmentation faults. The codebase is large but well-organized, with clear interfaces for modules and a focus on maintainability.

The tradeoff is that Caddy can feel complex to newcomers, especially due to its rich configuration options and the fact that it exposes multiple configuration formats. The dynamic JSON API, while powerful, requires a different mindset than static config files and may introduce a steeper learning curve.

Moreover, while automatic HTTPS is a huge operational win, it is not without limitations. Certain edge cases involving DNS challenges or firewall restrictions may require manual intervention. However, these cases are well-documented.

Quick start

The simplest, cross-platform way to get started is to download Caddy from GitHub Releases and place the executable file in your PATH.

See our online documentation for other install instructions.

Quick start

The Caddy website has documentation that includes tutorials, quick-start guides, reference, and more.

We recommend that all users – regardless of experience level – do our Getting Started guide to become familiar with using Caddy.

If you’ve only got a minute, the website has several quick-start tutorials to choose from! However, after finishing a quick-start tutorial, please read more documentation to understand how the software works. 🙂

verdict

Caddy is particularly suited for developers and operators who want a modern web server that combines strong automation around HTTPS with an extensible, modular platform. Its ability to handle millions of TLS certificates and trillions of requests in production speaks to its scalability and robustness.

That said, it comes with a learning curve due to its dynamic configuration model and flexible architecture. If you prefer conventional static config files or simpler server setups, this may feel like overkill. But if you need runtime flexibility, zero-downtime config changes, and tight integration with Go modules, Caddy is worth the investment.

Its zero external dependency footprint and Go-native design make it a reliable choice for production environments where performance and stability matter. Just be ready to spend some time with the documentation and tooling to get the most out of it.


→ GitHub Repo: caddyserver/caddy ⭐ 71,851 · Go