Build day
Day 4 — Animate + expand
Refine, animate, and expand. The site is built and live. Now you fix static issues, add GSAP animations, and generate additional pages off the homepage as a base. No new tools, no setup. Just Claude Code and a browser.
Rules for the day
- 01Fix static issues BEFORE animations — animating broken layout just hides bugs.
- 02Tell Claude to use GSAP explicitly — otherwise it might reach for a different library.
- 03Drag in screenshots when describing problems — "this looks weird" + a screenshot beats a paragraph of explanation.
- 04Get the whole site to "good enough" first, THEN refine — don't spend a week perfecting one section.
- 05Embrace vague prompts when you don't know what you want — "give me a nice hover effect" is a fine starting point.
- 06Add new content types to Sanity in the SAME prompt as the new page — so the page and CMS schema are wired up together.
Part 1 — Fix static issues first
- 1
Walk the whole site, desktop first
Open localhost on desktop. Scroll the homepage top to bottom and write down everything that looks off. Don't fix anything yet — just capture the list. Things to check: blur effects, image scaling, spacing, alignment, overlay opacities.
- 2
Then walk it on mobile
Open dev tools and switch to a mobile width (or open it on your phone). Same exercise: scroll, note what's broken. Common mobile issues: scroll bars where there should be sliders, content cut off, scaling looks weird, layouts that don't centre properly.
- 3
Take a screenshot of the broken section
Cmd + Shift + 4 on Mac. Crop tightly to the problem area.
- 4
Drag screenshot into Claude Code and describe the issue plainly
Don't worry about technical language. "The blur is fading at the bottom but should be strongest at the bottom" works just as well as anything more technical.
- 5
Convert mobile scroll bars into sliders
Sections like testimonials and services often default to horizontal scroll bars on mobile, which feel broken. Ask Claude to convert them into proper slider experiences.
- 6
Confirm static is solid before moving to animations
Don't add animation polish on top of a broken layout — you'll just be hiding bugs. Walk through both desktop and mobile one more time and confirm everything looks right at rest.
Part 2 — Add animations with GSAP
- 7
Pick one section to start with
Don't try to animate everything at once. Start with the nav, since it's the highest-impact and most visible.
- 8
Tell Claude exactly which library to use
If you don't say GSAP, Claude might reach for Framer Motion, Anime.js, or CSS-only animations. Specify GSAP up front.
- 9
If you don't have a specific idea, say so
Vague is fine. "Give me a nice hover effect" lets Claude propose something. If you like it, keep it. If not, ask for something else.
- 10
Use 'all clear' when you're unsure your prompt makes sense
Just paste "all clear" at the end. Claude does a sanity check on whether it actually understood what you described before building anything.
- 11
Review on desktop AND mobile after each change
Animations can break differently on different screens. Always test both before moving on.
- 12
Iterate with specific feedback
Examples: "the button hover effect is boring, do something else", "if I quickly hover off the button it goes all white", "I want 15 pixels more space between Specter and the paragraph below". Specific issues = specific fixes.
Animation ideas covered in Day 4
- 18
Hero — split parallax
On scroll, the word "Harvey" drifts left, "Specter" drifts right. The "Hello, I'm" label follows Harvey but slightly slower. Background image grows. Creates a really dynamic hero.
- 19
Mission statement — GSAP scrubbing text fill
Text fills in colour as you scroll, locked to scroll progress (scrubbing). Premium-feeling effect with very little code.
- 20
Quote box — drift left on scroll (desktop only)
Box parallaxes off to the left as you scroll past it. Disabled on mobile to avoid breaking the layout.
- 21
Image — blur to clarity on scroll
Image starts blurry, sharpens to fully clear by the time you're scrolled about 50% past it. Subtle but adds depth.
- 22
Deliverables — line-grow + text-move on hover
Each row has a thin grey line that grows wider on hover, while the deliverable name shifts slightly.
- 23
Selected work — card hover effect
Project cards lift or shift on hover. Tells the user the card is interactive.
- 24
Testimonials — parallax drift
Testimonial cards drift slightly as you scroll past them, adding rhythm to the section.
Part 3 — Build out additional pages
- 26
About page — one prompt
Once the homepage exists, Claude knows the design language: fonts, spacing, animation patterns, classes. Generating new pages becomes dramatically faster.
- 27
Review what comes back, decide whether to refine
If it's good enough, move on. If not, list specific issues. Either is valid — don't get stuck perfecting one page when others don't exist yet.
- 28
Services page — same pattern
- 29
Projects page — explicit Sanity instruction
When the page should pull from CMS, say so up front.
- 30
Bundle several pages + features in one prompt
Once Claude clearly knows what it's doing, bundle requests. Saves tokens and keeps the design consistent.
- 31
Refine one round per page, then stop
It's better to have all pages at 80% than one page at 100%. Get the whole site to a good baseline, then circle back to polish.
Part 4 — Wire pages to Sanity
- 33
Add the schema in the same prompt as the page
When asking Claude to build a new page that pulls from the CMS, ask for the schema in the same breath. Saves a round trip.
- 34
For demos: let Claude make up a sensible schema
If you don't have specific field requirements, Claude will infer reasonable ones (title, slug, image, body, date, etc.). Refine afterwards if needed.
- 35
For real client work: specify the fields up front
If the client has specific fields they need (price, SKU, category, related products), list them in the prompt. Avoids re-doing the schema later.
- 36
Reorder fields and add descriptions in Sanity Studio
You don't need to manually create fields anymore — but you can still tweak ordering and add helper text directly in the studio interface (or ask Claude to).
- 37
Refresh /studio after each schema change
Sanity Studio picks up new schemas on save. Refresh localhost:3000/studio to see the new content type appear.
Part 5 — Hook up the contact form
- 38
Claude builds the form, but it can't process submissions
A form needs a backend handler to actually deliver emails. Claude generates the markup; you bring the handler.
- 39
Use Formspark for form handling
Julian's pick. One-time $25 payment for 50,000 submissions, no subscription. Better bot protection than the Webflow default. Site: formspark.io
- 40
Sign up at formspark.io and create a form
Formspark gives you a unique URL for that form.
- 41
Give Claude the URL and ask it to wire it up
- 42
Test by submitting the form on your live site
Submissions arrive in your Formspark dashboard and to your email.
Part 6 — Push everything live
- 43
Push everything to main
For brand new projects with no users, push direct to main is fine. GitHub history is your safety net.
- 44
Vercel auto-deploys
Open Vercel → Deployments. You'll see a new build kick off in a minute or two.
- 45
Test the live site
Visit your live URL. Walk through each page. Check the animations work, the CMS pulls correctly, and the form submits (if you wired up Formspark).
- 46
Verify Sanity Studio works on the live domain
Visit yoursite.vercel.app/studio. If you haven't registered the studio host yet, do that now — see Day 3 troubleshooting.
Useful tips from Day 4
- 47
Embrace vague prompts when you're unsure what you want
Sometimes the best workflow is "make this section feel more dynamic" and seeing what comes back. You can always refine. Specificity isn't a virtue when you don't have an opinion yet.
- 48
AI design quality depends on what you start from
Generic AI websites look generic because the prompt was generic. Starting from a custom-designed homepage means the AI has a real design language to extend across new pages — that's why the about/services/news pages look intentional rather than templated.
- 49
Use 'all clear' before complex prompts
Adding "all clear" at the end of a long prompt tells Claude to verify it understood the request before building. Catches misunderstandings early.
- 50
Time-box refinement
You can spend a week perfecting one page. Don't. Get the site to 80% across all pages, ship it, then refine based on feedback. Most clients can't tell the difference between 80% and 95% anyway — they care that it exists and works.
- 51
Speed isn't the goal — using your hours well is
If a client paid for 10 hours, use the 10 hours. Just don't spend them on the wrong things. Faster generation means more time for craft (animations, refinement, copy) instead of fighting with code.
- 52
Vibe-design from scratch is also valid
You don't HAVE to start from a Figma. If you're confident, you can describe the vision in prose and let Claude propose. Figma is a better starting point for client work; vibe-design is great for personal/experimental projects.
Troubleshooting
Common errors and what they actually mean.
- Claude reached for the wrong animation library
- What:
- If you don't specify GSAP, it might use Framer Motion, Anime.js, or CSS keyframes.
- Fix:
- Always say "use GSAP" in the prompt. If it's already used a different library, tell it:
convert these animations to use GSAP instead.
- Mobile turns into an ugly horizontal scroll bar
- What:
- Sections like testimonials and services default to overflow-x: scroll on mobile.
- Fix:
- Tell Claude: "Convert this section to a proper slider on mobile, not a scroll bar." Specify that all items should be visible and tops shouldn't be cut off.
- Hover effect causes white flash when cursor leaves quickly
- What:
- Animation transition isn't handling fast mouse-out events.
- Fix:
- Drag in a screenshot of the issue and describe what's happening. Example: "If I quickly hover over a button and exit it, the text goes all white." Claude will add the missing transition state.
- New page doesn't match homepage style closely enough
- What:
- Sometimes the first generation is generic.
- Fix:
- Be more specific. Tell Claude exactly which homepage patterns to reuse: "Use the same scrubbing text effect from the mission statement, the same parallax blur, and the same hover effect on cards."
- CMS data isn't appearing on the new page
- What:
- Page was built but isn't actually pulling from Sanity.
- Fix:
- Tell Claude: "This page should pull [content type] from Sanity. Make sure the schema exists and the page is fetching it." Verify the schema appears in /studio.
- Contact form doesn't send emails
- What:
- Claude can build the form markup but can't process submissions.
- Fix:
- Sign up at formspark.io ($25 one-time). Get the form URL. Tell Claude: "Connect the contact form to this Formspark URL: [paste URL]."
- Animations feel jittery or laggy
- What:
- Too many animations firing at the same scroll position, or unoptimised transforms.
- Fix:
- Tell Claude: "The animations are jittery on scroll. Optimise the GSAP setup — use will-change where appropriate and make sure transforms are GPU-accelerated."