Case Study

How morganvault.com was built solo with AI in 2 weeks

This is the site you're reading. Every technical detail, tool, real cost, and pitfall — fully disclosed. This case study is also a live witness of the workflow the Morgan Vault book teaches.

By Morgan · Updated
TL;DR
What tools, time, and money did it take to build this site from zero to live?

Two weeks of work. Main tools: Claude Code + Wispr Flow + Cloudflare Pages + GitHub. Recurring monthly cost $25-40 USD (Claude Code subscription included). One person built HTML/CSS/JS, multi-language i18n, SEO/AEO structured data, and the automated deploy pipeline.

The 2-week timeline

Not '80 full-time hours over 2 weeks' — this is real life: ~4-6 hours/day with normal life around it.

Day 1-2
Environment setup: install Claude Code, open Cloudflare account, create GitHub repo, subscribe to Wispr Flow. Write the first line of HTML.
Day 3-5
Hero / About / Book / Pricing sections structured. CSS design system locked in (navy + gold palette, serif/sans typography hierarchy). First successful Cloudflare Pages auto-deploy.
Day 6-8
Multi-language i18n system: single JS translation object, data-i18n attribute swap, language picker. Wrote a build script to generate per-language sub-pages for SEO.
Day 9-10
SEO/AEO structured data: JSON-LD schemas (Organization, Person, WebSite, Book, FAQPage, BreadcrumbList, HowTo), sitemap.xml, hreflang, OG social card (1200×630). Lighthouse: all 100s.
Day 11-12
Copy polish: every paragraph went through 5-10 iterations with Claude. FAQ, pitfall log, social proof, CTAs — repeatedly balancing honesty vs sales tone.
Day 13-14
Deploy + first-week iteration: real-time adjustments based on GA4 + GSC data. Found a few RWD bugs, CSS specificity conflicts, JSON-LD validator warnings — all fixed.

Real recurring monthly cost

This isn't a marketing estimate — these are the actual line items on Morgan's credit card:

Tool Monthly Notes
Claude Code$20Anthropic Pro subscription includes Claude Code
Wispr Flow$15Voice input — essential for long prompts
Cloudflare Pages$0Free tier is more than enough (500 builds/mo, unlimited bandwidth)
GitHub$0Public repo, free
Lemon Squeezy5%Transaction fee — only charged on sales
Domain$0.83$10/year .com amortized
Total fixed monthly~$36All AI subscriptions, excluding sales fees

Tech stack

No framework, no build step (except i18n), no dependencies. The entire site is plain HTML/CSS/JS:

deploy.bat real snippet:

REM === [0.5/6] Build per-language static HTML pages (SEO/AEO) ===
!PY_CMD! build_i18n.py 2>&1

REM === [1/6] Clean lock files + git status ===
taskkill /F /IM git.exe >nul 2>&1

REM === [3/6] git add + commit + push ===
git add -A
git commit -m "!MSG!"
git push origin main

REM === [6/6] Cloudflare Worker (Wrangler) ===
powershell -File "Website\deploy_cloudflare.ps1" -Mode WorkerOnly

Quantified results

23Language sub-pages
7JSON-LD schemas
300+hreflang entries
~350KBPage size (CSS/JS inlined)
100Lighthouse Performance
100Lighthouse SEO
100Lighthouse Accessibility
100Lighthouse Best Practices

8 pitfalls navigated (each with the actual fix)

Every one of these actually happened while building morganvault.com — not 'theoretically could':

  1. PowerShell encoding garbageUTF-8 BOM clashing with Big5 codepage. Setting chcp 65001 in Windows Terminal alone doesn’t fix it — edit your PowerShell profile.
  2. Cloudflare Pages "deploy succeeded" but site unchangedCDN edge cache holds for ~24h. Use a versioned ?v=YYYYMMDD query string to force bust.
  3. JSON-LD aggregateRating warningProduct schema requires aggregateRating or review; a brand-new book has none — faking it triggers Google’s manipulative-markup flag. Switched to Book schema instead.
  4. GitHub Actions vs Cloudflare API token confusionTwo different tokens for different jobs: GitHub Actions uses secrets.CLOUDFLARE_API_TOKEN (scope: Pages: Edit); local Wrangler uses env CLOUDFLARE_API_TOKEN (scope: Workers Scripts: Edit).
  5. RWD 720/900px overlap zoneTwo @media breakpoints — 720 and 900 — created a 720-900 range where absolute positioning fought flex column. Unified all stack rules at 900px.
  6. CSS @media specificity order trapA later @media (max-width: 900px) should override an earlier 1024px, but cascade didn’t apply — both rules were (0,2,0). Refactored with more specific selectors.
  7. Tutorial drift — docs vs current UICloudflare's official docs screenshots are years behind the 2026 dashboard. Fix: screenshot the current UI and have Claude map old steps to new buttons.
  8. Site deployed, now what?The biggest pitfall — assuming 'site live = visitors arrive'. Reality: equal time again for SEO/AEO, subscription collection, traffic funnels. This book's Chapter 5 + 6 cover exactly that.

Want to use the same workflow for your own site?

This case study is the condensed version. The full 200-page hands-on book — including more pitfalls I've personally hit, copy-pasteable scripts, HTML starter templates, AI prompt templates — is in the bundle.

See the e-book bundle — $39.90 →