📄 Implementation Guide

Build a Full Client
Growth Package
with Claude Code

How to go from a website audit document to a live password-gated client deliverable in a single session.

3
HTML deliverables
1
Live Shopify page
0
Manual copy/paste
~90
minutes total
Overview

What Is Claude Code?

Claude Code is Anthropic's CLI tool that lets you run Claude directly in your terminal, connected to your local files, APIs, and browser. Unlike the chat interface, Claude Code can read and write files, run scripts, call external APIs, and take actions in sequence without you being involved at every step.

For this project, that meant Claude could:

📷
Extract real images from a live Next.js siteUsed browser JavaScript to decode image optimizer URLs and pull actual photo paths
🌐
Build three styled HTML documentsWebsite mockup, social media growth plan, and 4-week content calendar — all in one session
📱
Publish directly to Shopify via the REST APICreated the page, uploaded a custom Liquid template, and set template_suffix — no manual steps
🔒
Gate the page behind a client passwordBuilt a JS sessionStorage password gate directly into the page body — no app needed
The Core Unlock

Claude Code isn't just a better chat interface. It's an agent that can execute multi-step workflows end-to-end. The difference is that it can act on your computer, not just advise you.

End-to-End Workflow

The Full Workflow

Here's the exact sequence used to build the Cincy Mahjong Club deliverable package, from first message to live URL.

1
Paste in the audit document
Start with whatever source material you have — an audit, notes, a brief. Paste it into Claude Code and ask for an HTML mockup. Claude reads the full document before building anything.
2
Extract real photos from the live site
Claude Code uses the Chrome MCP to navigate to the live site, then runs JavaScript in the page context to extract real image URLs. For Next.js sites, this requires decoding the image optimizer query params — Claude handles this automatically.
3
Build the HTML mockup with real photos
Claude writes a full HTML file matching the site's actual color palette, fonts, and aesthetic. Real photos are embedded directly. Bug fixes and new sections are annotated with color-coded badges so the client can see exactly what changed.
4
Build the social plan and content calendar
Separate HTML documents for the growth strategy and 4-week content calendar. Each is a complete, styled deliverable — not a Word doc, not a Google Doc. Ready to share immediately.
5
Publish to Shopify as a standalone page
Claude calls the Shopify REST API to create the page, then uses the Theme Assets API to upload a bare {% layout none %} Liquid template. The page renders as pure HTML with no theme wrapper.
6
Send the client a single URL + password
One link. One password. Everything the client needs — website mockup notes, full social strategy, 4-week content calendar, caption bank — in one scrollable page they can revisit any time.
Technical Techniques

Key Techniques Used

📸
Extracting images from a Next.js site
Next.js serves images through an optimizer at /_next/image?url=...&w=...&q=.... The raw paths are URL-encoded inside the query string. Claude used this JS snippet in the browser to decode them:
🔒
JS password gate (no app needed)
A simple sessionStorage-based gate — the page hides all content behind a password form. One correct entry per browser session. No Locksmith, no app, no monthly fee. Embedded directly in the Shopify page's body_html.
🪟
Bare Shopify Liquid template
By default, every Shopify page renders inside the active theme (nav, header, footer). Creating a templates/page.HANDLE.liquid file with {% layout none %} strips all of that and serves just your HTML.
📊
Annotation badge system
Color-coded pills (RED = bug fixed / GREEN = new) placed directly on mockup elements so clients can scan exactly what changed without reading an explanation doc.
📄
Shopify Pages + Assets API
Two API calls to publish: (1) POST /pages.json creates the page with body_html. (2) PUT /themes/{id}/assets.json uploads the Liquid template. Then PUT /pages/{id}.json sets template_suffix.
🅾
Preview server for local verification
Claude Code uses a local http-server (configured in .claude/launch.json) to preview every HTML file before publishing. Screenshot tools confirm the render before any API calls.

Image Extraction JavaScript

