04 min

How I Started My Homelab SEO Stack

Jamil Harun
#seo#homelab#serpbear#self-hosted#freelancing

The Pivot

For the last few months I’ve been sending cold emails, setting up Fiverr gigs, posting on LinkedIn, building demo sites for Australian trade businesses — everything you’re supposed to do to land freelance clients. None of it converted. I’d finish one outreach push, get discouraged, and immediately jump to a new project, hoping the next one would be the one that worked.

I got fired from my previous job recently, and looking back, that desperation was driving everything. I wasn’t building a business — I was running away from a problem.

Two weeks ago I decided to stop. No more cold emails. No more platform roulette. I bought a domain for my portfolio, dragged out an old Dell Latitude, and started building something for myself first: a self-hosted SEO monitoring stack that tracks every site I own from one place.

The idea is simple. If this works and my own sites start ranking, the stack itself proves I know SEO — and the portfolio becomes the lead generator. If the automation proves reliable, I can offer it as a service later. But the first customer is me.

Build vs. Buy (or, Don’t Rebuild the Commodity)

Rank tracking and technical crawling are solved problems. There are mature open-source engines for both, and I didn’t see any reason to rebuild them from scratch. The one piece I couldn’t find off the shelf was a layer that turns raw data into plain-English action items — what dropped in rank, what’s broken, what to fix first. That’s the part worth building.

SerpBear — Rank Tracking

SerpBear is a self-hosted Node.js rank tracker that ships as a Docker image. Unlimited domains and keywords, clean REST API, and native Google Search Console integration for real click and impression data rather than scraped estimates. It’s actively maintained — I ruled out Serposcope because its repo is explicitly marked legacy and abandoned.

advertools — Site Crawling

advertools is a Python SEO library built on Scrapy. It’s headless-first and scriptable: one adv.crawl() call runs a full site crawl and hands back a structured table — status codes, titles, meta descriptions, canonicals, headings, redirects, broken links. Because the output is a DataFrame rather than an export file, it feeds the digest script directly, with no per-site database to reconcile.

I originally planned to use Greenflare here, and switched before writing any code. Greenflare is a solid desktop crawler, but it’s a Tkinter GUI app with no CLI — I checked the source and there’s no entry point to call. Driving its crawler headless means scripting undocumented internals, which is exactly the fragile dependency you don’t want inside a scheduled pipeline. advertools is built for the automated case, so it’s less code and one fewer thing to break at 8am on a Monday.

The rough edge is that Scrapy doesn’t execute JavaScript. My portfolio was a client-rendered SPA, so the crawler saw an identical <head> on every route and an almost empty body. That turned out to be useful rather than annoying: it made a real problem visible that I’d been ignoring, and pushed me toward prerendering the site.

The AI Glue

Neither tool tells you what to actually do. The custom piece is a script that pulls SerpBear keyword data via the API, ingests the latest advertools crawl output, and sends both to an LLM for a prioritized weekly digest. Same structural pattern as the sitemap-generator script I already shipped on the portfolio — fetch data, feed it to a model, get back actionable output.

The Hardware Reality Check

This all runs on a Dell Latitude E6330 I’m converting into a homelab server. Resource headroom isn’t the concern — both SerpBear and advertools are lightweight. The blocker is hardware stability: the laptop has a power and charger issue that causes random shutdowns. Phase one of this project has nothing to do with installing software. It’s fixing the machine so it stays on.

What I’m Tracking

  • My portfolio site — the testbed. Per-route SEO tags and an auto-regenerating sitemap are already shipped.
  • Two freelance template sites (a plumbing contractor and an Irish business demo) — if I’m pitching web design services, my own demo sites had better have clean SEO.
  • A new venture site — no domain or stack yet, but it joins the roster once live. design services, my own demo sites had better have clean SEO.
  • A new venture site — no domain or stack yet, but it joins the roster once live.

The Build Order

  1. Fix the Dell Latitude’s power issue (blocking prerequisite)
  2. Deploy SerpBear via Docker, connect Google Search Console
  3. Run baseline advertools crawls for each site
  4. Build the AI glue script
  5. Schedule it with cron
  6. Add the venture site when it’s ready

Where This Is Headed

If the stack proves reliable, it becomes more than internal tooling. Australian trade businesses — the freelance niche I was targeting — care about local SEO, and monthly rank and site-health monitoring is cost per client site is near-zero. No per-seat SaaS bill scaling with client count.

But I’m not selling it yet. First I need my own sites to rank. Then the portfolio proves the work. Then the service sells itself.

Two things I left alone but you should know about, since this draft predates most of the build:

  • “The Build Order” is now history, not a plan. Per the vault, phases 1–5 all shipped 2026-07-28/29 — homelab live, SerpBear deployed, advertools pipeline built, digest running on DeepSeek, weekly cron delivering to Telegram. The post reads as future tense throughout.
  • “Fix the Dell Latitude’s power issue (blocking prerequisite)” was explicitly de-risked — the vault’s note says phases 2–4 don’t need the homelab, and they got built in parallel with the hardware fix still pending.