Skip to main content

SEOLint has shut down. Read the post-mortem

Post-mortem · July 2026

SEOLint is no longer running.

It was an SEO agent that watched your site, opened the pull request, and graded every fix against real Search Console traffic. The agent worked. The business did not follow. Here is the honest version.

Current status

The database is switched off. Accounts, scans, dashboards, the MCP server, and billing are all gone, and sign-in now lands on this page. Nobody is charged and there is no data left to export. What stays online is this write-up and the blog, which is still worth reading if you care about SEO for developer-led products.

The idea

SEO that behaves like a linter.

At a previous startup we paid around $3,000 a month for SEO audits that engineers still had to implement by hand, weeks later. Most of the strategy attached to it was text chunks for blog posts we wrote ourselves anyway. That felt broken.

So SEOLint was built on a simple premise: SEO should run in the background like a linter, flag what is wrong, hand over the fix, and then prove whether the fix worked. Not a dashboard you visit. A coworker that reports in.

The differentiator was never scanner coverage. Anyone can count missing meta descriptions. It was the loop back to Search Console. Ship a change, wait, and find out whether impressions moved. Almost no SEO tool closes that loop, because closing it means admitting when the advice did not work.

What actually shipped

This was not a landing page with a waitlist.

The full loop ran in production. A site got scanned, issues were fingerprinted per URL, a fix went out as a pull request, and the merge was measured against Search Console weeks later.

The scanner

A crawler built on cheerio and got-scraping, with Browserless for JS-rendered pages and screenshots. Google PageSpeed Insights supplied Core Web Vitals. Claude Haiku turned HTML, screenshot, and PSI data into structured issues with paste-ready fix prompts.

The MCP server

A full read surface for Claude Code and Cursor. Scan a site, list open issues, read site history, and ask for the next action without leaving the editor.

Search Console integration

OAuth connect, a daily sync cron, and per-page metrics stored per day. Refresh tokens encrypted at rest with AES-256-GCM. This was the piece that made grading possible.

The GitHub PR bot

A registered GitHub App that opened pull requests with the fix applied, handled the webhook on merge, and emailed the result. Autonomy was the actual product.

The grading loop

Every shipped fix was checked back against real Search Console traffic at 14, 28, and 90 days. Not a score out of 100. An answer to whether the change moved anything.

The agent brief

A weekly email covering PR activity, watch flags, and action items, plus agent-generated blog drafts sourced from sitemap coverage and Search Console winners and opportunities.

Why it stopped

Four things I got wrong.

None of these are “the tech was hard”. The tech worked. That is precisely the problem.

01

The moat needed volume I never reached

The whole thesis was that operating the product generates data nobody else has. Scans, fix-outcome pairs, cross-site patterns. The payoff line was "sites like yours typically…", and that line needs a meaningful number of comparable sites before it says anything true. I designed the data model for a scale the funnel never delivered, which meant the strongest part of the product stayed dormant.

02

I solved the hard problem and skipped the hard part

Getting an agent to scan a site, open a correct PR, and grade the outcome against Search Console is genuinely difficult, and it worked. Getting developers to install it is a different problem, and I kept choosing the one I already knew how to do. Every week I could ship a feature was a week I did not have to go find users.

03

Pricing churn was a symptom, not a strategy

The plan went from a tiered scan ladder, to $19 and $49 scans, to $79 a month with 200 credits bundled and BYOK as an optional upgrade. Each revision was defensible on its own. Taken together they were me rearranging the storefront of a shop nobody had walked into yet. Repricing is not traction.

04

The grading loop was the product, and it was invisible

The thing that made SEOLint different was that it told you whether a fix actually worked. But that verdict lands 14 days after the first fix, which is longer than a 7-day trial. The best argument for the product could not be demonstrated inside the window where someone decided to pay for it.

What I took from it

Build the distribution before the moat.

The data moat was real and I still believe in it. Fix-to-outcome pairs across hundreds of sites would produce recommendations no passive audit tool could match. But a moat is a second-order asset. It only exists once enough people are using the thing, and I built the machinery for it long before I had earned the right to.

The correct order was to find ten developers who would install a scrappy version, watch them use it, and only then build the compounding layer underneath. I did it backwards, and the most valuable code in the repo never got the volume it needed to say anything interesting.

I would rather ship this write-up than quietly let the domain lapse. The code taught me more than a successful version of a smaller idea would have.

Built with

The stack

Next.js App RouterTypeScriptSupabase (Postgres, RLS, auth)Claude (Haiku + Sonnet)Model Context ProtocolGoogle Search Console APIGitHub AppsBrowserlessPageSpeed InsightsResendCreemVercel

Still writing, still shipping.

The blog stays up. The lessons carry into whatever is next. If you want to follow along, the best places are below.