Open-source SEO platform (Semrush replacement) - THNKBIG deployment
  • TypeScript 97.6%
  • CSS 0.9%
  • MDX 0.9%
  • JavaScript 0.5%
Find a file
rudymccomb 72e8533191
Some checks failed
build / verify (push) Failing after 38s
build / image (push) Has been skipped
debug: temporary auth config check endpoint
2026-07-03 13:32:21 -05:00
.agents/skills GSC MCP part 1 (#233) 2026-06-04 13:50:26 -04:00
.claude/skills Scheduled rank checks run through DataForSEO's task queue (#268) 2026-06-13 11:20:42 -04:00
.do deploy: allow both seo.thnkbig.com and *.ondigitalocean.app hosts 2026-07-03 13:01:27 -05:00
.forgejo/workflows ci: add buildah build pipeline + k8s deploy manifests + AGENTS policy 2026-07-02 13:58:48 -05:00
.github/workflows Add stateless MCP server (#162) 2026-05-07 23:38:00 -04:00
.opencode chore: default release notes to public main 2026-03-16 22:03:23 -04:00
.vscode Initial public release 2026-02-27 14:09:33 -05:00
docs refactor: simplify to Postgres+Valkey+Temporal (kill MinIO, drop node pool) 2026-07-02 17:36:00 -05:00
drizzle feat(outrank): provider wiring + JobRunner + deploy manifests 2026-07-02 18:53:03 -05:00
e2e Refactor pages to improve performance and consistency (#205) 2026-05-20 17:23:09 -04:00
k8s feat(outrank): provider wiring + JobRunner + deploy manifests 2026-07-02 18:53:03 -05:00
public redesign: auth pages (#60) 2026-04-08 14:09:01 -04:00
release-notes release: v0.0.20 (#266) 2026-06-12 14:29:49 -04:00
scripts feat(outrank): D1→Postgres migration complete + distroless Dockerfile 2026-07-02 18:31:46 -05:00
specs Hybrid keyword data: Google Ads coverage for non-Labs countries + opt-in clickstream volumes (#262) 2026-06-12 14:08:11 -04:00
src debug: temporary auth config check endpoint 2026-07-03 13:32:21 -05:00
web Remove free trial: subscription paywall + 30-day money-back guarantee (#251) 2026-06-14 21:21:04 -04:00
.dockerignore chore: publish OpenSEO Docker images and use image-first self-host flow (#18) 2026-03-12 19:28:45 -04:00
.env.example Self-hosted Google Search Console (#236) 2026-06-04 18:06:16 -04:00
.gitignore release: v0.0.20 (#266) 2026-06-12 14:29:49 -04:00
.oxlintrc.json feat: Rank Tracking MVP (#91) 2026-04-14 20:29:38 -04:00
.prettierignore feat: group backlinks table by domain with expandable rows (#88) 2026-04-08 14:09:02 -04:00
AGENTS.md docs(agents): lock container spec — multi-stage distroless, no build tools at runtime 2026-07-02 17:53:45 -05:00
cli-auth.ts Replace better-auth with Cloudflare for oauth (#174) 2026-05-08 22:19:55 -04:00
compose.yaml Self-hosted Google Search Console (#236) 2026-06-04 18:06:16 -04:00
Dockerfile fix: use drizzle-kit migrate (Postgres) instead of wrangler d1 (SQLite) at runtime 2026-07-02 18:59:43 -05:00
Dockerfile.selfhost Add stateless MCP server (#162) 2026-05-07 23:38:00 -04:00
drizzle-prod.config.ts Initial public release 2026-02-27 14:09:33 -05:00
drizzle.config.ts feat(outrank): D1→Postgres migration complete + distroless Dockerfile 2026-07-02 18:31:46 -05:00
knip.jsonc Prevent duplicate Default projects and add D1 cleanup tooling (#203) 2026-05-19 20:53:13 -04:00
LICENSE Add MIT License to the project 2026-02-27 14:14:23 -05:00
package.json fix: add tsx to prod deps (drizzle-kit needs it to load .ts config) 2026-07-02 19:15:07 -05:00
playwright.config.ts Refactor pages to improve performance and consistency (#205) 2026-05-20 17:23:09 -04:00
pnpm-lock.yaml fix: add tsx to prod deps (drizzle-kit needs it to load .ts config) 2026-07-02 19:15:07 -05:00
pnpm-workspace.yaml Add pnpm workspace release age config (#181) 2026-05-11 21:24:59 -04:00
README.md Update pricing sources in README 2026-06-18 09:50:04 -04:00
tsconfig.json website: Create website (#19) 2026-03-11 23:23:47 -04:00
vite.config.ts Improve onboarding questions and sign-up routing (#225) 2026-05-26 23:05:20 -04:00
vitest.config.ts test: add vitest checks and run tests in CI (#21) 2026-03-12 19:34:18 -04:00
worker-configuration.d.ts feat: Rank Tracking MVP (#91) 2026-04-14 20:29:38 -04:00
wrangler.jsonc fix: declare AUTH_MODE=local_noauth in wrangler vars (preview-mode binding fix) 2026-07-02 14:40:32 -05:00

Image

OpenSEO

Open source alternative to Semrush and Ahrefs

OpenSEO is an SEO tool for the people. If tools like Semrush or Ahrefs are too expensive or bloated, OpenSEO is a pay-as-you-go alternative that you actually control.

Why use OpenSEO?

  • Best in class MCP and AI Skills.
  • Modern, simple UI.
    • Focused workflows instead of a bloated, complex SEO suite.
  • No subscriptions.
    • Bring your own DataForSEO API key and pay only for what you use.
  • Fork and vibe code your own custom tool.
Image

Table of Contents

Hosted Version

If you not interested in self hosting, or just want to support the project, we also have a hosted version:

openseo.so

Main SEO Workflows

  • Keyword research
    • Find topics worth targeting, estimate demand, and prioritize what to write next.
  • Rank tracking
    • Monitor keyword positions across desktop and mobile over time, with SERP feature detection.
  • Domain insights
    • Understand where your domain is gaining or losing visibility so you can focus on the pages that move revenue.
  • Backlinks
    • See who links to your site, which pages attract links, and where links are newly won or lost.
  • Site Audits
    • Catch technical issues early so your site is easier for search engines to crawl and rank.
  • AI brand visibility
    • See how your brand appears in AI answers, including competitor mentions and source coverage.
  • AI search prompt explorer
    • Track and explore the prompts people might use when they ask AI tools for recommendations in your market.

OpenSEO MCP

OpenSEO exposes an MCP server so AI agents can use your SEO data directly.

Connect Codex, Claude Code, Claude Desktop, or another MCP client to:

  • Run keyword research
  • Inspect SERPs
  • Compare domains
  • Review backlinks
  • Work through SEO decisions from your editor or chat

In the app, open AI & MCP and copy your MCP server URL. Point your agent at whichever OpenSEO instance you use.

Hosted app:

codex mcp add openseo --url https://app.openseo.so/mcp
claude mcp add --transport http --scope user openseo https://app.openseo.so/mcp

Cloudflare self-hosted:

codex mcp add openseo --url https://your-openseo-domain.com/mcp
claude mcp add --transport http --scope user openseo https://your-openseo-domain.com/mcp

Local Docker:

codex mcp add openseo --url http://localhost:3001/mcp
claude mcp add --transport http --scope user openseo http://localhost:3001/mcp

Approve the OpenSEO login when your agent asks.

OpenSEO Agent Skills

OpenSEO Agent Skills are reusable workflows for Codex and Claude Code. They guide your agent through SEO tasks and can use the OpenSEO MCP for live keyword, SERP, backlink, and domain data.

Installation Options

Install with skills add:

npx skills add every-app/open-seo

Auto-accept each OpenSEO skill:

npx skills add every-app/open-seo --skill '*'

Install for Claude Code only:

npx skills add every-app/open-seo --skill '*' --agent claude-code

Install for OpenAI Codex only:

npx skills add every-app/open-seo --skill '*' --agent codex

You can also pick skills directly from the GitHub repo and copy them into your agent's skills folder:

git clone https://github.com/every-app/open-seo.git

# Codex
mkdir -p ~/.codex/skills
cp -R open-seo/.agents/skills/* ~/.codex/skills/

# Claude Code
mkdir -p ~/.claude/skills
cp -R open-seo/.agents/skills/* ~/.claude/skills/

Start with /seo-project-setup. It will ask about your project and help configure your workspace.

Available Skills

  • seo-project-setup
  • seo-coach
  • keyword-research
  • keyword-clustering
  • competitive-landscape
  • competitor-analysis
  • link-prospecting

Roadmap

Top priorities:

  • Google Search Console Integration + MCP
  • Local SEO
  • Custom Reports for Clients
  • Improved and Scheduled Site Audits
  • In App AI Agent
  • Support Multiple Projects

Our top priority is always refining the current product and making existing features better based on user feedback.

If something important is missing, please join the Discord or email me at ben@openseo.so and request it.

Community

Email me: ben@openseo.so

Join Discord to chat: Discord

Follow along for updates:

Pricing / Costs

OpenSEO is totally free to use. It works by using DataForSEO's APIs, which is a paid third-party service unaffiliated with OpenSEO.

There are two separate things:

  1. OpenSEO app cost: $0, you host it yourself.
  2. DataForSEO API: pay-as-you-go based on usage.

For cost estimates, see DataForSEO API Cost Reference.

DataForSEO API Key Setup

OpenSEO uses DataForSEO to fetch SEO data. You need an API key to connect OpenSEO to the service.

Backlinks requires one more step beyond the API key: you also need DataForSEO Backlinks enabled on your account (trial or paid subscription), then confirm access from the Backlinks page in OpenSEO.

  1. Go to DataForSEO API Access.
  2. Request API credentials by email (API key by email or API password by email).
  3. Use your DataForSEO login + API password, then base64 encode login:password:
printf '%s' 'YOUR_LOGIN:YOUR_PASSWORD' | base64
  1. Set this as DATAFORSEO_API_KEY in your environment file:
  • Docker self-hosting: .env
  • Cloudflare: Set it in the workers UI
  • Local development: .env.local

Google Search Console

Search Console is optional and works in self-hosted deployments using your own Google OAuth client. It takes ~10 minutes of one-time setup — see docs/SELF_HOSTING_GOOGLE_SEARCH_CONSOLE.md.

Self-hosting

OpenSEO supports two self-hosting paths:

  • Docker for personal use and testing (Recommended for local use).
  • Cloudflare for internet-facing self-hosting across multiple devices or for your team.

Docker

Docker is recommended for getting started. It's super easy to get up and running once you install Docker.

Cloudflare

If you love OpenSEO and want to use it across multiple devices or with your team, you can host it on Cloudflare which we'll be a SaaS-like experience. Also, this will have automatic database backups and other nice convenience features. It's just a bit more effort to get started if you're unfamiliar with Cloudflare.

Docker Self Hosting

Warning

By default, the Docker version is intended for local use only. It runs in single-user mode with no authentication. For internet-facing self-hosting, use Cloudflare (free plan compatible). Or read docs/SELF_HOSTING_DOCKER.md before exposing to the internet.

Prerequisites:

Quickstart:

  1. cp .env.example .env
  2. Set DATAFORSEO_API_KEY in .env
  3. docker compose up -d
  4. Open http://localhost:<PORT> (default 3001)

By default, compose.yaml pulls the published image from GHCR:

  • ghcr.io/every-app/open-seo:latest

To update to the newest published image, pull first and then restart:

docker compose pull
docker compose up -d

Or use a single command:

docker compose up -d --pull always

For more info, see docs/SELF_HOSTING_DOCKER.md.

Cloudflare Self-Hosting

Deploy the Worker

Clicking this button opens a page to deploy OpenSEO in your Cloudflare account. If you do not have an account yet, it will take you to account creation first (OpenSEO works great on the free plan).

Reference these docs while deploying since the Cloudflare UI doesn't indicate what steps you need to take: docs/SELF_HOSTING_CLOUDFLARE.md.

Deploy to Cloudflare

Local Development

See docs/LOCAL_DEVELOPMENT.md.

Contributing

Contributions are very welcome.

  • Open an issue for bugs, UX friction, or feature requests.
  • Open a PR if you want to implement a feature directly.
  • Community-driven improvements are prioritized, and high-quality PRs are encouraged.

If you want to contribute but are unsure where to start, open an issue and describe what you want to build.

SEO API Cost Reference

Use this section to estimate DataForSEO spend per request type. OpenSEO itself remains free; these are API usage costs only.

As of February 26, 2026, DataForSEOs public docs/pricing pages say:

  • New accounts include $1 free credit to test the API.
  • The minimum top-up/payment is $50.

That means you can try OpenSEO for free with the starter credit, then decide if/when to top up.

Pricing sources

1) Rank tracking

There are in-app estimates for this since its dependent on the settings you select.

$2/month example:

  • 50 keywords
  • 1 device (Mobile or Desktop)
  • Search 5 pages deep.

Searching ten pages deep costs 8x more than one page. Tracking both devices costs 2x more.

2) Site audit

  • $0.01 per 20 pages audited with Lighthouse
  • Current billed cost pattern (from account usage logs):
    • 0.02 + (0.0001 x returned_keywords) USD
  • Default app setting: 150 results per search ($0.035 each).
  • Available result tiers:
    • 150 results = $0.035
    • 300 results = $0.05
    • 500 results = $0.07

4) Domain overview

  • Standard domain overview request (with top 200 ranked keywords): $0.0401 per domain.
  • General formula if needed:
    • 0.0201 + (0.0001 x ranked_keywords_returned) USD

Note

There is a 2 week free trial, but then DataForSEO requires a $100/month commitment for this API. You can access this data for just $10/month through openseo.so. Soon, we'll let you use an OpenSEO API key so that you can call our API from your self hosted instance.

  • Backlinks search costs about $0.06 for a domain or $0.04 for a page.
  • Opening extra tabs like Referring Domains or Top Pages adds about +$0.02 each.
  • Exact cost can vary slightly based on returned rows and DataForSEO pricing.

6) AI Search — Brand Lookup

  • One lookup = 6 DataForSEO AI Optimization calls (aggregated_metrics + top_pages + mentions_search across ChatGPT and Google AI Overview): up to about $0.85 per lookup.
    • aggregated_metrics: $0.101 per platform.
    • top_pages: page-ranked cited sources per platform.
    • mentions_search: row-priced; $0.20 per platform at the app's full 100-row sample (lower-volume brands return fewer rows and cost less).
  • Adding competitors (Share of Voice) adds 2 cross_aggregated_metrics calls: about $0.10 each, $0.20 total.
  • Results are cached for 24 hours, so repeating the same lookup (same target + competitor set) is free within a day.
  • Re-measure anytime with pnpm billing:brand-lookup --target=example.com --competitors=a.com,b.com --confirmLive=true.

Planning examples

  • 100 keyword research requests at the default 150 results: $3.50
  • 100 keyword research requests at 500 results each: $7.00
  • 100 domain overviews (200 ranked keywords each): $4.01
  • 100 backlinks domain searches at current defaults before opening extra tabs: about $6.34
  • 100 backlinks page searches at current defaults before opening extra tabs: about $4.30
  • 100 fully explored backlinks domain searches: about $10.94
  • 100 fully explored backlinks page searches: about $8.61