Caddy: An Extensible HTTP/1-3 Server with Automatic HTTPS
A Go server for teams hosting HTTP/1-3 sites, handling HTTPS by default and allowing live API configuration changes.
GitHub caddyserver/caddy Updated 2026-10-06 Branch master Stars 77.1K Forks 5.1K
Go HTTP/1.1-3 Automatic HTTPS JSON API Cross-platform

🧭 Decision Guide

Try it if you

  • You need an HTTPS web server supporting HTTP/1.1, HTTP/2, and HTTP/3
    The README's Features section lists all three protocols as supported by default and states that Caddy uses TLS by default
  • You want to manage sites with Caddyfile or the JSON API instead of relying only on command-line flags
    The README's Features and Overview sections list Caddyfile and the JSON API, and describe the API as the primary configuration method
  • You need public-domain certificates or local CA management for internal names and IPs
    The README's Features section lists ZeroSSL, Let's Encrypt, and a fully-managed local CA
  • You need to convert YAML, TOML, or NGINX configuration into Caddy JSON
    The README's Overview section explicitly lists config adapters and YAML, TOML, and NGINX config

Skip it if you

  • Your release process must build from source but cannot provide Go 1.26.0 or newer
    The README's Build from source section lists Go 1.26.0 or newer as a requirement
  • You require development builds to include complete version information automatically
    The README's Build from source / For development section explicitly says these steps do not embed proper version information
  • Your team will not learn Caddy's JSON configuration structure but needs its deeper module configuration capabilities
    The README's Overview section says the config document structure must be understood to wield the design's power

Requirements

  • Source-build requirement: "Go 1.26.0 or newer"
  • The development build flow includes: "git clone https://github.com/caddyserver/caddy.git"
  • For low ports on Linux, the README provides: "sudo setcap cap_net_bind_service=+ep ./caddy"
  • The project provides a cross-platform executable through GitHub Releases, described as "The simplest, cross-platform way to get started"

First step (verbatim from README)

$ git clone "https://github.com/caddyserver/caddy.git"

Watch out

  • Binding low ports such as 80/443 may require setcap or elevated privileges on Linux
    The README's Build from source section says Caddy may bind low ports and provides a setcap command
  • Using go run for low-port development requires setcap.sh
    The README's For development section provides go run -exec ./setcap.sh main.go
  • Development builds and release builds differ in how version information is handled
    The README explicitly warns that the development steps do not embed proper version information
  • The README asks users to read more documentation after completing a quick-start tutorial
    The README's Quick start section asks users to read more documentation to understand how the software works

Alternatives

  • NGINX:If the team already has mature NGINX configuration, modules, and operational processes, NGINX may be easier than introducing Caddyfile, the JSON API, and Caddy's module system
    General domain knowledge

Not stated in the README

  • The material does not describe the complete v2.11.7 changes, upgrade compatibility, or deprecations
  • The material provides no CPU, memory, or throughput data for HTTP/1.1, HTTP/2, or HTTP/3 on specific hardware
  • The material does not explain ZeroSSL, Let's Encrypt, or local CA behavior with enterprise proxies, offline environments, or certificate-renewal failures
  • The material does not provide a plugin inventory, plugin-version compatibility matrix, or custom-module release process
  • The material does not describe the storage, network requirements, or consistency mechanism used for multi-instance cluster coordination
  • The material does not specify installation package formats or service-manager integration for Windows, macOS, and Linux

💡 Deep Analysis

6
Yes My clients include HTTP/1.1, HTTP/2, and HTTP/3, while deployment requires a single Go binary with no external dependencies. Can Caddy serve as the unified entry point?
For: A network engineer needing one unified entry point for HTTP/1.1, HTTP/2, and HTTP/3 while retaining a single Go binary deployment

Yes. The README explicitly lists default support for all three protocols and emphasizes Go-based operation without external dependencies.

  • The Features section states that HTTP/1.1, HTTP/2, and HTTP/3 are all supported by default, matching the stated protocol mix.
  • The project description calls Caddy a fast, extensible, multi-platform HTTP/1-2-3 web server with automatic HTTPS, and project data identifies Go as the main language.
  • Features also says it runs anywhere with no external dependencies, not even libc, which matches a single-executable, cross-platform deployment constraint.
  • TLS by default, reverse proxying, and static file serving allow it to act as a unified web entry point rather than handling only one protocol.

