Quick context
I'm a solo dev in Abidjan. On October 13 I launched Upstar, a site that ranks the GitHub repos taking off inside each topic: self-hosted, Rust, local LLMs, Android, agent skills, 69 topics so far.
The idea is simple. GitHub Trending is one big list where the same giants win every day. On Upstar, every topic is its own little league, and growth is weighed against size. So a 300-star project that doubles in a week can beat a giant that gains 2,000.
I built it with Claude Code. That detail matters later.
Ten good days
Google picked it up faster than I expected. 14 clicks on the first full day, 51 the next, 159 on October 19. I refreshed Search Console way too often.
By October 22, Upstar was showing up about 6,450 times a day in Google, with 147 clicks. About 20 people had signed up for the Monday digest. Most of the traffic came from people typing a project's exact name, like "macviewer github", and finding my page about it in the top five.
Then October 23
Impressions went from 6,450 to 1,031 in one day. Clicks from 147 to 54. No manual action, no server errors, and I hadn't even deployed anything that day.
What confused me was the average position. It barely moved, around 6.7. It took me a while to get it: Google wasn't pushing my pages down, it had just stopped showing most of them. The few it still showed ranked fine, so the average looked healthy.
So if you ever see impressions collapse while the average position holds, look at indexing first.
What Google actually saw
The day before the drop, Googlebot fetched about 16,500 of my pages, way more than on any day before. And the day before that, I had shipped a feature that added a README excerpt to every repo page. Bad timing.
So Google read thousands of pages built from the same template: repo name, the GitHub description, a chunk of README, a few numbers. An audit tool said only 32% of my content was unique. My own count was worse, with a median of 22% of words that actually belonged to each page.
And I had a French version of almost every page. That's about 39,000 URLs that mostly repeated what GitHub already says.
Google's spam policies have a name for this: scaled content abuse. Lots of pages, little value, no matter how they're made. The same page explains why my good pages went down too: Google tends to assume a page is about as good as the rest of the site.
The annoying part is that Claude knew about these policies. It just didn't bring them up, and I never asked.
Fix #1, and the mistake inside it
First I took about 82% of the pages out of the index. They stayed online for visitors, just marked noindex. A repo page stayed indexed only if the repo had made a topic's top 50 at least once in 30 days, or had already brought a visitor from Google. That cut 39,232 URLs down to 7,151, while keeping most of the pages that actually got clicks.
I felt good about it for about three days.
Then I opened a fresh Claude Code session with no history and asked it to look at my SEO cold. It simulated the rule on real data and found the problem. New repos enter a top 50 every day, so the index was growing back by about 1,500 pages per language every week. By mid-November I'd have been right back where I started.
Now the rule is stricter: top 10 of a topic in the last 7 days, or a past Google click. That's about 1,200 English repo pages and 900 French ones, and it stays stable. There's a hard cap per topic, a test that fails if the cap is broken, and an email alert if the index grows more than 10% in a week.
The other changes
- Every repo page now starts with why the project matters this week, which GitHub doesn't tell you. For example: "gaining 3 times more stars than usual, Upstar spotted it 9 days ago at 336 stars." Then a 30-day chart with the day it was spotted, its rank in each topic and a small health check. The README excerpt is gone.
- I redesigned the whole site so you get it in five seconds, with one line explaining how the ranking works.
- I stopped flooding Bing. I was sending about 6,500 URLs a day to IndexNow, mostly pages where only the star count had changed. Now it's around 800, and only real changes.
The number I didn't want to see
Search Console's own reports lag by several days, so I wired up the URL Inspection API to ask Google about every URL directly.
Out of 1,375 English URLs, 173 are indexed. Google has never even heard of 452 of them. It knows about 227 but hasn't crawled them yet. And it crawled 523 and decided not to keep them.
It hurt to read, but it's the first honest number I've had. Half of my pages haven't been rejected, they just haven't been looked at yet. The 523 are the real problem, and that's what all the changes above are about. Now I can watch that number every week instead of guessing.
What I'd tell another indie dev
- Don't publish thousands of pages built from someone else's data. Every page you want indexed should say something no other page says.
- Look at why pages aren't indexed. "Crawled, currently not indexed" means Google judged them. "Unknown" or "discovered" usually just means it hasn't visited yet.
- Stop checking the 24-hour view in Search Console. The last couple of days are always incomplete, and it'll ruin your mood for nothing. I learned that one the hard way.
- Before you ship anything that touches thousands of pages, ask your AI what could go wrong with search, security or legal. It won't always tell you on its own.
- Get a second pair of eyes. A fresh session with no context caught a mistake I had walked right past.
- Don't panic-edit. Google needs weeks to re-evaluate a site.
Where things are now
Too early to say if Google comes back. Meanwhile Upstar keeps running: rankings update every hour, and the Monday digest goes out to everyone who signed up.
If you have five seconds, open upstar.dev and tell me what you think it does. And if you pick a topic you know well, does the ranking make sense to you? Honest answers welcome, harsh ones included.
Armel, solo dev in Abidjan, Côte d'Ivoire. I wrote this with some help from Claude for the English; the numbers and the mistakes are mine.
Top comments (0)