Skip to content

Release notes

What shipped,when, and why.

Every release, grouped by version. Features on top, fixes below, each bullet linked to the commit that introduced it. Generated automatically from the repository — no marketing spin, no missing entries.

v1.77.0

View diff on GitHub

Features

  • analyticsroute browser PostHog through first-party reverse proxy 5c04be9
  • functionslog provider-native batch state on still-pending poller ticks 8728225
  • suggestionsground campaign/topic suggestions on positioning + target keywords 164f4a7

Fixes

  • aiclean up prompt-audit findings from a production system prompt 3b3619a
  • clientbackfill empty campaign model fields at the form-provider level d4a232d
  • functionskey internal-link candidates by the activation's site URL 6ea3a40

v1.76.0

View diff on GitHub

Features

  • growthfire purchase milestone server-side (PostHog-only) 392b511
  • growthpersist utm_source through the funnel for partner referrals 2d07a4a
  • wwwadd audience landing pages for individual + agency ad campaigns a1cbab6

Fixes

  • onboardinghydrate visuals over a pristine stale draft + make Exit stick 4ac5397

v1.75.0

View diff on GitHub

Features

  • generationspersist the full prompt on text generation docs d40c9a9
  • growthdeep funnel events to PostHog, Telegram + Google Ads OCI 2def422
  • growthenrich funnel Telegram cards with name, plan, uid 7e2a381
  • growthreframe Overview as multi-surface activation + waitlist 4946844

Fixes

  • contentnormalize slug/keyphrase/heading/anchors before publish 757356a
  • growthdrop undefined click ids before the attribution set 106a17b
  • scope site positioning + seoIntel to the activation, not the workspace ca10450
  • stockrun the repetition guard on batch-generated posts e97bcd0
  • webcommit public prod env so PostHog can't drop out of a build 0e12243
  • webPostHog opt-state from consent at init, not a post-load flip d229230

v1.73.0

View diff on GitHub

Features

  • siteSave button + Add all on Keywords/Competitors/Authority editors 41e5444

Fixes

  • clientnamespace persisted localStorage per activation dbdc391

v1.72.0

View diff on GitHub

Features

  • campaignsshow creation date on the campaign overview 3eb7c76
  • onboardingauto-start the wizard on every activation, including free/none fcec255
  • onboardingfree/none get real Site/AI/Visuals/Personas steps; only SEO locked; hide campaign CTA for none f30dafb
  • onboardingPro-gate format encoding + optimize-on-upload in the wizard Visuals step a516732

Fixes

  • campaignsclose create wizard when the per-tier cap is hit on launch 253ca57
  • campaignsreset margins on the launch-CTA heading + paragraph 52be682
  • sitefree tiers can restart the wizard + disabled Select now looks disabled a1ee96d
  • sitepad the locked-panel overlay so the lock card isn't flush 7044208

v1.71.0

View diff on GitHub

Features

  • campaignsinherit SEO inputs from global settings; drop Competitors step fc38540
  • campaignsprominent keyword chips + prefill-from-site note 8358d1a
  • generationground post synthesis in brand positioning (tier-gated) 50c0566
  • growthdedicated growth Telegram bot + Send-test, separate from ops alerts 3119887
  • growthGROWTH_TELEGRAM_CHAT_ID accepts a comma-separated recipient list 08bf644
  • onboardinglogo→Step 1, unified magic loader, multi-persona, Step 6 CTA finish 887dda8
  • onboardingrestart-wizard on Site→Settings, drop stale moved-widget, logo to top of Step 1 5090917
  • seopromote authority domains to a global workspace setting + fix dropped fields 0e55882
  • sitere-run AI keyword suggestions on the Keywords tab d056e1d
  • sitesurface + edit positioning on Site → Info with magic re-draft 81e9f6e
  • sitesurface target keywords on the Keywords tab 3849009
  • stockpositioning-aware stock pre-generation (parity with live synthesis) 3a56df4
  • uiFileUpload drag-and-drop component; use it for the wizard logo 384a525

