CASE · 062026 — ONGOINGSOLOSTATIC · pSEO · AD-REVENUE
◦ TOOLPRIME · toolprime.dev

73 thousand pages. One worker.

Suite kostenloser Dev-/Creator-Browser-Tools — static-first, pSEO-tief, ad-finanzierbar. Astro 6 Islands, Cloudflare Workers + Assets, GSC-gesteuerter Index. Kein Backend, kein Tracking, ein Entwickler.

§ 01Problem · motivation

Why this exists.

Der Tool-Portal-Markt ist funktional, aber visuell und inhaltlich auf Stand 2010. Langsam, zugemüllt, Cookie-Banner-Hölle.

Wer schnell einen Hash generieren, Prozente rechnen oder Zeitzonen vergleichen will, landet heute bei Calculator.net, RapidTables oder UnitConverters. Funktioniert — aber mit Werbebannern, die vor dem Tool laden, UI aus einer anderen Dekade und fast keiner inhaltlichen Tiefe pro Rechner. Zielgruppe sind Endnutzer, die das Tool jetzt brauchen, keine App installieren, sich nicht registrieren und auch keinen Cookie-Manager durchklicken wollen.

ToolPrime ist der Versuch, diese Lücke zu füllen: modern, schnell, programmatisch tief — und als Ein-Mann-Betrieb über Ad-Revenue tragfähig zu halten. Kein Venture-Scale, keine 40-Mann-SEO-Agentur im Rücken. Ein Entwickler, ein Repo, und eine Infrastruktur, die auf Cloudflare Workers Paid für $5/Monat die gesamte Ausspielung übernimmt, egal wie viel Traffic eintrifft.

§ 02Constraints · operating box

The box it had to fit in.

Jede Architektur-Entscheidung musste an diesen Constraints vorbei.
C/01 · OPS
Solo-Dev. Code, SEO, Deploy — alles in einer Hand. Kein Team, keine Hand-off-Punkte.
C/02 · BUDGET
Infrastruktur hard-capped < 10 €/Monat — realistisch $5 CF Workers + Domain.
C/03 · ZERO-ORIGIN
Keine DB, kein Backend-Server. Alles statisch gebaut oder client-side berechnet.
C/04 · SCALE
~73.000 generierte HTML-Seiten — sprengt CF-Pages 20K-Limit und GitHub Actions 504-Timeouts.
C/05 · SEO = PRODUKT
Traffic muss organisch kommen. Bezahlte Akquise ist bei Ad-Revenue unwirtschaftlich.
C/06 · PRIVACY
Kein Tracking-Bloat, keine Third-Party-Cookies — Voraussetzung für Mediavine/Raptive-Einstieg bei 50K Sessions/Monat.
C/07 · TRAFFIC
Spiky Long-Tail-SERP, persistente Baseline auf Haupt-Tools. Extrem bursty, ohne Vorhersagbarkeit.
C/08 · STATE
Keine Sessions, keine Nutzerkonten, keine Moderation. Jeder Page-Load ist staatenlos.
§ 03Architecture · pSEO feedback loop

How it runs.

