Building the PunkSolid twelve-site network

By · Updated

Short answer

PunkSolid’s marketing network lives in `apps/ai-network`: twelve static Astro sites on Cloudflare Pages, roughly 160 content pages in git, child mirrors that canonical back to punksolid.ai, and validate/test/preflight scripts that block bad merges. We built and maintain it in Cursor with the same guardrails we sell to clients.

Key facts

Scale
12 sites in `src/network/sites.ts` (PunkSolid parent + eleven keyword-owned children)
Content volume
About 160 Markdown pages loaded by `loadAllPages` across all site folders (count drifts as drafts land)
Stack
Astro 7 static export, per-site `dist/<id>/`, Wrangler deploy to Cloudflare Pages
SEO ownership
One indexable owner URL per topic; mirrors render summaries with canonicals to the child route on punksolid.ai
Quality gate
`pnpm validate`, Vitest (JSON-LD, CTA, registry parity), and `pnpm ai-network:preflight` before release
Tooling
Built and updated in **Cursor** (independent company; Cursor is Anthropic/Anysphere’s mark)

Why we built it

PunkSolid sells production delivery—migrations, custom software, and agent-assisted builds with human review. Prospects kept asking how we practice what we preach. Rather than a slide deck, we shipped apps/ai-network: a twelve-site static network where every page is Markdown in git, every primary keyword has a single owner, and agents (and humans) must pass the same quality gate before a page can graduate from draft to reviewed.

What’s in the repo

The package is inspectable without a sales call:

Piece Role
src/network/sites.ts Registry of 12 sites—punksolid parent plus eleven children (AI training, SEO training, agentic builders, and related education brands).
src/content/pages/<siteId>/ One Markdown file per route; Zod schema in src/content/pageSchema.ts.
src/network/topics.ts Keyword → owner map; validators error if PunkSolid targets another site’s phrase.
src/validate/quality.ts Word minimums, FAQ counts, service steps, and answer length for reviewed pages.
scripts/validate-run.ts / pnpm validate Blocks bad frontmatter, duplicate keywords, and missing sources on case studies.
test/*.test.ts JSON-LD coverage per template, CTA placement, external registry parity, service pillar checks.
pnpm ai-network:preflight Validate + test + registry checks before we tag a release (documented in package AGENTS.md).

A full content load (loadAllPages in src/validate/loadPages.ts) currently pulls on the order of 160 pages across site folders—that number rises as draft guides and services land.

How it behaves in production

Each site builds with SITE_ID=<id> pnpm build:site into dist/<id>/. pnpm build runs all sites, then mirror-parity.mjs compares owner and mirror bodies. Deploy uses Cloudflare Pages (wrangler pages deploy) with public/_headers rules for preview noindex on *.pages.dev hosts.

On PunkSolid itself, section pages expose tiles; detail pages get Article JSON-LD, FAQ blocks when present, and—for case studies—about pointing at a related Service from the related: frontmatter list. That is the same structured-data discipline we recommend on client launches.

Built in Cursor

Implementation and content waves were written in Cursor—the AI-assisted editor from Anysphere—with repo rules in AGENTS.md and .cursor/rules on the wider monorepo. Cursor is a trademark of its owner; PunkSolid is independent and not affiliated.

The workflow matches methodology: specs and topic ownership first, agent drafts second, human review before reviewed, automated validate/test third. For paid work we deliver the same custom software development outcome: you keep the repository; optional AI code review helps your team adopt the gate locally.

Relation to client rebuilds

This network is first-party proof alongside anonymized healthcare migrations and the named 48V Products rebuild. All three show the same ending: code in git, owner-controlled hosting, and gates that stop “vibe-coded” pages from shipping without sources or FAQs. When you hire us, you are buying that stack applied to your domain—not a leased micro-CMS.

Sources

FAQ

Why twelve sites instead of one big domain?

Each child site owns a tight keyword cluster (`src/network/topics.ts`) so titles and intros match search intent. PunkSolid.ai mirrors those articles under stable hub paths (`hubArea` per child) while canonical tags point at the owner build on the child domain—one indexable URL per page in the network.

How do you prevent duplicate content between mirror and owner?

Owner pages self-canonical; mirror HTML includes canonical URLs to the child. `mirror-parity` scripts compare body markers after full builds. Broken ownership or missing tiles fail CI-style checks in this package.

Is this case study about a client project?

No—it documents our own network in this repository, so every fact is verifiable from code, tests, and build scripts. Client deliveries use the same patterns; see [code ownership](/services/code-ownership/) for handoff on paid work.

Cursor is a trademark of Anysphere, Inc. Claude Code is a product of Anthropic. PunkSolid is not affiliated with either company.

Want the same guardrails on your repo?

Ask about spec-driven pages, validate scripts, and review gates sized for your team—not a one-off marketing microsite.

Talk to us

Related

Custom software development

Internal tools, APIs, and automation built in Cursor with review gates, tests, and full source access at handoff.

Service

AI code review

Structured review of agent-generated or vibe-coded repos for security, tests, and deployment readiness before launch.

Service

Full code ownership at handoff

Every PunkSolid client receives full access to finished code—maintain it in Cursor, hand it to another developer, or stay independent if we part ways.

Service

48V Products ecommerce rebuild

How 48vproducts.com moved off its old WordPress store into the monorepo storefront with Medusa checkout—sales held steady or grew.

Case study
Start a project