The README provides no performance data by protocol, kernel requirements, QUIC network conditions, or hardware resource figures, so throughput cannot be inferred from it.

  • Project description: Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
  • Features: HTTP/1.1, HTTP/2, and HTTP/3 all supported by default
  • Features: Runs anywhere with no external dependencies (not even libc)
  • Project data: main_language is Go
Not stated in the README:The README provides no performance comparison or resource-usage data for HTTP/1.1, HTTP/2, and HTTP/3;The README does not specify QUIC/UDP network conditions, kernel requirements, or hardware capacity for the target system
Yes We have one public domain and an upstream application, and want one cross-platform binary to provide HTTPS and reverse proxying without an extra libc runtime dependency. Is Caddy suitable?
For: A DevOps engineer on a small team running a public-domain website who wants HTTPS and reverse proxying in one cross-platform binary

Yes, because the README presents automatic HTTPS, HTTP serving, and cross-platform operation as core capabilities.

  • Automatic HTTPS is enabled by default and can use ZeroSSL or Let’s Encrypt for public names, including certificate issuance and renewal.
  • The Features section lists reverse proxy support, so Caddy can act as the public entry point and forward traffic without a separate TLS terminator.
  • It supports HTTP/1.1, HTTP/2, and HTTP/3, and states that it runs anywhere with no external dependencies, not even libc.

The domain still has to satisfy ACME validation requirements. The README does not specify your upstream framework, traffic volume, or existing port usage.

  • Features: Automatic HTTPS by default; ZeroSSL and Let's Encrypt for public names
  • Features: HTTP/1.1, HTTP/2, and HTTP/3 all supported by default
  • Features: Runs anywhere with no external dependencies (not even libc)
  • Project data: main_language is Go; description is a multi-platform HTTP/1-2-3 web server with automatic HTTPS
Not stated in the README:The README does not specify the upstream framework, listen address, WebSocket, or timeout requirements;The README does not specify whether the target environment exposes the network access required by ACME
Yes I already use Go 1.26.0+ and want to implement authentication, storage, or logging as Caddy modules that gain JSON documentation, API configuration changes, and a unified lifecycle. Is this project suitable as an extension platform?
For: An engineer using Go 1.26.0+ to build custom authentication or storage plugins for Caddy's HTTP/TLS runtime

Yes. The README explicitly positions Caddy as a platform for running Go application modules rather than merely a web server with fixed features.

  • The Overview says Caddy apps are Go programs implemented as Caddy modules, with tls and http shipped as standard apps.
  • It states that apps gain automated documentation, graceful online configuration changes through the API, and unification with other Caddy apps.
  • The Features section lists a modular architecture and powerful plugin system, while source builds require Go 1.26.0 or newer.

This directly matches extensions for authentication, storage, or logging. However, the README does not specify your module API version, plugin distribution model, compatibility guarantees, or test matrix, so it cannot confirm that a particular plugin will work without adaptation.

  • Build from source: Go 1.26.0 or newer
  • Overview: Caddy “apps” are just Go programs that are implemented as Caddy modules
  • Overview: apps instantly benefit from automated documentation, graceful online config changes via API, and unification with other Caddy apps
  • Features: Highly extensible modular architecture; powerful plugin system
Not stated in the README:The README does not specify the stability of the target module interfaces, version-compatibility policy, or testing requirements;The README does not specify build, signing, release, or security-audit procedures for third-party plugins
Yes I need to keep ingress configuration in one document and modify HTTP handlers and TLS-handshake-related settings online through an API without restarting Caddy. Does this runtime model fit?
For: A DevOps engineer maintaining a production ingress who needs to change HTTP/TLS routing through an API without interrupting service

Yes. The README directly describes a centralized configuration model and graceful online configuration changes through the API.

  • The Overview says nearly all Caddy configuration is contained in a single config document instead of being scattered across CLI flags, environment variables, and configuration files, which suits a unified control plane.
  • JSON is described as the native configuration language, while the JSON API provides dynamic configuration; Caddyfile, YAML, TOML, and NGINX config can be converted through adapters.
  • The same section says the API controls the actual in-memory values powering HTTP handlers, TLS handshakes, and the storage medium, and explicitly supports graceful online changes.

The README does not specify API authentication, behavior after validation failure, concurrent update conflicts, or rollback semantics. It supports the online-change decision but does not define your production control-plane design.

  • Overview: Nearly all of Caddy's configuration is contained in a single config document
  • Overview: JSON is Caddy's native config language; The primary way to configure Caddy is through its API
  • Overview: graceful online config changes via API
  • Overview: actual values ... power everything from HTTP handlers and TLS handshakes to your storage medium