Fixes

  • ai-enginedialogs unusable inside onboarding wizard + auto-default sole provider aafdc65
  • growthsurface Telegram rejection reason in Send-test + consistent button cf76820
  • onboardingblock Finish until complete instead of jumping to a step f861cea
  • onboardingconnect wizard personas to the shared library + prefill logo from custom_logo 4c415e0
  • onboardingFinish setup dead-ended after reload — persist validity + route to gaps d4b260b
  • onboardingmodals invisible, loader spacing, empty visual draft, step-5-submit flow bd03fde
  • onboardingpositioning/keyword AI-draft truncated — cap thinking budget, raise output cap 5155513
  • onboardingReact [#310](https://github.com/yuriy-vasilyev/structura-core/issues/310) — finishedRef useRef called after loading early return cabd532
  • onboardingwiden the wizard container on the Personas step 144dd4d
  • onboardingwizard logo stacked vertically — variant-swap classes clobbered LogoFull's flex 1811a02
  • personaskeep New/Templates buttons in the Personas page header 8b511de

Performance

  • authoritycap Gemini thinking + tighten liveness checks to fit the sync request budget cd787e0

v1.70.0

View diff on GitHub

Features

  • onboardingpolish round — clickable stepper, favicon competitor chips, Step 6 redesign, title relocation, Continue spinner 4b3dab3
  • onboardingW-A wizard skeleton — routes, persistence, steps 1+6 5213569
  • onboardingW-A.1 — auto-redirect, dashboard resume tile, step 1 inline edit 687765a
  • onboardingW-B — step 2 AI engine + blocking connection test b3c1746
  • onboardingW-C — step 3 SEO intelligence (positioning + competitors + keywords) 7ced91e
  • onboardingW-D — steps 4 (Visuals) + 5 (Persona) f681627
  • onboardingW-E — tier-change reaction + campaign-side gate c18b41e
  • onboardingwizard restart endpoint + Step 6 button + ?restart=1 URL trick f065aba

Fixes

  • onboardingContinue stuck post-restart + full wordmark + centered title in header 9fc4e04
  • onboardingcritical wizard bugs — back button, dropdowns, cache merge, finish, headings 1ccf9d9
  • onboardinghoist OnboardingPage hooks above the loading-state early return 8070751
  • onboardingportal wizard out of wp-admin chrome, mirror dark class to body 4c7d796
  • onboardingseven issues from in-browser test — logo, exit color, footer gap, navigation model ab759cd
  • onboardinguse icon logo variant in wizard header, mono ink for dark 7779f20
  • seo-intelhide numeric category IDs from Site Intelligence niche display f2d642a

v1.69.1

View diff on GitHub

Fixes

  • seo-intelreal DFS response shapes — categories objects, organic-footprint authority, ETV sort d9a978a

v1.69.0

View diff on GitHub

Features

  • seo-intelsurface analyzed URL + source so headless setups are verifiable 07980f9
  • siteinteractive Competitors + Settings CRUD; vertical spacing fix; DFS payload logs dbbf52e
  • siteSitePanelHeader for consistent layout; auto-discover SERP competitors 5f3e162

v1.68.0

View diff on GitHub

Features

  • aiinternal-link picker — surface workspace's ranking URLs in prompts ebfb6ff
  • aiwire SEO intel provider into post-synthesis research + prompt 8a07d3d
  • campaignsadd Competitors wizard step; rename 'Excluded Domains' 3abf2b4
  • campaignsdata-source badge — Live data vs AI estimate 60625c6
  • campaignspersist wizard competitor URLs to workspace; thread to keyword discovery d2e8617
  • channelsroute LinkedIn org connections through a second OAuth app 968dd4d
  • seo-inteladd monthly refresh cron + workspace notices 2ec5188
  • seo-intelextend campaign + workspace schemas; add updateWorkspaceSeoSettings ef9b37b
  • seo-intelhourly balance watch with Telegram critical alerts 473ba1f
  • seo-intelimplement DataForSEO OnPage client; wire analyzeCompetitorPages end-to-end 547f826
  • seo-intelreal discoverKeywords impl with gap analysis c6c4d79
  • seo-intelscaffold DataForSEO provider foundation 772843c
  • seo-intelwire keyword-discovery through the provider 2b4de26
  • seo-intelworkspace activation hook — warm /site cache on first activate b67d7b1
  • siteadd /site route with 5 tabs; relocate Headless Mode toggle 6e683bd
  • siteAuthority tab — real backlinks-driven authority metrics 3f1decf
  • sitemanual analyze trigger — real DataForSEO impls + Keywords/Info tabs 36e7721

Fixes

  • seo-intelbind DATAFORSEO_SECRETS to TEXT_GENERATION_SECRETS 909114a
  • seo-intelconvert dynamic imports to static (.js extension) ad23d38
  • siteempty-result UX, niche fallback, real Competitors/Settings data 5167222
  • siteLockedPanel overlay overflows when preview is shorter 1ffc248
  • sitereset heading + paragraph margins against wp-admin globals 6fe9194

v1.67.0

View diff on GitHub

Features

  • aiguard generated content against degenerate repetition cd365a8
  • campaignswarn when BYOK image gen is on but no image model picked 48a5cc5

Fixes

  • airesolve BYOK image model from catalog default instead of failing dee8f11
  • billingdrop undefined fields in recordUsage so keyless runs record 779801f
  • clientremove double spinner from campaign Posts tab loading state c65d7b7

v1.66.0

View diff on GitHub

Features

  • aisingle source of truth for language→geo, extend to ~55 languages 4ee55c5
  • personasground Magic Suggest on the site's own voice b6e5b58
  • progresssurface competitor-analysis and authority research steps e7b5258
  • seofallback /llms.txt that defers to Yoast/Rank Math 8e70093
  • uimonochrome logo variant for colored backgrounds d730715
  • websplit-screen login, Overview dashboard, system-pref theme d2fd320
  • wwwStructura vs. Outrank comparison page 91247d7
  • wwwsurface multi-channel distribution + GEO on the homepage 8bbb750

Fixes

  • authauthoritative isNewUser for magic-link sign_up conversion d80f777
  • wwwlink the Outrank comparison page from nav + homepage 63f7725

v1.65.0

View diff on GitHub

Features

  • channelsLinkedIn company-page posting d40eeca
  • clientswap dashboard upgrade banner for a permanent tiered upsell card 6572a95

Fixes

  • clientrestrict header Upgrade to none/free, restyle, order internal links first 550f060
  • wwwsync channels page to catalog — drop X, add Telegram/WhatsApp/Email/Webhook ce825f1

v1.64.0

View diff on GitHub

Features

  • channelspage ops Telegram on permanent channel-dispatch failures f31a419
  • clientadd Manage account button to the account page 4d55ac5
  • clientmove Account & Settings into a header account menu 111446c
  • runssurface partial channel-dispatch failures on the run 2541760

Fixes

  • i18ntranslate the bare "Upgrade" string for es/fr e3eaad3

v1.63.0

View diff on GitHub

Features

  • adminanalytics dashboard, workspace drill-down, and shell parity e2666a0
  • adminmake signups KPI 'today' (viewer-local) instead of rolling 24h e2e380d
  • campaignscap Free tier to one post per week 5f57dd2
  • channels/promptstune LinkedIn + X social copy for subtle conversion 7185ef1
  • consentenv-gated opt-out default for US-only launch ec422ee
  • noticessurface generation failures + retire in-app System Logs strings 7162298
  • personasblock campaign and single-post creation when no personas exist 30c5d24
  • usersworkspace-aware account deletion with guard rails cc198a3
  • web/accountmake delete dialog role-aware 9807397
  • web/accountrestyle danger zone and make delete dialog descriptive 4a02ca0

Fixes

  • channels/xdrop ungrantable media.write scope so X OAuth can connect 8994311
  • channelsstop LinkedIn truncation + strip AI-tell em-dashes fe3735e
  • client/channelsstop /channels/* redirect from racing the entitlement heartbeat 14bb0bd
  • client/licenseinvalidate entire query cache on connect/disconnect 7f0d36b
  • plugin/licensere-seed default persona after reconnecting to a new workspace 2186723
  • progressreflect stock-served progress instead of freezing at 25% 111ae53

Reverts

  • channels/promptsrestore original LinkedIn + X social prompts 153c87c

v1.62.0

View diff on GitHub

Features

  • adminadd "Test Telegram" button to the admin dashboard 173f4f6
  • opscritical-alert fan-out + stalled-run watchdog; fix campaign-step OOM 2a6a861

Fixes

  • functions/emailuse the friendly run-timeline copy in failure emails 0839108
  • functionsraise global HTTP timeout so long generations don't die at 5 min 24a3a8f
  • increase memory 9c7943a
  • runscorrect stalled-run index scope; add image-gen timing metrics 82d5748

v1.61.1

View diff on GitHub

Fixes

  • client/typesJob.persona_id accepts nanoid strings (type hygiene) b010e4e
  • plugin/campaignspreserve nanoid in Campaign_Shape_Transformer::normalize_persona_id 742c848

v1.61.0

View diff on GitHub

Features

  • personasPhase 2b — per-activation binding becomes the canonical author-attribution path 7905c71

Fixes

  • personas/pagealways render the personas grid when the editor is open fb2b38c
  • plugin/campaigns,cloud/typespreserve nanoid string in personaId end-to-end c0f7f1d
  • pluginwp.org Plugin Check security pass — escape output, sanitize input ab5192b
  • scheduler/plugin,types/clouddefensive sweep — preserve persona nanoids in remaining (int) casts 0a5a495
  • schedulerwrite the resolved nanoid persona id on generation docs f9abe16

v1.60.1

View diff on GitHub

Fixes

  • channels/linkedinread post URN from x-restli-id header + diagnostic logging d9dcf52
  • plugin/channelsforward attach_featured_image through the settings REST proxy 2f85f0a

v1.60.0

View diff on GitHub

Features

  • channelsper-connection "attach featured image" toggle (default on) 478ea8c
  • notices,client,pluginPhase 3a — wp-admin Notices page d5e0117
  • notices,clientbell + popover, shared utils, translations, indexes 8ad98a5
  • notices,plugin,clientPhase 3b — retire local logs surface 77318cf
  • notices,plugin,clientplugin-health diagnostics button fb039f7
  • notices,webportal NoticesBell 17ac427
  • noticesPhase 1 — cloud-side Notification Center f13bdf1
  • noticesPhase 1.1b — wire remaining audit-gap error branches 4cc3669
  • noticesPhase 2 — portal Notice Center page 5d4b055

Fixes

  • channels,schedulerforce OAuth landing on #/channels/connections; stamp link_validation milestone on paid-tier always-on runs 3693950
  • hook ordering, webhook timeout, link_validation milestone, timeline rail b2804bd
  • notices,webportal page theming + missing Firestore index 25500bc
  • progress/timelineper-tier image-row matrix (None tier-locks both; Free tier-locks body only) b3662e4

v1.59.0

View diff on GitHub

Features

  • progresssplit image gen into per-slot milestones (featured + body) 38d4e81

Fixes

  • ai/geminidisable reasoning on schema-constrained calls + breadcrumb the image phase 788d390
  • generate-postblock sync generation when no visual preset is bound 0c064d8
  • progress/timelinedefault to SHOWING the images row unless explicitly disabled 415bade
  • schedulerbound webhook delivery + inline image gen with wall-clock deadlines b74cc8c

Reverts

  • ai/geminidrop thinkingBudget: 0 — Gemini 3.x Pro rejects it e42d906

v1.58.1

View diff on GitHub

Fixes

  • channels/dispatchergive adapt 30s and degrade timeout to title-only aa584c5
  • channelsmount the BYOK + provider master keys on channelsPostPublished 28bd2fb
  • progress/timelinerescue render when currentStep was filtered out of the visible order 5dd73dc
  • schedulergive synthesis 30 min instead of 9, log terminal completion 452e283
  • stock/text-batchgive blueprint requests 64k output to survive reasoning models 979fab9

v1.57.0

View diff on GitHub

Features

  • analyticsmigrate to GTM + emit sign_up event from new-account flows f4be79d
  • pricinghide WP.org column in comparison matrix when plugin unpublished 840cdfe
  • wwwgate wp.org plugin surfaces behind WP_PLUGIN_PUBLISHED flag 1726ab4

Fixes

  • wwwmobile-friendly layouts for comparison + agency-volume tables 1406874

v1.56.0

View diff on GitHub

Features

  • channels/xattach featured image to tweets via v2 media upload 54ff326
  • channelsAI-adapted social commentary (first-person + hashtags) for LinkedIn & X 0a5288f
  • channelsenrich post-published payload + auto-pick prefixSwap on headless 9c47734

Fixes

  • channels/oauthland users on the real SPA route after OAuth, not a phantom admin slug 198e484
  • channels/oauthwrite OAuth secret doc under the workspace, not the license 329dd37
  • settingskill the headless+inherit contradiction end-to-end b13ceb0
  • stockcron refills only when buffer fully drained (matches consume trigger + spec) 1c8a2e6

v1.55.0

View diff on GitHub

Features

  • analyticswire Google Ads conversion tracking to consent banner aa52b7d
  • channelsper-connection campaign bindings + every-Nth-post cadence for OAuth e86e709

Fixes

v1.53.1

View diff on GitHub

Fixes

  • channels/oauthland users on the right wp-admin URL after the OAuth dance 050a814
  • channelsstop coercing nanoid campaignIds to int across the stack a949926
  • runsstop ephemeral generate-post runs from creating phantom campaign docs ce06cd8

v1.52.3

View diff on GitHub

Fixes

  • clientstabilize single-post run page and refine timeline chips fda3d37
  • subscriptionscancel standalone Channels item when plan now bundles it ece4484

v1.52.2

View diff on GitHub

Fixes

  • billingrollup cron resolves planId/maxSites from the bound License ffe20ea
  • client,functionsaudience-aware plan labels in the wp-admin SPA da315aa
  • i18nwire audienceMissingOrInvalid in the contracts source 57898a2
  • subscriptionsrequire explicit audience on Stripe plan products a700664
  • web/billingsingle Stripe-portal funnel + audience-aware plan label 210622b

v1.52.1

View diff on GitHub

Fixes

  • channels,billingOAuth redirect_uri + launch chrome + channels load race ([#97](https://github.com/yuriy-vasilyev/structura-core/issues/97)) ee4955b

v1.51.0

View diff on GitHub

Features

  • plugin,clientcleanup + warn on disconnect, pin cross-license switch 2364dcd

Fixes

  • recent-posts widget cross-campaign leak + empty textModel synthesis crash 6656c51

v1.49.7

View diff on GitHub

Fixes

  • aidowngrade non-active licenses to anonymous tier so None→Free→None keeps working d9d5a0b

v1.49.5

View diff on GitHub

Fixes

  • campaignscap postLength input + form default at 500 for None tier (matches Free) 65895f1

v1.49.3

View diff on GitHub

Fixes

  • schedulerresolve random persona to a workspace persona so post_author lands correctly 84d5a6c

v1.49.2

View diff on GitHub

Fixes

  • progresslocalise milestone subtext + filter Free-tier no-op steps from timeline 7c0ebd2

v1.49.1

View diff on GitHub

Fixes

  • atomic cloud-side bump of campaign.postsPublished to close the read-then-write race 3db09d9

v1.49.0

View diff on GitHub

Features

  • aicap Free post length at 500 + ban outbound links on Free/None tier 619237f
  • pluginhard-strip external `<a>` tags for non-Pro tiers in Block_Serializer 476873e

v1.47.0

View diff on GitHub

Features

  • campaignsmake pre-generation Pro-only on Free + fix client POT extractor 9300efd
  • pricingpoint Free upgrade CTA at portal + sync feature lists across www/web/portal 49b9a10

Fixes

  • client,webpolish free-tier keyword/authority teasers and route unlock intents to /billing a0c3c5c
  • close Free-tier value leaks in meta prompts, internal-link injection, and image format b1df889
  • drop pregen rollout banner, retire cadence-sync flag gate, hide Free-tier cap warning 8a23995
  • pluginmint progress runId for Free tier so Run-now lights up the strip without reload d92c426

v1.46.0

View diff on GitHub

Features

  • ui,webtop-bar portal shell + workspace-first navigation cb9e720

Fixes

  • ui,webportal shell polish + Select dropdown + role-based nav 332d943
  • webhide Members tab + sidebar link for editors and viewers b696225

v1.44.0

View diff on GitHub

Features

  • i18ntranslate the 643 newly-extracted SPA strings (de/es/fr) 9d9d6ea

Fixes

  • clientde-block none-tier campaigns teaser, lead with Generate Post 9eee7a9
  • clientmake AppErrorBoundary's nav-reset opt-in 95238dc
  • i18nextract SPA strings + regen .pot via TS-aware scanner 0728266

v1.43.1

View diff on GitHub

Fixes

  • clientbreak Visuals render-loop, reset error boundary on nav 2096d77
  • functionswire recent titles into stock pre-gen dedup context 9fd10cb
  • pluginlog skipped campaigns in cadence sync b8decfc

v1.43.0

View diff on GitHub

Features

  • clientuseLicense().hasWorkspace + flip 7 hook gates + AI Engine cap restrictions (Phase 1.8 PR7b) ff93817
  • functionsbootstrapAnonymousInstall endpoint + anonymous-bootstrap rate limiter (Phase 1.8 PR6) e89ba78
  • functionsflip free + none tiers to BYOK-only; flatten anti-abuse cap to 100/site/mo d9bd190
  • functionsPhase 1.8 foundation — Workspace + AnonymousInstall types, anonymous-aware bearer middleware, endpoint classification 93b1f95
  • plugin,client,functionssuppress fresh-install banners and add "Forget this site" flow d650c49
  • plugin,functionsanonymous-install bootstrap + claim flow + structuraConfig surface (Phase 1.8 PR7a) 8f67d8b

Fixes

  • clientgate workspace-keys + wp-users queries on license; render unlicensed teaser on Visuals 55634bf
  • pre-publish polish — unblock None tier end-to-end, harden error/block paths, dashboard cleanup 5feebfe
  • wwwhide HeroEyebrow rule on mobile so the label aligns left e0b7366

v1.41.0

View diff on GitHub

Features

  • per-activation scoping for visual styles, personas, and AI keys 7e50d40
  • web,functionsportal viewers for personas + visual presets, plus binding tests 4e5b5c8

Fixes

  • clienttype the had_prior_activation bootstrap flag on StructuraConfig 3229ecd

v1.40.1

View diff on GitHub

Fixes

  • clientgate Channels routes by per-site seat assignment 74fc5ed
  • functionsstock pre-gen now uses sync prompt builder for full SEO parity 9c4f951
  • pluginmeta-box image regen — reset apply button + body-image new_url 23548e2

v1.40.0

View diff on GitHub

Features

  • functionsstock pre-gen failure insurance — timeout, daily cap, rich incidents 6bcff97

Fixes

  • functionsre-sign stock-image URLs at consume time, not write time 391f305
  • pluginmeta-box image regen — trim loaders, support body-from-placeholder 50d1dc9
  • pluginpersist pregeneration_enabled toggle through the validator 0c5bd4f

Performance

  • clientswap AppLoader → PageLoader on route loaders, deduplicate AI Engine settings query aa4ef32

v1.39.1

View diff on GitHub

Performance

  • plugin,clientbootstrap settings on page load to skip first-paint roundtrip 5cc10f9

v1.39.0

View diff on GitHub

Features

  • clientpersist new-campaign draft across navigation cce0b1b
  • freeze plugin → cloud surface for wp.org submission 9ca6c4b
  • functionsPhase 4.5 follow-up — auto-attach metered overage item on subscribe 301375b
  • functionsprovider fallback for interview/suggestion calls 75e4f72
  • plugin,clienthumanize provider error toasts in suggestion flow cd3be77

Fixes

  • ciwporg-zip workflow — replace multi-line sed with head/tail splice e2dd5b3
  • clientpreselect recommended model in provider setup wizard cf2e7be
  • clientwrap multi-pick answers as chips in interview review d4108f1
  • firestoreadd COLLECTION_GROUP index override for members.userId 3ebae4e
  • functionsroute add-on assignment funnel reads/writes through workspaces (Phase 3.3 leftover) 1f5a809
  • functionsroute stock refill through canonical resolver to support BYOK 5feaa6a
  • pluginbump cloud-discovery cURL timeouts from 120s to 240s e5e0a00

v1.37.0

View diff on GitHub

Features

  • functions,webPhase 3.7 Pass C — workspace rename 8c656a9
  • functions,webPhase 3.7 Pass D — workspace ownership transfer 2dd2cf2
  • functions,webPhase 3.7 Pass E — multi-workspace switcher 6656fbe

v1.36.0

View diff on GitHub

Features

  • client,functionsPhase 3.7 — wp-admin "this site is part of workspace X" c14509e
  • client,plugincycle-quota site-wide banner + delete legacy Campaign_Repository 359f94e
  • clientPhase 4.4b — wp-admin Cycle Usage widget 86e1845
  • functionsPhase 3.4 — hoist personas to workspace root 4dcc0f2
  • functionsPhase 3.4 — hoist visualSettings to workspace root 2134bfa
  • functionsPhase 4.1 — per-tier × audience quota config 096c18a
  • functionsPhase 4.2 — per-generation usage metering + nightly rollup 4405e39
  • functionsPhase 4.3 — Stripe metered overage reporting cron a0f3111
  • functionsPhase 4.3a — metered prices + Stripe Meters in the catalog f26a959
  • functionsPhase 4.4a — cycle usage view + getUsageAnalytics extension 963aa1a
  • plugin,functionsPhase 1.0h — retire AS image chain across both surfaces 7e8bef5

Fixes

  • aihonour resolver's provider override in executeCloudSuggestion 2497270
  • functionsroute campaigns store through workspaces path 56b0b35

v1.34.0

View diff on GitHub

Features

  • wwwadd "Why not Koala/SEOWriting AI?" sibling comparison on home de1dcac
  • wwwexpose the "20+ point SEO protocol" as a real disclosure list 4c2f2da
  • wwwGDPR/EU trust strip in footer 7d09198
  • wwwoutcome-framed pricing CTAs + box SERP claim against autobloggers 8d5dd32
  • wwwsticky mobile CTA on pricing page 05720e2

Fixes

  • aipreserve user-picked orientation for OpenAI image gen 6ee290e
  • functionswipe lib/ on prebuild to prevent stale orphan re-deploys f7e1f5e
  • wwwremove brand duplication in &lt;title&gt; tags + noindex thin blog archives 74f5e3d
  • wwwsitemap hygiene + meta description audit across 4 locales 82a2fcc

v1.33.1

View diff on GitHub

Fixes

  • clientunblock provider setup wizard's Configure step on cloud-only heartbeat 2041c3c
  • tests,i18nunblock CI workflows on main b576e0e

v1.33.0

View diff on GitHub

Features

  • functions,pluginforward AI key save through cloud, retire wp_options storage f63f4cd
  • functions,webadd workspace credential library endpoints + portal page 0302c9b
  • functionsactivation-scoped credential bindings + resolver rewrite a7dd11e

v1.32.0

View diff on GitHub

Features

  • personas,licenses,clientauto-seed default "House voice" persona on activation 0f9163b

Fixes

  • clientseed Single Post form from connected provider, not Gemini bcad11a
  • personas,plugin,clientrequire author on save and stop ghost upserts 6fd1bc7

v1.31.0

View diff on GitHub

Features

  • ai,billingcloud-only-gen Phase 2 — resolver + rate limit 48e5c78
  • aicloud-only-gen Phase 2 — wire resolver into text engine 523de4b
  • plugin,licensescloud-only-gen Phase 3 — gated plugin cutover e639dec
  • schedulercloud-only-gen Phase 2 — image path + dispatcher catch 194c5b0
  • workspacescloud-only-gen Phase 1 — workspace credentials store a5e2e1e

Fixes

  • licenses,plugin,clientactivation cycle no longer self-deactivates 5ad36d1

v1.30.0

View diff on GitHub

Features

  • emails,spectier+audience in over-cap warning + retire pricing-v2 §4.5 1703691
  • workspaces,channels,pluginPhase 3.3 — UUID activation + surface discriminator 2273539
  • workspaces,permissionsPhase 3.1 + 3.2 — workspace tenant root + RBAC 644ed56
  • workspaces,pluginPhase 3.5 — API tokens + Bearer auth middleware 8b32563
  • workspaces,webPhase 3.7 Pass A — member role + remove a900388
  • workspaces,webPhase 3.7 Pass B — invite-by-email + acceptance route 4e8f958
  • workspaces,webPhase 3.7 walking skeleton — workspace settings page 8c772f9
  • wwwimprove mobile menu bece2b8
  • wwwrefine pricing toggle layout + recommend BYOK for agencies ad9b400

v1.29.0

View diff on GitHub

Features

  • catalog,web,i18nlock Cloud Pro Individual + BYOK Agency + Cloud Agency prices 3293f07
  • functions,client,pluginper-tier campaign-count cap (BYOK abuse prevention) 16694c5
  • functions,clienttier policy — auto-pause on "none" + per-tier provider gating 6bd81fc
  • functionsPhase 1.0j — UUID-keyed activations + read-path cutover afe6879
  • pluginadd model switch when regenerating images 25dbe29
  • web,www,packages/ui,i18ntwo-grid pricing UI + JustThePluginSection 2-column refactor 0733c8b

Fixes

  • catalogmatch products by (plan_id, audience), not plan_id alone a686a0a
  • clientsilence "Active license required" toast storm on disconnected installs 350f497
  • pluginpersist authority + keyword bank to cloud campaigns ab632f5

v1.26.0

View diff on GitHub

Features

  • suggestionadd tracing logs for request, brand content, and blueprint composition 4a4e8c9

Fixes

v1.25.0

View diff on GitHub

Features

  • pluginlink new headless-mode + IndexNow surfaces to docs.structurawp.com 9484acf
  • ship IndexNow keyfile verify + headless onboarding 8cec3d1

Fixes

  • channelsgenerate PKCE pair on OAuth init (X login was sending empty code_challenge) f276e39

v1.23.0

View diff on GitHub

Features

  • add resend for sending emails 78d81b0
  • cloud pre-generation pipeline 87e7caa
  • cloud pre-generation pipeline, part 2 31ff5c7
  • docsadd missing languages support da4d48b
  • docsadd sitemap.xml and robots.txt for indexability 0205708
  • pluginadd stock logic ab97fd9
  • pluginmove image generation to cloud + buckets 81057e3

v1.22.0

View diff on GitHub

Features

  • move campaigns, personas and visuals to the cloud 08aeb7c
  • pluginmigrate most of entities to cloud cb337bf
  • wwwadd more json+ld schemas, add search tool bea0068
  • wwwupdate features page 2fbc959

Fixes

v1.20.0

View diff on GitHub

Features

  • functions,plugin,clientprogress-stream — CampaignRun writer, status API, drawer UI 82d95f9
  • functions,webadmin-log-triage — incidents store, listIncidents endpoint, /admin/incidents dashboard 9c7f25a
  • plugin,clientplugin-quiet-mode — Debug_Mode gate, Dashboard widget, legacy Logs surfaces retired 3738e9d
  • pluginadd campaign runs d9594bc
  • wwwadd favicon from LogoIcon mark 1bff0ec
  • wwwadd support page 06943dd
  • wwwsharded sitemap, blog taxonomy, and post-page polish 6d90afb
  • wwwsupport form with mail + rate limiting 16f0746

Fixes

  • wwwopen per-page locale gates so /de /es /fr render eb6be46

v1.19.0

View diff on GitHub

Features

  • docsrefactor docs bf76a8c
  • pluginadd Site Health probes for background-task blockers d68580d
  • wwwadd missing translations 0578630

Fixes

  • pluginstop serializing $campaign through Action Scheduler args 68d2897

v1.18.0

View diff on GitHub

Features

  • plugin,clientdiagnose image tasks; hide debug logs by default d43e697

Fixes

  • functionspreserve serverTimestamp sentinel in generations writer e69423b

v1.17.0

View diff on GitHub

Features

  • clientlocalize enum labels and default disclosure text 10b1c43

Fixes

  • functionsharden generations store writes 982c652
  • pluginsubstitute plan-default image provider when configured one is text-only 01623a1

v1.16.0

View diff on GitHub

Features

  • channelssurface activation-domain mismatch as a global advisory 18c86ce

Fixes

  • channels and agency tier appearance 617d14f
  • pluginremove citation prop 7adf5ba

v1.15.0

View diff on GitHub

Features

  • aiextract brand palette and route logo images through multimodal Gemini 4bcbc8a

Fixes

  • docs links 70f1850
  • image visual style f2060ba
  • plugindrop data-howto-name from action-step &lt;ol&gt; to satisfy Gutenberg 1c0a3a6
  • render naked URLs as clickable anchor tags in post body 451afed
  • wwwpin @exodus/bytes &lt;1.15 to unbreak blog route on Vercel 5f41b0f
  • wwwswap isomorphic-dompurify for sanitize-html to fix Vercel ERR_REQUIRE_ESM 8c1b1ee

v1.14.0

View diff on GitHub

Features

  • www,uiadd blog pagination with shared Pagination component dd1071f
  • wwwrestructure header/footer nav + persistent language switcher 3d87cbd
  • wwwtheme + language switchers in footer 5f3f6af

Fixes

  • openai blocks schema 833029d
  • openai blocks schema 657caa6
  • plugin,functionsrequire explicit text/image provider + fix OpenAI image 400 3e00670
  • www,uipricing page light-mode polish + live currency in matrix e6c831c
  • wwwawait params in every App Router route (Next.js 15) 44c874c
  • wwwpremium cta button color on hover 65c2bf7

v1.13.0

View diff on GitHub

Features

  • add comparison pages 8916ac0
  • plugin,wwwmark FAQ + HowTo sections for headless extraction 00159e6
  • wwwadd /vs/koala-ai comparison page (EN) 3d5c3ac
  • wwwadd auto-generated /changelog page from release-please CHANGELOG.md 6964ddf
  • wwwadd reusable FaqSection + HowTo JSON-LD schema 8a4127e
  • wwwport persona switcher demo to /features 10ff6d1
  • wwwrestore SEO protocol and approach comparison composites on /features 191b89f

Fixes

  • price IDs 3103ede
  • wwwtighten homepage hero scale and drop broken footer links f40badc

v1.12.2

View diff on GitHub

Fixes

  • cidrop PHP 8.0 match so Patchwork can tokenize on 7.4 184d7a4
  • pluginre-stub get_post_meta with when() so forwarder tests see the override da9ff53

v1.12.0

View diff on GitHub

Features

  • ai,plugin,clientrestructure SEO rules into always-on tier map + HARD REQUIREMENTS band e54ee79
  • docs,wwwadd branded error boundaries 8e93ed6

Fixes

  • clientunblock managed-tier dashboard + restore PHP-first license flow 36242fe
  • docsremove Nextra i18n array to unblock runtime 9b64690
  • plugin,clientpricing-v2 gaps — Agency badge + entitlement-aware Channels visibility 299dc31

v1.11.0

View diff on GitHub

Features

  • add agency tier; introduce www project 4a60f72
  • aiper-plan default models for managed tiers 3a45ea4
  • billingdeclarative Stripe catalog sync tool 93b7488
  • billingsynthesize bundled add-on entitlements from plan metadata 77dd8c2
  • clientAgency tier feature gates and per-post model picker 34f1d3a
  • uilift pricing composites to @structura/ui/pricing d8906e9
  • web4-tier pricing UI with currency toggle and Agency volume strip 3d00c69
  • wwwbuild real homepage + pricing pages for /en 6e43949
  • wwwscaffold Next.js marketing site workspace 22250f4

Fixes

  • build process de6b026
  • docsalign deps with workspace overrides so frozen install works 9f42b9f

v1.9.0

View diff on GitHub

Features

  • channelsadd LinkedIn integration — OAuth, AI adaptation, publishing (Phase 3+4) dfce360
  • channelsadd per-campaign bindings and company page posting a26604e
  • channelsadd publishable dispatch, frequency control, and LinkedIn image posting 21fe37b
  • only post published posts on linkedin f5fca30

v1.8.0

View diff on GitHub

Features

  • adminadd Entitlement health dashboard panel (spec §11.7) cd6793a
  • channelsadd Email, Telegram, WhatsApp integrations (Phase 7) 8c9cd3a
  • channelsadd expired-connections admin banner (Phase 7) 7e5d171
  • integrations store + per-add-on entitlements (Phases 1-6) 647495c

Fixes

  • licensesrepair checkActivationLimits cron (spec §11.5.4) ea0d0a0
Changelog — Structura