SEOcontent hub control
4,182 pages · 6 hubs

Six hubs. Four thousand pages. One queue.

Pick a hub, give it topics and cities, and it writes the cross-product. Sitemaps rebuild on publish and go to Search Console on the next cron tick. Nothing here waits on you clicking through a CMS.

Last generate run finished 41 minutes ago · 96 pages · 0 failed
Network

Hubs

Select a hub to target it in the generator below. Sitemap age is measured from the last successful rebuild.

Targeting Roof & Gutter Co.
Bulk generate

Topic × city matrix

One page per filled cell. Dark squares are new; grey squares already exist and will be skipped, not overwritten.

4 topics
5 cities
4 × 520 new
new exists skipped
Writing… 0 / 0
Distribution

Sitemaps & Search Console

Sitemaps rebuild automatically when a generate run publishes. Submission goes through the Search Console API with the stored service-account credential for each verified property.

Google deprecated the anonymous /ping?sitemap= endpoint in 2023. Submissions here use the Search Console API sitemaps.submit method, which requires the property to be verified and the service account added as an owner.

Output

Recently published

Live links. Index state is refreshed nightly from the URL Inspection API — it lags real indexing by up to a day.

Last 12 of 4,182
Pipeline

How a run actually executes

01 — enqueue

Cross-product, then dedupe

The topic and city lists are crossed into candidate slugs. Each is checked against pages(hub_id, slug) — a unique index in SQLite — so re-running the same matrix costs nothing and never overwrites live copy.

02 — write

One page, one call

Each cell is a single generation with the hub's brand voice, service area and internal-link targets in the prompt. Output lands in a draft row. Failures retry twice, then park in failed with the error text rather than silently dropping.

03 — publish

Rebuild, then submit

Publishing flips status and triggers a sitemap rebuild for that hub. A cron job submits changed sitemaps to Search Console and pulls index coverage back into pages.index_state overnight.