browser console
// Next.js image optimizer encodes the real path in the url= param
// Calling img.src directly triggers a "cookie/query string data" block
// Decode the url param instead:
[...document.querySelectorAll('img')]
  .map(img => {
    try {
      return new URL(img.src).searchParams.get('url');
    } catch { return img.src; }
  })
  .filter(Boolean)
  .filter(src => !src.startsWith('data:'));

// Returns clean paths like /gallery/IMG_4688.jpeg
// Prepend the domain to build full URLs

Bare Liquid Template

templates/page.YOUR-HANDLE.liquid
{%- liquid
  layout none
-%}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>{{ page.title }}</title>
</head>
<body style="margin:0;padding:0;">
  {{ page.content }}
</body>
</html>

<!-- page.content renders the body_html from the Page object -->
<!-- All CSS, JS, and HTML is embedded in body_html -->

Shopify API — Full Publish Script Pattern

publish_page.py
import os, json, urllib.request

TOKEN = os.environ["SHOPIFY_ADMIN_TOKEN"]
STORE = "your-store.myshopify.com"
API   = "2026-04"

def shopify(method, path, body=None):
    url  = f"https://{STORE}/admin/api/{API}/{path}"
    data = json.dumps(body).encode() if body else None
    req  = urllib.request.Request(
        url, data=data, method=method,
        headers={
            "Content-Type": "application/json",
            "X-Shopify-Access-Token": TOKEN,
        }
    )
    with urllib.request.urlopen(req) as r:
        return json.loads(r.read().decode())

# Step 1: Create the page
page = shopify("POST", "pages.json", {
    "page": {
        "title":    "Your Page Title",
        "handle":   "your-page-handle",
        "body_html": YOUR_HTML_STRING,
        "published": True
    }
})["page"]

# Step 2: Upload bare Liquid template
themes = shopify("GET", "themes.json")["themes"]
active = next(t for t in themes if t["role"] == "main")
shopify("PUT", f"themes/{active['id']}/assets.json", {
    "asset": {
        "key":   f"templates/page.{page['handle']}.liquid",
        "value": LIQUID_TEMPLATE_STRING
    }
})

# Step 3: Point page to bare template
shopify("PUT", f"pages/{page['id']}.json", {
    "page": {
        "id":               page["id"],
        "template_suffix": page["handle"]
    }
})

print(f"Live: https://your-domain.com/pages/{page['handle']}")
Prompt Patterns

The Prompts That Worked

These are the actual prompt patterns used in this session. The key: be specific about the aesthetic you want, reference the live site, and tell Claude the output format explicitly.

Prompt 1 — Website Mockup
"I am helping a friend build up her social media presence and website — can you do an HTML mockup based on the following audit and help me build a plan. [paste full audit document]"
Paste the full audit inline. Claude reads the entire document and builds from it. The more specific your audit, the better the output.
Prompt 2 — Fix AI Feel
"The html looks way more AI than I'd like — can you add in her photos and such"
This triggered Claude to navigate to the live site, extract real photos via JavaScript, and rebuild the mockup from scratch to match the actual site aesthetic. Short prompts work when Claude has enough context.
Prompt 3 — Social Plan (parallel request)
"While you're doing that, can you build a comprehensive social media plan to supercharge her followers and reach/growth"
Issued while the mockup rebuild was in progress. Claude queued and completed both. You can stack requests when they're independent.
Prompt 4 — Content Calendar + Publish
"Create a content plan — can you also publish all of this roadmap as a Shopify page I can share with her that is password gated — she wants to really push her open plays as her biggest revenue driver"
One prompt, three actions: build content plan, create Shopify page, add password gate. The "open plays" context shaped the entire content calendar strategy. Business context in prompts = better output.
Prompt 5 — Fix Render Issue
"The page setup is wrong — it's rendering the wrong page — needs to be full page JSON"
Claude diagnosed the Shopify theme wrapper issue, created the bare Liquid template, uploaded it via the Theme Assets API, and updated the page's template_suffix. One sentence fix for a multi-step technical problem.
Prompt Pattern That Works

Give Claude the business goal, not just the task. "She wants to push open plays as her biggest revenue driver" reshaped the entire content calendar — every week's posts were architected around that one revenue lever. Claude can't optimize for what it doesn't know.

