Changelog

What shipped, when.

Public-facing changes to plgd — API additions, pricing updates, agent surfaces, platform fixes. Curated highlights up top, raw commit history below.

Highlights

Aug 23, 2026

Embed mode (beta): your marketing site and your app on one domain

plgd content can now be served through your own app's domain: your app owns domain.com, and a rewrites block (GET /api/agent/embed-config returns it ready to paste) proxies pages, blog, feeds, and sitemap to plgd — app routes always win, CMS paths fall through. domain.com/blog SEO equity consolidates on your root domain, same-domain cookies work across marketing and app, and a plgd outage can never take your app down. Includes a /plgd-health probe that verifies the proxy end-to-end before you flip, and automatic 301s from the old plgd-hosted URLs so existing SEO equity migrates. Also fixed in this batch: IndexNow submissions now always use the tenant's canonical host (publishes from admin hosts were submitting admin URLs to search engines), and robots.txt no longer advertises a sitemap route that never existed.

Aug 23, 2026

Real versioning: date-based API version + a working machine changelog

The API now reports a date-based version (YYYY-MM-DD+sha of the deployed commit) in /api/openapi.json, the MCP server info, /changelog.json, and at the bottom of /llms-full.txt — replacing a hardcoded "1.0.0" that never changed. /changelog.json now includes these curated highlights and a real commit feed (commit data is baked at build time; it was silently empty in production because the runtime has no git). /llms-full.txt also documents the explicit versioning policy: no URL versioning, additive changes, stability tiers as the per-tool contract, deprecations announced here.

Aug 23, 2026

Docs-truth audit: audience preview, contact-by-id, and agent-side suppression are now real

An audit of the agent docs against the actual routes found four documented endpoints that did not exist. Three are now implemented as documented: POST /api/agent/audience/preview resolves audienceFilters to a recipient count + sample without sending (same resolution as a real send); GET/PATCH /api/agent/contacts/{id} fetches and updates a single contact, with shallow-merge metadata semantics and an explicit replace mode; and POST /api/agent/email/suppressions (new email-suppressions:write scope) lets an agent suppress an address — known contacts get the full unsubscribe flow including enrollment cancellation and sequence:unsubscribed webhooks. The fourth (an email-layout scaffold endpoint) was a doc error and the docs now say so. All-scope agent keys auto-expand to include the new scope.

Aug 23, 2026

Design systems: reference images + a browsable /design-system page

POST /api/agent/design-system/generate now accepts referenceImages — up to 4 screenshot URLs the generator reads for visual direction (type hierarchy, color temperature, spacing density, radius personality). References steer, never copy: layouts, logos, and exact hex values are ignored, and the written brief always wins. Every tenant with a design system also gets a live reference page at /design-system — token swatches, type specimens, spacing, motion, voice and tone, and the component library, rendered from the current tokens and kept out of search indexes.

Jul 5, 2026

One MCP integration for all your sites

Sign in with any Google account, own multiple sites through tenant memberships, and connect a single MCP integration that manages all of them: the OAuth consent screen now offers "All my sites", which issues a user-scoped key covering every site you are a member of, current and future. Every MCP tool gains a site argument (list_sites shows your options), memberships are re-checked on every request, and EDITOR-role sites are limited to content operations. No superadmin involved.

Jul 5, 2026

MCP connections from claude.ai and other OAuth clients

OAuth dynamic client registration is now RFC 7591-compliant: standard MCP clients (claude.ai custom connectors, Claude Code, MCP Inspector) register with just a redirect URI — no pre-known tenant or scopes required. Authorization now goes through an authenticated consent screen where you pick which site to connect and review the requested scopes before an agent key is issued. Public clients (PKCE, no secret) are supported, and token exchange enforces client authentication strictly.

Jul 5, 2026

Design-system versioning, artifact sync, and taste rules

The design system is now the enforced source of truth: Puck landing pages derive their theme variables from it, designSystem.version bumps on every change, and a design:sync job automatically regenerates the site chrome and drafts refreshed email templates at normal per-artifact rates (running campaigns are never touched). GET /api/agent/theme-info reports stale artifacts including creative pages, and the new GET /api/agent/taste-audit scans published pages for mechanical design tells. All AI generation — design systems, components, chrome, creative pages, emails — follows new anti-generic design rules based on the open-source taste-skill by Leonxlnx (MIT, github.com/Leonxlnx/taste-skill), with a persistent per-tenant taste profile.

May 1, 2026

Tenant chrome — shared nav and footer for default-layout sites

Every plgd-built site now has a coherent header and footer across blog, articles, and 404 pages — generated to match the design system, no per-page configuration. New API: POST /api/agent/site/generate-chrome (25¢).

Apr 30, 2026

Email template generator

New endpoint POST /api/agent/email/templates/generate produces inbox-safe HTML email templates styled to the tenant's design system. 30¢ per generation. Renders correctly in Gmail, Outlook, Apple Mail.

Apr 30, 2026

Pricing recalibration

