Patch sprint: AbsURL, SQL quoting, health improvements, and a proper 404
A focused session today — no new features, just making Forge sharper and more correct in four areas that matter in real-world use.
forge.AbsURL()
forge.URL() has always returned root-relative paths by design. That's the right default for internal links, but og:url and <link rel="canonical"> need absolute URLs — and until today, developers had to manually prepend BaseURL themselves. Not anymore. forge.AbsURL(base, path) handles it cleanly, and forge-cms.dev is already using it throughout.
SQL identifier quoting
SQLRepo generates SQL from struct tags at runtime. If you happened to name a field order, group, or another reserved keyword, you'd get a cryptic SQL error with no obvious cause. All generated column names are now double-quoted, which is ANSI SQL and supported by both SQLite and PostgreSQL. Reserved keywords just work.
Framework versions in /_health
The health endpoint used to return {"status":"ok"} — useful for liveness checks but not much else. It now includes the versions of forge core and any companion modules (like forge-mcp) pulled directly from the binary's embedded build info. No extra build flags, no manual version strings. Deploy, hit /_health, and know exactly what's running.
As a bonus, the same versions are logged at startup, so they show up in docker logs right where you'd look first.
Health endpoint HTTPS bypass
Config.HTTPS: true previously caused /_health to return a 301 redirect — which breaks Caddy's health_uri check entirely. The endpoint now responds directly on plain HTTP regardless of the HTTPS setting. Internal infrastructure checks work correctly; external traffic still gets redirected.
Styled 404 pages
Forge has always enforced the content lifecycle correctly — archived, draft, and scheduled posts return 404, as they should. The presentation was just bare. There's now a styled 404 template that matches the site design, and unknown paths go through Forge's error handler so the experience is consistent everywhere.
Five small things. Each one closes a gap between "technically correct" and "actually pleasant to work with."