Marketing site for Forge Space — the open-source developer workspace ecosystem.
- Next.js 15 (App Router)
- React 19
- Tailwind CSS 4
- Motion (motion.dev) for animations
- Lucide React icons
Docker (recommended, matches other Forge Space projects):
npm install
npm run dev:docker
# Or: ./scripts/dev.sh upApp runs at http://localhost:3000 with hot reload.
Terminal (alternative):
npm install
npm run devNODE_ENV=production npm run buildNote: Use NODE_ENV=production for builds to avoid Next.js workspace inference warnings.
Production Smoke Checks validates live production pages with a stable selector
contract (not marketing copy text), and fails closed on regressions.
- Workflow:
.github/workflows/production-smoke.yml - Script:
scripts/smoke/production_smoke.py - Trigger modes:
schedule,workflow_dispatch, and successfulDeploy to Vercel(main) - Failure artifacts:
artifacts/smoke/report.json,artifacts/smoke/report.md, screenshot on failure
Run locally:
python scripts/smoke/production_smoke.py --output-dir artifacts/smokeMarketing pages consume a server-only GitHub metadata sync for the Forge Space
ecosystem (repo count, latest release tag, recent activity).
- Sync source: GitHub REST API (
Forge-Spaceorg) - Cache strategy:
revalidate: 21600(6 hours) - Resilience: static fallback snapshot if GitHub is unavailable/rate-limited
- Stable display labels are prepared on the server to avoid hydration drift on public route date chips
Optional authentication (for higher GitHub API limits):
FORGE_SPACE_GITHUB_TOKEN=ghp_...
# fallback if the variable above is not set:
GITHUB_TOKEN=ghp_...Forge Space exposes only canonical marketing routes for indexing:
//features/pricing/ecosystem/roadmap/enterprise
Technical SEO behavior:
- Per-route metadata contract with canonical URL, Open Graph URL, and Twitter fields
- Deterministic
sitemap.xmltimestamps to avoid crawl churn robots.txtpublishes sitemap and blocks/_next/assets- Skip-to-content navigation with a single
mainlandmark on public routes - Structured data split:
- Global
Organization+WebSitegraph - Homepage
SoftwareApplication - Pricing
FAQPageschema
- Global
- Server-rendered
<h1>coverage for feature, ecosystem, and roadmap routes
Forge Space web supports GA4 event tracking for paid traffic optimization and first-touch attribution persistence.
Set the GA4 measurement ID before running paid launch checks:
export NEXT_PUBLIC_GA_TRACKING_ID=G-XXXXXXXXXXads:google:prepublish also auto-loads NEXT_PUBLIC_GA_TRACKING_ID from
.env.local when the variable is not exported in the shell.
Tracked CTA events:
fs_cta_github_click(primary optimization event)fs_cta_contact_sales_click(secondary)fs_cta_siza_click(secondary)
First-touch attribution contract stored in browser localStorage:
utm_source,utm_medium,utm_campaign,utm_term,utm_contentgclid,gbraid,wbraidlanding_path,first_seen_at
Google Ads campaign assets for the low-cost BR test are in:
marketing/google-ads/forgespace_br_pten_relevance_v2/- v3.3 defaults:
$20total-equivalent cap (R$100hard stop,R$10/day)- EN-only active ad groups (
smb_en,oss_en) with a 60/40 keyword mix - intent split landing:
/enterpriseforsmb_en,/ecosystemfoross_en - primary conversion set to
fs_cta_github_click smb_ptpaused until a PT landing exists- Search-only with strict negative pruning cadence (
R$10,R$30,R$60)
Prepublish command:
npm run ads:google:prepublishCheckpoint command (requires a logged-in Google Ads Chrome session with CDP on 9222):
npm run ads:google:checkpointCheckpoint output:
marketing/google-ads/forgespace_br_pten_relevance_v2/artifacts/<YYYY-MM-DD>-checkpoint/withcampaign|settings|conversions|keywords|search-termsas.txt+.pngmarketing/google-ads/forgespace_br_pten_relevance_v2/checkpoint-scorecard-live.csvupdated in place (R$10,R$30,R$60rows preserved across runs)
Important campaign files:
campaign-config.json— targeting/budget/measurement contractkeywords.csv— active + paused keyword inventorynegative-keywords.csv— launch + pruning negative setrsa.json— baseline/challenger RSA variantsassets.json— sitelinks/callouts/snippets/image/logo/business namega4-ads-setup.md— GA4 + Ads conversion and custom-dimension contract
Development (hot reload):
./scripts/dev.sh upornpm run dev:docker— foreground./scripts/dev.sh up-d— detached./scripts/dev.sh down— stop./scripts/dev.sh logs— follow logs
Production:
docker compose -f docker-compose.prod.yml up -d --buildsrc/app/page.tsx— Multi-section landing (Hero, Features, HowItWorks, SocialProof, Architecture, CTA)src/app/features/— Detailed feature sections with bullet pointssrc/app/pricing/— 3-tier pricing with FAQ accordion and trust badgessrc/app/ecosystem/— Repos grouped by layer (Generation, Governance, Brand) with npm badgessrc/app/roadmap/— Phase 1 (Complete) / Phase 2 (Active) / Phase 3 (Planned)src/app/enterprise/— Enterprise support portal
src/components/landing/— HeroSection, FeaturesGrid, HowItWorks, SocialProof, ArchitectureDiagram, CTASectionsrc/components/layout/— Nav (responsive with mobile menu), Footer (multi-column)src/components/ui/— Button, Badge, Section (reusable primitives)src/components/shared/— HeroParticlesBackground now degrades to a static branded fallback when WebGL is unavailable
src/app/globals.css— CSS custom properties (Forge brand tokens + Tailwind 4 theme)src/styles/design-tokens.ts— TypeScript token constants for non-CSS contexts- Fonts: Sora (display), DM Sans (body), IBM Plex Mono (code)
docs/STYLE_GUIDE.md— Design tokens reference
Styles not loading (white background, default fonts): Tailwind v4 may not scan source files if a .gitignore in a parent directory (e.g. home) uses broad patterns like *. Fix: add @source "../" in src/app/globals.css to explicitly scope scanning, or run the app from a directory outside the ignored tree. Also try: rm -rf .next && npm run dev.