Per-call pricing rebuilt against measured Anthropic costs. Creative pages 25¢→75¢, design system 25¢→30¢, story pipeline 25¢→40¢, articles in batch 2¢→5¢. New: 1¢ per email sent via Resend, 5¢ per AI image (was flat 15¢ surcharge). Most full sites now cost $3-5.

Apr 30, 2026

Hybrid plan model

Three tiers defined: Pay per call ($0/mo, default), Studio ($29/mo with $50 included credits), Scale ($99/mo with $200 included credits + higher rate limits). Stripe wiring pending.

Apr 29, 2026

Showcase + demo tenants

plgd.ai/showcase publishes three live, fully agent-built reference sites: Slow Press, Daybreak, Tendril. Each demo includes a deep-dive page with API receipts, design system tokens, articles, and email previews.

Apr 29, 2026

Agent discovery surfaces

Four ways for agents to use plgd: /llms-full.txt (reference), /api/openapi.json (schema), /api/mcp (protocol), /SKILL.md (Claude Code skill format). Each linked from the homepage agent section.

Commit feed

Aug 29, 2026cdc04f6Caching: bound the stale window, add feeds/sitemaps (stage 1)
Aug 28, 2026786af7cExperiment: CDN caching for blog paths via Vercel-CDN-Cache-Control
Aug 28, 20268c3c9e4Embed mode: correct the path-ownership docs after end-to-end validation
Aug 28, 202662cbb79Embed mode: replace the x-forwarded-host loop guard with an explicit marker
Aug 28, 202693811c1Embed mode (beta): tenant app owns the domain, plgd serves content paths
Aug 28, 2026453c61ePlatform batch: DS reference images + /design-system page, docs-truth endpoints, real versioning, canonical-host fixes
Aug 28, 20261b67659Vendor output-skill; enforce output completeness in generation + audit
Aug 22, 2026144d367Fix admin automation/campaign pages: relation-name mapping (crash + empty)
Aug 22, 20268aa8cc5Fix contact detail page: tags render + self-consistent engagement
Aug 21, 2026c5cdd43Sequences: send windows (hold drips to a local-time window)
Aug 21, 202658c8786Sequences: per-step send-time conditions (skip-if-tag)
Aug 21, 20262d99ee4PATCH sequence enrollment variables (mid-flight)
Aug 21, 20262ab37feMeasurement: feed time-range queries + per-step sequence analytics
Aug 21, 20263903410Harden remaining crons: route all through isAuthorizedCron
Aug 21, 202659eaf39Campaign POST idempotent by externalId; stop replaying cached 4xx
Aug 21, 20266a803d0scheduledAt: reliable auto-send via the enqueue+drain path
Aug 21, 2026766a679Campaign object: live-computed engagement (fix always-zero counters)
Aug 21, 20262a42790Fix strict-auth crons 401ing in prod (webhook delivery + agent-job queue down)
Aug 21, 20265cb7a6dAgent API: webhook /{id} routes, contact dup-resolve + email lookup, campaign archive
Aug 15, 20261a9fc70Fix spurious 'failed' enrollments from concurrent step advance + docs
Aug 15, 202671de819Fix sequence enroll 500 when re-enrolling a past-completed contact
Aug 14, 20264e0f75aSecurity batch: close audit-confirmed leaks + remove breaking-news AI crons
Aug 14, 2026905000bSecurity: strip tenant secrets from public page rendering
Jul 29, 2026c960877MCP 2026-07-28: RFC 9207 issuer identification + readiness record
Jul 25, 202693d6916Campaigns: GET lookup by externalId (idempotent find-then-PATCH) (#26)
Jul 22, 202609b7ec0Add suppressHydrationWarning to <html> (extension-injected attrs) (#25)
Jul 21, 20265faad08Fix Resend message-id capture + worker idempotency-collision handling (#24)
Jul 21, 2026c29e5b3Async campaign sends: enqueue + resumable drain worker (scales to 7k+) (#23)
Jul 21, 2026d06817eFix campaign Send-Now timing out mid-send (1k+ recipients) (#22)
Jul 21, 2026938e562Fix tagged-audience build (wrong Contact relation name) (#21)
Jul 20, 20260fdeecaTest send: timestamp the subject so Gmail stops trimming the body (#20)
Jul 20, 2026bce5b6aCampaigns: wrap sends in the layout (header/footer + unsubscribe) (#19)
Jul 20, 2026d47f505Campaigns: test send + preview, and fix Send-Now for inline content (#18)
Jul 20, 2026eae4ac6Admin: show inline email content on the campaign detail page (#17)
Jul 19, 202631e7d73Pages API: 400 on invalid status enum + revalidate/notify on write (#16)
Jul 7, 2026f2291c2Add missing SignupAttempt migration (schema/DB drift) (#15)
Jul 7, 2026ffb98d3Fix webhook subscribe allowlist drift + add delivery-health fields (#14)
Jul 6, 20267fa0360Harden domain/mailbox provisioning against abuse
Jul 6, 202636320b6Email domain setup instructions: Resend parity + agent-facing Migadu endpoint
Jul 6, 2026caeb894Domain setup: the add_domain response is now the user documentation
machine-readable feed → /changelog.json