Template × Datensatz → Build-Farm → Wrangler → CF Workers Edge. Dann: GSC-Signal zurück in den Analyzer, noindex-Filter ins Template. Der Index atmet.
build.live·pages 73,359·indexable 20,812·noindex 52,547
deploy ·cost/mo $5
INPUT · 01
pSEO Template
/src/pages/[cat]/[a]-to-[b].astro
active13
CONTENT · 02
MDX collections
tool prose · per-category copy
formatfile · /never
DATASET · 03
Data matrix
n × n · currency · units
rows1,814
SITEMAP · 04
Crawl-budget config
noindex + sitemap-exclude
indexable~21k
BUILD · 05
Astro 6 · Islands
static-first · hydrate-on-need
THUMBS · 06
sharp · build-time
og · thumb · minify
assets73,473
SHIP · 07
wrangler 4 · ./deploy.sh
incremental manifest diff
last-deploy~30s
EDGE · 08
CF Workers + Assets
flat $5/mo · 330+ cities
cache-hit94%
OUTPUT · 09
Organic long-tail
privacy-first · mediavine-ready
sess/24h0
SIGNAL · 10
Search Console export
weekly ZIP · impressions/CTR
queries89,412
ANALYZE · 11
scripts/analyze-gsc.mjs
cannibalization detect
POSCTRCAT
FILTER · 12
Category kill-switch
noindex + sitemap-exclude
kicked52,547
EVENT LOG · ./deploy.sh · wrangler · analyze-gsc.mjs
04:18:22wranglerdeploy · 412 deltas · 28s · skipped 73,061 unchanged
04:18:14astrobuild · 73,359 routes · format:file · 187s
04:18:09analyzercannibal-detect · 18 cat · pos<5 · ctr<.5%
04:18:04filterkick · category:percent · 1,402 routes → noindex
04:17:58sitemaprebuilt · 20,812 indexable · 52,547 excluded
04:17:52sharpog · 73,473 thumbs · 1024×512 · cached
04:17:44gscexport · 7d · 89,412 queries · csv → /tmp
04:17:36tplcollected · 13 templates · n×n dataset · 1,814 rows
04:17:28cfworkers · req 12,408 · hit 94% · cost $0.00
04:18:22wranglerdeploy · 412 deltas · 28s · skipped 73,061 unchanged
04:18:14astrobuild · 73,359 routes · format:file · 187s
04:18:09analyzercannibal-detect · 18 cat · pos<5 · ctr<.5%
04:18:04filterkick · category:percent · 1,402 routes → noindex
04:17:58sitemaprebuilt · 20,812 indexable · 52,547 excluded
04:17:52sharpog · 73,473 thumbs · 1024×512 · cached
04:17:44gscexport · 7d · 89,412 queries · csv → /tmp
04:17:36tplcollected · 13 templates · n×n dataset · 1,814 rows
04:17:28cfworkers · req 12,408 · hit 94% · cost $0.00
§ 04Decisions · trade-offs

Four deliberate choices.

Pro Entscheidung: was gewählt, statt was, warum.
D/01

Astro 6 Static-First + Islands statt Next.js SSR.

chosen
Alle Tool-Seiten pre-rendered, Interaktion nur in React-Islands — kein Server-Runtime im Request-Pfad
instead of
Next.js SSR/ISR mit Node-Runtime auf jedem Request
reason
Bei Ad-Revenue zählt jeder Cent Compute. SSR hätte pro Tool-Interaktion Compute-Minuten gekostet und CDN-Caching unterwandert. Static + Islands gibt Lighthouse-100 out of the box, CDN cached alles, und die React-Inseln hydrieren nur, wo echte Interaktion gebraucht wird — nicht in der Tool-Beschreibung und nicht im Footer.
D/02

Cloudflare Workers + Assets statt Pages oder Vercel.

chosen
CF Workers Paid $5/mo · Wrangler 4 · bis 100K Files
instead of
CF Pages (20K-Limit) · Vercel (Traffic-scaled pricing)
reason
Pages scheitert hart am 20K-File-Limit — und wir produzieren 73K Seiten. Vercel skaliert Preise mit Traffic, was bei spiky Long-Tail-SEO unkalkulierbar wird. Workers Paid ist flat: $5/Monat, egal ob 10K oder 10M Requests. Das ist für ein Ad-Revenue-Modell überlebenswichtig — fixed cost unter variable Einnahme.
D/03

Lokaler Deploy via ./deploy.sh statt GitHub Actions.

chosen
Wrangler lokal, inkrementeller Upload — CI nur als workflow_dispatch-Backup
instead of
GitHub Actions push-on-main mit Full-Deploy
reason
Actions timed out zuverlässig mit 504 Gateway Timeout beim Upload von 146K Build-Assets an Cloudflare. Nicht mal theoretisch — reproducible fail. Wrangler lokal pusht inkrementell, sieht was sich geändert hat, und lädt nur Deltas. CI ist jetzt Backup für den Notfall, nicht der Hot-Path.
D/04

Programmatic SEO als Template × Datensatz.

chosen
Ein .astro-Template pro Kategorie, n × n-Kombinationen aus Daten → tausende Long-Tail-Seiten
instead of
Handgeschriebene Seiten pro Tool-Kombination
reason
Long-Tail-SERP bedient man nicht mit 40 handgeschriebenen Seiten. Template-Ansatz bedient echte Suchintention (z.B. USD to EUR, EUR to JPY …) in einem Commit. Und — entscheidend — er erlaubt evidenzbasierte Steuerung: wenn eine Kategorie nicht rankt, wird sie per noindex + Sitemap-Filter komplett abgeschaltet, ohne Code-Delete. Kategorie ein, Kategorie aus — ein Config-Flag.
§ 05Highlights · interesting bits

Things that were not obvious.

Edge-Cases und Details, die erst beim Bauen klar wurden.

