
# RankMeFast
**The self-hosted SEO platform. Plain-language audits for search and AI answers.**
Site audits · rank tracking · keyword research · backlinks · Search Console · AI visibility,
in one `docker compose up`.
[](https://github.com/SelmiAbderrahim/rankme.fast/actions/workflows/ci.yml)
[](LICENSE)
[](docs/changelog.en.md)
[](docs/beta.en.md)
[](#quick-start)
[](#development)
[](#tech-stack)
[](#development)
[](#features)
[Quick start](#quick-start) ·
[Try it without keys](#try-it-without-vendor-keys) ·
[Features](#features) ·
[Documentation](docs/index.en.md) ·
[Self-hosting guide](docs/self-hosting.en.md) ·
[Architecture](#architecture) ·
[Contributing](#contributing)
---
## Why RankMeFast
Most SEO suites are closed SaaS with per-seat pricing, and your data stays on
their servers. RankMeFast works differently:
- **Bring your own keys.** RankMeFast doesn't crawl the web or scrape Google
itself. It calls data vendors (DataForSEO, Google APIs, Firecrawl, and
optionally an LLM provider) with your API keys, and there's no markup on top.
- **Your data stays with you.** Everything lands in your MongoDB and PostgreSQL. Users
can export their data or schedule account deletion themselves.
- **Plain language.** Each finding names the page, says in one sentence why it
matters, and tells you how to fix it.
- **Works without keys.** Every provider has a `fake` backend that returns
fixed demo data, so you can try the whole product before paying any vendor.
- **Shared cache.** Vendor responses are cached across users, so you don't pay
twice for the same keyword or URL while the cached copy is still fresh.
> [!NOTE]
> **Public beta.** Expect rough edges, and breaking changes between releases.
> Report bugs through [GitHub issues](https://github.com/SelmiAbderrahim/rankme.fast/issues).
## Features
| Area | What you get |
|---|---|
| **Site audits** | Crawl a site, run 26 automated checks, get a *Fix now / Watch / Passed* report with an optional AI summary. |
| **Rank tracking** | Google organic positions over time, plus Bing, YouTube, and Amazon. SERP features, confirmed-drop alerts, and a local geogrid. |
| **Keyword research** | Volume, difficulty, trends, SERP-overlap clustering, and cannibalization reports from Search Console data. |
| **Links & competitors** | Backlink profiles, link-gap analysis, toxic-link review, competitor discovery, and content comparison. |
| **Google integrations** | Search Console (performance, URL Inspection, sitemaps), GA4, PageSpeed Insights, and CrUX. |
| **AI visibility** | Track prompts in AI Overviews and LLM answers, measure share of voice, get a weekly digest. |
| **Content tools** | Content briefs, internal-linking suggestions, schema.org generation, and change monitoring for public pages. |
| **Local & app SEO** | Business listings and reviews, local-pack ranks, and App Store / Google Play optimization. |
| **Reporting** | PDF/CSV exports, scheduled white-label client reports, read-only share links, a Looker Studio connector, a read-only REST API, and an MCP server for AI assistants. |
| **Teams & alerts** | Seats and invites, plus alert rules delivered by email, Slack, or signed webhook. |
| **Seven languages** | English, Arabic (RTL), French, German, Spanish, Russian, and Chinese across the UI, emails, and docs. |
Each vendor-backed feature has its own feature flag and provider setting, so
you only turn on the ones you have keys for.
## Quick start
**Requirements:** Docker with the Compose plugin.
```bash
git clone https://github.com/SelmiAbderrahim/rankme.fast.git
cd rankme.fast
cp .env.example .env
```
Edit `.env`. The minimum for a local install:
| Variable | Value |
|---|---|
| `BETTER_AUTH_SECRET` | `openssl rand -hex 32` |
| `MASTER_ENCRYPTION_KEY` | `openssl rand -hex 32` (a *different* value) |
| `POSTGRES_PASSWORD` and `DATABASE_URL` | the same random password in both |
| `CLIENT_URL`, `APP_URL`, `VITE_SITE_URL` | `http://localhost:3000` |
| `SERVER_URL` | `http://localhost:8080` |
> [!IMPORTANT]
> Back up `MASTER_ENCRYPTION_KEY`. Losing it makes every stored secret
> (OAuth tokens, channel credentials) unreadable.
Start the stack:
```bash
make build-up # or: docker compose up -d --build
make ps # every service should be healthy
```
Open http://localhost:3000 and create an account.
### Try it without vendor keys
Each provider has a `fake` backend, so you can explore the product without
spending anything. With `NODE_ENV=production` the fakes are refused unless you
opt in:
```dotenv
ALLOW_FAKE_PROVIDERS=true
EMAIL_TRANSPORT=fake
```
> [!WARNING]
> Never enable this on a public deployment.