Track all updates, new features, and improvements to Content Engine
Current Version
v3.13.0
Features
106
Bug Fixes
122
Improvements
97
If you run more than one site, Content Engine can now find related articles across them and link them to each other — as proposals you approve one at a time, or as a daily run once you trust it. Every link it plans is recorded, including the ones it decided not to make and why.
Inter-Site Links looks across your connected sites, works out which articles are genuinely about related things, and links them. It is on the My Sites page, and it costs no credits — this is your own sites linking to each other, not the exchange.
By default a run produces proposals and changes nothing on your site until you accept them. Accept or decline them one at a time. When you are happy with what it suggests, you can let it apply links on its own.
A searchable history of every link the feature has ever planned for your sites — where it went, what changed in the article, and links to both pages so you can open them and look.
A site can opt out of giving links, receiving them, or both, without disconnecting it from Content Engine.
When writing a link into a page did not succeed, the run recorded it as applied anyway. The history then listed edits that had never happened, which is worse than reporting nothing — you would have gone looking for a change that was not there. A failed link is now recorded as failed, with its reason.
The words chosen to carry a link were picked in the order they appeared in the article rather than by how well they described the article being linked to. Anchors are now ranked against the target, so the link text tells a reader where they are about to go.
Our messages did not carry the one-click unsubscribe headers that large mail providers now expect, and Gmail was classifying legitimate notifications as spam as a result. Every email now carries them, along with an unsubscribe link in the footer.
The login, register, forgot-password and reset pages had no link home. If you arrived at one by accident your only way out was the browser's back button. Every auth page now has a way back.
Runs do not live in your browser. You can start one, close the tab, and come back to it — and pausing a run is honoured whether or not the page is still open.
Two ways of getting locked out of your own account are fixed, one of them serious. Email is substantially rebuilt: every message now looks like it comes from a real product, carries a plain-text alternative, reaches you with the right branding, and tells you about plan changes and renewals. And the article picker in the backlink exchange stops hiding most of your library.
Every notification now uses a proper email shell with your organisation's branding, and ships a plain-text version alongside the HTML for clients that prefer it.
Changing plan, and an upcoming renewal, now send you an email. Previously both happened silently and the first you knew of a renewal was the charge.
The picker that chooses which of your articles a link should point at is now paged and searchable. On an account with four hundred published articles, three hundred of them could not be reached at all.
After enabling 2FA the login form never asked for the code, so the correct password was rejected every time and there was no way to supply the second factor. Anyone who switched 2FA on could not get back in. The login form now asks for the code, and existing accounts with 2FA enabled can sign in normally.
An account whose role the permission system did not recognise crashed two internal helpers, and the failure surfaced as a login that simply did not work. Unknown roles are now handled and fall back to the safest permissions rather than breaking the page.
A workspace can hold several connected sites. The push half of Two-Way Sync selected everything published in the whole workspace, so syncing one site sent the other sites' articles to it — titles, branding and all. Sync now only keeps an article in step with a site it already belongs to, and reports everything else as "not on this site" rather than silently skipping it.
Changes on the general settings page appeared to save and were gone on reload. They now persist. Three fields that nothing in the product ever read have been removed rather than left there implying they did something.
An image that simply was not there produced an error suggesting storage was down. It now reports the image as missing. A separate defect in avatar addresses, where part of the path was joined without its separator, is also fixed.
Arabic has more plural forms than most languages, and several of ours were incomplete — so instead of a count you would see the internal key. The plural families are now complete. The Backlinks area has also been added to the mobile app's navigation, where it was missing entirely.
A notification sent when an article was submitted said it had been published. Two related problems are fixed alongside it: some messages shipped visible escaped markup instead of formatted text, and one showed a raw internal step name where a readable description belonged.
Only around three sends in every thirty were being recorded, which made "did that email actually go?" unanswerable. Every send is now logged, whatever its outcome.
The profile and account area is now tabbed rather than one long page, and the publishing totals shown there have been corrected — they previously counted some records twice.
Two-Way Sync keeps a connected site and Content Engine in step in both directions — posts on your site come in, articles here go out, and nothing is duplicated. Plus link text in the exchange is now drawn from words the host's own article already uses.
Start a sync on any connected site and articles move both ways, one at a time. Posts on the site that Content Engine does not have are pulled in; articles here that belong on that site are pushed out. You can close the page — it keeps going.
When you ask for a link, Content Engine now suggests anchor text drawn from words already present in the host's article — so the link can be wrapped around existing prose rather than added as a line of its own.
Both backlink screens showed the address of the page a link would go on, as text you had to copy. They are now links you can open.
Two-Way Sync is wired into the same background driver as the rest of the product's scheduled work, so a run continues reliably rather than depending on a browser staying open.
The backlink exchange shipped with no way for a new account to get its first credits, so nobody could actually start. That is fixed, along with where a paid link is placed in an article, a queue whose second page was unreachable, and cover images, which stopped working when Google withdrew the endpoint we were using.
Your subscription includes a monthly allowance of exchange credits, and there was no path by which a new account ever received them — so the exchange could not be started at all. The allowance is now granted, and the credits card shows what you have.
A link a requester paid for was being appended below the references, where a reader never sees it and a search engine discounts it. Links now go into the body of the article, wrapped around words the host already wrote.
The card could show one balance in its summary and another in its detail, its most prominent button had no effect, and a successful claim made the whole card disappear. The page header repeated the same wrong claim.
When a request expired unanswered, the host's article was counted against their per-article limit permanently — so an article could be quietly removed from the market by a request its owner never even saw. Expired requests no longer consume the slot.
A requester who mistyped an anchor, or simply changed their mind, had no way to withdraw a request that no host had answered yet. You can now withdraw a request while it is still waiting, and nothing is charged.
Each service explained exactly which limit had refused a request, and every one of those reasons was discarded one layer below the screen. The specific reason now reaches you.
The placements list could not be paged, so anything beyond the first page was invisible rather than merely further down. Two further defects in the same area were found by using it in a browser and missed by every check of the API behind it. The filter bar also stranded its fourth control on a row of its own.
An article imported from a site is already live, and nothing recorded that — so the verifier looked at a perfectly good live page and reported the link as not published. Imported articles now carry the address they are live at.
Where the host's article title was not available, the screen rendered the literal text `in "" on` instead of a sentence.
When a host's page was re-published after a link was added, a second draft was created instead of the live post being updated.
A limit meant to stop one article carrying too many links was being applied more broadly than intended, removing hosts from the market who were within their own limits. Affected records have been repaired.
Google withdrew the image endpoint we were calling, so cover image generation failed outright. It now uses the current Gemini image model. Alongside that, when several image providers fail, every one of their failures is reported with its own reason instead of only the first with a generic phrase.
The navigation hierarchy had inverted, so twenty-six entries rendered as one flat list with no grouping. Sections are back, and the guide rail that shows which section you are in — which was invisible in light mode — is now visible in both themes.
Your published articles can now carry links to other people's articles and earn credits for it, and you can spend those credits getting links to your own. Every placement is checked on the live page before anybody is paid, and nothing is charged until the host agrees.
Pick one of your published articles and see which other published articles could carry a link to it, ranked by how closely the two subjects actually overlap. You choose the anchor text; the host decides whether to accept.
A Link Requests page lists everything asked of your articles, what each one would pay you, and whether it is still waiting on you. Accept, turn down, or place the link into your article from the same row.
After a link is placed, the page is fetched and read. Credits move to the host only when the link is found live on the real page, pointing at the real target.
A settings page for hosting: whether you are accepting requests at all, your price in credits, how closely a subject must match, how many links one article may carry, a monthly ceiling, and which categories you will take.
New hosts started with a 60% subject-overlap requirement. Because the score compares the whole of both articles' titles, keywords and categories, two articles on exactly the same topic score around 20-35% — so a host using the defaults would have been offered to nobody, for ever, with nothing reporting a problem. The default is now 20%, which admits genuinely related articles and still refuses unrelated ones.
A placement you are waiting on shows as held rather than spent, so you can tell the difference between credits that are gone and credits that can still come back if the host turns you down.
When a request cannot be made, the reason names the host's own setting that refused it — the price, the subject match, the per-article limit or the monthly ceiling — instead of a single generic message.
The Content page loads a page at a time instead of every article you have ever written, paid plans get the connection and article allowances they paid for, and the Labs now tell you which findings a fix cannot move instead of offering one that changes nothing.
Content now loads one page of articles at a time, with Previous and Next, and the heading still shows your real total rather than the number of cards on screen.
When a tool reports five issues and offers two fixes, it now lists the other three with the reason each was withheld.
Thirteen new articles, covering every screen in the product. The AEO Lab, the GEO Lab, Content Audit, Content Refresh, Competitor Gap, the Bulk Queue, Repurpose, My Sites, SEO Performance and the Research Library had no documentation at all.
The Integrations page showed an Enterprise account a two-site limit with the Add button disabled, automation offered every package one article a day, and the dashboard told everyone their content limit was ten. All three read the plan from a snapshot written once at signup and never updated.
The Ranking Keywords list and the profile analytics that includes it were failing outright. A keyword record is stored as an object and was being read as a string.
The content and publishing figures on a profile analysis are computed in the database now. Same numbers, verified against the old calculation on real data, without loading every article to add them up.
It attached a full snapshot of each article for every revision ever made, and used only the count.
Any new customer-facing query that grows with your usage and has no limit now fails the build, with an escape hatch that requires a written reason at the call site.
A new screen with no documentation, or an article missing from its section index, is now visible rather than discovered months later.
The Labs used to report a score and leave you to act on it. Thirteen tabs across SEO, AEO and GEO can now propose a surgical fix for the section a finding belongs to, for you to approve — and the panel tells you which site the article is on and whether the live copy is behind.
Every tab that reports on one of your stored articles can now fix what it found. Proposing writes nothing; you read the before-and-after for each suggestion and approve the ones you want.
It names the site the article is published to, links the live post, says whether publishing will update that post or create a new one, and says whether the live copy is behind your edits.
Content Validation and Similarity Check now let you pick one of your articles instead of pasting text, which is what the AEO and GEO tabs already did.
Articles were pure prose. They now include a comparison table, a data table, an ordered sequence or a pull quote when the material genuinely calls for one.
It always had. The keyword endpoint it called does not exist; only the path was wrong.
The version list changed but the text underneath kept the first version you had opened.
And it lost the record of what had already been sent, so "is the live copy behind?" was permanently unanswerable for imported articles.
Twenty-six flat links became six collapsible sections. The Labs' tab bars now wrap instead of clipping the twelfth tool off the edge.
Connect an account, publish, and push updates — Reddit supports editing a post, so a corrected article can be corrected there too. Scoped to your own profile and subreddits you moderate.
Dark mode, on by default, with a toggle in the navigation and a follow-my-device option in Settings. Building it surfaced four contrast defects that had been in the light theme all along, including a chart series nobody could see.
The whole application, dark by default. Toggle it from the landing navigation or the dashboard header.
Two colours used on 162 places between them had no readable variant. They had always been below the accessibility threshold on the cream background.
The default line and bar colour was a near-white acid green on a light background, used in 41 places.
Terms, Privacy and the rest never received the redesign, so they rendered with the old dark styling on the light site.
Publishing the same article twice left two posts on your site. It now updates the post it created.
The image prompt named a photographer, which the image model read as a subject.
It had no entry point of its own — the only way in was a link inside the Integrations page. Settings now has one tab bar covering General, Integrations, Billing & Plan, API and Team.
Profile and Settings in the account menu did nothing at all.
They had no handler. Signed in they take you to your plan; signed out, to registration with the plan preselected.
Import an article from WordPress, improve it here, and push it back to the same post. The whole cycle now works end to end, and the Sections editor works on imported and generated articles.
Opening an article in My Sites now shows the full article — headings, paragraphs, lists and images — instead of an empty preview.
Publishing an imported article updates the original post on your site instead of creating a second copy, and the update is now recorded.
Everything that reads an article now reads an imported one correctly: the Improvement Wizard, SEO scoring, export, repurposing, social snippets and link suggestions.
Adding, deleting and reordering sections now works on imported and generated articles, and the article body updates with them.
It answered "Failed to analyze competitor" for every domain because it called an SEO data endpoint that does not exist. It now returns the keyword gaps, and says specifically when the data provider is the problem.
Requests to your site were not being authenticated, so only publicly visible posts were listed and the article count was wrong.
On imported articles the improvement was saved in one place and read from another, so the article did not change.
The indicator always said "no local changes", even straight after rewriting an article.
The sidebar section headings are larger and each carries an icon, and the links themselves are a size up.
Selecting a different version now changes the content, not just the heading above it.
Some publish paths could send the article as markdown, which showed as literal ## and ** on the live page.
A grouped, collapsible sidebar; clear error messages in place of "[object Object]"; and fixes to Content Audit, Repurpose, SEO Performance and My Sites.
The sidebar's 26 links are now organised into six collapsible sections, with only the one you are working in expanded.
Previously generated versions are now clickable and open in the preview, and the preview names the platform it was written for.
When the table is empty it now tells you which Search Console property was read, how many rows Google returned and how many matched your articles.
Across the app, a failed request now shows the reason the server gave. Competitor Gap Analysis was the most visible case.
Auditing a single article URL used to produce a Site Health Score of 0 from zero crawled pages. The audit now looks at the whole site that URL belongs to, falls back to auditing that one page, and tells you when it could not read anything at all instead of scoring nothing.
The article list asked WordPress for a post status it does not accept, so every site showed "0 articles" and a WordPress API error. It now loads your published posts, and drafts and pending posts can be selected explicitly.
The page heading showed an internal label instead of its name.
The twelve tools in each lab were in a single row that clipped the last entry with no indication more existed. The bar now wraps so every tool is visible, and the selected tool is readable and announced rather than shown by colour alone.
Navigation sections, lab tabs and the repurpose version list are all operable by keyboard and announce which item is current.
Automation was inventing article topics from a keyword with no date and no search behind it, which is how a post about a two-generation-old phone reached a live site. Articles gained a working table of contents. The plans were repriced against measured cost.
Automation-published articles had none at all, and the ones the wizard produced had links that pointed at headings that did not exist.
The topic was invented from a bare trending keyword using the model's training data — no date, no search — and the research step then confirmed the wrong premise it had been handed. Topic creation is now grounded in a dated, recency-filtered search before the title exists, and an ungrounded run is forced to an evergreen topic rather than guessing at news.
Research reached the keyword and outline steps and stopped there, so the article itself was written from training data filtered through an outline. Both the wizard and automation were affected.
Citations came back in a shape the parser did not read, so the sources rendered as empty links.
Headings inside a quote block were shipped as raw text. Measured on ten live posts: every one of them had two or three.
The article's own heading was included in the body as well as the post title.
Images are the most expensive part of an article and the section-image loop had no limit, so every plan was six times over the allowance it was priced on.
Every tier was repriced against measured cost — API, infrastructure, storage and payment fees — in the product and in Stripe together. Anyone on an old price keeps it.
The public page described plans that no longer existed, promised one tier as unlimited when it is capped, and hid the real top tier entirely. A check now fails the build if the page and the plans disagree.
The image instruction asked for a concept and got stock-art; it now asks for a concrete scene in photographic language.
The product could not send email at all — password recovery and team invitations answered success and sent nothing. Your WordPress and Shopify credentials were stored unencrypted. Screens that could not load their data were claiming there was none.
Password recovery, team invitations, payment-failure notices and usage warnings are delivered. The blocker was a hard dependency on a single vendor, so the transport is now provider-agnostic.
Every statement on it is verifiable against the product, and it says plainly what is NOT claimed.
An application password is a real credential for your own site. They are encrypted at rest now, with the existing ones migrated.
A failed check was drawn as "not connected" rather than as a failed check — so a Search Console outage looked like a disconnected account.
A write the server refused left the screen looking as though it had worked.
Retrying a failed publish, cancelling an invitation, the member picker and the Shopify blog selector.
The dropdown reported success and the status did not change.
Daily usage could be recorded against the previous day, and a billing period could start an hour before the month.
Not a live bypass — the routes in front of them refuse first — but the check itself was inert.
It made one database round trip per unit. Reporting 200 units took 2.8 seconds inside a single request; it is now flat.
Every CSV this product emits neutralises formula injection, and download filenames no longer break on non-Latin titles.
A full security pass. Cross-tenant access was possible on articles, platform connections, keyword lists and collections; password-reset tokens were stored in plaintext; there was no request size limit. All closed, and the type gate that would have caught several of them is back on.
A render error used to produce a blank white page. Every area of the application now has a boundary that keeps the navigation usable and offers a way back.
Requests carrying another workspace's identifier could read or change data that was not theirs — including a platform connection's stored credentials. Every by-identifier route is now scoped to the caller's own organisation, centrally rather than route by route, and a request naming a workspace outside your organisation is refused before a handler runs.
Two separate plan definitions existed and the one being enforced defaulted to free, so a paid account could be hard-blocked at two articles a month with an upgrade prompt.
Three fields moved in the payment provider's API and the code could not see the change, so a failed payment left full access in place.
Instead of at the end of the period already paid for — up to two months lost. The same bad date then produced a "$0.00, 0 days remaining" figure on the upgrade screen.
Only a hash is stored now, single-use, and issuing a new link invalidates the outstanding one.
A 24 MB body was buffered and parsed without authentication.
Which blocked the server for 73 seconds and then crashed it.
And the same route had no tenancy check at all — both fixed together, because fixing only the first would have opened a cross-tenant write.
One settings panel generated a plausible-looking key in the browser, showed it as live, and reported success on revoking it.
It served hardcoded prose one word at a time to imitate a model, on a live authenticated endpoint. It now refuses instead.
Nothing could create an endpoint, so every delivery was rejected. They are persisted and signature-verified now.
Eight alerts and thirteen confirmations used the browser's own dialogs, which take their buttons from the operating system language — so a customer reading the product in Arabic got an English left-to-right dialog on the destructive actions specifically.
Including the organisation switcher and the account menu, which appear on every page.
It never had: the direction was being applied and then removed as the page loaded, so Arabic rendered inside a left-to-right document. 417 hard-coded directional styles were converted.
A run takes minutes and used to execute inside an HTTP request, capped at roughly one run a minute. Each run is now claimed atomically, so two workers can never charge the same run twice.
Four of about 350 routes had any limit. The default now applies everywhere, per customer and per endpoint.
Publishing history, the publishing queue, automation statistics, keywords and the dashboard were reading every row a workspace had ever produced. They are bounded or aggregated now — and the per-site breakdown on the automation analytics card, which had always been empty, reads the right table at last.
The whole product in seven languages, including right-to-left, with a switcher in the dashboard header and on the public site. Plus a Free allowance that resets every month instead of expiring once.
English, German, French, Italian, Spanish, Swedish and Arabic, across the dashboard, the Labs, the documentation and the public pages.
The free tier was a one-time pool that expired. It is now a monthly allowance, so an account that has been idle is usable again next month.
The generation log appeared frozen while the work was proceeding normally. A keep-alive now keeps the connection open.
And the finished article was hard to read on the light theme.
It now falls back to a second provider instead of failing the step.
A missing import during the language work meant the page threw instead of rendering.
A support email and a ticketing system, and the phone number, WhatsApp link and street address removed from every page.
59 endpoints could be reached without one.
GEO Lab (Generative Engine Optimization Laboratory) — a full-featured module with 9 sub-modules for optimizing content for AI engines like ChatGPT, Perplexity, Gemini, and AI Overviews.
Comprehensive Generative Engine Optimization laboratory with 9 analyzers, per-workspace feature flags, and a research library.
Per-workspace toggle control for each of the 9 GEO Lab sub-modules with activity logging.
Full dashboard with overview stats, sub-navigation, content selector, and score displays.
Scattered GEO analysis code (GEO Analyzer, GEO Optimizer, Geopolitical Context Engine) consolidated into a cohesive laboratory module.
GEO Lab follows the same proven architecture as AEO Lab for consistency and maintainability.
Automation pipeline wired to real AI services with quality gates, plus AI Content Audit, Social Media Snippets, Collaboration Workflow, White-label Reports, and Public REST API.
Automation pipeline steps wired to real Gemini AI, quality gates, brand voice, image generation, and cost tracking.
Crawl any website and score every page for SEO quality, content freshness, readability, and technical SEO.
Transform articles into platform-optimized social media posts.
Multi-role content approval pipeline with comments and transition history.
Generate branded PDF/HTML reports with custom templates and organization branding.
API key authentication for external integrations with rate limiting and documentation.
Each automation run now tracks estimated cost in USD with per-step progress data.
Automation scheduler endpoints protected with CRON_SECRET environment variable.
Bulk article generation, content refresh engine, competitor gap analysis, content calendar, SEO performance tracking, content briefs, brand voice learning, multi-language support, and smart internal linking.
Submit 10-50 topics for sequential AI article generation with progress tracking.
Detect stale content and refresh it with AI-powered suggestions and one-click updates.
Analyze competitor URLs to discover keyword opportunities and content gaps.
Track article ranking snapshots with keyword position data over time.
Analyze existing content to learn tone, sentence structure, vocabulary, and paragraph patterns.
AI-powered suggestions for internal links between workspace articles.
Generate articles in multiple languages with localized SEO optimization.
Export structured content briefs for external writers with SEO guidelines.
Visual calendar showing scheduled and published content with drag-and-drop rescheduling.
Republish updated content to connected platforms with a single click from the content detail page.
Five critical runtime bugfixes: trending keywords save from workflow, GSC analytics silent errors, documentation typography, saved topics navigation, and multi-article queue progression.
Fixed TrendingKeywordsModal not receiving workspaceId when opened from TopicCreationStep, causing all save operations to fail.
Fixed fetchGscSearchPerformance silently returning null on errors instead of surfacing error information to the frontend.
Installed and configured @tailwindcss/typography plugin so prose-* classes render properly in documentation articles.
Added "Saved Topics" as a child nav item under Workflow in the sidebar for discoverability.
Fixed handleComplete in ContentGenerationStep always navigating away instead of calling onArticleComplete in multi-article mode.
Analytics API now includes gscError field when GSC fetch fails, allowing frontend to display specific error messages.
Saved Topics link on workflow page upgraded from small text to a prominent button-style link.
Claude Blog methodology integration with 12 content templates, GEO/AEO analyzer, quality gate enforcement, content repurposing to 5 formats, and full frontend UI for template selection, quality display, and repurpose panel.
12 structured content templates with AI citation strength ratings and automatic template suggestion based on topic signals.
Visual quality gate results with pass/fail status, composite score, 5-category breakdown, and severity-sorted violations.
Transform articles into 5 formats: Twitter/X threads, LinkedIn posts, email newsletters, YouTube scripts, and key takeaways.
New SEO scoring category for Generative Engine Optimization with 5 sub-checks.
AI prompts now incorporate template structure and content rules when a template is selected.
Quality gate validation runs automatically after content creation and results are included in the API response.
Added property-based tests for template selection determinism, GEO score bounds, quality gate consistency, and SEO category completeness.
AEO Lab module, real image search with AI editing, AI-powered quality violation fixes, and analytics/governance data pipeline fixes.
Professional-grade Answer Engine Optimization laboratory with 9 sub-modules for AI citation optimization.
Replace pure AI-generated images with real internet-sourced images edited via Google Imagen 4.
One-by-one AI fix suggestions for Quality Gate violations with preview and undo.
Fixed analytics page not showing real Google Search Console data due to sync log deduplication skipping display fetches.
Fixed governance and evolution pages showing empty state despite having connected domains and published content.
Removed hardcoded device breakdown, traffic source, and visitor split percentages from analytics API.
Each stat card now shows its data source (via GSC, via content analytics, estimated).
Specific reason displayed when governance data is insufficient instead of generic empty state.
Trending keyword save/reuse, multi-topic article generation, reusable content blocks, SEO Lab data pipelines, and ranking/clustering data population.
Save trending keywords to lists with full DataForSEO research data for future reuse.
Select multiple topics in Step 4 and generate separate articles for each in a batch queue.
Design saveable content templates (newsletter boxes, quote boxes, styled elements) for reuse across articles.
Automated data collection pipelines for Evolution and Governance tabs with real metrics.
Fixed profile cards showing 0 articles and 0 sessions by computing real counts from Content and WorkflowSession tables.
Fixed Keywords page Tracking tab showing empty state by fetching real TrackedKeyword data.
Fixed Keywords page Clusters tab showing empty state with Generate Clusters action.
Topics generated in Step 4 are now saved and accessible for future article creation from the Workflow page.
Analytics page now shows data source indicators and explanatory banners for each metric section.
Documentation updated to cover all implemented features with proper layout fixes.
Trending keywords modal, SEO Lab research integration into workflow AI prompts, WordPress tag creation, real-time workflow progress with SSE streaming, and plain English status messages.
DataForSEO-powered trending keyword discovery in SEO Lab AI Research and Workflow Step 4.
Server-Sent Events streaming for genuine real-time progress across all 5 workflow steps.
Detailed real-time activity feed showing every action in simple, user-friendly language.
Create new WordPress tags directly from the publish dialog without switching to WordPress.
Fixed Complete button requiring two clicks by ensuring single-click save-and-navigate with immediate disable.
Fixed data pipeline not populating metrics by auto-registering published articles and providing Run Pipeline button.
Attached SEO Lab research records are now formatted and injected into workflow AI prompts for all 5 steps.
Helpful tips and encouragement messages displayed during workflow steps exceeding 15 seconds.
SEO Lab UX overhaul with pagination/sort/filter/export, OpenClaw dashboard UI, multi-property GSC/GA4 analytics, and Google Search Console integration.
Frontend interface for the OpenClaw Adaptive SEO backend with feature flags, AI research, validation, evolution, governance, and hybrid content pages.
Connect multiple Google Search Console and Google Analytics 4 properties per workspace.
OAuth2 GSC connection feeding real search data into SEO Lab pipelines.
Fixed favorite star not updating by implementing optimistic UI updates with rollback on failure.
Fixed delete not removing cards by implementing optimistic removal with re-insert on failure.
Fixed "domainId is required" error by auto-detecting connected domains.
Fixed raw [] rendering by treating empty arrays/objects as empty data with descriptive messages.
All SEO Lab data views now paginate at 25 rows with page navigation controls.
Sortable column headers and debounced search input across all data tables.
CSV and JSON export buttons on all data tables for filtered/sorted data.
Row count summary, proper empty states, configurable page size, sort indicators.
SEO-Lab moved directly after Workflow for easier navigation.
SEO Lab research persistence and workflow integration, interactive product tour engine, seamless article import, and enhanced keyword management.
Auto-save every SEO Lab analysis result and attach research to workflow steps for AI-enriched content generation.
Comprehensive onboarding system with fluid spotlight animation, smart tooltips, and keyboard navigation.
Professional keyword management with lists, tracking, clustering, competitive analysis, and visualizations.
Transform imported WordPress/Shopify articles into first-class content with proper parsing and normalized storage.
Fixed imported articles showing raw CSS/styling code by properly handling ContentBlock[] array format.
Fixed soft-deleted profiles still appearing in list by adding deletedAt: null filter to all queries.
Research data formatted as human-readable summaries with labeled sections instead of raw JSON dumps.
Consistent "SEO-Lab" naming across all UI components, navigation, and labels.
Major release with production-ready Stripe billing, multi-platform publishing, unified analytics, intelligent SEO fix engine, and inline SEO fix suggestions.
Complete Stripe payment integration with subscription management, three pricing tiers, and usage tracking.
Connect and publish to multiple WordPress and Shopify sites from a single dashboard.
Comprehensive resource consumption tracking with trends, cost breakdown, and exports.
AI-powered SEO fix system that applies fixes to the correct database records.
GitHub-inspired inline AI fix suggestions within the JSON structure viewer.
Keyword history tracking and ranking performance visualization.
Fixed batch fix "Record to update not found" error for thin-section issues.
"Potentially Broken Links" changed from manual to AI-fixable.
Structure tab now shows current SEO values instead of stale outline metadata.
Fixes no longer replace entire content - H1, intro, and conclusion fixes work correctly.
Fixed React hooks called conditionally in JSON viewer components.
Comprehensive test coverage for billing, publishing, SEO, and more.
New tables for platform connections, publishing records, usage tracking, and keyword history.
Performance-optimized JSON viewer with 500ms render for 10K word articles.
OpenClaw Adaptive SEO platform with multi-model AI routing, AI-native research engine, pre-publish validation, evolution layer, and hybrid content generation. Claude Blog quality scoring and template integration.
Multi-model AI routing, AI-native research, 5-layer adaptive architecture, and hybrid Google + AI optimization.
12 content templates, 5-category quality scoring, GEO/AEO analyzer, and content repurposing.
Content rules from claude-blog methodology incorporated: answer-first formatting, title optimization, heading hierarchy, readability targets.
New geo category added to SEO analysis with passage-citability, qa-format, entity-clarity, extraction-structure, crawler-accessibility factors.
My Sites section with AI content improvement wizard, BYOK API key management, comprehensive analysis page, enhanced publishing, and dashboard visualizations.
Manage connected WordPress/Shopify sites, import articles, and improve them with AI-powered step-by-step optimization.
Bring Your Own Keys for DataForSEO, Firecrawl, OpenAI, Perplexity, and Google API.
Profile-specific analytics with content stats, keyword analytics, SERP performance, E-E-A-T scores, and publishing statistics.
Interactive charts for content creation, site distribution, keyword performance, and E-E-A-T scores.
Fixed non-functional dropdown menu on profile cards with proper z-index and click handling.
Fixed refresh action to bypass cache and fetch new data from external APIs.
Fixed publishing page to query real PublishingQueue and ScheduledPublish records.
Fixed dashboard API to query real data from database instead of returning empty arrays.
Complete publication history with platform icons, external links, error messages, and retry options.
Added My Sites, Keywords, Analysis links to sidebar navigation.
Proper cascade deletion of associated workflow sessions, links, analysis, and citations.
Rich content insert menu with 27+ block types, article quality enhancement matching n8n workflow output, Google Imagen 4 integration, and interactive workflow progress indicators.
Contextual insert menu with text blocks, tables, AI images, and charts.
AI-generated articles now match n8n workflow quality with internal links, tables, EEAT compliance, and rich formatting.
Alternative image generation provider with superior photorealism for product images.
Animated progress indicators with real-time status updates for all 5 workflow steps.
Citations scored 0-100 for relevance; only citations scoring 40+ are included.
77+ commercial/SEO sites blocklisted from citations for credibility.
Proper React dependency arrays, memoization, and stable references in content editor.
Responsive input under 100ms for 5000+ word articles with virtualization and lazy loading.
Critical SEO fix content overwrite bug resolved, WordPress publishing fixes, professional keyword research with real DataForSEO data, and comprehensive AI SEO optimization engine.
SEMrush-level keyword research with real DataForSEO metrics replacing placeholder data.
Comprehensive real-time SEO analysis with 30+ factors, one-click AI fixes, and competitor gap analysis.
Fixed critical bug where applying SEO fixes overwrote entire content instead of updating specific sections.
Cover image from CoverImage table now properly set as featured image during WordPress publishing.
Surrounding quotes stripped from article titles before publishing.
TOC now uses ContentSection.level field (integer) instead of non-existent type field.
H1 fixes now update only the first section heading without modifying other sections.
Introduction/conclusion fixes insert new sections without removing existing content.
All fix applications wrapped in database transactions with rollback on failure.
Reusable business profiles, AI image generation, WordPress/Shopify publishing, API cost analysis with tiered pricing, and SaaS billing fixes.
Save business analysis as reusable profiles to skip Steps 1-3 for the same website.
Generate featured and section images with multiple styles and drag-to-resize.
Comprehensive cost analysis for all external APIs with tiered pricing ensuring 40-60% margins.
Fixed authentication error on Analytics/Analysis page by properly authenticating API requests.
Replaced mock team data with real WorkspaceMember table queries.
Fixed publishing page showing incorrect connection status by querying real PlatformConnection table.
Regenerate specific article sections without regenerating the entire article.
Automatic versioning with preview and restore for last 10 versions.
Draft → Review → Approved → Published status pipeline with notifications.
Landing page redesigned with Onyx dark theme matching dashboard.
Documentation center with searchable knowledge base, comprehensive platform fixes for images, keywords, content history, analytics, team management, and integrations.
Comprehensive searchable documentation hub with 6 modules and in-app contextual help.
Section images now persist to database with dimensions and display correctly in editor.
Cover image generation, resize, and persistence throughout content lifecycle.
Fixed server errors and [object Object] display on content history page.
Keywords page now displays real keywords from workflow sessions with metrics.
Analytics page shows real profile-based metrics instead of placeholder data.
Fixed "Not defined" display when business analysis data exists in JSON field.
Real keyword metrics: search volume, competition, CPC, difficulty from DataForSEO API.
Real team member data with invite, role management, and activity tracking.
Add/validate/disconnect WordPress and Shopify connections with status indicators.
On-demand refresh of internal links, business analysis, and EEAT sources.
Export to PDF, Markdown, and HTML formats.
Critical UI data display fixes across workflow steps, content history, keywords, analytics, and business profiles. Comprehensive bug fixes for session creation, workspace context, and API integrations.
Scan results now display link count summary grouped by category.
Discovery results show source name, URL, authority type, and relevance score.
Fixed raw ">" characters displaying instead of formatted content.
Error messages now display as strings, not objects.
Fixed workflow session creation failures with proper workspace context.
First workspace automatically selected when dashboard loads.
Structured error responses with user-friendly messages for all API failures.
Session state preserved across step navigation and page refreshes.
Validated environment variables for Firecrawl, Perplexity, DataForSEO, OpenAI/Gemini on startup.
Session creation and step updates wrapped in transactions for atomicity.
Skeleton loaders, spinners, and actionable error messages across all pages.
Production readiness audit addressing 30 gaps, enterprise security audit, spec-to-code audit system, and gap remediation across 35 specs.
Automated audit tool analyzing all 35 specs against codebase implementation.
Comprehensive security, reliability, and performance audit following OWASP Top 10.
Real Stripe payment processing, email service via Resend, OAuth providers, usage tracking persistence, webhook handlers.
Real connectivity checks for Stripe, Resend, OpenAI, DataForSEO, Firecrawl.
Distributed rate limiting with Redis backend and in-memory fallback.
JSON-format logs with correlation IDs and sensitive data scrubbing.
SIGTERM handling with 30-second drain period for in-progress requests.
Added 81 missing Prisma models, 436 TypeScript interfaces, and fixed property test references across 35 specs.
Local development to production deployment path, Perplexity and Firecrawl API client implementations, and Firecrawl rate limiting.
API client for online search and deep research capabilities used in Parts 2-5.
Web scraping and content extraction API client for URL analysis.
Docker Compose for PostgreSQL/Redis, database initialization, seed data, health checks.
JWT session management with refresh tokens, connecting dashboard to real auth.
Frontend pages wired to backend services with real database queries.
Optimized Docker image, database migrations, security headers, CORS, Sentry monitoring.
Initial release of the Content Automation SaaS platform converting n8n workflows (Parts 0-5) into a full-featured web application with AI-powered content creation, SEO optimization, and multi-platform publishing.
Complete n8n workflow pipeline as interactive UI with session management.
Full-featured editor with markdown, version history, and auto-save.
Organizations, workspaces, projects, and team management with RBAC.
Central content management with status tracking, filtering, and analytics.
Coordinated AI agents with Perplexity, Firecrawl, DataForSEO, and Gemini/OpenAI.
AI content generation streamed in real-time with typing animation.
Export session data to JSON, Google Sheets, Notion, and CSV.
Dark theme with obsidian (#09090b), acid (#ccff00), and surface (#0a0a0a) colors.
Content Engine — Enterprise-grade content creation and optimization platform