* fix(sam): stream canned refusals without a provider call Out-of-credits and session-gone refusals ran a real LLM turn with a 200-token cap; MiniMax M3 could spend the whole budget on reasoning tokens, leaving the user a raw truncated chain-of-thought (which also named the backing model) and no reply. Refusal turns now swap in a static LanguageModelV3 that streams the refusal text through Think's normal pipeline — rendered and persisted like any assistant message, with no provider request at all. Fixes every-app/open-seo#161 * fix(chat): stop pinning the transcript to the bottom while the user scrolls up Both chat surfaces (SAM and onboarding) forced scrollTop to the bottom on every streamed chunk, so scrolling up mid-reply was undone within milliseconds. A shared stick-to-bottom hook now tracks pinned-ness from real scroll events: scrolling away releases the pin, returning to the bottom (or sending a message) re-arms it. Fixes every-app/open-seo#160 * fix(rank-tracking): allow any SERP language for any country The Add Domain modal restricted the language picker to the Labs per-country subset and disabled it when only one option existed, so e.g. tracking English searches in Czechia was impossible — even though rank tracking runs against the SERP API, which serves every supported language in every country. The picker now offers the full SERP language list; create/update schemas validate codes against the master list so unknown codes still fail before DataForSEO charges for them; and keyword-metrics refreshes resolve a Labs-served language so an unserved pair never reaches a charged Labs call. Fixes every-app/open-seo#183 * fix(chat): surface silent turn failures in Workers logs A provider stream dying mid-turn (chat:request:failed) and a DO restart whose recovery gives up (chat:recovery:exhausted) leave the user a replayed "Something went wrong" banner and a half-streamed message, but never reach the onChatError hook — their only signal is the agents:chat diagnostics channel, which was unsubscribed, so the chat agents' most common failure modes produced zero log lines. A module-level subscription now logs both for every chat DO. SamChatAgent.onChatError also returns the error now: Think uses the return value as the stored chat-terminal body that reconnecting clients replay, and returning void stored the literal string "undefined".
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.
All-in-one SEO tool for you and your AI agent.
Connect 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.
Hosted Version
Try OpenSEO for free on our website. If you want to support the project, a hosted subscription is $10/month.
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.
Main SEO Workflows
- Keyword research
- Rank tracking
- Competitor Insights
- Backlinks
- Site Audits
- AI Visibility
OpenSEO MCP & Agent Skills
OpenSEO exposes an MCP server so AI agents like Claude Code, OpenClaw, and Hermes can use your SEO data directly. Agent Skills are reusable workflows that guide your agent through SEO tasks using the MCP.
Self-Hosting
OpenSEO supports two self-hosting paths:
- Simple: Docker for personal use on your own machine (recommended for getting started). See
docs/SELF_HOSTING_DOCKER.md. - Advanced: Cloudflare for internet-facing self-hosting across multiple devices or with your team (works on the free plan). See
docs/SELF_HOSTING_CLOUDFLARE.md.
Either way, you need a DataForSEO API key to get SEO data. See docs/DATAFORSEO_API_KEY.md.
Costs
OpenSEO needs a DataForSEO API key so that you can get SEO data. You pay them directly when self hosting.
When you self host, your costs will be slightly lower than the estimates on our website. The way the hosted service makes money is by charging 28% extra for every request we make to DataForSEO.
Local Development
See docs/LOCAL_DEVELOPMENT.md.
Contributing
Contributions are very welcome. See docs/CONTRIBUTING.md.
Community
Join Discord to chat: Discord
Follow along for updates:
- Follow on X: https://x.com/bensenescu
- Sign up for the mailing list on our website: openseo.so