open-seo

Application

every-app/open-seo

Open source SEO tool that replaces Semrush and Ahrefs.

Overview

OpenSEO is a pay-as-you-go SEO tool with keyword research, rank tracking, backlink analysis, site audits, and AI agent integration via MCP. It supports self-hosting and uses DataForSEO API for data.

README Preview

# OpenSEO\n\n> Open source alternative to Semrush and Ahrefs\n\nOpenSEO 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.\n\n> All-in-one SEO tool for you and your AI agent.\n\nConnect with any agent like Claude Code, OpenClaw or Hermes. We have pre-built skills, but you can build your own to tailor OpenSEO to your needs.\n\n\n\n## Table of Contents\n\n- [Why use OpenSEO?](#why-use-openseo)\n- [Main SEO Workflows](#main-seo-workflows)\n- [OpenSEO MCP](#openseo-mcp)\n- [OpenSEO Agent Skills](#openseo-agent-skills)\n- [Roadmap](#roadmap)\n- [Community](#community)\n- [Pricing / Costs (Free + API costs)](#pricing--costs)\n- [DataForSEO API Key Setup](#dataforseo-api-key-setup)\n- [Google Search Console](#google-search-console)\n- [Self-hosting](#self-hosting)\n  - [Docker Self Hosting](#docker-self-hosting)\n  - [Cloudflare Self-Hosting](#cloudflare-self-hosting)\n- [Local Development](#local-development)\n- [Contributing](#contributing)\n- [SEO API Cost Reference](#seo-api-cost-reference)\n\n## Hosted Version\n\nIf you not interested in self hosting, or just want to support the project, we also have a hosted version:\n\n[openseo.so](https://openseo.so)\n\n## Why use OpenSEO?\n\n- Best in class MCP and AI Skills.\n- Modern, simple UI.\n  - Focused workflows instead of a bloated, complex SEO suite.\n- No subscriptions.\n  - Bring your own DataForSEO API key and pay only for what you use.\n- Fork and vibe code your own custom tool.\n\n## Main SEO Workflows\n\n- Keyword research\n  - Find topics worth targeting, estimate demand, and prioritize what to write next.\n- Rank tracking\n  - Monitor keyword positions across desktop and mobile over time, with SERP feature detection.\n- Domain insights\n  - Understand where your domain is gaining or losing visibility so you can focus on the pages that move revenue.\n- Backlinks\n  - See who links to your site, which pages

FAQ (5)

Troubleshooting
How do I fix the SolidJS "No matching export ... for import 'use'" error when running pnpm dev?

This occurs when @tanstack/react-devtools 0.10.12 pulls in @tanstack/devtools-ui 0.7.1, which imports use from the SolidJS 1.9.11 server build that does not export it. Setting VITE_SHOW_DEVTOOLS=false does not help because the devtools are imported statically in src/routes/__root.tsx.

Workaround: pin @tanstack/react-devtools to the last compatible version:

"@tanstack/react-devtools": "0.10.8"

Then update dependencies:

pnpm install --no-frozen-lockfile
pnpm dev

This resolves to @tanstack/devtools-ui 0.6.0 and allows the dev server to start. The cleaner permanent fix is to load devtools with a client-only dynamic import in src/routes/__root.tsx, as implemented in commit db8bde17e245d01f9ca4ab06acaf37fe22aac361.

GitHub Issue #382
Troubleshooting
Why does the site audit undercount words and show a false thin-content warning on minified HTML?

This is a bug in open-seo versions before v0.1.16. Block-level tags joined without whitespace (e.g., <p>one</p><p>two</p>) were parsed as concatenated text (onetwo), lowering the word count and triggering a false thin-content warning. It also affected <li>, <td>, and <br> elements and produced different content hashes for equivalent HTML. Fix: upgrade open-seo to v0.1.16 or later (fixed in commit 756538cc5). After upgrading, minified and formatted HTML yield identical word counts and content hashes, while inline markup like Open<strong>SEO</strong> still counts as one word.

GitHub Issue #400
Troubleshooting
How do I stop the SAM chat from scrolling back to the bottom while I am trying to scroll up and read earlier messages?

This happens because the chat scroll container is pinned to the bottom on every messages update. During SAM's streaming response, updates occur for each token, so the view is pulled back down immediately. The fix is to update to the release containing the chat auto-scroll fix. As a code workaround, in SamConversation and OnboardingChatConversation, only auto-scroll when the user is already near the bottom, for example: const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80; if (nearBottom) el.scrollTop = el.scrollHeight;. Do not force scrollTop = scrollHeight on every message change.

GitHub Issue #160
Troubleshooting
Why does the open-seo Docker container run `vite build` on every restart and take 90 seconds to respond?

The v0.1.0 self-host image runs pnpm run build unconditionally in its startup command, rebuilding the Vite client/SSR bundles and running tsc --noEmit before serving. The fix is to use an image containing PR #120: the startup script hashes the Vite-inlined VITE_* variables plus the image build ID, caches the build output in the persistent data volume, and skips the build when both are unchanged. It also removes the runtime tsc --noEmit check. Update with docker compose pull && docker compose up -d, keeping the data volume mounted. The first start may still build; later restarts should skip it. Changing a build-relevant VITE_* variable or updating the image triggers a rebuild. If you must remain on v0.1.0, build or run the PR #120-based image; there is no built-in flag to disable the startup build in the old image.

GitHub Issue #100
Troubleshooting
Why do scheduled rank tracking checks never run when nextCheckAt is stuck in the past and lastSkipReason is null?

This occurs when the scheduled rank-check cron fails before it advances nextCheckAt or creates a run row. A manual check can still succeed because it uses a different code path. The hosted issue was fixed by deploying scheduler commits f048dc3bd1c671e28aa4ceaaf22ca6663cdcb321 and eec998a76233bb33e2dddbd921fc81da2eba1e0a; database capacity was also upsized after scaling-related failures. For self-hosted instances: 1) Upgrade to a release containing those commits. 2) Search cron logs for [cron] Error processing config and the affected config ID, for example: grep '\[cron\] Error processing config' app.log | grep -E 'aea7a4ae-b6f3-4334-8196-eb9406d20dbf|845f59d5-c4cd-440f-953a-2be68374ca38'. 3) Check database CPU, connections, latency, and resource exhaustion, and upsize if necessary. 4) As an immediate workaround, use **Check rankings** manually; this updates positions but does not repair the frozen schedule. 5) After deploying the fix, requeue or contact support for any configs whose nextCheckAt remains stuck.

GitHub Issue #198