A page falls out of Google’s index. Now you get to find out why.
Open Search Console to confirm it’s actually gone. GA4, to see if the traffic died or if Search Console’s just lying to you again. Bing, on the off chance it indexed the thing and knows something Google won’t cop to. PageSpeed and CrUX, in case the page went slow. Cloudflare, in case you’re quietly serving Googlebot a 522 and nobody told you. Clarity, to watch some poor bastard rage-scroll the page while you sit there guessing. Tag Manager, in case someone published a version on Tuesday and broke tracking. That’s eight tabs, eight logins, eight auth flows that all work differently for no fucking reason, and you stuck in the middle of them with a spreadsheet, being the world’s dumbest database, joining rows by hand at 1am like a caveman.
rankrat is me getting fed the fuck up with being that database. You point an agent at it, say “this page dropped, go find out why,” and it shakes down every one of those consoles for the answer so you don’t have to open a single one of the bastards.
The rat can’t touch shit you didn’t hand it
The rat doesn’t break in. It gets in through doors you already unlocked, because you handed it the keys. You give it the provider accounts, and those credentials are the entire extent of its power. That’s the whole fucking security model and I’m not going to dress it up.
There’s a file, boundaries.json, with a list of the resources the rat knows about. It would be piss-easy to sell you that file as an access-control layer and charge you for the privilege. It’s not one. It’s the rat’s notebook — where it’s already found holes in the fence, nothing more. If your Google token can touch a property, so can the rat, and no amount of JSON is going to save you from a credential you handed over your own damn self. So the real safety rule is boring as shit: don’t feed it tokens you’re scared of.
One switch and it’s a boolean
Out of the box the rat writes. It’ll create properties, rename them, publish Tag Manager versions, submit sitemaps everywhere, purge your Cloudflare cache, manage edge redirects — armed, straight away, no ceremony. Some of you are going to read that and clutch your fucking pearls.
There is one thing that changes it:
RANKRAT_READ_ONLY=trueFlip that and every write route and every write tool doesn’t just get blocked, it disappears from discovery — the agent never even learns those tools exist, so it can’t go poking at them. That’s the entire capability system. Not a role matrix, not fourteen scopes you configure over a weekend and still fuck up. One boolean. Armed rat or defanged rat, pick one at startup. And it’s on you to decide whether the thing calling it is a careful agent with a human watching or a fully autonomous one you’ve decided to trust — the rat’s not going to make that call for you.
Seventy tools and I’m not listing them
There are 70 tools. I counted the names in the source, because a number on this blog is a promise and not a vibe, and that’s as far as I’m going with it. It does Search Console, GA4 (including realtime, not just yesterday’s numbers), Tag Manager down to individual triggers and variables, Bing — including the backlink data Google won’t fucking give you — Cloudflare, Clarity, PageSpeed, CrUX, IndexNow and Lighthouse. Inside each one it does the specific boring shit you’d otherwise click through by hand.
The count isn’t the point. The point is you ask one question and the rat figures out which of those it has to go bite to answer it, instead of you deciding, logging in, and copy-pasting a URL across every one of them.
It monitors — read this part before you rely on it
Here’s the bit that’ll bite you in the ass if you skim. Yes, it monitors. A monitor is a named schedule that runs a bounded site audit on an interval, saves an immutable snapshot every time it runs, and opens and closes issues as they appear and vanish. Real lifecycle — it’ll notice an issue is gone and resolve it, not just pile up diffs.
The catch: the scheduler only runs inside the long-lived HTTP server. If you’re driving the rat over stdio, which is how an agent normally talks to it, nothing fires on its own — the stdio process dies the second your agent hangs up, and a dead process doesn’t wake up at 6am to crawl shit. Over stdio you can still create monitors, manage them, and run one on demand. But “check every six hours and tell me when something breaks” needs the HTTP server actually sitting there running. Get that backwards and you’ll spend a week wondering why your monitor never went off. It didn’t go off because there’s nobody fucking home to fire it.
The Lighthouse lives in a separate cage
The Lighthouse audits don’t run in the main process. They run in their own container, psyb0t/rankrat-lighthouse, that setup pins alongside the main image. A Lighthouse run is a headless Chrome pointed at a URL, which is a real browser chewing on a page you didn’t write, and that does not go anywhere near the same box as your OAuth tokens. Same reason stealthy-auto-browse gets locked in its own box — the browser’s the loaded gun, so the browser gets its own room.
Getting the rat running
Docker’s the only thing you need installed. The whole thing ships as images plus a readable wrapper script that drives them, so you’re never running some mystery binary you can’t read.
curl -fsSL https://raw.githubusercontent.com/psyb0t/rankrat/main/install.sh -o rankrat-install.sh
less rankrat-install.sh
bash rankrat-install.sh
rankrat setuprankrat setup is the part that saves your sanity. It lists every provider, you tick the ones you actually use, and it walks you through creating each credential — the exact Google OAuth clicks, the Bing key, the Cloudflare token, the Clarity token — instead of leaving you to guess which nine of Google’s ten thousand cursed OAuth scopes you need off a README that went stale two versions ago. And it hides every value the moment you paste it, so your scrollback isn’t a live credential dump waiting for you to share your screen.
It talks MCP over stdio, MCP over Streamable HTTP at /mcp, and a plain FastAPI JSON API under /v1/ for anything that doesn’t speak MCP. It installs into an agent off the psyb0t/agents marketplace:
claude plugin marketplace add psyb0t/agents
claude plugin install rankrat@psyb0tCodex takes the same marketplace with codex plugin add rankrat@psyb0t, and also finds the skill on its own in a checkout since it reads .agents/skills/ natively.
It’s alpha and it says so — the tool surface can still move before 1.0, minor releases are allowed to break shit on purpose as long as it’s written down, so pin an exact version if you need it to hold still. Under all that it’s 668 tests against a 90% coverage floor, which is the least you’d fucking want from something you’ve handed live write access to your whole search stack.
Stop being the fucking database. Feed the rat the keys you already own and let it go find whichever console has been sitting on the answer. github.com/psyb0t/rankrat.