Skip to content

SEO + growth funnel - #8

Open
miguelrisero wants to merge 8 commits into
fix/build-robustness-and-testsfrom
feat/seo-and-funnel
Open

miguelrisero wants to merge 8 commits into
fix/build-robustness-and-testsfrom
feat/seo-and-funnel

Conversation

@miguelrisero

Copy link
Copy Markdown
Contributor

Stack 4 of 5 (base: fix/build-robustness-and-tests). Council P2 — discoverability + funnel now that the hub is indexable.

  • SEO <head>: meta description, canonical, Open Graph + Twitter cards, theme-color, SVG brand favicon.
  • robots.txt (always) + sitemap.xml (when SITE_URL or Vercel's prod URL is set), generated from the built project list.
  • Selective noindex opt-in: "noindex": true in a template.config.json adds a robots meta + drops it from the sitemap. Default stays indexable — so this doesn't reverse the earlier "make it indexable" change, just makes it controllable per template.
  • Funnel: a "Build with Runflow ↗" CTA + footer linking runflow.io (UTM-tagged) and the GitHub source — the branded hub now points back at the product.
  • Analytics: Vercel Web Analytics script (no-op until enabled).
  • Tests for sitemap/robots; README documents SITE_URL + the noindex opt-out.

npm test (13) + npm run build green; sitemap/robots verified with SITE_URL set.

⚠️ Stacked — merge after #7. Order: 1→5.

Public-repo essentials: MIT LICENSE; SECURITY.md (private disclosure + no-secrets
policy); CONTRIBUTING.md (how to add a template, slug rule, no-secrets, lockfile);
CODEOWNERS gating build scripts/workflows/config; PR + issue templates with a
secrets/build-command checklist.
Least-privilege `permissions: contents: read`, concurrency cancellation, and
SHA-pinned actions (checkout v6.0.3, setup-node v6.4.0) so tag re-points can't
change CI. Dependabot covers github-actions + npm (root and projects/*).
Validate project folder names against a strict slug (^[a-z0-9][a-z0-9-]*$) at
discovery and skip the rest — closes the command-injection vector where a folder
name was interpolated into `sh -c` (`npx vite build --base /<name>/`). Extend the
static-copy filter to drop secret-looking files (.env*, .npmrc, *.pem/*.key, ssh
keys) so a template can't publish credentials. HTML-escape project name/title/type
and section titles in the generated landing index, and allowlist link schemes
(internal paths + http(s) only) so externals.json can't inject script/markup.
- detectInstallCmd uses `npm ci` for package-lock projects (was `npm install`,
  which floats deps) — matches build-node-functions.mjs.
- run() gains a child 'error' handler + double-settle guard so a failed spawn
  rejects instead of hanging the build forever.
- Bounded build concurrency (mapLimit) instead of unbounded Promise.allSettled.
- Assembly, landing index, and config now use only successfully-built projects,
  so a failed project can't leak partial/empty output into the deployment.
- Extract pure buildVercelConfig() (fail-fast on multi-segment dynamic [param]
  entries that would silently 404), and export pure helpers + guard main() so
  the orchestrator can be unit-tested.
…ve path

Refuse the 'local-dev-cron-secret' fallback when CI/VERCEL/NODE_ENV=production,
and report the actual served directory (.vercel/output/static, dist fallback)
instead of the stale 'Serving from: dist'.
node --test coverage for escapeHtml, safeHref, slug validation, and
buildVercelConfig (static, dynamic [id], catchAll, multi-segment reject,
nuxt-server ordering, crons) + collectCronEntries. Adds `npm test` and a CI
test step — exercises the routing/cron logic that the example projects don't.
Now that the hub is indexable, make it discoverable and a real funnel:
- Landing <head> gains meta description, canonical, Open Graph + Twitter cards,
  theme-color, and an SVG brand favicon.
- Generate robots.txt (always) and sitemap.xml (when SITE_URL / Vercel prod URL
  is known) from the built project list.
- Opt-in selective noindex: a template with `"noindex": true` gets a robots meta
  and is dropped from the sitemap (default stays indexable).
- Header 'Build with Runflow' CTA + footer linking runflow.io (UTM-tagged) and
  the GitHub source, so the branded hub points back at the product.
- Vercel Web Analytics script (no-op until enabled on the project).
Unit tests for buildSitemap (skips noindex) and buildRobotsTxt; README Deployment
section documents SITE_URL, generated robots/sitemap, and the noindex opt-out.
@vercel

vercel Bot commented Jun 3, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
templates Ready Ready Preview, Comment Jun 3, 2026 9:46am

Request Review

This branch was successfully deployed

1 active deployment
Preview — 8ea52370 Deployed Jun 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant