FirstHomeFix website
  • TypeScript 96.3%
  • CSS 2%
  • JavaScript 1.7%
Find a file
Hermes 49de7ae7cb
Some checks failed
Deploy Preview / build-and-deploy (push) Failing after 26s
fix: 404.tsx uses ev.status(404) instead of removed statusCode API
Closes #29
2026-06-09 19:51:32 +00:00
.forgejo/workflows feat: full deploy workflow with pipe-to-host 2026-06-09 17:09:33 +00:00
briefs End-to-end keyword pipeline: 6,680 seeds → 1,048 scored → 15 SERP analyses → 15 gaps → 865 briefs 2026-06-06 23:32:57 +00:00
data SOTA keyword research pipeline: 7-stage automated topical network 2026-06-06 23:26:39 +00:00
docs feat: add electrical outlet replacement article 2026-06-09 17:52:26 +00:00
keyword-map Wire seolab (~/tools/seolab) as upgraded data source for the keyword pipeline 2026-06-07 09:14:19 +00:00
scripts feat: add electrical outlet replacement article 2026-06-09 17:52:26 +00:00
site fix: 404.tsx uses ev.status(404) instead of removed statusCode API 2026-06-09 19:51:32 +00:00
.env.example feat: add electrical outlet replacement article 2026-06-09 17:52:26 +00:00
.gitignore feat: add electrical outlet replacement article 2026-06-09 17:52:26 +00:00
bun.lock feat(articles): demo canary article + full content pipeline 2026-06-07 17:56:30 +00:00
package.json Wire seolab (~/tools/seolab) as upgraded data source for the keyword pipeline 2026-06-07 09:14:19 +00:00
README.md feat: add electrical outlet replacement article 2026-06-09 17:52:26 +00:00
TECHNICAL-PLAN.md docs: revise plan with v2 changes (Partytown+GA4, no content, no Tier 5) 2026-06-06 21:19:32 +00:00
tsconfig.json SOTA keyword research pipeline: 7-stage automated topical network 2026-06-06 23:26:39 +00:00

FirstHomeDIY

Practical home repair and improvement for first-time homeowners and renters who own almost no tools.

Status: 🟡 planning Launched:Niche: Home improvement / DIY for first-time homeowners Monetization: Display ads (AdSense → Ezoic → Mediavine, display-only — no affiliate)


🎯 Briefing

What this site is

A home improvement site that respects the reader as an adult but assumes they've never touched a pipe wrench. Every guide is written for someone who owns a screwdriver and a hammer, nothing more. When a job is too big to DIY, we say so plainly.

Audience

  • Who: First-time homeowners aged 25-40, just closed on a house or condo; long-term renters who finally want to fix things without calling the landlord
  • What they're searching for: "how to fix a running toilet," "how to unclog a drain without calling a plumber," "do I need a permit to replace a kitchen faucet," "what's the best tool kit for a new homeowner"
  • What they care about most: "Will this cost me a fortune / void my lease / cause a flood if I screw it up?"

Success looks like

Primary goal: €1,000/month from Google display ads, sustained. Display ads only — no affiliate, no sponsored content.

Everything else — niche, tech, content cadence, monetization ladder — is a means to that number.

The math. Home-improvement RPM is the best in the display tier (assuming mostly US/UK traffic; EU traffic halves it):

Tier RPM band Pageviews/mo for €1k
AdSense €8-12 85,000-125,000
Ezoic €10-20 50,000-100,000
Mediavine €15-30 35,000-65,000

The cheapest path to €1k is to scale to Mediavine-tier sessions (~50k sessions/mo) and stay there. Below that, we're grinding for €1k on AdSense RPM, which means 2x the content.

Milestones:

  • Month 3: 5,000 organic sessions/mo, AdSense pending
  • Month 6: 15,000-20,000 sessions/mo, AdSense approved, €100-200/mo
  • Month 9-12: 50,000 sessions/mo → apply to Ezoic
  • Month 12-15: 80,000-100,000 sessions/mo, on Ezoic, €700-1,200/mo
  • Month 15-18: apply to Mediavine at 50k sessions → €1,000-1,500/mo sustained
  • Month 18+: maintenance cadence, hold €1k+/mo

🛠 Tech Stack

Layer Choice Why this and not the alternative
Framework Qwik + Qwik City Resumability = ships ~0 JS by default; perfect for content sites that need instant loads + good Core Web Vitals. Vs. Astro: similar philosophy, Qwik's interactivity model is more future-proof if we ever add tools.
Build runtime Bun Faster installs and builds than npm/Node. Used as the package manager and to run Qwik's build.
SSG adapter adapters/static from Qwik City Pre-renders all routes to static HTML/JS/CSS at build time. No Node runtime needed in production.
Hosting Cloudflare Pages (static) Free tier is generous, global CDN, integrates with Cloudflare DNS you already use. Static output = $0 forever.
Domain TBD (user registers themselves — see roadmap) User handles all domain purchases. We'll add the domain to the README once it's registered.
Analytics Google Analytics 4 in Partytown worker Privacy-friendly, runs off main thread. Plausible considered but GA4 picked per user direction.
Display ads Google AdSense (start) → Ezoic (50k pageviews) → Mediavine (50k sessions) AdSense has the easiest approval. Ezoic doubles RPM at scale. Mediavine is the premium tier, requires apply + 50k sessions.
Affiliate None (per user direction) Display ads only for now. Can revisit later.
Search Console Google + Bing Both free, both required
Content workflow Markdown in git + article writer API Trivially fast to publish, full version control, no human writing
Newsletter Buttondown (free up to 100 subs) when ready Not needed in Phase 1

📈 Strategy

Monetization mix

  • Primary: Google AdSense (Phase 1-2), Ezoic (Phase 3), Mediavine (Phase 4)
  • Secondary: None in Phase 1-3. Open to sponsored posts or direct ad deals once traffic justifies, but no affiliate.

Content pillars

  1. Repairs & emergencies — "how to stop a leaking pipe," "fix a running toilet," "what to do when the power goes out in one room"
  2. First-time buyer prep — "tool kit for a new homeowner," "what to do in the first 30 days," "things to check before winter"
  3. Room-by-room guides — kitchen, bathroom, bedroom, outdoor — practical projects in each
  4. When to call a pro — honest "this is beyond DIY" articles, builds trust + authority
  5. Money-saving DIY — projects that save hundreds vs. hiring out

SEO approach

  • Keyword research pipeline: SOTA, fully automated. See keyword-map/README.md for the system, keyword-map/keyword-map.yaml for the data. Sources include Google Suggest API, DuckDuckGo Suggest, SearXNG (Bing under the hood), competitor sitemaps, Wikipedia category trees, Reddit, Stack Exchange, Quora.
  • Briefs are auto-generated. Each priority page has a briefs/<pillar>--<slug>.md with target keyword, reader profile, angle, required sections, FAQ, schema, internal links, "done" definition.
  • Article body is API-generated. No human writing. The brief is the contract.
  • Content cadence: 4 articles/week for first 6 months, then 3/week, then 2/week maintenance
  • Word count target: Repairs 800-1,500 words; guides 1,500-2,500; pillar pages 3,000+
  • Internal linking: Every article links to 3-7 related articles. Pillar pages hub everything.
  • Link building: Phase 1-2 is pure on-page + content. Phase 3, do HARO responses and a few guest posts to build domain rating. Cheap and slow.
  • Schema markup: HowTo schema on every guide, FAQ schema where it fits — helps with rich snippets and CTR.

Differentiation

Why this site over Family Handyman / Bob Vila / This Old House?

  • No condescension. Existing sites alternate between "this is so easy anyone can do it" and "actually, this is a 6-hour job requiring 3 specialized tools." We'll be honest about difficulty and time.
  • Real tool lists for beginners. Most sites assume you have a workshop. We start with "you own a screwdriver, here are the next 3 things to buy."
  • Permit-aware but not paranoid. Most DIY sites either ignore permits or fearmonger about them. We'll say what actually requires a permit in plain English.
  • Renter-friendly where possible. Many readers are renters — we note when a fix can be done without permanent changes (no drilling, no painting required).

🗺️ Strategy plan

Three engines running in parallel. If one stalls, the others compensate, but the €1k/mo display-ads target is the only goal that matters.

Engine 1 — Content (the floor)

You can't earn €1k/mo on display ads without a lot of indexed, ranking pages.

  • 5 pillar pages (3,000+ words) built first, before cluster content. These are the authority hubs.
  • ~300-400 articles total to hit €1k/mo sustainably. 4 content pillars × 15-20 clusters × 5-8 articles each.
  • Cadence: 4 articles/week for 12 months (~200 in year 1), then 3/week to month 18, then 2/week maintenance.
  • Every article links to 3-7 siblings + its pillar. No orphan pages.
  • Word count: repairs 800-1,500; guides 1,500-2,500; pillars 3,000+.