Prerequisites

What You Need to Replicate This

Required
Claude Code CLI Paid
Install via npm install -g @anthropic-ai/claude-code. Requires an Anthropic account with API access.
Required
Shopify Admin API Token Store needed
Create a private app in Shopify Admin. Needs Pages read/write + Theme Assets read/write scopes. Store token in ~/.zshenv as SHOPIFY_ADMIN_TOKEN.
Recommended
Claude in Chrome Extension Free
Lets Claude navigate live websites, take screenshots, and run JavaScript in page context. Used to extract real photos from the client's site.
Recommended
Local Preview Server Free
Run npx http-server /your/workspace -c-1. Configure in .claude/launch.json so Claude can preview HTML files before publishing.
Optional
Google Fonts API Free
All HTML deliverables use web fonts loaded from Google Fonts. No key needed — just internet access at render time.
Optional
CLAUDE.md config file Free
A project-level instructions file that tells Claude your preferences, brand rules, file conventions, and workflow. Eliminates the need to repeat context each session.

Shopify API Setup (5 minutes)

terminal
# 1. Create a private app in Shopify Admin
#    Settings > Apps > Develop apps > Create an app
#    Scopes needed: write_content, read_themes, write_themes

# 2. Store the token securely (never hardcode it)
echo 'export SHOPIFY_ADMIN_TOKEN="shpat_your_token_here"' >> ~/.zshenv
source ~/.zshenv

# 3. Verify it works
curl -s -H "X-Shopify-Access-Token: $SHOPIFY_ADMIN_TOKEN"   "https://YOUR-STORE.myshopify.com/admin/api/2026-04/shop.json"   | python3 -m json.tool | grep '"name"'

Launch.json Preview Server Config

.claude/launch.json
{
  "version": "0.0.1",
  "configurations": [
    {
      "name": "client-workspace",
      "runtimeExecutable": "npx",
      "runtimeArgs": ["http-server", "/path/to/workspace", "-c-1"],
      "port": 8110,
      "autoPort": true
    }
  ]
}

// Claude Code reads this file to start preview servers
// Use "preview_start" tool with the name to launch
// Then preview_screenshot to verify before publishing
Replicate It

How to Run This for Any Client

This workflow works for any local business with an existing website. Swap the audit document and API credentials, keep everything else the same.

1. Write or get an audit

You need a source document. Either write the audit yourself (score the website across 5-6 dimensions, note specific bugs, flag missing sections) or have Claude Code audit the live site directly — navigate to it, take screenshots, and ask Claude to score it.

Shortcut

You can skip a written audit entirely. Just navigate Claude Code to the live site and say: "Audit this website and build an HTML mockup showing what it could look like with all the issues fixed." Claude will observe the site, form its own critique, and build from there.

2. Extract the real site aesthetic

Before building the mockup, have Claude take a screenshot of the live site and identify the actual color palette, fonts, and visual style. The first mockup Claude builds will look too generic if it doesn't match the real site — real photos and matched aesthetic are the difference between "looks AI" and "looks like their site but better."

3. Build all deliverables in one session

Stack your requests. While one deliverable is building, queue the next. This session produced a website mockup, social plan, and content calendar in parallel because Claude can write files independently. Don't wait for completion on each — overlap the work.

4. Publish via the platform's API

Whatever platform the client uses — Shopify, Webflow, WordPress, Notion — there's an API. Have Claude write a Python script that takes the finished HTML and publishes it. The script is reusable: swap the content, run the script, new page is live.

5. Deliver one URL, not a folder of files

Clients don't know what to do with a folder of HTML files. One URL, one password, all the work in one scroll. The Shopify page approach works well, but any static host works — Cloudflare Pages, Netlify, even a GitHub Pages URL with a simple JS gate.

The Meta Point

The value of this workflow isn't the specific tools — it's that Claude Code can hold the full context of a client project and act as an executor, not just an advisor. The prompts are short because Claude already knows the client's site, the audit, the brand aesthetic, and the business goal. Context accumulation across a session is the real leverage.