Not stated in the README:The README does not specify authentication, authorization, TLS protection, or exposure boundaries for the JSON API;The README does not specify the exact semantics of validation failure, concurrent update conflicts, or rollback for online changes
Yes My services use only internal names and IPs and have no domain suitable for public ACME validation. I still want Caddy to manage internal HTTPS automatically. Does the local CA described in the README satisfy this constraint?
For: An engineer responsible for an internal development environment who needs HTTPS for internal names and IPs without relying on public-domain certificate issuance

Yes for an internal environment, but it uses a managed local CA rather than certificates issued by a public certificate authority.

  • The Features section explicitly lists a fully managed local CA for internal names and IPs, directly covering environments without public DNS names.
  • The same section associates ZeroSSL and Let’s Encrypt with public names, showing that public ACME issuance and internal names/IPs follow different paths.
  • Caddy is described as TLS by default, and automatic HTTPS is a default capability, so internal HTTPS does not require assembling a separate certificate service.

The README does not explain how clients install or trust the local CA root, nor how to distribute, revoke, back up, or share it across hosts. Those details determine whether it meets an organization-wide trust requirement.

  • Features: Fully-managed local CA for internal names & IPs
  • Features: ZeroSSL and Let's Encrypt for public names
  • Project description: Caddy is an extensible server platform that uses TLS by default
  • Features: Automatic HTTPS by default
Not stated in the README:The README does not specify how clients install and distribute trust for the local CA root;The README does not specify revocation, backup, key protection, or cross-instance sharing procedures for the local CA
It depends I need to manage hundreds of thousands of sites, coordinate certificate state across multiple Caddy instances, and centrally push configuration through an API. Are the capabilities described in the README sufficient for this ingress platform?
For: A hosting-platform engineer managing hundreds of thousands of sites who requires centralized configuration, clustered certificate coordination, and large-scale site management

It depends: the README supports the scale and control-plane direction, but does not cover every operational requirement of a hosting platform.

  • The Features section states that Caddy has managed millions of TLS certificates in production and scales to hundreds of thousands of sites.
  • Automatic HTTPS can coordinate with other Caddy instances in a cluster and provides multi-issuer fallback, which fits multi-instance certificate lifecycle management.
  • The Overview explicitly lists the JSON API, dynamic configuration, and graceful online config changes; config adapters can also convert Caddyfile, YAML, TOML, or NGINX config into JSON.

However, the README does not specify control-plane authentication, tenant isolation, shared-storage implementation, API rate limits, rollout rollback, or per-instance resource limits. It therefore cannot establish that a complete hosting platform is ready solely from the README.

  • Features: Scales to hundreds of thousands of sites as proven in production
  • Features: Production-ready after serving trillions of requests and managing millions of TLS certificates
  • Features: Can coordinate with other Caddy instances in a cluster; Multi-issuer fallback
  • Overview: graceful online config changes via API; Nearly all of Caddy's configuration is contained in a single config document
Not stated in the README:The README does not specify a multi-tenant permission model, API authentication, or tenant configuration isolation;The README does not specify the shared certificate-storage backend, cluster consistency mechanism, or per-instance capacity boundary;The README does not specify rollout, rollback, or rate-limiting mechanisms for large configuration changes

✨ Highlights

  • HTTPS is enabled by default, with ZeroSSL and Let's Encrypt support
  • Native support for HTTP/1.1, HTTP/2, and HTTP/3
  • Caddyfile, JSON, and the JSON API work together for configuration
  • Go's modular architecture supports plugins without external dependencies
  • The README reports trillions of requests and millions of TLS certificates managed

🔧 Engineering

  • Caddyfile offers simple configuration, while the JSON API supports online config changes
  • JSON is native, with adapters for YAML, TOML, and NGINX configuration
  • Automatic HTTPS obtains public certificates and manages a local CA for internal names
  • The standard distribution includes the tls and http Caddy apps

⚠️ Risks

  • Binding low ports may require Linux setcap or elevated privileges
  • Building from source requires Go 1.26.0 or newer
  • The README says understanding the JSON config structure is needed to use its full power
  • Development builds do not embed proper version information

👥 For who?

  • Teams needing HTTP/1.1, HTTP/2, and HTTP/3 web serving
  • Operations teams wanting to manage TLS with Caddyfile or the JSON API
  • Developers extending long-running services with Go modules and plugins