GSC-Analyzer gegen Widget-Kannibalisierung

H/01
Google rankt pSEO-Seiten wie "5% of 200" auf Position 8–10 — mit 0 % CTR, weil Googles eigener Calculator-Widget direkt in der SERP antwortet. Traffic-Illusion auf Position, Null an Besuchern.

scripts/analyze-gsc.mjs parst GSC-Export-ZIPs, findet automatisch Kategorien wo Position gut ist aber CTR null — und flagged sie für noindex. Ergebnis: ~52.000 Seiten via noindex + Sitemap-Filter aus dem Crawl-Budget genommen, das Budget umgelenkt auf die ~21.000 Seiten, die kein Google-Widget kannibalisiert. Recovery-Fenster laut GSC-Trend: 4–8 Wochen, kein Quick-Win, sondern Hygiene-Maßnahme.

Canonical-Duplicates per build.format: 'file'

H/02
Astro erzeugt per Default /tool/index.html mit Trailing-Slash-Redirects. Bei 73K Seiten sind das 343 Canonical-Duplikate — same URL, unterschiedliche Normalisierung, sichtbar als Coverage-Errors im GSC.

Umschalten auf build.format: 'file' + trailingSlash: 'never' produzierte flache .html-Outputs ohne Redirect-Zwischenstufe. Ein Commit, das Problem war weg. Manchmal ist der Fix ein Config-Flag, den man vor vier Monaten hätte setzen sollen.

Zero-Origin trotz File-Processing

H/03
Image-Compressor, PDF-Tools, ZIP-Extractor — alles, was normalerweise Upload braucht, läuft komplett im Browser. browser-image-compression, jszip, html2pdf.js. sharp nur zur Build-Zeit für Thumbnails.

Kein Upload, kein Backend, keine DSGVO-Baustelle — Nutzerdaten verlassen den Browser nie. Erfordert sauberes Web-Worker-Handling bei großen Dateien, damit die UI nicht einfriert. Aber spart jeden Gedanken an Storage, Moderation, Abuse, GDPR-DPA, AV-Verträge. Der beste Server ist keiner.

Wrangler-Push als Deploy-Hot-Path

H/04
Bei ~73K Build-Assets wird jeder Upload-Mechanismus zur Frage der Lebensqualität. Wrangler 4 hat endlich inkrementelle Manifest-Diffs — es lädt nur Files hoch, die sich gegen den CF-Side-State geändert haben.

Das verändert den Deploy-Loop komplett: ein Template-Fix in einem Tool deployed in ~30 Sekunden statt 8 Minuten. Das erlaubt iteratives Fixen direkt gegen Production — was bei Ad-Revenue auch bedeutet, kaputte Revenue-Seiten in 30 Sekunden zu reparieren statt einen CI-Lauf abzuwarten.
§ 06Stack · in production

What's running.

Working toolchain in production — nichts Theoretisches.
Astro 6React IslandsTypeScriptMDX · Content CollectionsCloudflare Workers + AssetsWrangler 4pSEO Templatessharp (build-time)browser-image-compressionjszip · html2pdf.jsGSC AnalyzerSitemap filterPrivacy-first · no tracking
§ 07Reflection · takeaways

What I learned.

Projekt läuft. Diese Dinge nehme ich in die nächsten mit.

SEO ist ein Feedback-System, kein Upload.

Ich bin mit der Illusion gestartet, dass man pSEO "baut und deployed". Realität: man baut, deployed, misst, kickt die Hälfte wieder raus, deployed neu. Der GSC-Analyzer war der Unterschied zwischen einer Tool-Seite und einem Tool-Index. Ohne den Feedback-Loop hätte ich 73K Seiten aufrechterhalten, die gemeinsam weniger Traffic bringen als 21K fokussierte. Jedes pSEO-Projekt braucht diesen Rückkanal ab Tag 1 — nicht erst, wenn der Index zu groß für den Crawl-Budget ist.

Flat pricing ist ein Feature.

Workers Paid für $5 flat hat mir den Kopf freigemacht. Keine Revenue-Prognosen zur Infra-Angst, kein Ausrechnen von Worst-Case-DDoS-Bills. Der Traffic darf explodieren, das Cost-Modell bleibt gleich. Das ist selten geworden — und für einen Solo-Entwickler, der nachts noch SEO-Analysen macht, mehr wert als jeder Premium-Feature-Blogpost.

◦ NEXT CASE · 07 / 11
Ludotek
← alle Projekte