{"id":51941421,"url":"https://github.com/testedmedia/seo-command-center","last_synced_at":"2026-07-28T19:30:37.047Z","repository":{"id":370881185,"uuid":"1297589355","full_name":"testedmedia/seo-command-center","owner":"testedmedia","description":"Self-hosted SEO platform: rank tracking, keyword research, competitor gaps, AI Overview visibility, site audits, link gaps, and local map-pack grids — for ~$4/month on DataForSEO instead of $139/month SaaS.","archived":false,"fork":false,"pushed_at":"2026-07-11T16:42:49.000Z","size":8801,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-11T18:11:41.051Z","etag":null,"topics":["cloudflare-pages","dataforseo","keyword-research","local-seo","python","rank-tracker","self-hosted","seo","seo-tools","serp"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/testedmedia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-11T16:07:34.000Z","updated_at":"2026-07-11T17:23:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/testedmedia/seo-command-center","commit_stats":null,"previous_names":["testedmedia/seo-command-center"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/testedmedia/seo-command-center","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testedmedia%2Fseo-command-center","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testedmedia%2Fseo-command-center/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testedmedia%2Fseo-command-center/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testedmedia%2Fseo-command-center/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/testedmedia","download_url":"https://codeload.github.com/testedmedia/seo-command-center/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/testedmedia%2Fseo-command-center/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36006421,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-28T02:00:06.341Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare-pages","dataforseo","keyword-research","local-seo","python","rank-tracker","self-hosted","seo","seo-tools","serp"],"created_at":"2026-07-28T19:30:36.165Z","updated_at":"2026-07-28T19:30:37.034Z","avatar_url":"https://github.com/testedmedia.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/screenshots/login.png\" alt=\"SEO Command Center login\" width=\"820\"\u003e\n\n# SEO Command Center\n\n**A self-hosted SEO platform that costs ~$4/month instead of $139/month.**\n\nRank tracking · keyword research · competitor gaps · AI Overview visibility · site audits · link gaps · local map-pack grids\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-orange.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org)\n[![Dependencies](https://img.shields.io/badge/dependencies-zero-brightgreen.svg)](#)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-ff7a2e.svg)](#contributing)\n[![GitHub stars](https://img.shields.io/github/stars/testedmedia/seo-command-center?style=social)](https://github.com/testedmedia/seo-command-center/stargazers)\n\n\u003cimg src=\"docs/demo.gif\" alt=\"SEO Command Center demo\" width=\"900\"\u003e\n\n\u003c/div\u003e\n\n## Why\n\nSEO tools charge subscription prices for data they buy wholesale. Under the hood they're calling the same SERP APIs you can call yourself.\n\nSEO Command Center is the whole dashboard, self-hosted, on top of [DataForSEO](https://dataforseo.com/?aff=254685)'s pay-as-you-go API. No subscription, no seat pricing, no keyword caps — you pay cents for the exact SERPs you pull:\n\n| | SEO Command Center | [Semrush Pro](https://www.semrush.com/pricing/) | [Ahrefs Lite](https://ahrefs.com/pricing) | [Local Falcon](https://www.localfalcon.com/pricing) |\n|---|---|---|---|---|\n| Monthly cost | **pay-as-you-go (~$4/mo typical\\*)** | $139.95/mo | $129/mo | from $24.99/mo |\n| Commitment | none — prepaid API credits | subscription | subscription | subscription |\n| Rank tracking, research, competitor gap, site audit, AI Overview tracking, local grids | all included | partial | partial | grids only |\n| Your data, on your server | yes — one SQLite file | no | no | no |\n\n\\* Measured on a real deployment: 570 keywords across 5 sites updated daily, plus weekly local map grids and brand-SERP checks — **$3.55/month** in API costs. A 7×7 map-grid scan is $0.29; a keyword-research pull is ~$0.02.\n\n## What you get\n\nEight pages, one dark command center, everything driven from the browser:\n\n| Page | What it does |\n|---|---|\n| **Rankings** | Daily positions, 1d/7d/30d deltas, best-ever, sparklines, history charts, visibility score, GSC impressions/clicks, mobile ranks, CSV export |\n| **Research** | Live keyword ideas from seeds or any competitor's domain — volume, CPC, competition — checkbox → tracked |\n| **Site Explorer** | Ahrefs-style analysis of ANY domain or single URL: DR, traffic + traffic value, history charts, backlinks (dofollow/new/broken), anchors, referring domains, best-by-links, broken-page link opportunities, competitors, content gap vs your brands, paid keywords, site structure. A full all-tabs run costs about $0.20 in DataForSEO credits; results cache 24h so re-checks are free |\n| **Competitors** | Who actually outranks you + every keyword they rank for that you don't |\n| **AI Visibility** | Which of your keywords trigger Google AI Overviews, whether you're cited, and who is |\n| **Site Health** | Zero-cost technical crawler: broken links, duplicate titles, missing metas, thin content, per-site score |\n| **Link Gap** | Domains linking to your rivals but not you, junk-filtered and classified by how to actually get the link |\n| **Map Grid** | LocalFalcon-style GPS grid: your Google map-pack rank from 49+ points around your city, who holds the top 3 at every pin, per-keyword history charts and run-over-run improvement deltas |\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/screenshots/rankings.png\" alt=\"Rankings dashboard\" width=\"900\"\u003e\n\u003cbr\u003e\u003cbr\u003e\n\u003cimg src=\"docs/screenshots/map-grid.png\" alt=\"Local map grid\" width=\"900\"\u003e\n\u003cbr\u003e\u003cbr\u003e\n\u003cimg src=\"docs/screenshots/research.png\" alt=\"Keyword research\" width=\"900\"\u003e\n\u003c/div\u003e\n\nMore screenshots in [docs/screenshots](docs/screenshots).\n\n## Quickstart\n\n**Try it with sample data first (no account needed):**\n\n```bash\ngit clone https://github.com/testedmedia/seo-command-center.git\ncd seo-command-center\npython3 demo.py \u0026\u0026 python3 worker.py serve\n# → http://localhost:8000\n```\n\n**Track your own site:**\n\n```bash\npython3 setup.py            # guided: DataForSEO creds (validated live), your sites, options\npython3 worker.py run all   # first pull — typically $0.10-0.50\npython3 worker.py serve     # local dashboard\n```\n\nThat's it. Python 3.9+ standard library only — no pip install, no Docker, no database server (SQLite file).\n\n### What you need\n\n| Requirement | For | Cost |\n|---|---|---|\n| Python 3.9+ | everything | free |\n| [DataForSEO account](https://dataforseo.com/?aff=254685) | rankings, research, competitors, map grids | pay-as-you-go, ~$4/mo typical usage (prepaid credits last months) |\n| Cloudflare account (optional) | hosted dashboard + in-browser buttons | free tier |\n| Google Search Console (optional) | impressions/clicks + found keywords | free |\n| Node.js (optional) | only for `worker.py deploy` (wrangler) | free |\n\n## Hosted mode\n\nLocal mode is read-only pages. Hosted mode (free Cloudflare Pages) unlocks the buttons: refresh any report, add keywords/sites, delete keywords, live research, and map-grid setup from the browser — protected by a login page (orange matrix included).\n\n```bash\npython3 worker.py deploy-config   # creates the Pages project + queue, pushes your secrets\npython3 worker.py deploy          # ship the dashboard\npython3 worker.py loop            # poll the queue + daily auto-refresh (cron/systemd/launchd)\n```\n\nButtons queue work into Cloudflare KV; `worker.py loop` on any machine (a laptop, a $4 VPS, a Raspberry Pi) picks jobs up within 2 minutes, runs them, and redeploys. Your API credentials only ever live in your `.env` and as encrypted Pages secrets.\n\n## Connect Search Console (optional)\n\n1. Create an OAuth client (Desktop) in [Google Cloud Console](https://console.cloud.google.com/apis/credentials), enable the Search Console API.\n2. Save the client JSON to `credentials/gsc-client-secret.json`.\n3. Run any OAuth helper to get a refresh token into `credentials/gsc-tokens.json` (`{\"refresh_token\": \"...\"}`).\n4. That's it — rankings runs will merge impressions, clicks and Google-reported positions, and auto-discover keywords you already get traffic for.\n\n## How it works\n\n```\n┌────────────────────┐     ┌──────────────────────┐     ┌─────────────────────┐\n│  DataForSEO API    │ ←── │  tracker/*.py        │ ──→ │  data/ranks.db      │\n│  (SERPs, keywords, │     │  stdlib Python,      │     │  (SQLite, all       │\n│   maps, backlinks) │     │  one file per report │     │   history forever)  │\n└────────────────────┘     └──────────┬───────────┘     └─────────────────────┘\n                                      │ renders\n                                      ▼\n                           ┌──────────────────────┐     ┌─────────────────────┐\n                           │  site/*.html         │ ──→ │  localhost or       │\n                           │  self-contained dark │     │  Cloudflare Pages   │\n                           │  dashboard pages     │     │  (+ auth, buttons)  │\n                           └──────────────────────┘     └─────────────────────┘\n```\n\n- **No framework.** Each report is one Python file that pulls data, stores history in SQLite, and renders a self-contained HTML page.\n- **No backend server.** Hosted interactivity is three tiny Cloudflare Pages Functions (auth, queue, research proxy).\n- **No lock-in.** Your entire SEO history is one SQLite file you can query directly.\n\n## Cost control, built in\n\n- Manual refreshes are capped per tool per day (default 2) and research pulls per day (default 20) — a shared dashboard can't drain your balance.\n- Every research pull and grid save shows its dollar cost before/after running.\n- The keyword cap per site (default 100, configurable) bounds the daily tracking spend.\n- Weekly-only for the expensive stuff (map grids, true-SERP brand checks) by default.\n\n## FAQ\n\n**Is the ranking data as good as Semrush/Ahrefs?**\nIt's the same class of data — DataForSEO is one of the SERP providers this industry runs on. Tracked positions come from live Google SERPs (top 100, any country/language).\n\n**Can I track competitors' sites too?**\nYes — add any domain as a site, or use Research → \"Steal from a competitor\" and the Competitors gap report.\n\n**Multiple sites?**\nUnlimited. Cost scales with keywords, not sites.\n\n**White-label / client dashboards?**\nOut of the box it carries the Tested Media logo. Set `BRAND_NAME` (and optionally `LOGO_FILE`) in `.env` to rebrand everything — sidebar, login page, titles. Deploy once per client, each with its own access key.\n\n**Why not just use rank tracker X?**\nIf you're happy paying monthly SaaS pricing, do that. This is for people who want the whole stack, their own data, and a bill that rounds to a coffee.\n\n## Roadmap\n\n- Optional docker-compose for people who prefer containers (the no-Docker default stays)\n- Multiple Google Search Console properties per install\n- Scheduled email digests for rank changes\n- Deeper AI Overview tracking: which domains get cited, not just presence\n- CSV export on every report\n\nVote or suggest in [Discussions](https://github.com/testedmedia/seo-command-center/discussions).\n\n## Contributing\n\nPRs welcome. The codebase is intentionally boring: stdlib Python, one file per report, no build step. Add a report = one script that writes JSON + HTML, one nav entry.\n\n## License\n\n[MIT](LICENSE)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n\u003ca href=\"https://tested.media\"\u003e\u003cpicture\u003e\n\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/brand/testedmedia-white.svg\"\u003e\n\u003cimg src=\"docs/brand/testedmedia-dark.svg\" alt=\"Tested Media\" width=\"190\"\u003e\n\u003c/picture\u003e\u003c/a\u003e\n\nBuilt and run in production at [Tested Media](https://tested.media) — every number in this README is from our own deployment.\n\nIf this saved you $100+/month, a star helps other people find it.\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftestedmedia%2Fseo-command-center","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftestedmedia%2Fseo-command-center","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftestedmedia%2Fseo-command-center/lists"}