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.
Written by AI. Bob Reynolds

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
We Watch Tech YouTube So You Don't Have To
Get the week's best tech insights, summarized and delivered to your inbox. No fluff, no spam.
More Like This
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.
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.
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.
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.
Where to Deploy Your App in 2026: A Reality Check
Developer Theo breaks down serverless vs VPS deployment options for 2026, from Vercel's ease to Cloudflare's cost traps. Here's what actually matters.
What Happens When AI Gets Root Access to Your Computer
A YouTuber gave an AI agent root access to his Linux system. The results reveal both the promise and the friction of our autonomous software future.
Tech Meetups: Why Showing Up Matters More Than Networking
Vienna-based developer argues tech meetups work best when you stop trying to extract value and start playing positional chess. His approach challenges conventional networking wisdom.
GPT-5.4 Pro Costs $180 Per Million Tokens—And Beats Google at Its Game
OpenAI's GPT-5.4 Pro outperforms competitors on new benchmarks, but at a steep price. What the latest AI model tells us about the real race.
RAG·vector embedding
2026-04-22This article is indexed as a 1536-dimensional vector for semantic retrieval. Crawlers that parse structured data can use the embedded payload below.