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.

v2.20.0

View diff on GitHub

Features

  • aiaccept a BYOK model tier on the generation path (rollout-tolerant) 82bca3a
  • aiextract shared @structura/model-catalog with tier-based resolution daf3de4
  • campaignspersist + thread the BYOK model tier through generation c9c7a11
  • clientmove GSC prompt to a dismissable dashboard banner; scroll the property picker 8f00a5c
  • clientTop/Standard tier picker on campaign create/edit 6c325d6
  • clientTop/Standard tier picker on single-post-gen + create steps 308da8f
  • functionsprime inputSnapshot on portal single-post runs 4019d47
  • model-catalogadd live provider model-sync script c86178b
  • model-catalogbump models to live-confirmed ids 57db590
  • pluginforward model tier (top|mid) on campaign + single-gen 49e13ba
  • runs,webadd provider/model rows to the Run-again modal 972e41b
  • runsconfirm before "Run again" with a run summary 8f71ccd
  • runsrebuild the Run-again modal to the design handoff fc5bf36
  • Top/Standard tier picker for image regeneration c6242f3
  • web"Run again" on the portal run receipt 4af6030
  • webtier-based BYOK model picker (Top/Standard) on campaigns 2041e8e

Fixes

  • billingguard against a duplicate active product shadowing a plan afcd195
  • campaignsstop "Run again" crashing on a schedule-less snapshot a741783
  • clientcorrect the wp.element JSX-runtime shim (React [#130](https://github.com/yuriy-vasilyev/structura-core/issues/130) crash) f9ea0f7
  • clientscope the wp-admin Personas page to this site's bound voices 2301075
  • clienttier badge shows the plan only, not the retired audience suffix af00e17
  • onboardingbind seeded House voice for non-AI tiers + workspace-aware seed flag 495c58d
  • onboardingdurable server-backed onboarding-dismissed flag 9dc0353
  • pluginself-heal a revoked anonymous bearer instead of 401-looping forever 5537d73
  • runsshow draft-aware label on the single-post run header 633502e
  • webdraft-aware run receipt label for WP posts a7f7e6f

v2.19.0

View diff on GitHub

Features

  • gsccap the weekly digest length for agencies 8b2dee8
  • gscvalue-gate the weekly digest — no email without a story e834b09
  • wwwadd Search Console differentiator to vs pages + home 7abf203
  • wwwannounce Search Console analytics across the marketing site d722b52

v2.18.0

View diff on GitHub

Features

  • gscdesigned connect flow — four-state modal on both surfaces 150abbb
  • gscopportunity engine + URL inspection drip (slice 3 backend) 1fd7174
  • gscrange support + per-post table on the site overview aeacf33
  • gscSearch performance page — trends, opportunity queue, post table 4585b1d
  • gscuncovered-query rule, impact tiers, competing titles, row sparklines b4ddce5
  • gscweekly search digest email — slice 4 complete 032af39
  • gscwizard connect cards + wp-admin dashboard glance card edfb614

Fixes

  • gscroute property-less connections to the Configure picker 4cce557
  • headlessenforce WP-style per-site slug uniqueness at delivery 4434fd5

v2.17.0

View diff on GitHub

Features

  • billingfounding member offer across portal, www, and seat counter cf099c3
  • gscGoogle Search Console integration — connection + post performance 8b64bb9
  • webshow translated render-stage progress on video cards eb49e0e
  • wwwadd /rank-higher paid-ad landing page 0f1eb1f

Fixes

  • functionscount delivered live posts in the headless terms cache 045dc5d
  • functionsdefault missing slug arrays in delivery term deltas c6d7b59
  • functionsportal run cancel no longer 500s 70739e4
  • noticesrender translated copy instead of raw i18n keys 8bcb52a
  • refuse URL-shaped input in API key fields before the live test e59480a
  • uiresolve pricing/search-perf subpaths for CommonJS consumers d22a25d

v2.16.0

View diff on GitHub

⚠ BREAKING CHANGES

  • videothe "assembly" video pipeline id and the Shotstack integration are removed from the cloud renderer.

Features

  • functionspublic share links for headless posts + SEO/AI provenance stamps 77d318a
  • headlessrelease the Headless surface to everyone — remove the dogfood gate 723f1ec
  • portalreal Xerx mark + wider integration-help dialog e91ad9f
  • portaltrack outbound xerx.io clicks from the integration-help surfaces 43f7296
  • portalXerx integration-help banner + lead dialog on the Headless surface 2bafb2f
  • videoyear-long video retention with self-healing download links 3e161ea
  • web+wwwshare links live on the vanity host share.structurawp.com 947da4d
  • webpost export (MD/HTML/DOCX) + Share-preview dialog for headless posts 528feef
  • wporgplugin directory listing assets — icon + banner ad540ca
  • www"Works with your stack" platforms band + Content API feature card e903914
  • wwwdrop "WordPress sites" from the Xerx builtBy credit f3d4005
  • wwwfooter bottom-bar cleanup — cookies to Legal, Xerx credit f7c2039
  • wwwplatform-neutral copy across EN landing pages e75d5f4
  • wwwport the multi-platform reposition to de/es/fr e510ae8
  • wwwpublic share-preview page at /p/{token} 99ac174
  • wwwrename the product descriptor to "autonomous blog engine" 5a84288
  • wwwreposition homepage copy to two-paths (WordPress or Content API) 359a831
  • wwwscrub "WordPress-only" concessions from EN vs pages 2e32254
  • wwwtwo-paths copy for features, pricing, and channels pages e601d70

Fixes

  • billingfree-tier weekly and monthly post caps never blocked 2b2291e
  • functionsmanaged AI derives from the plan, not the stored license flag a1021f6
  • functionspage ops when the Serper account rejects all SERP calls 758f5dc
  • functionstemporal anchor in generation prompts + competitor guard on citations 58d437b
  • functionstolerate trailing commas in AI blueprint JSON 0e77a02
  • functionstrigger-driven stock refills thread isManagedAi too a8da14b
  • functionsvideo renders can no longer strand at 'rendering' 0225122
  • licensesentitlement bundle never matched WP sites — consolidate site-host normalizers bebee3b
  • licensesgrace-period revokes wrote to the retired activations path, aborting every revoke 3274511
  • onboardingAI competitor suggestions survive wizard step remounts 38c4a89
  • plugincampaign Posts tab shows drafts — recent-blueprints queries set post_status e9a26e4
  • portalland invite acceptances in the invited workspace + lock member roster to owner/admin 7498022
  • web+clientmodel pickers are BYOK-only; managed campaigns store no model d11f431
  • web+docsalign portal and docs welcome with the two-paths positioning 79aab2c
  • webcampaign config card falls back to the provider name when no model is stored e277470
  • webdrop stale pre-parity headless channel strings 9bbd5f7
  • webShare dialog close button + surface the active share link on the post view f6bc227
  • webshow the wizard smart loader from first paint on Visuals + Persona steps ba73a94
  • webwizard logo commits live at upload; suggested competitors auto-add e9122c3
  • workspacesenforce the plan-tier provider gate on the plugin credential transport b9f301c
  • wporg-zipclamp 'Tested up to' to major.minor ded16d4
  • www+functionsshare-page identity tile prefers the square favicon over the logo 16e4075
  • wwwmark Cloud as Most Popular on landing and vs pages, not BYOK 489e59b
  • wwwremove false WordPress-only claims after headless GA 9dc51d7

Chores

  • pin next release to 2.16.0 23ab942
  • videoretire the Shotstack renderer e1ccab5

v2.15.0

View diff on GitHub

Features

  • post-statusremove "pending", default to draft, and make run labels status-aware 38aeea8
  • videoGemini TTS voices with BYOK-aware key routing c1bd9e5
  • videogrouped two-provider voice picker across wp-admin and portal e57c0aa
  • videoraise the monthly video cap 20 → 40 25fed69
  • videoRemotion composition package with six-template lineup 924ac23
  • videoremotion render pipeline, default renderer with Shotstack rollback 70bbf8d
  • visualsfall back to a generic image style instead of blocking when no preset is bound ff2bac1

Fixes

  • none-tiergate AI-suggest to paid tiers + stop Visuals fetch when locked 130f4ef
  • portalwider video configure modal + scalable campaign bindings list 281bc00
  • video4GiB worker + capped render concurrency after first-render OOM 9bcf2fa
  • videoaccept Remotion template ids as preset videoStyle values 610b535

v2.14.1

View diff on GitHub

Fixes

  • none-tierwp.org "none"-tier UX fixes across wizard, diagnostics, and run screen e6d9cdb
  • schedulerresolve webhook signing secret by workspace for "none" installs ff997ac

v2.13.0

View diff on GitHub

Features

  • billingbundle Channels into all paid tiers + pricing-restructure spec 4f0c161
  • billingcollapse catalog to 3 graduated tiers (agency merge) 5d52720
  • billingone-ladder pricing UI + regenerated catalog (Slice 2C) 06ee8f9
  • billingretire audience gating — seats derive from site quantity 02f6d3e
  • billingretire standalone Channels SKU, bundle into every paid plan 646583a
  • channelsdiscoverable multi-connection UX for LinkedIn (portal) a274d62
  • channelsmake the per-connection publish cooldown env-tunable 156c809
  • channelsportal post Channels tab — View post link + throttle display eb08745
  • channelspre-emptively gate the video Regenerate button 7a261cc
  • channelswp-admin LinkedIn connect radio choice (portal parity) 19b50c0
  • channelswrite an audit tombstone when a connection is deleted 3d76065
  • functionsfoundingSeats endpoint for the live scarcity counter 48a2825
  • wwwadd Video to the channels page, badged "New" a169e55
  • wwwFounding-Customer offer on the pricing page 16dde08
  • wwwlive founding seat counter e8230bb
  • wwwshow the Founding offer on the ad landing pages c1ea4da

Fixes

  • channelsclassify rate_limited as a skip, not a delivery failure bba46e0
  • channelsgate video Regenerate on an active connection + quota d25e42c
  • channelshide Notification language on publish-only channels 55eacf6
  • channelskey dispatch results by connectionId, not integrationId 4b94793
  • channelsLinkedIn featured images — read bytes binary-safe, not as text 914e319
  • channelsLinkedIn Page picker — versioned organizationAcls contract 143002e
  • channelsreconcile LinkedIn Page names against a workspace cache a24b03c
  • channelswait for LinkedIn image to be AVAILABLE before posting 470f4c4
  • referral-linksgate the referral-links editor to paid tiers 76dc6c0
  • schedulercount posts published after manual review d14a36c
  • workspacesrestore COLLECTION index on invitations.email a3b9d98
  • wwwfounding pricing page — design QA f7292fa

v2.12.0

View diff on GitHub

Features

  • functions,web,clientclient referral/affiliate links woven into relevant posts a524a7e
  • webAI "Suggest competitors" on the site profile + subtitle fix 6cedc87

v2.11.0

View diff on GitHub

Features

  • client,pluginvideo styling moves onto the visual preset (wp-admin surfaces) 155e7a0
  • clientper-platform caption packages on the video Ready row ada09cc
  • clientRegenerate on ready videos behind a quota confirmation 2e30e25
  • clientVideo channel UI in wp-admin — premium store card, config modal, activity lifecycle, quota, gates 2ed99d2
  • discoverylocalize explicit topic seeds + thin-pool augmentation 438dcea
  • functions,typesStripe price-metadata video entitlement + per-site video quota 24a4896
  • functions,websuper-admin "Regenerate (sandbox)" via Shotstack's free stage env c9e1f09
  • functions'your video is ready' owner email (en/de/es/fr) 10ca259
  • functionsallowedActivationIds on the workspace member model 8a0ac29
  • functionsbackfill channel adapt bodyText from generations store b6991be
  • functionscaption placement + palette accents in the video EDL 3f9b93a
  • functionsconfigurable Shotstack environment (stage sandbox vs v1) 11b9994
  • functionsdisconnected flag on cycle rows + discount on billing overview d4dab6c
  • functionsfan headless posts out to channels f8a6718
  • functionsfan out channels when a review post is manually published 4573530
  • functionsfirst-render feedback batch — useful scripts, safe captions, brand mood, persona voice, real filenames, run milestone 210893d
  • functionsjoin video jobs into channelsListEvents + video category 2d6bd88
  • functionskaraoke captions — word-synced chunks + SRT sidecar c4cedcc
  • functionslive video quota snapshot for the meter UI be33d3a
  • functionsmake the video channel credential-installable 58dc8d1
  • functionsmember access-change notification emails 4399422
  • functionsmode:'video' usage metering + cloud_pro quota gate af3241a
  • functionsmotion-graphics video assembly — branded cards, numbered step headlines, pipeline seam c5a1b69
  • functionsopen the Video channel in the store (drop comingSoon) 6888069
  • functionspage ops on permanent video render failures 912087c
  • functionsper-platform social paste packages for the Video channel 7746f11
  • functionsprefer preset.videoArtDirection in the video adapt art-direction resolver 16ea20a
  • functionsrunVideoSynthesis worker + video channel wiring a0ad246
  • functionsship boundVisualPreset digest on channelsListConnections 77a23af
  • functionsShotstack EDL builder for the video channel e295346
  • functionssite-access endpoint + restricted activation listing 5f390a1
  • functionsstock-served headless posts get channels dispatch + owner email + persona stamp aba1f65
  • functionssuppress owner-signup artifacts for invite-driven signups 076ce5d
  • functionsthread invite-time site scope through invite → accept 6d4e412
  • functionsTTS, Pexels, and Shotstack clients for video synthesis 742cafc
  • functionsvideo job metadata for the activity UI + kinetic preset 21e877d
  • functionsvideo retry/regenerate endpoint (bearer + portal) e708d6e
  • functionsvideo synthesis orchestrator 8525694
  • functionsvideo worker resolves style/placement/accent from the bound visual preset b1dea82
  • functionsvideo-ready email deep-links to the post view Channels tab a157043
  • functionsvideo-script prompt template, parser, adapt-fn factory e23f7f7
  • functionsVideoIntegration (adapt→script, publish→enqueue) 7129207
  • functionsvisual suggest pass also drafts videoArtDirection + extracts brand palette e6b88f3
  • functionsvoice personas + video connection settings wire fields 7ebe6fc
  • functionsworkspace-aware headless gate for operate-on-site endpoints 9107b50
  • getHeadlessAccess honors workspace-aware gating for the post editor 21c9dbc
  • rulesscope activation reads to the member's allowedActivationIds 7976e7b
  • typesadd video styling fields to VisualPreset (packages/types + functions twin) 06fa24f
  • uishared VideoChannelGlyph mark (9:16 frame + play wedge) 14f887b
  • uiTabs size=xs + stretch — in-card platform switcher variant 1a69dc7
  • uivideo-channel primitives — ProgressBar, QuotaMeter, MediaLightbox, PresetRadioCard, Badge dot, Select adornment f252d52
  • uivideo-visuals primitives — VideoStylePreview, PlacementRadio, SectionGateTeaser, PaletteSwatches f68c9af
  • web,clientCaptions (.srt) download on ready videos 9da9982
  • web,uiportal single-post detail view per design handoff 6ff56e1
  • webbilling display modes — unmetered usage, renewal variants, site states d0a9ffa
  • webbrand-derived preset swatches + site-named default presets 84811f1
  • webmove video styling into Visuals — preset editor #video section, slimmed channel dialog, wizard row b72f43a
  • webper-doc site subscriptions for restricted members 1fcd9c8
  • webper-platform caption packages on the video Ready card ed84134
  • webRegenerate on ready videos behind a quota confirmation 8f9c2c6
  • webrestructure site Channels page into Store/Connections/Activity tabs 523cc44
  • webrestyle Channel Store to the board's uniform card grid + local channel glyphs ed2c8ba
  • website access controls on the Members page and invite dialog e92f5ad
  • webVideo channel UI in the customer portal (store, config, activity, quota) 503ea49

Fixes

  • adminresolve firebase-admin via functions/node_modules in voice-sample script 8b79e2e
  • clientconnection-row video meta reads the bound preset's style, not the frozen legacy field 7aed5c8
  • clientdefer the Visuals video-section highlight out of the deep-link effect 051ae85
  • clientmake the Ready video thumbnail a Preview button opening the lightbox e0e3815
  • clientshow loading state on single stock-post discard confirm 1b2ba9b
  • discoveryrewrite-tolerant re-rank guard + collapse retry 644027b
  • e2eboot portal e2e with committed .env.test firebase config 9b76b94
  • functions,pluginprevent auto-mode category sprawl 5235415
  • functionsblank-line paragraph gaps in the Shorts description package d4a5564
  • functionsdark outline on white video captions for bright footage 9557964
  • functionsgate portal stock reads on campaigns.read d822f37
  • functionsheadless site names in usage rows + unmetered flag on cycle view 6d30d09
  • functionslet the video styling fields through every visual-preset allowlist af9f7ef
  • functionsscrim captions (Shotstack drops text-shadow) + video fields on the portal preset list eaec82e
  • functionssnug inline caption scrim + Montserrat font registration + darker pill 3718e84
  • uipreview thumbs show the scrim pill the render actually produces 36fe471
  • web,clientclarify voice previews are English-only samples c025f3a
  • web,functionscorrect public post URLs + persona provenance in the post view 43a03ab
  • webcampaign Posts tab + run detail link to the post view, not the editor 777d984
  • webcaption package as full-width row below hero media + clickable video thumbnails c4b7181
  • webdefault body images ON for portal-created campaigns 59f6d08
  • webgetInitials survives partial pre-provisioning user profiles 590f82c
  • webkeep disconnected sites out of the site-access pickers 6c12142
  • webresolve persona names from the workspace library on run + post views 278b3c1
  • webstop Finish setup crashing with React [#185](https://github.com/yuriy-vasilyev/structura-core/issues/185) after the draft clears 78b01ed
  • webwizard Persona step scopes to site membership + seeds a tailored voice f28842a
  • www,e2efix pricing FAQ invalid dt/dd nesting (hydration crash) + make portal e2e self-seed be61649
  • www,web,uimake Cloud most popular, catalog-drive all prices, fix plan/model/provider copy e9fe5b4

v2.10.0

View diff on GitHub

Features

  • aimake Gemini Flash Image the recommended default; seed-tooling fixes c0a38fb
  • discoverytune keyword bank for blog reach; hide difficulty selector 217efa6

Fixes

  • aistop heading keyword-stuffing + never inject unverified authority URLs ac5631a
  • campaignstolerate object-shaped authorityDomains in cluster adapter bf31354
  • headlessscope internal-link suggestions to the campaign language 293fb26

v2.8.0

View diff on GitHub

Features

  • campaignclearer discovery actions — "Re-discover" (fresh) vs "Find more" (append) a43f9de
  • converttell users on the Done step that campaigns came over paused 044dfc5
  • deliverypull fallback when the webhook push is blocked 7b7b4fe
  • discoverybuyer-intent keyword seeds, winnability filter, clear-on-language 6d1e4d9
  • discoverykeyword difficulty modes (winnable / balanced / authority) 6c4095a
  • discoveryper-language positioning for multilingual campaigns 18f89fb
  • discoverywebsite-grounded seeds, diversity, and precision filters f1d0b03
  • growthlet users request an unshipped content language from the campaign builder 8fbeddf
  • headless-editoreditable publish date + status-change confirmations 0270dbd
  • migratefix in-body internal links after WP→headless import 2772115
  • migratevision-derived image alt + scene topic for imported posts 6385d93
  • migrationshandle unsupported source language on import a3c1040
  • onboardingcapture the full service range in AI positioning 2d0ea89
  • permalinkmake %year% and %category% tokens actually resolve 2aee056
  • postsadd Published-date column; drop redundant title hover-underline dbf72e3
  • profileinline-editable positioning with AI re-suggest in settings cab3c87
  • profilemove headless site identity from Settings to the profile 63c6296
  • visual-suggestground image-style on homepage screenshot, demote logo 3c20a14
  • wwwserve the blog from the headless API (cursor pagination, no search) 81fe1ee

Fixes

  • campaign-viewuse favicons for authority domains (not letter monograms) b819c92
  • campaignscoerce keywordBank entries to strings (no more [object Object]) 39be6ad
  • campaignshonor campaign language across all discovery explorations 23e56d2
  • convertcarry WP persona bindings (subcollection) onto headless site 8cf3866
  • convertmake the delete-confirm checkbox checkable on the Done step 396e145
  • convertpreserve campaign pregenerationEnabled (don't force it off) c3a362c
  • wwwallow the headless media bucket in next/image remotePatterns a0b03f0

v2.7.0

View diff on GitHub

Features

  • convertoptional source WP app password → authenticated import f35658f
  • seoAI strategy suggest on single post + tighter SEO Targeting UI 52ab32c
  • seoescalate a missing SERPER key to an incident instead of silent decay 720efd4
  • seoportal AI "Generate post strategy" on the single-post page abf0c3b
  • webadd "Generate now" to the portal Stock tab's empty state (plugin parity) 0fb6f33

Fixes

  • stockcoerce object keyword-bank entries to strings before research bfbb432
  • stockmount SERPER + JINA secrets on the stock-generation functions e853b1e
  • stockreap FROZEN pending entries in the cleanup cron 588aa5e

v2.6.0

View diff on GitHub

Features

  • functionsground campaign keyword discovery in activation positioning 7c14904
  • growthserver-side Google Ads OCI for signup + purchase (magic-link fix) b047d49
  • migratecapture protected SEO meta via new plugin endpoint c0ff163
  • schedulerreject host-intercepted webhook responses (no phantom publish) e527ac4
  • seoground per-post focus keyphrase in real DFS long-tails 36f4eba
  • seoground single-post generation in a real keyphrase + authority 693e6e7
  • uishare DiscoverableChipList + add EmptyState across surfaces 25de470
  • webcollapse campaign create/edit into the redesign's Discovery step 9d1ab6d
  • webDiscovery "Replace" — guarded discard-and-rediscover 3aba8fa
  • webedit campaign as one scrollable form + sticky section-nav a975e0c
  • webEditor/Edit polish — section icon headers + consolidated Discovery 6e13000
  • webInterview pass — match the create prototype a263a0c
  • webList card "in stock" chip — reuse existing stock-summary hook 47f61e5
  • webList filters + loading skeleton + View output-progress bar 4d8b9cf
  • webLOW cosmetic batch — paused hint, mode check, neutral tile, recent×3 4f3149b
  • webpersist the grounded long-tail pool when discovering campaign keywords 7364ff2
  • webprototype polish — keyword volume arrows + Strategy validity dots 3b84a5e
  • webprototype polish — SEO live-data pill, tier pills, stepper gating, delete side-effects caebb1e
  • webrebuild campaign List card to the prototype; drop "dark-first" doctrine 4b5c574
  • webStrategy progressive disclosure + shared Collapsible primitive 7c91b45
  • webView/Delete polish — mode tile, SEO row, competitor chips, dup toast a211b3e
  • webwire site-runs into List cards — needs-attention pill + live-run strip 0277f4c

Fixes

  • campaignsforward authorityDomains through campaignDocToCluster 6e07826
  • campaignsnormalize legacy object-shaped keyword/authority arrays in edit form 8be93e3
  • campaignstopic interview step shows AI seeds only, not bank keywords 3bf318d
  • convertcorrect Review previews — personas count, provider logos, keywords, switch 3015306
  • convertschemeless source siteUrl 400'd the move; calmer convert step 1fac72c
  • editorauto-size + soft-wrap the code block c7324a4
  • growthkeep recordAttribution bound to GROWTH_EVENT_SECRETS 47ae4fc
  • growthretry OCI uploads + never permanently lose a signup conversion 350d184
  • headlesshonor postStatus on stock-served posts + diversify authority links 04d9bc6
  • headlessstrip keyphrase-bolding the model emits despite the prompt 31da6ed
  • migratestrip stray <code> wrapper from imported code blocks b9ff4e3
  • portalcount posts-this-week from workspace-rooted runs cf4f7bb
  • seoAI-relevance-filter the long-tail pool, not just token-match b9a2bb4
  • seofilter long-tail pool to genuine variations of bank keywords cf9cc42
  • seostop the monthly keyword refresh from drifting the bank off-topic 3d2d5fa
  • webmove campaign filter/needs-attention keys into the campaigns namespace 6bbc83d
  • webno auto-discovery on the campaign edit screen 6fe9ad4
  • webrefetch the raw campaign doc after edit so the view isn't stale 184adb2

v2.5.0

View diff on GitHub

Features

  • clientdisable campaign image toggles when uploads dir is unwritable 20a30da
  • pluginwarn + guide when the uploads dir blocks image saves 681b5d3
  • surface plugin image-sideload failures as "completed with warnings" 81d8556

Fixes

  • generatehonor post status on single-post gen; never surprise-publish 5a22072
  • pluginan image sideload failure must not destroy the post 0851189
  • uicenter the logo + give the page a dark-mode background ffc4626

v2.4.0

View diff on GitHub

Features

  • conversionWP→headless site conversion backend (preview + start) dcee28b
  • convert"Move to Headless" wizard (portal frontend) acccf05
  • headlessadd a distinct "draft" post status 599e5e3
  • migratere-polish imported posts + richer html-to-blocks parse b5963ec
  • opsdaily reconciliation cron for paid-but-unprovisioned accounts d1dfe69
  • opspage ops on billing-webhook + signup-provisioning failures 0364aa9
  • sitesDrafts tab + DRAFT badge + 3-way editor status control 5591647
  • sitesre-polish action for imported posts + open imports in editor a310181
  • webBetter Stack error tracking (Sentry SDK) + copyable error block 82022dc
  • webpage-level error boundary so a page failure degrades in-shell 87efc48

Fixes

  • authoritybroaden per-post authority search beyond top-3 domains bdc51e3
  • billingdon't 500 the overview when the invoice list 403s 5edda76
  • growthsupport gbraid/wbraid in Google Ads OCI + bump sunset API version 7c33b4f
  • headlessrespect campaign "Publish immediately" on delivery e62691f
  • signupkey provisioning idempotency on the license, not the user doc bf25c1f
  • uifull-viewport height on AppLoader splash screen 6eb2c61

v2.3.0

View diff on GitHub

Features

  • headlessemail the site owner when a new draft is ready to review be879f7
  • sitestop-right "Re-discover" button in campaign discovery steps ae110f7
  • supportsend the ticket submitter a branded confirmation email af22a7d

Fixes

  • billingredirect checkout to the hosted session url fcd384d
  • billingstop expanding past Stripe's 4-level limit in overview 8cbca2b
  • headlessresolve %lang% permalink token so URLs/redirects don't emit a literal 4958e1b
  • headlesssupply internal-link candidates to stock-generated posts d3c85d9
  • seo-intelground campaign keyword re-rank on the objective 328d832
  • sitesraise discovery callable client timeout (deadline-exceeded) c455be4

v2.2.1

View diff on GitHub

Fixes

  • connectredirect into new site after WordPress connect celebration 28b2704
  • onboardingdrop "What does your site do?" from the wp-admin wizard dc38ee7
  • workspaceshide retired/merged workspaces from listMyWorkspaces 0571502

v2.2.0

View diff on GitHub

Features

  • onboardingper-site persona membership in the wp-admin wizard a8caeff
  • personasbearer-auth membership endpoints for the plugin wizard 6fe54aa
  • pluginpersona membership REST routes + envelope for the wizard 95614c3

Fixes

  • onboardingSEO auto-draft retry + manual competitor suggest c049acb
  • plugin/wizard/state returns a quiet fresh state when license-less 283f16c
  • portalredirect to Sites when a site route resolves to a deleted site 5acf892

v2.1.0

View diff on GitHub

Features

  • keywordsshow real DFS monthly search volume on keyword chips b5d6e87
  • onboardingauto-add DFS-measured competitors in the wizard SEO step cbf0eed
  • plugin"permanently delete all data" checkbox in the disconnect dialog 1a5d506
  • portal"permanently delete all data" checkbox in the removal dialog 8aa0f10
  • portalkeep AI-guessed competitors as suggestions in onboarding SEO step e8d4c19
  • workspaceshard-purge path for site removal (+ last-site teardown) 3ea37b5

Fixes

  • campaigns/sitepoll next-run, human model names, no auto-discover 2dc5e5c
  • clientgraceful recovery in the error boundary for a stale connection 6822ad9
  • i18nre-merge + complete de/de_AT/es/fr translations after wizard rebuild 16b9510
  • seostop interstitial pages poisoning keyword/positioning discovery 8c53d93
  • usagescope the wp-admin cycle-usage widget to the current site 162b29e

v2.0.0

View diff on GitHub

⚠ BREAKING CHANGES

  • pluginremove site-level keywords + authorities (now campaign-scoped)
  • webremove site-level keywords + authorities (now campaign-scoped)

Features

  • campaignscampaign-level competitor augmentation (language-aware) 46bb8f5
  • channelsmanage channels from the portal for non-WP surfaces 4065d5f
  • competitorsthread campaign language through the plugin suggestion path 85cbdcb
  • keywordsdrive gap analysis from the campaign's competitor list 639a4ab
  • migratemigrate a WordPress blog into a headless site bdd9446
  • onboardingadd the image-medium switcher to the wizard Visuals step 9e0ee8c
  • onboardingseed a site-specific persona even in a populated workspace 5bc57e0
  • plugincampaign Competitors step + campaign-scoped persistence cf25707
  • pluginremove site-level keywords + authorities (now campaign-scoped) a1e4026
  • seo-intelDFS-first multi-seed keyword discovery with smart-model re-rank 150fa5d
  • setupland SEO step prefilled, drop redundant step-1 description 6f868e4
  • webcampaign Competitors step (portal) — language-aware augmentation 1955f5a
  • webremove site-level keywords + authorities (now campaign-scoped) 3b8e2e2

Fixes

  • ai-enginekeep workspace-key rows single-line for long site names d15b40c
  • authmagic-link deliverability + signup inbox recovery UX 8f11f4b
  • authpolish magic-link "check inbox" panel de78fe7
  • diagnosticsmake "Run a connection check" actually run the check 4e48df3
  • onboardinglocalize wizard AI drafts + decode entity in key picker fe7886e
  • runsscope the "Recent generations" widget to the current site 5fc9d08
  • siteskeleton the positioning editor while it loads be863ed
  • taxonomystop feeding the default category to the model; nudge it to create a3f538d

v1.89.0

View diff on GitHub

Features

  • channels/linkedinbrand-voice prompt variant for company Page posts 988167f

Fixes

  • channels/linkedinhide unreachable "Personal profile" target on org connections 1daa66a
  • channels/linkedinpopulate company-Page picker via versioned org-ACL read 804fe6b
  • channelsauto-open Configure modal after OAuth connect (hash params) 4c48697

v1.88.0

View diff on GitHub

Features

  • personasper-site persona membership + in-site rotation; v6 portal Personas/Visuals 2380f9f
  • plugin,weball-tier Bridge Diagnostics + cloud-unreachable warning 756c773
  • pluginfold image medium into the Suggest dropdown (wp-admin parity) b0317ac
  • pluginimage-medium picker on the wp-admin Visuals page c589627
  • portalposts list — thumbnails, click-to-edit rows, three-dot menu ebbfa49
  • visualsfold image medium into a "Suggest image style" dropdown (portal) e0dc571
  • visualsimage-medium picker + photography-first art direction 41cc59c
  • webauto-suggest authority domains on the Site profile tab c146dc1

Fixes

  • ailink validator — HEAD is advisory, confirm dead with GET a3fda1f
  • ainever let the model invent outbound links — homepages or none 84e98e4
  • headlessrepair fabricated internal links + resolve headless public URL cda5d85
  • schedulerlink-validate against the real site host, not the UUID 95852fc
  • stockrun link validation in the batch path (was bypassed) 2f82630
  • suggestionsroute portal visual/persona suggest through the shared getSuggestionBlueprint 68bf0fe
  • visualscursor + hover affordance on the image-medium cards 6f4dfd1
  • visualsricher per-medium art-direction prompts + exact-hex palette 10da0ea
  • webdrop spurious _many plural keys from es/fr locales 82b3049

v1.87.0

View diff on GitHub

Features

  • headlessbidirectional cursor pagination for read API c68cf06
  • seocomplete JSON-LD graph on plugin render + dedupe www schema 760df28
  • sitesdocument `before` cursor param on the Delivery API page 3cc00e6
  • wwwadd competitor comparison pages for neuroflash, mindverse, neuronwriter, zimmwriter, writesonic 2f24ac2

Fixes

  • headlessadd ascending publishedAt indexes for backward paging f8cb66a

v1.86.0

View diff on GitHub

Features

  • headlessper-language delivery blogs a2fb751
  • headlessregenerate post images with AI b418bd5
  • headlessrestore trashed posts to their pre-trash status e43cb56
  • headlesstrash, restore, and permanently delete posts c1685ac
  • webinline text formatting toolbar + create link 1c703e6
  • webreal top-bar overflow (3-dot) menu 715d9d2
  • webresponsive headless editor layout e1d2e94

Fixes

  • headlessbind image-gen secrets to regenerateHeadlessImage 998b59f
  • stockcompare keywordBank by keyword text, not object reference 467e931
  • webconfirmations, inline popup errors, status tabs, format polish 5a3eef5

v1.85.0

View diff on GitHub

Features

  • headlessFAQ/HowTo JSON-LD schema + section marker classes 69f2c1f
  • imagespage ops on inline image-gen provider failures 04699b2
  • opspage Telegram when a campaign hits the stock failure cap bd4e9b2
  • stocksurface "pre-generation paused — provider errors" in the Stock tab 633cb1b
  • webcampaign edit save bar with Cancel 8041898

Fixes

  • aiunique writing-variety seed per stock-batch post f15b7a5
  • headlessdeliver action_steps + FAQ as blocks; heal body image c41c302
  • headlessrender body image + caption inline in delivered posts 8cf2ab8
  • imagesdefault imageModel to a real image model + heal bad values 4e3f6d0
  • runsflag failed image steps as warnings, not green checks f435973
  • stockforward image alt/caption/fileName/topic in served bundle 269a425
  • stockinvalidate on keyword change; refill only when buffer drains to 0 59eb4b3
  • stockstop self-cancellations tripping the failure cap; coalesce refills; reap failed entries 98040cc
  • webrender Select dropdown panels (add missing Select.Content) ebe12bf

v1.84.0

View diff on GitHub

Features

  • aiper-post writing variety to kill content-farm tells a59c5fb
  • campaignsbring headless campaign create flow to plugin parity 6b731a8
  • headlessfull Gutenberg-style post editor in the portal 9a57791
  • onboardingground wizard keyword suggestions in real demand + two buckets dc39d31
  • onboardingrebuild portal setup wizard AI/persona/visuals steps a6d5d58
  • onboardingrebuild portal setup wizard as a 6-step plugin clone bb1bad6
  • pluginexplain intentional readability-score variance to users 1063fb6
  • sites'Fetch from site' favicon button 3d7d558
  • sitescross-campaign Posts page for headless sites ce3dd97
  • sitesoptional favicon for the dashboard icon + real domain in SERP preview 75b187e
  • wwwcontextual AI Detector links on landing pages + blog posts 31e0396
  • wwwfree in-browser AI Content Detector tool page cb117c4
  • wwwlink the AI Detector from the footer Resources column 1755c8e
  • wwwPostHog events on footer links 8ebd7a0

Fixes

  • campaignsUX polish on the headless campaign create flow 10d38e4
  • headlesseditor polish — portaled-popover styling, list editor, DnD, captions 7b3857e
  • headlessstop editor re-render loop and render full-screen e4a0a54
  • portaldefer account creation to magic-link click dfe158c
  • workspaceslabel headless activations by siteName, not the raw id 11b56cb
  • wwwactually send the AI-detector breakdown email e140fc1
  • wwwadd /ai-detector to the sitemap b262a6d
  • wwwreplace AI-detector placeholders with real homepage assets a0f6f10
  • wwwtidy AI-detector promo spacing on blog posts a648dee
  • wwwtype the subscribe-test fetch mock so tsc passes 81e7e9e
  • wwwuse Resend Segments API for AI-detector email capture 1e85eb5

v1.83.0

View diff on GitHub

Features

  • functions,webAI-guess transparency notes + pipeline fixes from live run 54a1d9f
  • functions,webclose plugin-parity gaps — stock/run control, key testing, channels store, billing + chunk fixes 334afb5
  • functions,webheadless campaign engine — full surface parity e932656
  • functions,webheadless campaigns consume pre-generation stock ec4417d
  • functions,webpersona + visual-preset CRUD in the portal fb3fb35
  • functions,webportal-triggered WP generation — Run now + single post f306cb9
  • functions,webv3 paid billing — plan hero, cycle meters, payment method, invoices 228ed6f
  • functionsactivation-reminder cron, personal sender, localized greeting 958ebf5
  • functionscreateHeadlessSite callable (dogfood-gated) 7d2f5eb
  • functionsdurable headless image storage + upload endpoint (Tier-2 [#7](https://github.com/yuriy-vasilyev/structura-core/issues/7)b) c3f3449
  • functionsfeed real site context to headless generation (+ slug foundation) 8ea87ec
  • functionsgenerate on headless — store posts instead of webhooking WP (Tier-2 [#8](https://github.com/yuriy-vasilyev/structura-core/issues/8)) cf32ad4
  • functionshard maxSites gate on createHeadlessSite d4eac63
  • functionsheadless auto-pilot scheduler backend (Tier-3 [#19](https://github.com/yuriy-vasilyev/structura-core/issues/19)) 42db678
  • functionsheadless block→HTML renderer (Tier-2 [#6](https://github.com/yuriy-vasilyev/structura-core/issues/6)) b4bae8f
  • functionsheadless categories/tags archives + pagination 4a792d5
  • functionsheadless editor backend + image-block rendering (Tier-3 [#2](https://github.com/yuriy-vasilyev/structura-core/issues/2)a) 33ddb55
  • functionsheadless image normalization core (Tier-2 [#7](https://github.com/yuriy-vasilyev/structura-core/issues/7)a) 5d22126
  • functionsheadless read endpoint + publish action — Tier 2 complete ([#9](https://github.com/yuriy-vasilyev/structura-core/issues/9)) 28bd0b0
  • functionsheadless run-now + posts list backend (Tier-3 [#1](https://github.com/yuriy-vasilyev/structura-core/issues/1)a) 1229f03
  • functionsheadless surface type foundation + dogfood gate 2916f11
  • functionsimport existing posts into a headless site (Tier-3 [#3](https://github.com/yuriy-vasilyev/structura-core/issues/3)a) 54ff40c
  • functionssend a free-tier welcome email on signup 868209f
  • headlessrelease gate toggle (Firestore flag, no deploy to flip) ca57d59
  • ui,webshared Stepper component — one wizard strip everywhere 1df1b62
  • ui,webshared zod form-validation layer — required fields highlight in place f44ab29
  • web,functionsplan-tier gating for invites + AI providers; show stats for free 4ee25a4
  • web,functionsplugin-parity campaign UX — catalog dropdowns, AI Engine, campaign tabs 34dc871
  • web,functionsportal two-world redesign — site world, wizard, campaign flow ac53ce1
  • webblock-list editor + image paste for headless posts (Tier-3 [#2](https://github.com/yuriy-vasilyev/structura-core/issues/2)b) e0fa4a6
  • webclearer Download Plugin card — drop "Pro", add free/paid note 5c307c1
  • webConnect a site CTA in Overview empty state e35fc9a
  • webexplicit free-activation CTA on Subscription page 53cbc97
  • webheadless auto-pilot schedule UI — GA scheduler complete 2f677a3
  • webheadless integration instructions — Tier 1 complete 50e0969
  • webhome attention slot — failed-run / all-paused / nothing-scheduled states 8f7f9a1
  • webimport UI for headless sites — Tier 3 complete ([#3](https://github.com/yuriy-vasilyev/structura-core/issues/3)b) ca6d313
  • webminimal Add-Site portal UI (dogfood-gated) 4ce31b8
  • webmove headless site management to the Sites page 0c11d98
  • webone-click legacy schedule → campaign conversion 07948a1
  • webper-site headless area — generate → review → publish (Tier-3 [#1](https://github.com/yuriy-vasilyev/structura-core/issues/1)b) 4c24212
  • webremove coming-soon surface waitlist from the Overview ff42f68
  • webschedule-pulse home header — posts this week + next-post derivation 747cd31
  • websurface archive + pagination routes in the headless guide 8227927
  • webv3 workspace pages redesign — keys, personas, presets, members, billing, settings, account b387680
  • www/autoblogging landing page + /vs/machined-ai comparison 610e4f8
  • wwwadd missing pages fd317c0
  • wwwadd Structura vs. AI Buster comparison page 15e6cfa
  • wwwper-locale blog sources — de/es/fr blogs empty until their content campaigns launch 2945a72

Fixes

  • functions,webDFS instant_pages 404 + explicit site-name field in headless connect 2f9eeb7
  • functions,webportal runs visibility — canonical path + missing doc fields d968fb0
  • functionsEmailOwnerIntegration sends from the verified Resend domain 0091add
  • releaseforce plugin .zip to download as a file (Content-Disposition) 20ed606
  • uiCodeBlock preserves newlines + bounds width 0869d1d
  • web,functionswizard magic results survive remounts + headless identity fallback ec16035
  • webcampaign-flow grids cap at 2 columns — selects were truncating 8b395cc
  • websites table fidelity — tinted header band, flush accent add-row 51d6636
  • websync admin Test Email template list with the server registry 3e977ff
  • wwwstop dropping landing pageviews — queue captures behind PostHog init, re-emit on consent grant 9f33f54

Reverts

  • wwwback out marketing/www files swept into c3f344955 7cb4151

v1.82.0

View diff on GitHub

Features

  • clientwizard auto-suggests the whole brand layer 05ef886

Fixes

  • clientlicense gate success state + centered connect form 701a2ab

v1.81.0

View diff on GitHub

Features

  • clientdefault new campaigns to pending-review post status bb9a777
  • functions,plugin,clientfeed confirmed keywords + authority domains into AI suggest prompts c2f5905
  • wwwsurface structural benchmarks + rankings-based internal links in marketing copy 13dc87d

Fixes

  • clientscope wp-admin cycle-usage widget + quota banner to the current activation a84d2b2
  • functions,clientscope competitor suggestions to the analyzed site + AI prompt context f53bda4
  • plugin,functions,clientcache workspace audience so the plan badge doesn't flash d712cda

v1.80.0

View diff on GitHub

Features

  • clientplan-aware setup wizard — skip AI step on cloud, license gate first fa3c926
  • plugincarry provider_count_cap + is_anonymous on the settings payload 35c68f3

v1.79.0

View diff on GitHub

Features

  • aiE-E-A-T writing signals + SERP entity coverage as toggleable SEO directives 2f0bcaf
  • wwwadd Agility Writer comparison page, reorder compare links by directness ab24a30

Fixes

  • clientdefault the Code content block off for new campaigns 7af341a
  • clientremove the 300ms transient frame in interview single-select dcfdb96
  • clientstop interview chip rows rewrapping when the checkmark appears 5bc4f40
  • wwwgive every responsive grid an explicit grid-cols-1 base 4d55987
  • wwwunstick mobile scroll lock + viewport-wide overflow on phones 123011c

v1.78.0

View diff on GitHub

Features

  • admindebugging drill-down — site search, activation debug view, run traces 3333755
  • stockcampaign Stock tab — visibility + control over pre-generated posts 58a44db
  • stockcancel frozen batches at the timeout ceiling and notify the owner 263dd86

Fixes

  • researchrestore competitor analysis, site-level authority fallback, and stock enrichment 38c2d9c
  • webstop dark-mode login logo from stacking icon over wordmark 75c6d76

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