Engine 2 — SEO (the multiplier)

  • On-page: keyword in title, H1, first 100 words, URL, meta (handled by the article writer schema).
  • Schema: HowTo on every guide, FAQ where it fits, Article on everything else.
  • Internal linking: hub-and-spoke. Pillars hub clusters. Clusters cross-link siblings.
  • Indexing: GSC + Bing sitemap on day 1. Monitor Coverage weekly.
  • Backlinks: Phase 1-2 = content only. Phase 3+ = HARO + 2-3 guest posts/month. Not the priority; not the plan-killer either.

Engine 3 — Monetization ladder (the unlock)

We don't pick our tier — we earn it.

Phase Traffic Apply to RPM band €/mo target
1 (mo 1-3) building €0
2 (mo 3-6) 15-20k AdSense €8-12 €100-200
3 (mo 6-12) 50k Ezoic €10-20 €500-1,000
4 (mo 12-18) 80-100k Mediavine €15-30 €1,000-1,500

No affiliate, no sponsored posts until €1k/mo is sustained for 3 months. After that, optional and additive — display ads remain the core.

What we don't do (anti-distractions)

  • No YouTube. Validate at 100k visitors; revisit then.
  • No social media posting cadence. The site is the product.
  • No email capture popups. The article is the product, not the list.
  • No premium content, no paywall, no merch.

Kill criteria

  • Month 9, <5,000 organic sessions/mo at 3 articles/week → niche is wrong, pivot or kill.
  • Month 12, <€200/mo on AdSense → content isn't earning RPM, audit or kill.
  • Month 18, not on Ezoic or Mediavine → display-only doesn't hit €1k; recalibrate target or grind harder.

📂 Folder layout

first-home-diy/
├── README.md            ← this file
├── TECHNICAL-PLAN.md    ← execution plan for the technical foundation
├── site/                ← Qwik site code
│   ├── src/
│   ├── public/
│   └── adapters/static/
├── content/             ← articles as markdown
│   ├── repairs/
│   ├── buyer-prep/
│   ├── rooms/
│   ├── pro-vs-diy/
│   └── money-saving/
├── keyword-map/         ← the topical network + planning docs
│   ├── README.md        ← how to use the keyword map
│   ├── keyword-map.yaml ← THE source of truth
│   ├── priority-queue.md← what to write next
│   ├── pillars/         ← per-pillar overviews
│   ├── competitor-analyses/
│   └── IMAGE-STRATEGY.md
├── briefs/              ← generated content briefs (one per priority page)
├── images/              ← article imagery (downloaded + AI-generated)
├── scripts/             ← the SOTA keyword research pipeline
│   ├── lib/             ← shared library (search, scrape, suggest, classify)
│   └── keyword-mining/  ← the 7 pipeline stages
└── data/                ← pipeline output (raw + intermediate)
    ├── raw/             ← seeds.json, queries.jsonl
    └── intermediate/    ← classified, scored, serp-analyses, gaps

🗓 Roadmap

Phase 1 — Foundation (weeks 1-4)

  • Scaffold Qwik + Bun site with homepage + 1 pillar + 1 article template
  • Set up preview-mode container with 4-layer noindex
  • Tailwind + DaisyUI + Fontsource + Partytown + JSON-LD + sitemap + RSS + image pipeline
  • Build the SOTA keyword research pipeline (7 stages, all automated)
  • Generate seed corpus (6,680 seeds) + sample expansion (1,112 queries)
  • User: register domain (handled by user, not me — see memory rule)
  • Wire up the article writer API (input schema, output → markdown)
  • User: point domain DNS to Cloudflare Pages once both are ready
  • Set up GA4 + Google Search Console + Bing Webmaster
  • User: apply to Google AdSense (as soon as we have 30+ quality articles, ideally within week 6)
  • Run full keyword pipeline on all 5 pillars (250+ seeds → 5,000+ queries → 100+ priority pages)
  • Write all 5 pillar pages (3,000+ words each) BEFORE scaling cluster articles — pillars are the authority hubs
  • Write 30 cornerstone articles in month 1 (4 pillars × 1 cluster each ≈ 8 articles + 5 pillars = first wave)
  • Custom 404, OG image generation, cookie consent (already scaffolded)

