rankforge
Honest, local-first SEO autopilot. Audit your site → research keywords → brief the SERP → write scored articles → weave internal links → publish → track rankings. One shared Python core, two front-ends: a CLI and an MCP server you can drive from any MCP client.
No SaaS, no account, no required API keys. Your site data and your .env
never leave your machine — it's a single SQLite file you can delete and
rebuild.
git clone https://github.com/Makeph/rankforge && cd rankforge
pip install -e ".[all]" # or `pip install -e .` for the lean core
rankforge init
RANKFORGE_SITE=https://your-site.com rankforge audit
rankforge keywords research "your topic"
rankforge write "your best keyword" # scored SEO + GEO before you ever publish
rankforge tick --dry-run # see what the autopilot would do
Why this exists
The "AI SEO autopilot" category (AutoSEO, Oscar AI, and friends) charges ~$150/month for a loop you can run on your own machine: pick a keyword, read the SERP, write an article, add links, publish, track. rankforge is that loop, rebuilt small and honest:
| Idea | Seen in | How rankforge does it |
|---|---|---|
| "Connect your site, get daily articles on autopilot" | AutoSEO-style tools | tick worker with a daily cap and a quality gate — cron it, or don't |
| Real-time SEO/GEO article scoring | Oscar-style tools | A deterministic rubric (score) — every point traceable to a named check, same input → same score |
| Keyword research + competitor analysis | everyone | Zero-key: autocomplete expansion + DuckDuckGo SERP + competitor scrape |
| Auto internal linking | Oscar-style tools | Anchors matched against your crawled pages, idempotent insertion |
| Publishes to your CMS | everyone | WordPress REST (app password) or markdown export for any static site |
| Rank tracking incl. AI engines | AutoSEO-style tools | DuckDuckGo position history in SQLite; the GEO score covers the AI-answer side |
Everything degrades gracefully: no key → article generation falls back through local agent CLIs to a deterministic outline; no WordPress → markdown export; no network → audit/score/link still work on stored data. Nothing publishes without passing the quality gate, and nothing publishes at all unless you configured a target.
The engine trick
Article writing is pluggable, and three of the engines are agent CLIs you may already pay for — so generation costs nothing extra and no API key ever enters this tool:
RANKFORGE_ENGINE = auto | anthropic | codex | kimi | qwen | outline
anthropic— the Anthropic API (ANTHROPIC_API_KEY).codex/kimi/qwen— driven via their non-interactive prompt modes.outline— offline, deterministic: expands the brief into a structured skeleton with TODOs. Never publishable, never blocking.
auto walks whatever is actually available (rankforge engines shows the
order). Every draft is scored; if it lands under RANKFORGE_MIN_SCORE, the
engine gets one revision pass listing the exact named checks that failed —
then the article is either ready or held as a local draft.
SEO score + GEO score
rankforge score <id> prints two rubrics, check by check:
- SEO 0–100 — keyword in H1/intro/headings, structure, length vs the SERP-derived target, density, internal + external links, readability, lists.
- GEO 0–100 — will an answer engine (ChatGPT, Perplexity, AI Overviews) quote you? Question-phrased H2s, ≤60-word direct answers under them, an FAQ block, a liftable definition, lists/steps, concrete figures.
No magic, no vibes: the scorer is ~150 lines you can read, and the writer never sees it — only its plain-language feedback.
The pipeline
rankforge audit # crawl + on-page issues + site-wide findings
rankforge keywords research <seed> # autocomplete → cluster → opportunity 0-100
rankforge brief <keyword> # live SERP: target length, questions, outline
rankforge write <keyword> # engine of your choice, scored, stored
rankforge links <id> --apply # internal links from YOUR crawled pages
rankforge publish <id> [--dry-run] # WordPress draft or markdown front-matter
rankforge track / report # DuckDuckGo positions + movement over time
rankforge tick # all of the above, once a day, guardrailed
The autopilot's guardrails mirror the rest of the tool: RANKFORGE_DAILY_ARTICLES
(default 1), RANKFORGE_MIN_SCORE (default 70, below = held as draft),
WordPress posts land as drafts unless you say otherwise, and --dry-run
always shows the plan first.
# typical cron line — one article per weekday morning, as WordPress drafts
0 7 * * 1-5 rankforge tick
MCP (drive it from any MCP client)
pip install "rankforge[mcp]"
rankforge mcp # stdio server
{
"mcpServers": {
"rankforge": { "command": "rankforge", "args": ["mcp"] }
}
}
Tools exposed: audit_site, research_keywords, build_brief,
write_article, score_article, suggest_internal_links, check_rank.
Configuration
Everything is optional — rankforge init drops a commented env.example.
| Variable | Purpose | Without it |
|---|---|---|
RANKFORGE_SITE |
your site (audit, linking, tracking) | pass URLs explicitly |
RANKFORGE_LANG |
keyword/article language (en, fr, …) |
en |
RANKFORGE_ENGINE |
writing engine | auto |
ANTHROPIC_API_KEY |
the API engine | CLI engines / outline |
WP_URL / WP_USER / WP_APP_PASSWORD |
WordPress publishing | markdown export |
RANKFORGE_DAILY_ARTICLES / MIN_SCORE / MAX_PAGES |
guardrails | 1 / 70 / 200 |
Install from source
git clone https://github.com/Makeph/rankforge
cd rankforge
pip install -e ".[dev]"
pytest # offline test suite, no keys needed
Responsible use
rankforge is a content system, not a spam cannon: one article a day by default, a quality gate that refuses to publish weak drafts, WordPress drafts by default so a human stays in the loop, polite crawling with a real user-agent and jittered pacing, and rank checks kept to a minimum. Generated content is your responsibility — review it before it ships.
License
MIT © 2026 Aurore Biakou
Metadata
Release files for rankforge 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rankforge-0.1.0.tar.gz | 47.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rankforge-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 89.6 kB
Release files / rankforge-0.1.0.tar.gz
| Download URL | rankforge-0.1.0.tar.gz |
|---|---|
| Size | 47.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f12d3bf6ce9599e8210a8f962901fb5812fd5689f809a47120b3e4840a6c3bb7
|
|
BLAKE2b-256 checksum How to use checksums |
0d0e9dac5ff4d80ba539e51ebd51ec8c25b3af9e5f8b6d7abd592cb630281ef5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency logRelease files / rankforge-0.1.0-py3-none-any.whl
| Download URL | rankforge-0.1.0-py3-none-any.whl |
|---|---|
| Size | 42.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d5974e86158060ad7ce0821e402e027278c1f8d64ec2511938529cf846f9e705
|
|
BLAKE2b-256 checksum How to use checksums |
c2488675bafc270ee2d63357fbf1fe61b45af76ff09e207eb9d78a7e00185efb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency log