HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
caddyserver
caddy
Go2015–2026
caddyserver / caddy

caddy

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

120Distinct people
214Mentions
2Explicit recommenders
79KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Hmm, went into this article skeptical, but came out agreeing with it more than I expected. Makes some excellent points, and highlights some real challenges of the ecosystem.…

mholt used a recommendation phrase. 2 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:03:16 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year214 dated mentions

Observed mentions: 2015-04-28 15:00:32 UTC to 2026-10-06 13:28:50 UTC.

0102030402015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 11 mentions; 1 submissions, 10 comments20152016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 10 mentions; 0 submissions, 10 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 40 mentions; 2 submissions, 38 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 8 mentions; 0 submissions, 8 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 22 mentions; 4 submissions, 18 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 28 mentions; 3 submissions, 25 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 11 mentions; 3 submissions, 8 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 36 mentions; 4 submissions, 32 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 21 mentions; 1 submissions, 20 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 13 mentions; 1 submissions, 12 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 9 mentions; 2 submissions, 7 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 5 mentions; 1 submissions, 4 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC11110
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC10010
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC40238
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC808
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC22418
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC28325
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC1138
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC36432
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC21120
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC13112
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC927
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC514

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
a project Every site on HTTPS Caddy is an extensible server platform that uses TLS by default. Releases · Documentation · Get Help           Powered by Special thanks to: Warp, built for coding with multiple AI agents Available for MacOS, Linux, & Windows Menu Features Install Build from source For development With version information and/or plugins Quick start Overview Full documentation Getting help About Features Easy configuration with the Caddyfile Powerful configuration with its native JSON config Dynamic configuration with the JSON API Config adapters if you don't like JSON Automatic HTTPS by default ZeroSSL and Let's Encrypt for public names Fully-managed local CA for internal names & IPs Can coordinate with other Caddy instances in a cluster Multi-issuer fallback Encrypted ClientHello (ECH) support Stays up when other servers go down due to TLS/OCSP/certificate-related issues Production-ready after serving trillions of requests and managing millions of TLS certificates Scales to hundreds of thousands of sites as proven in production HTTP/1.1, HTTP/2, and HTTP/3 all supported by default Highly extensible modular architecture lets Caddy do anything without bloat Runs anywhere with no external dependencies (not even libc) Written in Go, a language with higher memory safety guarantees than other servers Actually fun to use So much more to discover Install 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. Build from source Requirements: Go 1.26.0 or newer For development Note: These steps will not embed proper version information. For that, please follow the instructions in the next section. $ git clone "https://github.com/caddyserver/caddy.git" $ cd caddy/cmd/caddy/ $ go build When you run Caddy, it may try to bind to low ports unless otherwise specified in your config. If your OS requires elevated privileges for this, you will need to give your new binary permission to do so. On Linux, this can be done easily with: sudo setcap cap_net_bind_service=+ep ./caddy If you prefer to use go run which only creates temporary binaries, you can still do this with the included setcap.sh like so: $ go run -exec ./setcap.sh main.go If you don't want to type your password for setcap, use sudo visudo to edit your sudoers file and allow your user account to run that command without a password, for example: username ALL=(ALL:ALL) NOPASSWD: /usr/sbin/setcap replacing username with your actual username. Please be careful and only do this if you know what you are doing! We are only qualified to document how to use Caddy, not Go tooling or your computer, and we are providing these instructions for convenience only; please learn how to use your own computer at your own risk and make any needful adjustments. Then you can run the tests in all modules or a specific one: $ go test ./... $ go test ./modules/caddyhttp/tracing/ With version information and/or plugins Using our builder tool, xcaddy... $ xcaddy build ...the following steps are automated: Create a new folder: mkdir caddy Change into it: cd caddy Copy Caddy's main.go into the empty folder. Add imports for any custom plugins you want to add. Initialize a Go module: go mod init caddy (Optional) Pin Caddy version: go get github.com/caddyserver/caddy/v2@version replacing version with a git tag, commit, or branch name. (Optional) Add plugins by adding their import: _ "import/path/here" Compile: go build -tags=nobadger,nomysql,nopgx 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. 🙂 Overview Caddy is most often used as an HTTPS server, but it is suitable for any long-running Go program. First and foremost, it is a platform to run Go applications. Caddy "apps" are just Go programs that are implemented as Caddy modules. Two apps -- tls and http -- ship standard with Caddy. Caddy apps instantly benefit from automated documentation, graceful on-line config changes via API, and unification with other Caddy apps. Although JSON is Caddy's native config language, Caddy can accept input from config adapters which can essentially convert any config format of your choice into JSON: Caddyfile, JSON 5, YAML, TOML, NGINX config, and more. The primary way to configure Caddy is through its API, but if you prefer config files, the command-line interface supports those too. Caddy exposes an unprecedented level of control compared to any web server in existence. In Caddy, you are usually setting the actual values of the initialized types in memory that power everything from your HTTP handlers and TLS handshakes to your storage medium. Caddy is also ridiculously extensible, with a powerful plugin system that makes vast improvements over other web servers. To wield the power of this design, you need to know how the config document is structured. Please see our documentation site for details about Caddy's config structure. Nearly all of Caddy's configuration is contained in a single config document, rather than being scattered across CLI flags and env variables and a configuration file as with other web servers. This makes managing your server config more straightforward and reduces hidden variables/factors. Full documentation Our website has complete documentation: https://caddyserver.com/docs/ The docs are also open source. You can contribute to them here: https://github.com/caddyserver/website Getting help We advise companies using Caddy to
Read the full README on GitHub

