{"version":"2026-08-29+cdc04f6","generatedAt":"2026-09-02T04:57:56.351Z","highlights":[{"date":"2026-08-23","title":"Embed mode (beta): your marketing site and your app on one domain","summary":"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."},{"date":"2026-08-23","title":"Real versioning: date-based API version + a working machine changelog","summary":"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."},{"date":"2026-08-23","title":"Docs-truth audit: audience preview, contact-by-id, and agent-side suppression are now real","summary":"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."},{"date":"2026-08-23","title":"Design systems: reference images + a browsable /design-system page","summary":"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."},{"date":"2026-07-05","title":"One MCP integration for all your sites","summary":"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."},{"date":"2026-07-05","title":"MCP connections from claude.ai and other OAuth clients","summary":"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."},{"date":"2026-07-05","title":"Design-system versioning, artifact sync, and taste rules","summary":"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."},{"date":"2026-05-01","title":"Tenant chrome — shared nav and footer for default-layout sites","summary":"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¢)."},{"date":"2026-04-30","title":"Email template generator","summary":"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."},{"date":"2026-04-30","title":"Pricing recalibration","summary":"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."},{"date":"2026-04-30","title":"Hybrid plan model","summary":"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."},{"date":"2026-04-29","title":"Showcase + demo tenants","summary":"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."},{"date":"2026-04-29","title":"Agent discovery surfaces","summary":"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."}],"count":100,"commits":[{"hash":"cdc04f6b1f5c50a6f83b265c64a9b454204a99b2","shortHash":"cdc04f6","date":"2026-08-29T10:58:56-07:00","author":"Danish Ahmed","subject":"Caching: bound the stale window, add feeds/sitemaps (stage 1)"},{"hash":"786af7cc304accb042102814994a1f0bda282ad0","shortHash":"786af7c","date":"2026-08-28T16:58:07-07:00","author":"Danish Ahmed","subject":"Experiment: CDN caching for blog paths via Vercel-CDN-Cache-Control"},{"hash":"8c3c9e416b7e3fcde65baa1e573dceb2472866d2","shortHash":"8c3c9e4","date":"2026-08-28T16:36:21-07:00","author":"Danish Ahmed","subject":"Embed mode: correct the path-ownership docs after end-to-end validation"},{"hash":"62cbb7982be0fff87e91021c93a49d2b766b3ce8","shortHash":"62cbb79","date":"2026-08-28T16:02:01-07:00","author":"Danish Ahmed","subject":"Embed mode: replace the x-forwarded-host loop guard with an explicit marker"},{"hash":"93811c19dc8a4d8193fd36c6a8b4e4d0e9e4697e","shortHash":"93811c1","date":"2026-08-28T13:33:39-07:00","author":"Danish Ahmed","subject":"Embed mode (beta): tenant app owns the domain, plgd serves content paths"},{"hash":"453c61e78676f3f0027d77a2fad28d8659caad23","shortHash":"453c61e","date":"2026-08-28T13:33:28-07:00","author":"Danish Ahmed","subject":"Platform batch: DS reference images + /design-system page, docs-truth endpoints, real versioning, canonical-host fixes"},{"hash":"1b676597070b3f2ca4e3eeed39668220a3afba74","shortHash":"1b67659","date":"2026-08-28T13:33:11-07:00","author":"Danish Ahmed","subject":"Vendor output-skill; enforce output completeness in generation + audit"},{"hash":"144d367f686d1db838a13cbbbebbc34cf381540a","shortHash":"144d367","date":"2026-08-22T16:06:42-07:00","author":"Danish Ahmed","subject":"Fix admin automation/campaign pages: relation-name mapping (crash + empty)"},{"hash":"8aa8cc53d07c487273e57f0f4d450986e29d3ebf","shortHash":"8aa8cc5","date":"2026-08-22T15:53:07-07:00","author":"Danish Ahmed","subject":"Fix contact detail page: tags render + self-consistent engagement"},{"hash":"c5cdd435941a1a5ce5eed800b19fb86aacdcebab","shortHash":"c5cdd43","date":"2026-08-21T13:36:33-07:00","author":"Danish Ahmed","subject":"Sequences: send windows (hold drips to a local-time window)"},{"hash":"58c8786a3c9cb99fc2fd084f2a36ea25b31be46d","shortHash":"58c8786","date":"2026-08-21T12:46:01-07:00","author":"Danish Ahmed","subject":"Sequences: per-step send-time conditions (skip-if-tag)"},{"hash":"2d99ee4116cda285251b0ea2d7e5813a5fafd82f","shortHash":"2d99ee4","date":"2026-08-21T12:33:56-07:00","author":"Danish Ahmed","subject":"PATCH sequence enrollment variables (mid-flight)"},{"hash":"2ab37fe8b6c1b0ec277e180c47535acb97cb89ae","shortHash":"2ab37fe","date":"2026-08-21T12:29:31-07:00","author":"Danish Ahmed","subject":"Measurement: feed time-range queries + per-step sequence analytics"},{"hash":"390341020459b011000348d669a2e5bb8921a84f","shortHash":"3903410","date":"2026-08-21T12:20:34-07:00","author":"Danish Ahmed","subject":"Harden remaining crons: route all through isAuthorizedCron"},{"hash":"59eaf398a3bc46a714d4e9b48e9048b15feec551","shortHash":"59eaf39","date":"2026-08-21T11:59:16-07:00","author":"Danish Ahmed","subject":"Campaign POST idempotent by externalId; stop replaying cached 4xx"},{"hash":"6a803d0bd09227762038094ed59dc3d02631f3ef","shortHash":"6a803d0","date":"2026-08-21T11:55:44-07:00","author":"Danish Ahmed","subject":"scheduledAt: reliable auto-send via the enqueue+drain path"},{"hash":"766a67909d08bce5e0ad8139806b48c1ffe55407","shortHash":"766a679","date":"2026-08-21T11:14:08-07:00","author":"Danish Ahmed","subject":"Campaign object: live-computed engagement (fix always-zero counters)"},{"hash":"2a42790df3254b2b93b8d9e9bb0dbcf804e70805","shortHash":"2a42790","date":"2026-08-21T09:45:23-07:00","author":"Danish Ahmed","subject":"Fix strict-auth crons 401ing in prod (webhook delivery + agent-job queue down)"},{"hash":"5cb7a6d9c20f72b4e6304378d90b8dae674ed9f2","shortHash":"5cb7a6d","date":"2026-08-21T09:40:10-07:00","author":"Danish Ahmed","subject":"Agent API: webhook /{id} routes, contact dup-resolve + email lookup, campaign archive"},{"hash":"1a9fc70b9912e126fca49a5182cfa16ab4f8d60c","shortHash":"1a9fc70","date":"2026-08-15T15:45:02-07:00","author":"Danish Ahmed","subject":"Fix spurious 'failed' enrollments from concurrent step advance + docs"},{"hash":"71de8197430174e1a1cbaf253f53bb3e06c099dd","shortHash":"71de819","date":"2026-08-15T15:40:38-07:00","author":"Danish Ahmed","subject":"Fix sequence enroll 500 when re-enrolling a past-completed contact"},{"hash":"4e0f75ad16cf2bda3ea061b49f8e87b1a775f9d8","shortHash":"4e0f75a","date":"2026-08-14T12:18:36-07:00","author":"Danish Ahmed","subject":"Security batch: close audit-confirmed leaks + remove breaking-news AI crons"},{"hash":"905000b77bcd926900dd66348cd6fef0b3a9bccf","shortHash":"905000b","date":"2026-08-14T09:44:00-07:00","author":"Danish Ahmed","subject":"Security: strip tenant secrets from public page rendering"},{"hash":"c9608778fe41801430d52769b7b5263bb64f4e04","shortHash":"c960877","date":"2026-07-29T04:48:10+00:00","author":"Claude","subject":"MCP 2026-07-28: RFC 9207 issuer identification + readiness record"},{"hash":"93d6916575eccf72267f5b5525c0816d55953a53","shortHash":"93d6916","date":"2026-07-25T15:24:53-07:00","author":"Danish Ahmed","subject":"Campaigns: GET lookup by externalId (idempotent find-then-PATCH) (#26)"},{"hash":"09b7ec0ae037026e9a80efbf5f2cb59cfe741379","shortHash":"09b7ec0","date":"2026-07-22T08:55:11-07:00","author":"Danish Ahmed","subject":"Add suppressHydrationWarning to <html> (extension-injected attrs) (#25)"},{"hash":"5faad08cedeb0704c3cc68875e04e1283fba3747","shortHash":"5faad08","date":"2026-07-21T16:34:07-07:00","author":"Danish Ahmed","subject":"Fix Resend message-id capture + worker idempotency-collision handling (#24)"},{"hash":"c29e5b34d0daabdc667d319dbe64e5a201026506","shortHash":"c29e5b3","date":"2026-07-21T13:45:07-07:00","author":"Danish Ahmed","subject":"Async campaign sends: enqueue + resumable drain worker (scales to 7k+) (#23)"},{"hash":"d06817ee5b434a949f5bbc03c902920a3506f954","shortHash":"d06817e","date":"2026-07-21T08:32:06-07:00","author":"Danish Ahmed","subject":"Fix campaign Send-Now timing out mid-send (1k+ recipients) (#22)"},{"hash":"938e5621a6f2566c0b69a1656a1234387f7a16f7","shortHash":"938e562","date":"2026-07-20T17:21:52-07:00","author":"Danish Ahmed","subject":"Fix tagged-audience build (wrong Contact relation name) (#21)"},{"hash":"0fdeecaf5e2377cd3f6b05066ebbb863ea5a4ed7","shortHash":"0fdeeca","date":"2026-07-20T12:21:29-07:00","author":"Danish Ahmed","subject":"Test send: timestamp the subject so Gmail stops trimming the body (#20)"},{"hash":"bce5b6ab132252e7b6a29a350d13c35d68fae61a","shortHash":"bce5b6a","date":"2026-07-20T11:32:03-07:00","author":"Danish Ahmed","subject":"Campaigns: wrap sends in the layout (header/footer + unsubscribe) (#19)"},{"hash":"d47f505510ba9143642e729eedc98497287601f6","shortHash":"d47f505","date":"2026-07-20T09:09:00-07:00","author":"Danish Ahmed","subject":"Campaigns: test send + preview, and fix Send-Now for inline content (#18)"},{"hash":"eae4ac6494429cdda6b8bfb59e540869f0b21b99","shortHash":"eae4ac6","date":"2026-07-19T18:18:54-07:00","author":"Danish Ahmed","subject":"Admin: show inline email content on the campaign detail page (#17)"},{"hash":"31e7d73b491d193a763c78f54f808e7dfd7eaaca","shortHash":"31e7d73","date":"2026-07-19T16:37:50-07:00","author":"Danish Ahmed","subject":"Pages API: 400 on invalid status enum + revalidate/notify on write (#16)"},{"hash":"f2291c288330e0d3285f9d33840097c46cd02569","shortHash":"f2291c2","date":"2026-07-06T17:47:10-07:00","author":"Danish Ahmed","subject":"Add missing SignupAttempt migration (schema/DB drift) (#15)"},{"hash":"ffb98d37900635eca7aa3bd005678922acf8419b","shortHash":"ffb98d3","date":"2026-07-06T17:47:08-07:00","author":"Danish Ahmed","subject":"Fix webhook subscribe allowlist drift + add delivery-health fields (#14)"},{"hash":"7fa036080ea67f1eaff65a8a1b87e10841cb43c5","shortHash":"7fa0360","date":"2026-07-06T18:17:58+00:00","author":"Claude","subject":"Harden domain/mailbox provisioning against abuse"},{"hash":"36320b611fbc1a58446a7d9ee78487d2af6690df","shortHash":"36320b6","date":"2026-07-06T17:59:14+00:00","author":"Claude","subject":"Email domain setup instructions: Resend parity + agent-facing Migadu endpoint"},{"hash":"caeb89415702d0ae8220d959e0a6ba98e4f20dd2","shortHash":"caeb894","date":"2026-07-06T17:33:29+00:00","author":"Claude","subject":"Domain setup: the add_domain response is now the user documentation"},{"hash":"6d28de2c1b7923247de1a49362f1c7a48c7049cb","shortHash":"6d28de2","date":"2026-07-06T02:00:55+00:00","author":"Claude","subject":"Mandate JSON-LD in creative pages; add mobile/AEO checks to taste audit"},{"hash":"fb72d242aad5ed6eb50b28df05e725510c0891c4","shortHash":"fb72d24","date":"2026-07-05T20:56:51+00:00","author":"Claude","subject":"Palette rotation: stop design systems converging on the AI house look"},{"hash":"f52ab3775fae935cc8ed644f3bc402d45e0915ac","shortHash":"f52ab37","date":"2026-07-05T20:34:53+00:00","author":"Claude","subject":"One MCP integration for all a user's sites (user-scoped agent keys)"},{"hash":"78b54a215b5c002d2525b45f266b2643ab66ee10","shortHash":"78b54a2","date":"2026-07-05T19:58:33+00:00","author":"Claude","subject":"Fix MCP OAuth: RFC 7591 registration, authenticated consent, tenant picker"},{"hash":"64fbeca28c9840ddaecf13577a827d9cebeb0625","shortHash":"64fbeca","date":"2026-07-05T19:32:51+00:00","author":"Claude","subject":"Credit taste-skill author in the public changelog"},{"hash":"e85476122ec6674bde7ba679dcebce71e2149054","shortHash":"e854761","date":"2026-07-05T19:15:59+00:00","author":"Claude","subject":"Baseline also on P3009 when the failed migration is pre-ledger"},{"hash":"d768ff07846b0e286c8e4cef6a0b2a4f23599a2a","shortHash":"d768ff0","date":"2026-07-05T19:03:51+00:00","author":"Claude","subject":"Self-healing migration baseline in the Vercel build"},{"hash":"30ffc8c160b7578f54aac9c80affff0a54791333","shortHash":"30ffc8c","date":"2026-07-05T18:48:15+00:00","author":"Claude","subject":"Run prisma migrate deploy in the Vercel build"},{"hash":"49948eb93432139fb986a401d1d817188b4a54f8","shortHash":"49948eb","date":"2026-07-05T18:28:44+00:00","author":"Claude","subject":"Fix audit findings: sync billing, creative staleness, cache, themeId, taste gate"},{"hash":"5eed855ba3d473e0498fc544ffd961c166e32dbf","shortHash":"5eed855","date":"2026-07-05T17:57:38+00:00","author":"Claude","subject":"Phase 3: taste profiles, redesign audit, legacy migration, and tests"},{"hash":"5d790788016ac2438cb976e94531cee3dad29681","shortHash":"5d79078","date":"2026-07-05T17:44:30+00:00","author":"Claude","subject":"Document design-system versioning/sync across agent docs and changelog"},{"hash":"97a3484c301abc8e4145489b14359898932f9d78","shortHash":"97a3484","date":"2026-07-05T17:07:08+00:00","author":"Claude","subject":"Make the design system the enforced source of truth across surfaces"},{"hash":"623afe2bd05ba926de1fcc46dde2bb3797cabba4","shortHash":"623afe2","date":"2026-07-05T16:39:07+00:00","author":"Claude","subject":"Integrate taste-skill design rules into skills and generation prompts"},{"hash":"e0e749123c22e47f90326db264f6a3a40cb363e7","shortHash":"e0e7491","date":"2026-07-03T10:09:40-07:00","author":"Danish Ahmed","subject":"Harden email webhook: regression test + silent-failure alert"},{"hash":"026aca4ba6a4faf8c2735b724feb9180954639cf","shortHash":"026aca4","date":"2026-06-19T16:24:55-07:00","author":"Danish Ahmed","subject":"Fix Resend webhook: strip display-name From before tenant resolution"},{"hash":"43c0111b59e9c6c75320a2c8046eab89072cbef5","shortHash":"43c0111","date":"2026-06-19T10:23:53+05:45","author":"riteshjha","subject":"cleanup signup attempts after 25 hours"},{"hash":"6a07d192cea3d6dbb73bc196928a8bcc248b1ba6","shortHash":"6a07d19","date":"2026-06-18T11:48:36+05:45","author":"riteshjha","subject":"ip rate limiting for signup"},{"hash":"8ce7de43ca80b4d2416ea595397ce7cda624db4c","shortHash":"8ce7de4","date":"2026-06-17T15:37:30+05:45","author":"riteshjha","subject":"signup rate limit doc"},{"hash":"212b652246b8ddf52d76cd3b905f3663b8b7d382","shortHash":"212b652","date":"2026-06-12T13:47:35-07:00","author":"Danish Ahmed","subject":"Relax contact source enum to free-form string"},{"hash":"7e7aaf3ac850ba0e09f5e497d41e9ab4a8c2b36e","shortHash":"7e7aaf3","date":"2026-06-11T18:17:02-07:00","author":"Danish Ahmed","subject":"formatZodError: surface first field error + log server-side"},{"hash":"0fa4703482f7476d37158037e2b2a4582edd3508","shortHash":"0fa4703","date":"2026-06-10T18:51:10+00:00","author":"Claude","subject":"MCP feedback: tidy auth errors, surface scoped toolset, add Retry-After + agent failure-path docs"},{"hash":"00816a6283a5cc5c83a8f727f36d885e01e7444f","shortHash":"00816a6","date":"2026-06-10T18:45:57+00:00","author":"Claude","subject":"Fix Vercel build: lazily construct AI/email SDK clients"},{"hash":"4ae5bc5820ed0dfade8c735ba190082005b9c126","shortHash":"4ae5bc5","date":"2026-06-10T17:58:58+00:00","author":"Claude","subject":"Fix MCP OAuth discovery: add WWW-Authenticate header + protected-resource metadata"},{"hash":"6ab0a3699e2cd20362ad0bb74ce3b94ae6d6261a","shortHash":"6ab0a36","date":"2026-06-10T17:46:36+00:00","author":"Claude","subject":"Fix Vercel build: don't pass explicit datasource url to PrismaClient"},{"hash":"de146554807e36366b22f8f850db273ffdcf200e","shortHash":"de14655","date":"2026-06-10T17:29:17+00:00","author":"Claude","subject":"Add plgd plugin + marketplace scaffold for Claude Code/desktop"},{"hash":"35a0228f8190476b1ab030dc79c003e1e3c659a6","shortHash":"35a0228","date":"2026-06-09T21:06:39-07:00","author":"Danish Ahmed","subject":"Surface user-input errors as 422 + wire email.delivered"},{"hash":"82e477cb4d7fa9f97bd9838627d84eb42e669a36","shortHash":"82e477c","date":"2026-06-09T20:03:41-07:00","author":"Danish Ahmed","subject":"Surface fetch errors on campaign detail page"},{"hash":"6306f721e8aa0dc113ba9e61a800cbef13a6905c","shortHash":"6306f72","date":"2026-06-09T18:35:53-07:00","author":"Danish Ahmed","subject":"Phase 7: RFC 8058 List-Unsubscribe + send validation + enrollment-stop"},{"hash":"128f86aa8111192701737a3a7e73b79e4c88b83f","shortHash":"128f86a","date":"2026-06-09T17:30:59-07:00","author":"Danish Ahmed","subject":"Phase 6 analytics: service + admin UI + engagement chart"},{"hash":"b67dd2db19bee9c4e6ff3554437b3fb82aae9a0c","shortHash":"b67dd2d","date":"2026-06-09T17:07:23-07:00","author":"Danish Ahmed","subject":"Document new campaign stats + messages endpoints"},{"hash":"5c7b8ae4759a6a6ea6e714ef6568df32661457cd","shortHash":"5c7b8ae","date":"2026-06-09T15:12:43-07:00","author":"Danish Ahmed","subject":"Customer-facing campaign stats API + webhook attribution fix"},{"hash":"7fb120cc4b59983aa26564894615c2b53d9a4190","shortHash":"7fb120c","date":"2026-06-09T15:06:42-07:00","author":"Danish Ahmed","subject":"Worker idempotency layer for sequence + broadcast sends"},{"hash":"17d908dec2a14a26d130cd46c6d37e9592788bbc","shortHash":"17d908d","date":"2026-06-09T13:13:32-07:00","author":"Danish Ahmed","subject":"Cron auth: permissive pattern + accept x-vercel-cron header"},{"hash":"94cb03c0b56e9e1c457f2fb3adce58a91101c7a5","shortHash":"94cb03c","date":"2026-06-09T10:39:24-07:00","author":"Danish Ahmed","subject":"Layout token substitution + signed unsubscribe tokens + sequence offsetMode"},{"hash":"3cbf5ae43efb93e87a1dbb247ca28f53c153b2eb","shortHash":"3cbf5ae","date":"2026-06-09T10:15:53-07:00","author":"Danish Ahmed","subject":"Tenant-branded /unsubscribe + new /preferences center"},{"hash":"e2d8cd6552690bd03aad10ae3aa4ad8712114dc8","shortHash":"e2d8cd6","date":"2026-06-08T23:02:49-07:00","author":"Danish Ahmed","subject":"Fix sequence + broadcast workers: POST → GET (Vercel cron uses GET)"},{"hash":"1db75a5dcba4d18264cabeb281682d55140dc94b","shortHash":"1db75a5","date":"2026-06-07T21:31:26-07:00","author":"Danish Ahmed","subject":"Per-tenant usage tracking (Phase A measurement)"},{"hash":"46aa5b01f3e03f83ebf86bbb29bc7d0d7b9f8444","shortHash":"46aa5b0","date":"2026-06-07T21:14:18-07:00","author":"Danish Ahmed","subject":"Document rich-results JSON-LD metadata slots across all four agent docs"},{"hash":"ca11e9d4536bb3e77e59ffafaacf0721d05aa35e","shortHash":"ca11e9d","date":"2026-06-07T18:56:47-07:00","author":"Danish Ahmed","subject":"Fix: SoftwareApplication/FAQPage JSON-LD not emitting on VISUAL pages"},{"hash":"e4d56d1a7737586532f7485909487b42ed1b62d5","shortHash":"e4d56d1","date":"2026-06-05T12:49:47-07:00","author":"Danish Ahmed","subject":"Trim PREVIOUS_ALL_SCOPES_COUNTS: remove dead intermediate entries"},{"hash":"08bc849d33fff2eb3340c165dd323f0bebfbd1a1","shortHash":"08bc849","date":"2026-06-05T12:04:22-07:00","author":"Danish Ahmed","subject":"suggest-links: cross-content (articles + pages)"},{"hash":"3d32fb7979fbd7aea1a7af6fe713dc65503e6efc","shortHash":"3d32fb7","date":"2026-06-04T18:53:16-07:00","author":"Danish Ahmed","subject":"SEO rendering cluster: meta descriptions + SoftwareApplication/FAQPage JSON-LD"},{"hash":"2ae0905b3c06ff2390de82e474cbae33fdda30cf","shortHash":"2ae0905","date":"2026-06-01T17:12:53-07:00","author":"Danish Ahmed","subject":"GA4 Phase 1: SA-JSON connector + sessions/by-channel/top-pages"},{"hash":"8c3e35c8fc77f1838542c49d494b698f92647df8","shortHash":"8c3e35c","date":"2026-06-01T16:55:52-07:00","author":"Danish Ahmed","subject":"testRecipient on enroll — QA the full pipeline before going live"},{"hash":"4b2cd33b679e4f46ae9cfae0b2e5c3f4fc18ece7","shortHash":"4b2cd33","date":"2026-06-01T16:45:25-07:00","author":"Danish Ahmed","subject":"Fix sequence layout fallback + brand sender fan-out + document system tokens"},{"hash":"ce734daa25c17b24477e438e975d180fc1b399c3","shortHash":"ce734da","date":"2026-05-28T14:29:10-07:00","author":"Danish Ahmed","subject":"Sequence test-send: collapse cadence + ship every step to one email"},{"hash":"a1d73ec0276dfa29f6a5ae9df595c9883385cf8f","shortHash":"a1d73ec","date":"2026-05-28T11:11:04-07:00","author":"Danish Ahmed","subject":"Phase 1: lifecycle sequences agent API"},{"hash":"8f1cf0316258e4a2db2fb18aa6cd61caa5f90032","shortHash":"8f1cf03","date":"2026-05-28T09:33:33-07:00","author":"Danish Ahmed","subject":"MCP update_site: expose logoLayout + typed analytics fields"},{"hash":"827363a228b5569978f8ff4836aba213ea42cb10","shortHash":"827363a","date":"2026-05-27T09:25:54-07:00","author":"Danish Ahmed","subject":"Typed analytics ID fields — replace customJs paste workflow"},{"hash":"d9c8b67cf3ddd35ced13a8b2a206e301cb27c1cd","shortHash":"d9c8b67","date":"2026-05-27T08:58:28-07:00","author":"Danish Ahmed","subject":"Ship logoLayout: stop double-rendering brand in wordmark headers"},{"hash":"0485b9e1c2517bc0fd8a088ba29d2da372916f37","shortHash":"0485b9e","date":"2026-05-27T08:42:15-07:00","author":"Danish Ahmed","subject":"Ship 3 StartupTools feature requests: image upload + site:updated + URL hardening"},{"hash":"f7b267899a56d55875d288b744110b0f93bba84e","shortHash":"f7b2678","date":"2026-05-27T08:26:17-07:00","author":"Danish Ahmed","subject":"Feature requests: surface in /llms-full.txt + /api/mcp"},{"hash":"693bf1f8f13163ebec8e8f109340f143d5be7031","shortHash":"693bf1f","date":"2026-05-26T18:23:02-07:00","author":"Danish Ahmed","subject":"Feature requests: agents file gaps + bugs into a triage queue"},{"hash":"6034a2edf14443ca65ad059a0c1c9ccae651ff3f","shortHash":"6034a2e","date":"2026-05-25T00:22:19-07:00","author":"Danish Ahmed","subject":"robots.txt: handle unknown hosts with Disallow:/ instead of 500"},{"hash":"700ba722a7c7bc9849f1fbe502f646db68811d89","shortHash":"700ba72","date":"2026-05-25T00:18:36-07:00","author":"Danish Ahmed","subject":"Unblock /llms-full.txt + agent surfaces in robots.txt"},{"hash":"e0735b58f4b9e4918acc634e63049e4d4c82217d","shortHash":"e0735b5","date":"2026-05-25T00:04:44-07:00","author":"Danish Ahmed","subject":"Admin: in-UI key generation"},{"hash":"d394593235e6999142db58131b5aa9e07a67fa68","shortHash":"d394593","date":"2026-05-24T10:18:34-07:00","author":"Danish Ahmed","subject":"Admin: /admin/connect — CLI install + \"Try it now\" device-flow demo"},{"hash":"176a47b6f6e41f16cdb75c4a9d435d05a90636ab","shortHash":"176a47b","date":"2026-05-23T19:37:16-07:00","author":"Danish Ahmed","subject":"plgd CLI + docs for CLI device-flow auth"},{"hash":"737ded0be5c47f34081e1054e6ad01e22851950f","shortHash":"737ded0","date":"2026-05-23T17:03:00-07:00","author":"Danish Ahmed","subject":"CLI device-flow auth — /api/cli/auth/{start,poll,[code],[code]/approve}"},{"hash":"5352d394cdc4b3dc90968787d6877b67393dab8b","shortHash":"5352d39","date":"2026-05-19T09:59:05-07:00","author":"Danish Ahmed","subject":"Admin: /admin/partners UI — list, mint, top-up, tenant rollup"}]}