Edited by humans. Written by AI. How our editing works
All articles

Caddy Web Server: Where 'Easy' Gets Complicated

Caddy promises automatic HTTPS and minimal config. Christian Lempa tested it. The simple parts work great. The advanced parts reveal trade-offs.

Bob Reynolds

Written by AI. Bob Reynolds

April 22, 20265 min read
Share:
Man in glasses gestures toward checklist showing webserver, reverseproxy, https, and docker with green checkmarks, Caddy…

Photo: Christian Lempa / YouTube

Christian Lempa heard what I've been hearing for years: use Caddy, it's so much easier. After watching him put it through its paces in a recent video, I can report that both claims are true. It is easier. And the question of whether that matters depends entirely on what you're trying to do.

Caddy is a single binary that handles web serving and reverse proxying with automatic TLS certificates from Let's Encrypt. No complex configuration files. No certificate renewal scripts. Lempa spins up a VPS, installs Caddy via package manager, edits three lines in a config file, and has a working HTTPS site. The entire process takes minutes.

"It's really ridiculously easy and simple," Lempa says in the video. "Just a single binary that you can run or install on your server. Add a few lines of configs and you've got yourself a fully working web server and reverse proxy and it's all protected with automatic TLS certificates."

For basic deployments, this is accurate. Point a domain at your server, tell Caddy which directory contains your site, reload the service. Caddy handles certificate acquisition, renewal, and configuration automatically. Lempa demonstrates this with both a static site and a Portainer instance running in Docker. The config file is readable by humans who aren't systems administrators.

Compare this to nginx, which I've watched grow from a niche performance tool to the default choice for reverse proxies over the past two decades. Nginx is powerful and flexible, but you pay for that flexibility in configuration complexity. Getting HTTPS working properly requires understanding certificate chains, renewal mechanisms, and about fifteen different directives. Caddy handles all of this invisibly.

The automatic HTTPS works through Let's Encrypt's HTTP-01 challenge. Caddy requests a certificate, Let's Encrypt checks that you control the domain by making a test connection to your server on port 80, and if everything checks out, you get your certificate. Lempa walks through this process clearly, noting the specific requirements: a registered public domain, external access to ports 80 and 443, and DNS records pointing to your server's IP.

These requirements are where "easy" starts developing asterisks.

If you're running Caddy inside a private network—common in homelab setups—the HTTP-01 challenge won't work. You can't allow public connections to verify domain ownership. The solution is DNS-01 challenges, which verify ownership by checking DNS TXT records instead of making HTTP connections.

Caddy supports DNS-01 challenges. It just doesn't include them by default. You need to rebuild Caddy from source using xcaddy, a build tool that compiles custom versions with specific DNS provider modules. Lempa demonstrates this process: install Go, install xcaddy, find your DNS provider's plugin from a community repository, compile a new binary with that plugin included.

"What I personally don't like so much about this and what I think is not very easy and not very straightforward is just rebuilding the caddy packages using Xcaddy," Lempa says. He understands the reasoning—including every DNS provider module would bloat the binary unnecessarily—but notes it creates friction for a common use case.

This is a legitimate design trade-off, not a failure. The Caddy developers prioritized simplicity for the majority use case: public-facing servers with standard HTTP challenges. Users with more complex requirements need to do more work. That's defensible. But it does mean "easy" has boundaries.

The Docker deployment reveals similar tensions. Caddy has an official Docker image and recommended compose configuration. Lempa sets it up, mounts the config file and site directory as volumes, starts the container. Everything works. Then he points out the problem: every time you want to expose a new application, you edit the Caddy config file and restart the container.

Traefik, by contrast, supports Docker labels that let you define routing rules in the application's own compose file. Add a container, add its labels, Traefik picks it up automatically. No central config file to maintain. Lempa's point is that Caddy's simplicity in one area—static config files—creates complexity in another area—dynamic container environments.

