
Deploy OpenSEO
Keyword research, rank tracking, backlinks and site audits you host.
gateway
Just deployed
open-seo
Just deployed
/data
Deploy and Host OpenSEO on Railway

OpenSEO is an open source SEO platform for keyword research, rank tracking, competitor insights, backlinks, site audits and AI visibility tracking, built as a lighter alternative to Semrush and Ahrefs. Instead of a monthly seat, it runs on your own DataForSEO API key, so you pay the data provider only for the lookups you make. It's MIT-licensed, has about 27,700 GitHub stars, and ships an MCP server so AI agents such as Claude Code, Codex, ChatGPT and Cursor can pull SEO data and run audits for you. This template deploys OpenSEO on Railway as two services: the app, with its database and files on a volume, and a Caddy gateway that holds the only public domain and protects everything with a username and password. The site auditor works straight away; keyword, backlink and rank data switch on when you add your DataForSEO key. Hosting costs about $5–10/month on Railway, plus DataForSEO usage.
What This Template Deploys
| Service | Purpose |
|---|---|
| gateway | Caddy on port 8080 with the public domain. HTTP basic auth in front of the app, plus an anonymous /healthz for Railway. |
| open-seo | The OpenSEO app on port 3001, private only. Built from upstream's self-host image with the client and worker bundle compiled at build time. Volume at /data. |
The /data volume holds everything OpenSEO stores: its SQLite database, key-value stores, file storage, agent state and workflow state. A 24-character GATEWAY_PASSWORD is generated for every deploy.
About Hosting OpenSEO
Big SEO suites bundle dozens of tools behind one subscription and charge per seat. Many founders and small teams only need a handful of workflows: find keywords, track a few rankings, check backlinks, fix site issues. OpenSEO focuses on those, and you pay for data as you use it.
Why a gateway. OpenSEO's Docker self-host mode used here has no login of its own; it runs as a single built-in admin, and upstream advises putting it behind an authenticating proxy. The gateway is that proxy. Every request is checked against GATEWAY_USERNAME and GATEWAY_PASSWORD before it reaches the app over Railway's private network, and the app itself has no public URL.
Fast boots. Upstream's container normally compiles its front end on every start. This template does that once at image build time, so each deploy starts serving in seconds instead of rebuilding inside the health-check window.
Bring your own data key. Keyword volumes, SERPs, backlinks, domain overviews and rank checks come from DataForSEO. Set DATAFORSEO_API_KEY to the base64 of your DataForSEO login and API password. Until then, those features show as unavailable and /api/health tells you what's missing.
Shared login. Behind the gateway everyone uses the same username and password, so treat it as a team password. Change GATEWAY_PASSWORD and redeploy to rotate it when someone leaves.
AI agents. The AI and MCP page shows the MCP server URL for your agent, and the optional in-app assistant, SAM, runs on any OpenRouter model when you add OPENROUTER_API_KEY.
Typical cost: ~$5–10/month on Railway for both services, plus DataForSEO's pay-as-you-go charges. Semrush and Ahrefs entry plans cost roughly $130–140 a month per user. OpenSEO's own hosted version is $10/month and adds a markup on data requests; self-hosting avoids that markup.
Deploy OpenSEO in Under 5 Minutes
- Click Deploy on Railway. Both services build and start; the gateway gets the public domain.
- Copy
GATEWAY_PASSWORDfrom the gateway service's Variables. - Open the public domain and sign in as
openseowith that password. - Enter your site's domain on the dashboard, then open Site Audit, add a URL and start a crawl.
- Create a DataForSEO account, set
DATAFORSEO_API_KEYon open-seo and redeploy to unlock keyword, backlink and rank data.
To create the key value, base64-encode login:password from your DataForSEO API settings, not the dashboard key. The first site audit usually finishes in a minute or two and lists pages crawled, response times and issues by severity.
Common Use Cases
- Keyword research. Find search volumes, difficulty and related terms for new content.
- Rank tracking. Follow your positions for a set of keywords without a monthly seat.
- Site audits. Crawl your site for broken links, slow pages, missing tags and other issues.
- Competitor analysis. See which keywords and pages bring traffic to competing domains.
- Backlink checks. Review referring domains and new or lost links.
- AI visibility. Track how your brand appears in AI search answers.
- Client reporting. Run audits and keyword checks for client sites from one workspace.
- Agent-driven SEO. Let Claude Code, Codex or ChatGPT run audits and keyword research through MCP.
Configuration
| Variable | Required | Description |
|---|---|---|
GATEWAY_PASSWORD | 🔐 Auto-generated | The only credential for the whole deployment. Keep it long. |
GATEWAY_USERNAME | ✅ Set | openseo. |
OPENSEO_UPSTREAM | ✅ Auto-set | Private address of the app, open-seo on port 3001. |
DATAFORSEO_API_KEY | Optional | Base64 of your DataForSEO login:password. Needed for SEO data. |
OPENROUTER_API_KEY | Optional | Enables SAM, the in-app SEO agent. |
ALLOWED_HOST | ✅ Set | .railway.app. Set a leading-dot form of your own domain when you add one. |
PORT | ✅ Set | 8080 on the gateway, 3001 on the app. |
RAILWAY_HEALTHCHECK_TIMEOUT_SEC | ✅ Set | 900, a generous first-boot window. |
RAILWAY_DOCKERFILE_PATH | ✅ Set | Builds the gateway from gateway/Dockerfile in the same repo. |
Optional extras. GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET and BETTER_AUTH_SECRET together connect Google Search Console. Set OPENSEO_TELEMETRY_DISABLED=1 on open-seo to turn off upstream's anonymous usage heartbeat.
Custom domain. Add it to the gateway service and set ALLOWED_HOST on open-seo to .yourdomain.com, then redeploy.
OpenSEO vs. Alternatives
| OpenSEO on Railway | OpenSEO hosted | Semrush | Ahrefs | |
|---|---|---|---|---|
| Monthly cost | ~$5–10 plus data usage | $10 plus data markup | About $140 per user | About $130 per user |
| Self-hosted | ✅ Yes | ❌ No | ❌ No | ❌ No |
| Pay only for data you use | ✅ DataForSEO | ⚠️ With markup | ❌ Subscription | ❌ Subscription |
| Site audits | ✅ Built in | ✅ Yes | ✅ Yes | ✅ Yes |
| MCP for AI agents | ✅ Yes | ✅ Yes | ⚠️ Limited | ⚠️ Limited |
| Data on your infrastructure | ✅ Yes | ❌ Hosted | ❌ Hosted | ❌ Hosted |
| License | ✅ MIT | ⚠️ Hosted service | ❌ Proprietary | ❌ Proprietary |
Dependencies for OpenSEO Hosting
- Railway account. Hobby is enough for most small teams.
- A DataForSEO account and API credentials for keyword, backlink and rank data.
- Optional: an OpenRouter key for SAM, and a Google OAuth client for Search Console.
Deployment Dependencies
- OpenSEO on GitHub: source code and releases
- OpenSEO docs: MCP setup, agent skills and pricing
- openseo-railway: the Railway build used here
- DataForSEO: the SEO data API OpenSEO uses
Implementation Details
Both services build from the gridalpha/openseo-railway repository; the gateway selects gateway/Dockerfile through RAILWAY_DOCKERFILE_PATH. The app links /data into its storage directory, so the database and files survive redeploys. The gateway derives a bcrypt hash from your password at start-up, and Railway's health checks reach /healthz without credentials. OpenSEO is under active development, with releases such as 0.1.27 arriving often, so back up the volume before major upgrades.
Only the gateway has a public domain. The app listens on Railway's private network, so nothing reaches it without passing the password check first.
Frequently Asked Questions
What is OpenSEO? An MIT-licensed SEO tool for keyword research, rank tracking, backlinks, competitor insights, site audits and AI visibility, with an MCP server for AI agents.
How much does it cost to run? About $5–10/month on Railway, plus what DataForSEO charges for the lookups you make. There's no subscription or per-seat fee.
How do I sign in?
Use the username openseo and the GATEWAY_PASSWORD from the gateway service's Variables. That's the only login for the whole deployment.
Why are keyword and backlink features unavailable?
They need DataForSEO data. Set DATAFORSEO_API_KEY on the open-seo service to the base64 of your login:password and redeploy.
Can I use it with Claude Code or ChatGPT? Yes. Open the AI and MCP page in OpenSEO for the server URL and follow the setup guide for your agent.
Where is my data stored?
On the Railway volume at /data, including the SQLite database and files. Back up that volume to keep it safe.
Why Deploy and Host OpenSEO on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying OpenSEO on Railway, you get a private SEO workspace for keywords, rankings, backlinks and audits, paying only for the data you use.
Template Content
gateway
gridalpha/openseo-railwayopen-seo
gridalpha/openseo-railway
