What it is
- Static multi-page marketing site
- Package
@agentpad/landing - Dev server
:5180 - Output
apps/landing/dist
Internal · noindex · Project 1 of 3
How apps/landing is built, shipped, and wired for
demand. Static multi-page Vite site — no React, no app backend, no
@agentpad/* imports. Live at
www.mechapad.com.
The landing is Project 1 in the monorepo: marketing + pricing + Founding deposit. Desktop and Hardware are separate products that share narrative, not code.
┌─────────────────────────────────────────────────────────────────────┐ │ MONOREPO (agentpad) │ │ │ │ apps/landing ──static──▶ Vercel CDN ──▶ browser │ │ │ │ │ │ │ /api/checkout → Stripe Session │ │ │ (USD only, adaptive pricing off) │ │ │ │ │ apps/desktop · apps/virtual-pad · packages/* · hardware/ │ │ (NOT imported by landing — separate deploy / runtime) │ └─────────────────────────────────────────────────────────────────────┘ Request path (production) DNS → Vercel → apps/landing/dist/*.html + hashed assets public/* (robots, sitemap, llms.txt, SVG) copied as-is
@agentpad/landing:5180apps/landing/distDeliberately thin: Vite + hand-written HTML + small TS modules + CSS tokens aligned with the desktop app monochrome.
*.html + blog/*.html — each file is
a full document (MPA). SEO meta, Open Graph, and JSON-LD live in
the page head.
src/style.css (legacy MechaPad home) ·
src/megapad.css (go-forward MegaPad + SEO/blog) ·
src/board.css (war room) · optional industrial /
apple experiments.
src/main.ts (home / get) ·
src/megapad.ts (product + SEO + blog) ·
src/board.ts (checklist / ideate). No framework —
DOM + localStorage only.
public/ → root of dist: robots.txt,
sitemap.xml, llms.txt, SVG assets.
vite.config.ts. Typecheck via
tsc --noEmit.
vercel.json: install with pnpm, filter-build
landing, serve apps/landing/dist.
apps/landing/ ├── index.html, megapad.html, get.html, hardware.html, … ├── blog/ # long-tail SEO guides ├── public/ # robots, sitemap, llms, SVG ├── src/ │ ├── main.ts # MechaPad home + get │ ├── megapad.ts # product / SEO / blog client │ ├── board.ts # internal war room │ ├── style.css # legacy home skin │ ├── megapad.css # primary brand skin │ └── board.css ├── vite.config.ts # multi-page inputs ├── package.json # @agentpad/landing └── dist/ # build output → Vercel
Every public URL is a real HTML file (no client router). Go-forward
product surface is /megapad.html; home still carries
MechaPad SEO equity.
/ |
MechaPad home · SEO + JSON-LD |
/megapad.html |
Go-forward product · dual CTA |
/get.html |
Founding $99 pay page |
/hardware.html |
Pad-first experiment · hw_hero |
/thanks.html |
Post-checkout · noindex |
/codex-micro-alternative.html |
Tier A — competitor intent |
/multi-model-ai-agent.html |
Tier A — category intent |
/blog.html |
Blog hub |
/blog/* |
Tier C long-tail guides |
/board.html |
War room checklist · noindex |
/architecture.html |
This page · noindex |
/apple.html |
Alternate skin experiment |
main.ts |
index, get, legacy pages |
megapad.ts |
Product, hardware, SEO, blog |
board.ts |
War room only |
All interactivity is progressive enhancement in the browser. No API keys, no auth, no backend on this package.
main.ts / megapad.tsIntersectionObserver on .reveal
localStorage list
(mechapad-com-waitlist /
megapad-waitlist /
megapad-hardware-waitlist)
megapad-deposit-clicks ring buffer (last 100)
board.tsdata-id
Stripe Payment Links use
?client_reference_id=… per surface:
sw_primary (software dual CTA),
hw_hero (hardware-hero),
get_page, SEO/blog ids, pricing footer variants.
Client-side data-track logs clicks locally until real
analytics ships. See
docs/hardware/DEPOSIT-METRICS.md.
Multi-page application: every HTML entry is listed under
build.rollupOptions.input in
vite.config.ts. New public pages must be added there or
they will not ship.
pnpm dev:landing # vite dev · http://127.0.0.1:5180 pnpm build:landing # → apps/landing/dist vite build 1. Resolve each HTML entry (main, megapad, get, blog/*, …) 2. Bundle linked TS modules → dist/assets/*.js (hashed) 3. Bundle CSS → dist/assets/*.css (hashed) 4. Copy public/ → dist root 5. emptyOutDir: true on each full build
Configured in apps/landing/vite.config.ts:
index, apple, thanks,
megapad, hardware, board,
get, codexAlt, multiModel,
blog, six blog/* posts, plus this page
architecture.
Single Vercel project at repo root. Only the landing dist is the production output — desktop packages are not deployed here.
pnpm install (workspace-aware)
pnpm --filter @agentpad/landing build
Serve apps/landing/dist as static root
CDN + HTTPS · rewrites pass-through static files
vercel.json (repo root) { "framework": null, "installCommand": "pnpm install", "buildCommand": "pnpm --filter @agentpad/landing build", "outputDirectory": "apps/landing/dist", "rewrites": [{ "source": "/(.*)", "destination": "/$1" }] } Domain: www.mechapad.com No serverless functions, no env secrets required for static pages
Intent → dedicated HTML page → Founding CTA. Plan:
docs/website/SEO.md.
https://www.mechapad.com/…/get.html + productpublic/sitemap.xml — public money + blog URLspublic/robots.txt — Disallow board / apple /
thanks / architecture
public/llms.txt — AI crawler mapKeyword tiers → pages Tier A codex micro alternative → /codex-micro-alternative.html Tier A multi-model AI agent → /multi-model-ai-agent.html Tier B command center / macropad → /megapad.html (+ hardware) Tier C long-tail how-tos → /blog/*.html → hub /blog.html CTA sink every SEO page → Stripe link or /get.html
Live cash path is Stripe Payment Link only. Waitlist is browser-local until a form backend exists. Demand experiments split software-first vs pad-first.
Traffic organic SEO · social posts · direct │ ▼ Landing surfaces / · /megapad.html · /hardware.html · SEO pages · /blog/* │ ├── Primary money ──▶ Stripe Payment Link ($99 Founding) │ client_reference_id = page / experiment │ success → /thanks.html (or Stripe default) │ └── Waitlist form ──▶ localStorage only (dev / interim) keys: megapad-waitlist | megapad-hardware-waitlist After desktop public: dual CTA = Download installer + Founding deposit
/megapad.html ·
client_reference_id=sw_primary · product story first,
pad as Founding upside.
/hardware.html ·
client_reference_id=hw_hero · pad-forward for demand
test without PCB orders.
Hard isolation keeps the marketing deploy simple and prevents accidental coupling to agent runtime.
docs/website/)packages/protocol); never fork message types on the
website.
apps/landing/README.md |
Package entry + page table |
docs/website/SEO.md |
Keyword map + on-page rules |
docs/website/GTM-MEGAPAD.md |
Go-to-market |
docs/website/BRAND-MECHAPAD.md |
Naming / brand |
docs/hardware/DEPOSIT-METRICS.md |
Deposit KPI + attribution |
README.md (root) |
Three-project monorepo map |