Home / Devlog / Phase 2 begins — MustConfig, OGDefaults, AppSchema, and shared partials

Phase 2 begins — MustConfig, OGDefaults, AppSchema, and shared partials

2 April 2026 forge phase-2 devlog

Building a site with Forge just got simpler. You can now set your Open Graph image, Twitter handle, and Organization structured data once for the whole site — and your nav and footer live in a single file instead of being copy-pasted into every template. That's what shipped today.

Phase 1 shipped MCP support in March. Today we started Phase 2 — the production foundation that makes Forge ready for real-world applications.

Four amendments landed in a single session:

A60 — MustConfig enforcement. forge.New() now calls MustConfig() internally. Invalid configuration — empty BaseURL or a Secret shorter than 16 bytes — panics at startup with a descriptive message instead of silently starting and failing at the first request. Fail fast is the right default.

A61 — OGDefaults and AppSchema. Two new SEOOption types registered via app.SEO(). OGDefaults sets app-level fallbacks for og:image, twitter:site, and twitter:creator. AppSchema registers app-level JSON-LD structured data — Organization, WebSite, or any schema.org type — emitted automatically in every page's <head> by forge:head. As part of this amendment, forge:head now receives the full TemplateData value instead of just Head, which is architecturally cleaner and enables future app-level additions without breaking the call site again.

A62 — Shared template partials. app.Partials(dir) loads all *.html files from a directory and makes them available in every module template. app.MustParseTemplate(path) does the same for custom handlers like a home page. Nav and footer live in one place. No more copy-paste across list, show, and home templates.