What Hacker News says

214 sources
It's strange: SSL certificates (and maybe domain name registrations?) are one of the only "ticking time bomb" elements present in every modern web stack, whether a static site or not. By "ticking time bomb" I mean that there's a hard date N weeks/months from now where your site will definitely stop working, unless some external pile of dependencies work smoothly to extend that date. Software didn't have that sort of "ticking time bomb" element before, I think? I think I understand why it's necessary: we have a single, globally shared public namespace of domain names, which we accept will turn over their ownership over the long run, just like real estate changes hands. So we need expiration dates to invalidate "stale" records. We've already switched over everything to Let's Encrypt. But I don't think anyone should be under the delusion tha
Read the rest
t automation / ACME is failproof: https://github.com/certbot/certbot/issues?q=is%3Aissue%20ren... https://github.com/cert-manager/cert-manager/issues?q=is%3Ai... https://github.com/caddyserver/caddy/issues?q=is%3Aissue%20A... (These are generally not issues with the software per se, but misconfiguration, third-party DNS API weirdness, IPv6, rate limits, or other weird edge cases.) Anyway, a gentle reminder that Let's Encrypt suggests monitoring your SSL certificates may be "helpful": https://letsencrypt.org/docs/monitoring-options/ (Full disclosure: I wrote the most recent addition to that list, with the "self-hosted scripts".)
In SSL certificate requirements are becoming obnoxious
But it's not on by default, right..? (i.e. is there a particular config needed for that?) I'm using Caddy here and it's not falling back on ZeroSSL. Thanks for your help EDIT: hmm, it should be automatic...! https://caddyserver.com/docs/automatic-https#issuer-fallback interesting, I'll double check my config woah... it's probably related to this! https://github.com/caddyserver/caddy/issues/7084 TLDR: "Caddy doesn't fall back to ZeroSSL for domains added using API" (which is my case)
In LetsEncrypt Outage
https://github.com/caddyserver/caddy/issues/5759 : > When generating a CA cert via caddy and putting that in the trust store, those private keys can also forge certificates for any other domain. RFC5280 (2008) "Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile" > Section 4.2.1.10 Name Constraints: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.... : > The name constraints extension, which MUST be used only in a CA certificate, indicates a name space within which all subject names in subsequent certificates in a certification path MUST be located. Restrictions apply to the subject distinguished name and apply to subject alternative names. Restrictions apply only when the specified name form is present. If no name of the type is in the certificate, the certificate is acceptabl
Read the rest
e. > Name constraints are not applied to self-issued certificates (unless the certificate is the final certificate in the path). (This could prevent CAs that use name constraints from employing self-issued certificates to implement key rollover.)
In Setting up a trusted, self-signed SSL/TLS certificate authority in Linux

Showing the 15 most recent of 214 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.