I've been building CyberStars on my own for almost 12 months (9 days to go). It's a free place to learn Python, C, Java and Linux by writing real code in the browser. It is also open source
For the first 11 months, the only person on the site was me. Lessons nobody read, bugs nobody hit.
18 days ago, it had no users. Today it has 63.
I know how that sounds. 63 is nothing next to the launches you see on here. But seeing names I don't know in the users list, people I've never met working through lessons I wrote, is honestly a bit overwhelming. For me it's enormous.
It didn't come from going viral. It came from fixing things I should have fixed on day one.
Google was reading an empty page
CyberStars is a React single-page app. When Google asked for a lesson page, my server sent back the same index.html, with an empty <div id="root"> and one generic title. Every page looked identical. There was no sitemap and no robots.txt. Any made-up URL returned 200 with the app, so to a crawler the site was one page with endless copies of itself.
I had hundreds of lessons and challenges. Google saw none of them.
Fix 1: pre-render every public page
I didn't move to Next.js. After the Vite build, a small script renders each public page into its own HTML file: the landing page and every course, lesson and challenge. Each one gets its own title, description and link preview. The same script writes the sitemap from the same list. 862 pages came out of it.
Then the server learned to tell three things apart: a real page, an app route and a URL that doesn't exist. That last one now gets a real 404, not a 200 with an empty shell.
Fix 2: tell search engines when something changes
After each deploy, a script pings IndexNow with the pages that are new or changed. It's a few lines, and it means Bing and the other engines don't wait weeks to notice a new lesson.
Fix 3: say what people actually search for
This one wasn't technical, and I think it mattered most.
People choosing where to learn to code check two things first: is it free, and will it ask for my card? CyberStars is free and asks for no card, but my search results didn't say so. "Free and open source" sat at the very end of the landing page's description, right where Google cuts it off.
So every title now says it: "Learn Python for free, no card needed", "Two Sum in Python: free challenge, no card". Every description starts with "Free, no card." and then fits the page's own text into 155 characters. The link preview image got the same two checks.
Let them in before asking for an account
SEO brings people to a lesson page. If that page says "sign up first", most of them leave.
So a guest can open courses, lessons and algorithm challenges and run code without an account. Sign-up comes when they want to keep their progress, so people sign up after they've started, not before.
What I'd tell myself on day one
- If you ship an SPA, check what a crawler actually gets.
curlyour own pages. It takes a minute and tells you everything. - Unknown URLs must return 404. A 200 for everything looks like one page copied endlessly.
- Your title is an ad. Put the thing your users care about first, not your brand.
- Don't put a sign-up wall between a search result and the content it promised.
Why 63 feels huge
I can't prove every sign-up came from search: in those same days I also shipped new courses. But they came in right as these fixes went out, and for 11 months before that there was nobody.
For almost a year this project existed only for me. Now strangers open a lesson, get stuck, ask the tutor and keep going. It's a small number, and it's the most motivating thing that's happened since I started.
If you have a side project with good content and no visitors, check what Google sees before you build the next feature. Mine was looking at a blank page.
What SEO fix surprised you most on your own project?
Top comments (0)