Work in progress — new DataForSEO endpoints are being added progressively.
SEO Playground is a self-hosted dashboard that lets you run SEO and local SEO queries directly against the DataForSEO API. Every search is saved locally in a SQLite database, so you can browse your history and revisit results without making additional API calls. There is no cloud infrastructure involved — everything runs on your machine.
If you find this useful, consider supporting the project:
Local Finder: grid search showing local rankings across a geographic area
Rank Tracker: monitor keyword positions over time for any domain
Google Reviews: rating distribution, monthly review chart, and rating goal calculator
- Rank Tracker — Track keyword positions over time for any domain
- SERP Checker — Analyze Google organic results with target domain highlighting
- Ranked Keywords — Discover what keywords a domain ranks for
- Keyword Overview — Metrics (volume, CPC, competition) for a list of keywords
- Keyword Data — Google Ads & Bing keyword research
- Keyword Difficulty — Bulk difficulty scores via DataForSEO Labs
- Keyword Ideas — Keyword ideas from a seed with volume, difficulty and intent
- Search Intent — Classify keywords by search intent (informational, navigational, commercial, transactional)
- Related Keywords — Related keyword suggestions from a seed keyword
- Competitors — Find competing domains in the SERPs
- Domain Intersection — Common keywords between two domains
- Historical Rank — Ranking history overview for a domain
- Domain Categories — Thematic categories for any domain
- Subdomains — Top subdomains by organic traffic
- Traffic Estimation — Bulk organic traffic estimate for a list of domains
- Page Intersection (Labs) — Keywords shared between multiple pages
- Backlinks — Full backlink profile: list, referring domains, anchors, referring networks, history
- Backlinks Page Intersection — Pages linking to multiple of your targets simultaneously
- Backlinks Domain Intersection — Domains linking to you and a competitor
- Bulk Backlinks / Bulk Referring Domains — Aggregated backlink metrics for a domain list
- Local Finder — Google local pack results for any keyword and location, with map-based coordinate picker
- Geo-Grid Ranking — Local visibility heatmap across a configurable grid of points (3×3 to 11×11). Choose between three API modes: Live (~6 s, instant results), Priority (~1 min, 40% cheaper) or Standard (background queue, 70% cheaper). Results are color-coded by rank position and saved locally for later review.
- On-Page Site Audit — Full site crawl with pages, links, resources, duplicate tags and non-indexable pages
- On-Page Instant Pages — Instant single-page audit without crawling
- Microdata Analysis — Structured data inspection for any crawled URL
- Content Parsing — Quality score, readability (ARI), word count, meta tags, content blocks
- Google Reviews — Fetch and analyze Google Business reviews: rating distribution, monthly chart, and rating goal calculator
- AI Optimization — Visibility in AI-generated answers
- Reddit Mentions — Discover Reddit threads linking to or discussing your URLs
- Top Searches — Local search trends
- Settings — Store your DataForSEO credentials and defaults locally
- Node.js 18+
- A DataForSEO account (API key)
The easiest and fastest way to run the app. Docker builds a production image so the app is fully optimized.
# Build and start (first run)
docker compose up --build
# Subsequent runs
docker compose upThe database is persisted in ./data/seo-playground.db on your machine.
Faster than dev mode — build once, then run.
npm install
npm run build
npm startConvenient for development but noticeably slower — Next.js recompiles on every request and skips all optimizations. Not recommended for daily use.
npm install
npm run devOpen http://localhost:3000 and go to Settings to enter your DataForSEO API credentials.
All settings (API credentials, default location, language, coordinates, domain) are stored locally in seo-playground.db (SQLite). No .env file is needed — configure everything from the Settings page.
Search history and results are cached locally in seo-playground.db. The database is created automatically on first run.
- Next.js 15 — App Router, Server Actions
- React 19
- Tailwind CSS v4
- better-sqlite3 — local SQLite storage
- Leaflet — maps
- Lucide React — icons
- Local Finder simplified — grid search removed from Local Finder and now lives exclusively in its own dedicated Geo-Grid Ranking page
- Geo-Grid highlighted — three queue modes (Live / Priority / Standard), grid sizes from 3×3 to 11×11, color-coded heatmap, auto-polling, local history
- README: run options clarified — Docker and
npm run build && npm startrecommended overnpm run dev; dev mode noted as slow by design (no optimization, recompiles on every request) - Next.js dev indicator removed —
devIndicators: false
- Fix Labs API field mappings — corrected response parsing for Keyword Ideas (
keyword_properties.keyword_difficulty, flat structure with nokeyword_datawrapper), Search Intent (keyword_intent.labelandsecondary_keyword_intentsarray), Subdomains (removed unsupportedorder_byparameter), and Traffic Estimation (removed non-existent position columns, added Paid KWs column) - Fix Keyword Ideas request — endpoint requires
keywordsas an array, not a singlekeywordstring - Remove Next.js dev indicator —
devIndicators: falsein next.config.ts - Update banner translated to English
- Keyword Difficulty — fixed remaining French strings
- Labs endpoints — added Keyword Ideas, Search Intent, Page Intersection, Subdomains, Traffic Estimation
- Domain Analytics — added Categories page
- OnPage — added Site Audit tabs: Links, Resources, Duplicate Tags, Non-Indexable; added Content Parsing standalone page
- Backlinks — added Referring Networks, Page Intersection, Domain Intersection, History (with sparkline charts), Bulk Backlinks, Bulk Referring Domains
- Fix microdata
field.value.join is not a function— DataForSEO returnsvalueandtypesas strings in some responses; addedArray.isArray()guards - Fix microdata "page not submitted" — URL mismatch due to redirect normalization; fetch actual crawled URL from
on_page/pagesfirst - Docker support — added Dockerfile,
.dockerignore, anddocker-compose.ymlwith persistent SQLite volume - Auto-refresh — Site Audit page polls automatically while a crawl is in progress
- UI redesign — sidebar overhaul (blue active state, readable nav labels, section grouping), header cleanup, smooth scroll, focus rings
- All UI text translated to English
- Google Reviews — async task flow, rating distribution, monthly chart, rating goal calculator
- On-Page Instant Pages — full single-page audit via DataForSEO live endpoint
- Geo-Grid Ranking — heatmap across a geographic grid, async task polling
- Site Audit fixes — resolved INSERT OR REPLACE data wipe bug and invalid
order_byparameter causing crawls to never complete - Initial release — Rank Tracker, SERP Checker, Ranked Keywords, Keyword Overview, Keyword Data, Keyword Difficulty, Related Keywords, Competitors, Domain Intersection, Historical Rank, Backlinks, Local Finder, On-Page, AI Optimization, Reddit, Top Searches
MIT
