Fortify Development
coollabsio/coolify
ACTIVATE when the user works on authentication in Laravel. An agent skill from coollabsio/coolify.
Mount authenticate and authorize handlers, separate portal and protected routes, align auth URLs, and preserve trusted proxy metadata.
$ npx skills add greenpau/caddy-security --skill configuration-http-integrations -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install greenpau/caddy-security configuration-http-integrations --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/greenpau/caddy-security.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.codex/skills/configuration-http-integrations .claude/skills/configuration-http-integrations && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "configuration-http-integrations" agent skill from https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrations into .claude/skills/configuration-http-integrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configuration-http-integrations", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrationsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add greenpau/caddy-security --skill configuration-http-integrations -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install greenpau/caddy-security configuration-http-integrations --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenpau/caddy-security.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.codex/skills/configuration-http-integrations .agents/skills/configuration-http-integrations && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "configuration-http-integrations" agent skill from https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrations into .agents/skills/configuration-http-integrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configuration-http-integrations", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add greenpau/caddy-security --skill configuration-http-integrations -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install greenpau/caddy-security configuration-http-integrations --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenpau/caddy-security.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.codex/skills/configuration-http-integrations .cursor/skills/configuration-http-integrations && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "configuration-http-integrations" agent skill from https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrations into .cursor/skills/configuration-http-integrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configuration-http-integrations", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/greenpau/caddy-security.git --path .codex/skills/configuration-http-integrations--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add greenpau/caddy-security --skill configuration-http-integrations -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install greenpau/caddy-security configuration-http-integrations --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenpau/caddy-security.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.codex/skills/configuration-http-integrations .gemini/skills/configuration-http-integrations && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "configuration-http-integrations" agent skill from https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrations into .gemini/skills/configuration-http-integrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configuration-http-integrations", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install greenpau/caddy-security configuration-http-integrationsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add greenpau/caddy-security --skill configuration-http-integrations -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/greenpau/caddy-security.git skills-src && mkdir -p .github/skills && cp -r skills-src/.codex/skills/configuration-http-integrations .github/skills/configuration-http-integrations && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "configuration-http-integrations" agent skill from https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrations into .github/skills/configuration-http-integrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configuration-http-integrations", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add greenpau/caddy-security --skill configuration-http-integrations -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install greenpau/caddy-security configuration-http-integrations --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/greenpau/caddy-security.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.codex/skills/configuration-http-integrations .opencode/skills/configuration-http-integrations && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "configuration-http-integrations" agent skill from https://github.com/greenpau/caddy-security/tree/main/.codex/skills/configuration-http-integrations into .opencode/skills/configuration-http-integrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "configuration-http-integrations", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
configuration-http-integrationsMount authenticate and authorize handlers, separate portal and protected routes, align auth URLs, and preserve trusted proxy metadata.
Configuration HTTP Integrations is an agent skill from greenpau/caddy-security. Mount authenticate and authorize handlers, separate portal and protected routes, align auth URLs, and preserve trusted proxy metadata. Use for path conflicts, split hosts, public JWKS, and route ordering.
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `agents/openai.yaml`, `references/edge-trust.md` and `references/portal-mounts.md`).
It sits in Backend & APIs, covering Authentication. The repository describes itself as: 🔐 Authentication, Authorization, and Accounting (AAA) App and Plugin for Caddy v2. 💎 Implements Form-Based, Basic, Local, LDAP, OpenID Connect, OAuth 2.0 (Github, Google…. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit a48553d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are caddyfile).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
JWT_SHARED_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Configuration HTTP Integrations loads about 3.2k tokens when it runs, and up to ~5.5k if it reads all its reference files. Until then it costs about 59 tokens; SKILL.md has 1,398 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from greenpau/caddy-security at commit a48553d, republished under its Apache-2.0 licence (© greenpau). 1,398 words, ~3,231 tokens.
.claude/skills/configuration-http-integrations/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.Use this skill to wire caddy-security's route-level HTTP integrations:
authenticate [<matcher>] with <portal> and
authorize [<matcher>] with <policy>.
The security app defines authentication portals and authorization policies;
the HTTP integrations attach those configured objects to Caddy routes.
Portal internals belong to configuration-authentication;
policy internals belong to configuration-authorization.
Route mounting does not require reloading either owner unless its configuration
also needs changes.
Prefer names that reveal the referenced object type in generated examples, such
as myportal or local_portal for portals and app_policy or local_policy
for policies. Policy names are not required to end in _policy, but the suffix
makes authorize with <policy> intent clear.
Use authentication portal myportal with authenticate with myportal, or choose
a descriptive portal name. Avoid authentication portal portal in examples,
fixtures, and tests; the repeated word obscures the declaration's name.
Read these files when details matter:
plugin_authn.go for authenticate syntax and directive order.plugin_authz.go for authorize syntax and directive order.assets/config/Caddyfile, assets/config/home.Caddyfile, and
assets/config/multiportal.Caddyfile for current route shapes.testdata/caddyfile_adapt/testcase_authenticate_ok.Caddyfile,
testdata/caddyfile_adapt/testcase_authorize_ok.Caddyfile, and
testdata/caddyfile_adapt/testcase_authenticate_with_registration.Caddyfile
for focused adapt fixtures.Cross-device login uses the existing portal handler for its entire mount-relative
/cross-device namespace. Preserve the prefix and library strict-origin
Referrer-Policy; no extra handler or CORS layer is needed. Provider realms named
cross-device retain their own namespace. Use
configuration-authentication-cross-device
to review transfer paths, HTTPS/Origin boundaries and root/nested mount tests.
The selected Caddy v2.11.7 limits request headers to 16 KiB by default and
defaults idle request-body reads and response writes to 60 seconds. Review
large JWT/cookie sets and slow uploads or streams when upgrading. Tune Caddy's
global servers options (max_header_size, timeouts read_body_idle and
timeouts write_idle) only for a measured deployment need; these are host
settings, not security directives. An idle deadline measures stalled I/O,
not the whole request duration.
Caddy drops incoming dot-containing headers by default and controls underscore
headers separately. Prefer ordinary hyphenated names for identity and proxy
metadata. If a trusted integration needs other spellings, configure the host's
expected_dot_headers or expected_underscore_headers deliberately and review
hyphen/underscore/dot aliases together. The allowlists do not establish trust in
client-supplied identity; trusted-proxy and authorization rules still apply.
The legacy Caddy authentication chain buffers individual provider responses
when several providers are configured. Only the successful provider's response
headers are retained; a failed provider must not contaminate another provider's
success. Current authorize routes use AuthorizationHandler directly and
preserve handled gatekeeper responses. See the published
v2.11.6 changes and
v2.11.7 fixes.
authenticate serves the authentication portal. Put it on the portal host or
portal path, such as /auth and /auth/*. It is not the access-control layer for a file
server or upstream app.
authorize protects resource routes. It loads an authorization policy, checks
tokens or configured auth proxy methods, injects authenticated identity where
configured, and redirects unauthenticated browser users to the policy's auth
URL.
Keep portal and protected-resource routes separate:
example.com {
@portal path /auth /auth/*
route @portal {
authenticate with myportal
}
route /app* {
authorize with app_policy
reverse_proxy 127.0.0.1:8080
}
}For same-host browser login, put the portal route before a catch-all protected
route so the portal is not itself protected by authorize:
https://localhost:8443 {
@portal path /auth /auth/*
route @portal {
authenticate with local_portal
}
route {
authorize with local_policy
root * /srv/files
file_server browse
}
}The referenced policy should point browser users to the portal:
authorization policy local_policy {
crypto key verify {env.JWT_SHARED_KEY}
set auth url /auth
allow roles authp/user
}For split-host deployments, put authenticate on the auth host and authorize
only on the protected app or asset host. Use a full auth URL when the portal is
on a different host. A redirect alone does not transfer a host-only access
cookie to the app host. For browser access across sibling hosts, coordinate the
access-cookie domain/path, its policy-discovered name, and signing/verification
keys; only trusted hosts may share that domain. OIDC/refresh cookies retain
their own host and issuer constraints and must not be broadened automatically.
Use configuration-authentication-cookies
to configure cross-host access-cookie scope and validate prefix restrictions.
For unrelated domains, a shared Domain attribute is impossible; choose an
explicit token or separate authentication integration instead.
Caddy owns trusted-proxy selection. The plugins preserve the trusted host and client-address interpretation before authcrunch sees a request; arbitrary forwarded headers cannot establish it. Read edge trust for direct/forwarded behavior, duplicate hints, current IPv6 limits, exact mount matching, and verification through actual Caddy TLS.
The portal serves access-token public keys at
<mount>/.well-known/jwks.json through the existing authenticate handler.
Place the portal before any protected catch-all and use path-segment
boundaries when the deployment must keep neighboring prefixes private:
example.com {
@portal path /auth /auth/*
route {
route @portal {
authenticate with myportal
}
route {
authorize with app_policy
reverse_proxy 127.0.0.1:8080
}
}
}This routes /auth/.well-known/jwks.json publicly while /authentication/
stays under the policy. A /tenant/auth mount uses /tenant/auth and
/tenant/auth/* in the matcher. A dedicated root portal exposes
/.well-known/jwks.json with the existing root authenticate route.
Do not put authorize before authenticate on the portal route or add a
generic suffix-based bypass to the gatekeeper. Caddy owns mount selection;
the library owns public discovery, method validation, and serialization.
There is no discovery enable directive. See
the HTTP contract.
Direct OAuth without a portal uses the policy's own callback/logout namespace.
Route that namespace and application resources through the same authorize
handler. See direct OAuth.
The directive now emits http.handlers.authorization, which preserves handled
responses without allowing the protected handler to run. Legacy manually written
JSON using authentication.providers.authorizer retains Caddy's generic
authentication-chain behavior and should be regenerated for direct OAuth.
Keep POST <mount>/api/refresh_token, /api/refresh_session, and /api/logout
on the complete, unstripped portal route before any protected catch-all.
Portal.ServeHTTP authenticates these operations using their own credentials,
so expired access can renew or log out; other APIs stay protected. Forward the
refresh/session headers, Origin/Fetch Metadata, cookies and body unchanged.
Do not add retries, CORS allowances or gatekeeper suffix bypasses.
Serve <mount>/assets/js/refresh.js, continuation, fresh login and logout
confirmation through that same portal. Use top-level portal navigation for
external application continuation; a GET link to /api/refresh_token is invalid.
The embedded client does not renew arbitrary cross-origin applications.
See the browser HTTP/UI contract.
Native JSON login uses POST <mount>/login on the same unstripped portal route
and requires neither admin nor profile APIs. Preserve the JSON body and error
status/metadata. Do not synthesize Cookie, Origin or Fetch Metadata headers for
native requests, strip supplied browser headers to evade transport validation,
or infer an OIDC browser session from a bearer/API-key credential. The public Go
client and explicit native refresh/logout contract are documented separately in
JSON/native interoperability.
Default to exact /auth plus /auth/*, and point the policy's auth URL at that
mount. If the upstream owns /auth, choose another namespace; a dedicated auth
host can mount at /. Read portal mount patterns
for routing fragments, required declarations, path preservation, and split-host alignment.
Portal endpoint names constrain custom mount choices. Check the reserved path contract before choosing a prefix; an upstream namespace collision is resolved by moving the portal mount and its auth URL together.
Prefer route blocks for clarity:
@portal path /auth /auth/*
route @portal {
authenticate with myportal
}
route /api/* {
authorize with api_policy
reverse_proxy 127.0.0.1:9000
}The optional matcher form is valid when it keeps the surrounding Caddyfile smaller:
@portal path /auth /auth/*
authenticate @portal with myportal
authorize /api/* with api_policyThe portal or policy name must match a configured object in the security app.
Keep subconfiguration inside authentication portal <name> and
authorization policy <name> blocks. Do not put policy internals, such as
with api key auth ..., under the route-level authorize directive; the route
handler parser reads only the directive arguments.
Do not generate global Caddy directive-order overrides for caddy-security:
{
order authenticate before respond
order authorize before file_server
}Also do not generate order authorize before basicauth by default. The plugin
already registers its order in code:
authenticate before respondauthorize before basicauthOnly add global order directives when debugging a proven directive-order
conflict with another third-party plugin, and explain the conflicting directive
order. Do not use global order directives as a default fix for login failures,
redirect loops, or authorization denials.
Legacy docs-site examples and old solution briefs may still include global
order authenticate before respond and order authorize before basicauth
lines. Treat those examples as historical route-shape references, not as
current guidance to copy into new Caddyfiles.
When changing Caddyfile examples or fixtures, validate with the narrowest
adapt-focused test from testing-and-ci. For skill-only edits, run the skill
validator from skill-creator.
/auth and descendants reach the portal; /authentic does not. Protected
handlers receive no call after denial or a handled OAuth callback.© greenpau, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in .codex/skills/configuration-http-integrations of greenpau/caddy-security.
Open the folder on GitHubat commit a48553d
Configuration HTTP Integrations next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Configuration HTTP Integrations this skillgreenpau/caddy-security | 2.3k | — | ~3.2k | Automated safety check: Pass | Apache-2.0 | |
| Fortify Developmentcoollabsio/coolify | 63k | 4 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Supabase Development and Debuggingsupabase/agent-skills | 2.7k | 3 repos | ~3.6k | Automated safety check: Pass | MIT | |
| Better Auth Best Practiceslatitude-dev/latitude-llm | 4.7k | 7 repos | ~1.6k | Automated safety check: Pass | MIT | |
| Supabasecurvenote/curvenote | 169 | 5 repos | ~2.2k | Automated safety check: Pass | Custom licence | |
| Gitnexus Exploringaws-samples/sample-kolya-br-proxy | 106 | 11 repos | ~749 | Automated safety check: Pass | MIT-0 |
coollabsio/coolify
ACTIVATE when the user works on authentication in Laravel. An agent skill from coollabsio/coolify.
supabase/agent-skills
General Supabase skill for database, auth, Edge Functions, Realtime and storage work, plus client libraries, migrations, security audits, debugging and reading logs.
latitude-dev/latitude-llm
Configure Better Auth server and client, set up database adapters, manage sessions, add plugins, and handle environment variables.
curvenote/curvenote
A skill your agent uses when doing ANY task involving Supabase.
aws-samples/sample-kolya-br-proxy
A skill your agent uses when the user asks how code works, wants to understand architecture, trace execution flows, or explore unfamiliar parts of the codebase.
coinbase/agentic-wallet-skills
Crypto wallet operations via the awal CLI — sign in, check balances, send USDC/ETH/POL/SOL, trade tokens, fund the wallet, and use the x402 payment protocol to discover paid services, pay for API…
greenpau/caddy-security
Build or troubleshoot portal JSON/native login clients, refresh, profile and admin APIs, and public JWKS.
greenpau/caddy-security
Implement or review caddy-security Go code, Caddy modules, parsers, lifecycle, and HTTP delegation.
greenpau/caddy-security
Build or review caddy-security Caddyfiles and select focused configuration skills.
greenpau/caddy-security
Configure portal/policy JWT keys, token names and lifetimes, key loading and generation, public-key discovery, and System API encryption keys.
greenpau/caddy-security
Configure durable AuthCrunch runtime state, exclusive storage ownership, stop/start persistence, reload rejection, and recovery.
greenpau/caddy-security
Configure static local accounts, required identity fields, trusted password imports, bcrypt API keys, roles, and stored challenge rules.
Categories
Mount authenticate and authorize handlers, separate portal and protected routes, align auth URLs, and preserve trusted proxy metadata. Configuration HTTP Integrations is an agent skill from greenpau/caddy-security. Mount authenticate and authorize handlers, separate portal and protected routes, align auth URLs, and preserve trusted proxy metadata.
Configuration HTTP Integrations fits situations like: tasks that involve Authentication.
Run `npx skills add greenpau/caddy-security --skill configuration-http-integrations -a claude-code`. Or copy the skill folder (.codex/skills/configuration-http-integrations in greenpau/caddy-security) into .claude/skills/configuration-http-integrations in your project. Claude Code loads it when a task matches its description.
Run `npx skills add greenpau/caddy-security --skill configuration-http-integrations -a codex`. Or copy the skill folder (.codex/skills/configuration-http-integrations in greenpau/caddy-security) into .agents/skills/configuration-http-integrations in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add greenpau/caddy-security --skill configuration-http-integrations -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/configuration-http-integrations, .gemini/skills/configuration-http-integrations, .github/skills/configuration-http-integrations and .opencode/skills/configuration-http-integrations in your project.
Going by SKILL.md and its folder, Configuration HTTP Integrations needs credentials named JWT_SHARED_KEY. Our summary lists: A credential in JWT_SHARED_KEY.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Configuration HTTP Integrations is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Configuration HTTP Integrations: Fortify Development (coollabsio/coolify, 63k stars), Supabase Development and Debugging (supabase/agent-skills, 2.7k stars), Better Auth Best Practices (latitude-dev/latitude-llm, 4.7k stars) and Supabase (curvenote/curvenote, 169 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
greenpau (a GitHub user) maintains it in greenpau/caddy-security, which has 2,251 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 5, 2026.
Source: greenpau/caddy-security on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.