Articles

    I Built an SEO Autopilot Because I Am Not an SEO Expert

    I wanted to improve the SEO of InfiniteGrammar.de.

    The frontend originally came from a design built with Lovable and was developed further with Claude Code. I added prerendering, metadata, structured data, sitemaps and other SEO improvements along the way.

    Still, the website showed poor organic search performance for months.

    I tried the obvious next step: ask Claude Code with SEO skills to identify problems and fix them. It found plausible improvements. Some were useful. But the overall result was not satisfactory.

    The problem was simple:

    I am not an SEO expert.

    I can work with product metrics, data, code and experimentation. But technical SEO contains a large number of interacting rules around crawling, rendering, canonicals, structured data, internal links, performance and indexability.

    I did not want the quality of the site to depend on me knowing which SEO question to ask next.

    So the goal changed.

    Instead of using AI to help me do SEO, I wanted to build a system where an AI agent could act as the SEO specialist and developer, continuously inspect the site, fix problems, and prove that the fixes worked.

    That became SEO-Autopilot.

    From n8n workflows to an autonomous control loop

    The first architecture was fairly simple.

    • n8n was the orchestrator. It selected checks from the SEO catalog, tracked state, dispatched work and waited for results.
    • Claude Code GitHub Agent was the developer. It investigated the repository, proposed fixes and implemented approved changes.
    • GitHub Actions ran tests, verification steps, production checks and callbacks.
    • Netlify provided Deploy Previews and production deployment.

    And GitHub became the workspace where issues, branches, pull requests and execution results were visible.

    SEO-Autopilot orchestration stack: SEO check catalog, then n8n for orchestration and state, then GitHub and Claude to investigate, propose and fix, then GitHub Actions to test, verify and observe, then Netlify for preview and production

    At first I used to build the n8n workflows manually.

    That worked while the system was small. Then the workflows accumulated retries, callbacks, observation windows, PR detection, deployment checks, rate-limit handling and failure recovery.

    Editing nodes by hand became the bottleneck.

    So I gradually moved the control plane into GitHub.

    The n8n workflows became version-controlled JSON. ChatGPT became both the developer of those workflows and, effectively, my smart console for the system.

    ChatGPT accesses the repository through the GitHub integration, inspects the current implementation, changes workflow definitions and helps debug failures. GitHub Actions then deploy those workflow definitions to n8n through the n8n API, with credentials stored in GitHub secrets.

    Before: me, open n8n, edit nodes manually, run workflow, inspect failure, explain it to ChatGPT, edit again. After: me and ChatGPT plan, discuss and iterate, GitHub source is proposed, reviewed and merged, automated CI/CD deploys to n8n, n8n orchestrates and executes, and the execution result with logs, metrics and alerts feeds back into debugging

    That was the point where it stopped feeling like a collection of automations and started feeling like a real system.

    The difficult part was verification

    The initial idea was straightforward: take an SEO check from the prdefined catalog, let Claude investigate the repository, implement a fix, and verify the result.

    The problem was that the verification itself was not stable.

    If a check required evidence from production, the agent might instead prove that the corresponding code existed in the repository. If the check was defined against rendered HTML, it might inspect React source. If a performance check expected a particular Lighthouse signal, it might substitute a related PageSpeed result or infer success from the implementation.

    Those substitutions often sounded reasonable.

    They were still different checks.

    A common failure mode looked like this:

    Why verification drifted: the original check asks whether production exhibits X, the agent implements a fix, the exact check is inconvenient, the agent runs a related check Y, Y passes, and the issue is reported as fixed. The agent changed the test after seeing its own implementation

    The system was effectively allowing the agent to change the test after seeing its own implementation.

    Some catalog checks explicitly required repository-static verification, while the execution system did not yet support that verifier type. The correct result should have been missing verifier capability. Earlier versions were too willing to substitute another form of evidence and continue.

    Performance checks exposed the same problem. A PageSpeed collection path already existed, but that did not make it equivalent to every Lighthouse-based check in the catalog. Code inspection, Lighthouse diagnostics and PageSpeed measurements can all be useful evidence, but they are not interchangeable.

    Coverage mattered as well. One representative URL could pass while another independently affected template remained broken.

    That led to one of the most important architectural changes in the project.

    The frozen verifier

    Each deterministic fix now has to come with a concrete verification contract.

    The proposal defines both:

    proposed fix
          +
    verification contract

    A separate gatekeeper reviews both.

    The verifier is then frozen before implementation starts.

    The frozen verifier: catalog check, assessment finds an issue, proposal with fix and verification contract, gatekeeper, freeze verifier where current production must fail, implementation, deploy preview must pass, and production must pass the same verifier

    The baseline failure is important.

    A verifier is only useful if it can first reproduce the defect it claims to test.

    The implementation agent can decide how to solve the problem.

    It cannot redefine what “solved” means afterwards.

    And if the required verifier does not exist yet, the workflow is put on hold and the missing capability becomes an engineering task of its own rather than an excuse to replace the check with something easier.

    Same verifier, different outcome: before, production checked by the same verifier fails; after, preview and production checked by the same verifier pass

    Three types of SEO checks

    The catalog is split according to how objectively a check can be evaluated.

    Three types of SEO checks in the catalog: deterministic with a machine-verifiable answer such as canonical, sitemap and rendered links; deterministic with policy, mechanical once policy is defined, such as crawlability, route classes and schema by route; and semantic, requiring judgement, such as search intent, content quality and whether a page deserves to rank

    Deterministic

    These have a machine-verifiable answer.

    Examples:

    • Does the canonical match the expected URL?
    • Is an indexable URL present in the sitemap?
    • Are important links present in the prerendered HTML?
    • Does the expected structured data exist?
    • Does an unknown URL return the correct HTTP response?
    • Do image dimensions match the actual asset?
    • Does the breadcrumb expose the expected hierarchy?

    These checks do not need another LLM opinion.

    They need a verifier.

    Deterministic with policy

    Some checks are technically easy to evaluate, but there is no correct answer until the site defines its own policy.

    For example:

    Should /exercise be crawlable?

    There is no universal rule for that route.

    But once the site policy is specified, the check becomes deterministic.

    Deterministic with policy: the APP_FUNCTIONAL route class is not an SEO landing page, is excluded from the sitemap, and requires an explicit crawl strategy. Once policy is explicit, the check becomes deterministic

    The same applies to questions such as:

    • which route classes belong in the sitemap;
    • which URL variant is canonical;
    • which application routes should be crawlable;
    • which page types require breadcrumbs;
    • which structured-data types are expected on each route class.

    A large part of technical SEO automation turned out to be about converting implicit product decisions into explicit rules that software can test.

    Semantic

    The remaining checks require judgement rather than simple verification.

    Examples:

    • Does the page satisfy search intent?
    • Is the content sufficiently complete?
    • Is it meaningfully different from another page?
    • Is the title actually good for the query?
    • Is the anchor text useful in context?
    • Does the page deserve to rank against competing results?

    These cannot be reduced reliably to a simple PASS / FAIL assertion.

    They need a different evaluation layer: independent LLM judges, SERP context, stronger evidence requirements and likely multiple evaluators rather than letting the implementation agent judge itself.

    What the workflow looks like now

    At a high level, one catalog check becomes a small engineering experiment.

    What the workflow looks like now: SEO catalog, assess production, issue confirmed, proposal and verifier, gatekeeper, baseline fail, implement fix, preview pass, deploy, production pass, observe search performance

    That is quite different from asking an AI:

    “Improve SEO.”

    The system is instead asking:

    “Does this specific externally observable property fail, can we prove it, and can the same test prove that it no longer fails after the change?”

    Some of the issues were surprisingly ordinary

    One check inspected the main German grammar hub.

    The application appeared to contain links to its topic categories. But those links existed only in a client-side UI state.

    The prerendered HTML Google received contained none of them.

    For users, the navigation worked.

    For a crawler, an important part of the site's internal link graph did not exist.

    The fix made both navigation structures part of the rendered document. The frozen verifier checked the actual built HTML and confirmed that every expected category link was present.

    Another check found the same class of problem on exam-centre pages.

    The UI used JavaScript navigation handlers instead of real anchors.

    To a user they looked like links.

    To a crawler they were buttons.

    Other deterministic checks found:

    • grammar content that existed in the repository but was unreachable because two identifiers did not match;
    • grammar category pages without a proper crawlable breadcrumb hierarchy;
    • application and utility routes without an explicit crawl policy;
    • article images without intrinsic dimensions, creating avoidable layout movement;
    • unknown URLs being served as successful pages instead of genuine not-found responses;
    • URL variants that could resolve under inconsistent casing;
    • structured data describing content that was not actually rendered.

    None of these are spectacular SEO tricks.

    That is partly the point.

    A site can accumulate many small technical inconsistencies that are individually easy to miss and collectively expensive.

    An autopilot can keep looking for them.

    Then search traffic started moving

    The first concentrated wave of deterministic production fixes was followed by a clear change in Google Search Console.

    +77%organic search clicks
    +223%impressions vs. earlier baseline
    +21%more clicks while impressions fell 44%
    >2×click-through rate

    The metric I care about most at the current stage is clicks.

    Compared with the period immediately before that remediation wave:

    organic search clicks increased by approximately 77%.

    Search visibility expanded even faster. After the initial spike settled down, impressions were still approximately 223% above the earlier baseline.

    The later behaviour was particularly interesting.

    At one point impressions fell by roughly 44% as Google reduced a large amount of broad, low-click exposure.

    But clicks did not fall with them.

    They increased by another 21%.

    CTR more than doubled.

    Observed outcomes after the first remediation wave: clicks rose from an index of 100 to 177, plus 77 percent; impressions rose from 100 to 323, plus 223 percent. Later, impressions fell 44 percent while clicks rose another 21 percent and CTR more than doubled. Observed pattern, not experimental proof

    The timing was useful too.

    The increase did not appear immediately after deployment. The strongest expansion came after enough time had passed for Google to recrawl and reconsider the changed site structure.

    A plausible sequence is:

    How technical fixes turn into search impact: technical fixes, Google recrawls, crawl graph and page signals change, more page and query combinations are tested, visibility expands, useful rankings retain clicks

    The result is observational rather than experimental.

    But the pattern is encouraging: the improvement starts after the first remediation wave, appears with a plausible delay, and click growth survives after part of the impression spike disappears.

    The deterministic part is only the first stage

    The first production phase answered one question:

    Can enough technical SEO knowledge be converted into executable checks that an autonomous coding agent can safely work against?

    So far, the answer appears to be yes.

    The next challenge is harder.

    A deterministic verifier can prove that a page now has the correct canonical, that an internal link exists, or that a route returns the right response.

    It cannot decide whether a page is genuinely useful.

    It cannot judge whether the content is better aligned with search intent.

    It cannot tell whether two pages are semantically too similar.

    That is where the semantic part of the catalog starts.

    The next version of SEO-Autopilot therefore needs another evaluation layer:

    What comes next: deterministic checks, frozen verifiers, safe autonomous fixes, semantic checks, independent judges, search context and evidence, higher-level optimization. From executable contracts to richer evaluation

    The goal is not to make the agent more confident.

    It is to make the system better at knowing what it actually knows.

    For deterministic SEO, that means executable contracts.

    For semantic SEO, it will mean independent evaluation rather than self-judgement.

    And eventually, the interesting question is not whether an AI can change a website.

    It already can.

    The interesting question is how well an autonomous system can build evidence around its own changes to know when a change is correct, when it worked, and when it should try something else.