An autonomous SEO/GEO evolution engine. RankLoop treats the pages of a website as a population in an evolutionary system: every page has a DNA (title, meta, schema, content traits), a measured fitness, and a generation. A daily four-phase loop mutates that population, tests the mutations with real statistics, and promotes only proven winners.
Status: archived research project (2026-06-17), published as open source. The engine is real and the code verifiably works (see Verification), but the core promise, a measured ranking win from a fully closed promote/kill cycle on a live site, was never validated end to end. This README says so plainly instead of polishing it away. Reasons and reactivation criteria: ARCHIVE.md (German).
┌──────────────────────────────────────────────────────────────────┐
│ │
▼ │
COLLECT ──────────► ANALYSE ──────────► EVALUATE ──────────► EXECUTE ┘
GSC data SEO+GEO fitness z-test on Claude generates
SERP snapshots per page page-group mutations, served
LLM citations gap analysis split tests: live via Cloudflare
competitors opportunity promote / kill / Worker (HTMLRewriter),
trends scoring keep running no CMS access needed
All four phases run as daily Vercel crons with an evolution log as audit trail, plus a multi-site agency dashboard (approvals, client portal) on top.
Checked 2026-08-10 on a fresh clone of this repository:
| Check | Result | Detail |
|---|---|---|
npm ci |
PASS | 862 packages, clean install |
next build |
PASS | Next.js 16.2.1, all ~50 routes compile (dashboard, client portal, API, crons) |
vitest run |
43 / 45 | GSC fetcher, page scanner, fitness calculator, GSC client, SERP API all green |
| Known failures | 2 | Schema generator: HowTo and Article JSON-LD fail the repo's own validation (generator vs. knowledge-base required fields are inconsistent) |
| End-to-end loop | unproven | Needs running infrastructure (Supabase, GSC OAuth, DataForSEO, LLM keys) and was never closed on a real site |
The engine is not a facade: the collectors call real APIs, the evaluator computes a real statistical test with hard guardrails, and the edge worker is deployable Cloudflare code. What is missing is the proof that the whole loop produces a measurable win on a live website.
The most original part. Beyond classic SEO, RankLoop actively queries five AI systems
(Perplexity, ChatGPT, Claude, Gemini, Google AI Overview) and asks: is this domain cited
in generative answers? The result becomes a GEO score (citation rate 35%, AI Overview
presence 25%, citability 25%, entity clarity 15%) that is combined 50/50 with an SEO score
(position, CTR against per-position benchmarks, click growth) into one fitness value per
page. Generative Engine Optimization stops being a buzzword and becomes a measured,
tracked quantity. See src/engine/intelligence/fitness-calculator.ts
and src/engine/collectors/llm-monitor.ts.
SEO A/B testing cannot randomize visitors the way conversion testing does. RankLoop uses
the SearchPilot-style approach instead: comparable pages are split into control and
mutation groups and compared against their own baselines. Decisions are made by a z-test
with hard guardrails: minimum 14 and maximum 42 days runtime, at least 100 clicks and
5 pages per group, 90% confidence, otherwise the verdict is inconclusive rather than a
false winner. See src/engine/selection/test-evaluator.ts.
Winning mutations are not written into a CMS. A Cloudflare Worker (HTMLRewriter) injects
titles, metas, schema markup and content blocks at serve time. That makes any website
testable, WordPress, Shopify or custom, without touching the customer's deploy process.
See edge-worker/ and src/lib/edge-delivery.ts.
A hypothesis generator picks the most promising mutation type per page; Claude generates
the concrete variant, fed from a curated SEO/GEO knowledge base shipped in the repo
(src/engine/knowledge/seo-geo-knowledge-base.md).
Execution modules include a schema generator, an llms.txt manager and a content writer.
Collect, analyse, evaluate and execute run as daily crons with no human in the loop, and every decision lands in an evolution log. An agency layer adds multi-site management, approval workflows and a read-only client portal.
| Benefit | Status |
|---|---|
| AI-answer visibility becomes measurable (daily LLM citation monitoring across 5 systems) | real, usable today |
| SEO decisions become statistical instead of gut-driven (z-test, minimum power, confidence threshold) | real, usable today |
| Testing without CMS access or customer deploys (edge injection) | real, usable today |
| Continuous optimization with zero manual work (daily autonomous loop) | built, never proven over weeks |
| Measurably better rankings from evolved pages | unproven |
- Core promise unvalidated. No documented, fully closed promote/kill cycle with a real ranking win on a live site.
- ICP squeeze. The statistics need 100+ clicks per page group over 14-42 days, which only high-traffic sites deliver. Exactly those customers would have to trust a third-party edge worker in front of their live site. The market narrows from both ends.
- Never productized. No billing, incomplete tenant separation.
- Operating requirements. Own Supabase instance, GSC OAuth app, DataForSEO account and LLM API keys are mandatory.
- Known bugs. Two schema-generator tests fail (HowTo/Article required fields).
Reactivation criteria live in ARCHIVE.md. Short version: one real, measured ranking win from one manually closed loop on a real site, before any further investment.
The engine above needs a live site, Supabase, and API keys. The distilled, zero-infra
version of the same idea ships as a Claude Code skill in
skills/geo-visibility-loop/: a one-time GEO baseline
audit (six weighted categories, from AI-crawler access and llms.txt to third-party brand
mentions) plus a weekly probe-and-diff loop that tracks whether AI answers and search
actually surface your brand or repos, and outputs the top 3 moves each week.
git clone https://github.com/dankofly/rankloop.git
cp -r rankloop/skills/geo-visibility-loop ~/.claude/skills/Then copy config.example.json to your project as geo-loop.config.json, set your
domain and query set, and ask Claude for a GEO audit. A real worked example (baseline
audit of hypeakz.io, honest 54/100, 6 of 6 probes MISS) is included under
examples/hypeakz-baseline/.
Next.js 16 (App Router) · React 19 · Supabase (Postgres + Auth) · Claude API · Google Search Console API · DataForSEO · Cloudflare Workers (HTMLRewriter) · Vercel Cron · Tailwind 4 · Vitest
src/engine/
orchestrator.ts # the four-phase loop
collectors/ # gsc-fetcher, serp-scraper, llm-monitor, competitor-scanner, trend-watcher
intelligence/ # fitness-calculator, gap-analyser, hypothesis-generator, opportunity-scorer
selection/ # test-evaluator (z-test), evolution-logger
execution/ # content-writer, schema-generator, llms-txt-manager, split-test-deployer
knowledge/ # curated SEO/GEO knowledge base fed to Claude
offpage/ # backlink research, outreach strategist
edge-worker/ # Cloudflare Worker (HTMLRewriter) for live mutation delivery
skills/geo-visibility-loop/ # standalone Claude Code skill: GEO audit + weekly visibility loop
src/app/ # agency dashboard, client portal, API routes, cron endpoints
supabase/migrations/ # database schema
cp .env.local.example .env.local # fill in your own keys
npm install
npm run devThe engine scripts (scripts/) expect SUPABASE_URL,
SUPABASE_SERVICE_ROLE_KEY and ANTHROPIC_API_KEY as environment variables. Optional
collectors additionally use PERPLEXITY_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY,
DataForSEO credentials and a Google OAuth client for Search Console.
If you run a high-traffic site and want to close the loop RankLoop never closed, this repo gives you the full blueprint. Issues and forks welcome.
MIT · built by Daniel Kofler (HYPEAKZ.IO)