Signup
Same-origin forms on the site itself
Pages can post to /newsletter/signup without needing the site publishing path to become an app server.
htmlctl / Extension Page
A newsletter is the kind of feature that can easily push a website stack toward application complexity: signups, verification, unsubscribe flows, campaigns, send tracking, and provider integration. In `htmlctl`, that behavior lives in an extension, not in the core publishing system. That is the point.
Same-origin
Signup and verify under the site’s own domain
Tracked
Campaign sends, previews, unsubscribe state
Separate
Runtime service outside the asset publishing core
Why this matters
If the core website system absorbs newsletters directly, it starts accumulating signup logic, token flows, mail provider integration, campaign storage, send pacing, and operator workflows. Very quickly the “simple publishing system” is actually becoming an application framework in disguise.
Keep the website system focused on what agents need most: generating and publishing assets fast and safely. Put the newsletter into a dedicated extension service with its own runtime, and expose it through a declared site path. You get the feature without sacrificing the shape of the system.
What the newsletter extension handles
Signup
Pages can post to /newsletter/signup without needing the site publishing path to become an app server.
Verification
Verification and unsubscribe flows are served under the site’s own URLs while the runtime stays isolated on the host.
Campaigns
Operators can preview a campaign, store canonical HTML/text bodies, and send with explicit pacing when provider limits demand it.
State
Subscriber confirmation, unsubscribe state, and per-campaign delivery tracking stay in the extension’s own data model.
Operations
Before traffic is routed, the extension can be validated against the current client and server versions. That keeps runtime adoption disciplined.
Core protection
The newsletter is proof that the system can gain dynamic power without requiring every agent-authored site change to inherit application-framework complexity.
What operators actually do
Run the service separately with its own env vars, secrets, database, and loopback listener.
Check compatibility, add the backend route, and verify the runtime behavior on staging before prod cutover.
Website content can move through preview and promote. Newsletter campaigns remain operator actions within the extension runtime.
Next step
The newsletter extension makes more sense once you see it as part of a larger principle: `htmlctl` is for agents, and dynamic behavior should only appear where the site actually needs it.