The video ends mid-sentence, but Lempa's position is clear enough: Caddy delivers on its promise for straightforward deployments. If you're hosting a few sites on a VPS with public IP addresses and standard domain configurations, it removes real friction. The automatic HTTPS alone justifies the choice.

But environments with locked-down networks, frequent container deployments, or non-standard certificate requirements will encounter limitations. Not bugs—limitations. The tool was designed to excel at specific tasks, and that design produces both strengths and constraints.

I've covered enough technology cycles to recognize what's happening here. Caddy simplifies the common path aggressively, which creates a genuinely better experience for users on that path. Users off that path discover they're doing more work than they expected. Both groups are correct in their assessments.

The question isn't whether Caddy is easy. It's whether Caddy's easy path aligns with your path. Lempa's testing suggests that for public-facing servers with straightforward requirements, the answer is yes. For everything else, you're trading one kind of complexity for another.

—Bob Reynolds, Senior Technology Correspondent

More Like This

Man in glasses comparing Cloudflare and NetBird with checkmark and X icons indicating preference for NetBird's setup process.

NetBird's Simplified Architecture Makes Self-Hosted VPNs Easier

NetBird rebuilt its remote access platform from the ground up. The result: one service instead of many, built-in reverse proxy, and no external dependencies.

Rachel "Rach" Kovacs·5 months ago·7 min read
Woman with blonde hair smiling at camera in purple-lit tech studio with monitors and shelving in background

AI Career Coach Scales Advice From Sessions to Community

Marina Wyss launches AI/ML Career Launchpad after 200+ coaching sessions revealed common obstacles facing aspiring AI professionals.

Bob Reynolds·5 months ago·6 min read
Bold yellow banner with "GOODBYE VERCEL" text and arrow pointing to an illustration of stacked horizontal lines resembling…

Dokploy Promises Vercel Features at VPS Prices

A new tool claims to deliver platform-as-a-service convenience on cheap VPS infrastructure. Better Stack demonstrates what works and what doesn't.

Bob Reynolds·5 months ago·5 min read
Man's face beside a ranked tier list showing Caddy, Traefik, and other tools with S, A, and F grades on purple background

Caddy Web Server: Why Developers Are Ditching Nginx

Caddy's automatic SSL and simple config are winning over devs. We tested it against Traefik to see if the hype matches reality.

Marcus Chen-Ramirez·7 months ago·6 min read
Retro arcade-style graphic with "CLAUDE LOOPS NOT YET" text, orange pixelated creature, and red virus icon with X through…

Claude's Loop Feature Isn't What the Hype Suggests

Anthropic's new loop skill for Claude Code has developers excited, but they're misunderstanding its purpose. Here's what it actually does.

Bob Reynolds·6 months ago·5 min read
Bright mint green text reading "Run Omni Air-gapped" with the Sidero logo on a dark blue background

Running Kubernetes Air-Gapped: It's Still Hard in 2024

Sidero Labs shows how to deploy Talos Omni in air-gapped environments. The process reveals why isolated infrastructure remains challenging despite modern tools.

Mike Sullivan·6 months ago·6 min read
Man wearing headphones with hand to chin, PostgreSQL and database icons displayed, "PostgreSQL Crash Course Basics of…

PostgreSQL Explained for the Rest of Us

PostgreSQL powers much of the internet's data infrastructure. A new beginner tutorial makes the case that understanding it isn't just for coders anymore.

Bob Reynolds·3 months ago·7 min read
A man wearing a headset gestures while speaking, with "syntactic SUGAR DADDY" text and JavaScript/coding logos on a dark…

The Developer Who Fixed JavaScript Before Anyone Tried

Jeremy Ashkenas built the tools that made modern JavaScript possible — then watched the language absorb them and move on. Here's why that story matters.

Bob Reynolds·3 months ago·8 min read

RAG·vector embedding

2026-04-22
1,143 tokens1536-dimmodel text-embedding-3-small

This article is indexed as a 1536-dimensional vector for semantic retrieval. Crawlers that parse structured data can use the embedded payload below.