Phase 2 — Initial traction (months 2-6)

  • 4 articles/week consistently
  • 80+ published articles by month 6
  • 15,000-20,000 monthly organic sessions
  • AdSense approved, €100-200/month
  • Every published article indexed in GSC

Phase 3 — Scale (months 7-12)

  • 3 articles/week
  • 200+ total articles
  • 50,000 monthly sessions → apply to Ezoic
  • €500-1,000/month from Ezoic

Phase 4 — Premium (months 13-18)

  • Apply to Mediavine at 50k sessions
  • 80,000-100,000+ monthly sessions
  • €1,000-1,500/month from Mediavine
  • €1,000+/month sustained for 3 consecutive months = primary goal achieved
  • Drop to 2 articles/week maintenance
  • Re-evaluate affiliate / sponsored posts / YouTube (post-€1k, optional + additive)

💰 Budget

Item One-time Monthly
Domain ~$10-15
Cloudflare Pages $0 $0 (free tier covers us)
Plausible analytics $0 $9 (or $0 if we use Umami self-hosted)
AdSense $0 $0
Ezoic / Mediavine $0 $0 (they take a rev share)
Total ~$15 $0-$9

Total first-year cost: ~$15-$120. This is one of the cheapest online businesses to start.


📊 KPIs to track

Primary KPI (the only one that matters for the goal):

  • Monthly display ad revenue (€) + RPM — AdSense → Ezoic → Mediavine dashboard. Goal: €1,000+/mo sustained for 3 months.

Secondary KPIs (informs whether the primary KPI is reachable):

  • Organic sessions (GA4) — milestone targets: 5k (mo 3) → 20k (mo 6) → 50k (mo 9) → 80-100k (mo 12-18)
  • Impressions + CTR + avg position (Google Search Console)
  • Top 10 ranking keywords (GSC + occasional Ahrefs free check)
  • Indexed pages in Google (GSC Coverage)
  • Pages published per month — cadence targets: 16-17 (mo 1-12) → 12 (mo 13-18) → 8 (mo 18+)

⚠️ Risks & assumptions

  • Biggest risk: Google Helpful Content update. If our content reads like generic AI SEO garbage, we get crushed. Every article needs a real point of view, real photos/diagrams, and genuine firsthand framing. Mitigation: always write like a person, never like a content farm.
  • Assumption to validate: That first-time homeowners actually Google their problems (vs. just calling dad or YouTubing it). If 80% of them watch YouTube, we need a video strategy too. Validate in month 2 by checking search volumes on top keywords.
  • Kill criteria (also stated in the Strategy plan above):
    • Month 9, <5,000 organic sessions/mo at 3 articles/week → niche is wrong, pivot or kill.
    • Month 12, <€200/mo on AdSense → content isn't earning RPM, audit or kill.
    • Month 18, not on Ezoic or Mediavine → display-only doesn't hit €1k; recalibrate target or grind harder.

📝 Decision log

Date Decision Why
2026-06-06 Display ads only, no affiliate User direction
2026-06-06 Picked home improvement / DIY for first-time homeowners High RPM ($15-$25), evergreen, large search volume, real trust gap with existing sites
2026-06-06 Qwik + Qwik City + Cloudflare Pages (revised from initial Astro draft) User prefers fewer moving parts; Qwik picked over Astro for resumability if we ever add interactivity. Static + free hosting remains the simplest viable stack.
2026-06-06 Skip YouTube / video for now Video is 10x the work for 2x the return at our scale. Re-evaluate at 50k visitors.
2026-06-07 Primary goal locked: €1,000/month from Google display ads only Display ads are the entire monetization plan. No affiliate, no sponsored posts. Math: 50k+ sessions at Mediavine RPM (€15-30) = €1k/mo. Everything ladders to that.

🛠 Dev server (active)

A static preview of the built site/dist/ is served via Bun + Traefik at firsthomefix-dev.hermes.tecinfra.xyz. Not for public indexing — ships noindex meta + header + robots.txt, but is reachable by anyone with the URL. Use only for casual previewing; do not share the link publicly.

To redeploy after changes:

cd ~/projects/sites/first-home-diy/site
bun run build
cd /opt/firsthomefix-dev && docker compose restart

The container bind-mounts /root/projects/sites/first-home-diy/site/dist read-only, so a rebuild + restart picks up the new output. No git push, no Cloudflare deploy.