NIXFRED // BUILD SYSTEM
DOC PLAYBOOK.HTML ACCESS PUBLIC READERS HUMAN + AI STATUS ● ACTIVE
// Site Build & Client Interview System

SITE BUILDPLAYBOOK

One brief, read by two operators. Hand this URL to an AI as a /goal and it takes a bare Linux box all the way to a live, hardened customer website. Work the interview below with the client first — on a call, or via the ready-to-send email at the bottom — and the AI builds from their own words.

Static HTML/CSS Zero open ports Cloudflare Tunnel Tailscale-only admin Self-healing host SEO + schema Private GitHub backup
// How this page is used
Mode 1 · The Machine

An AI mission brief

Paste this URL into the /goal skill of a fresh Claude Code on a clean Ubuntu box. Part I is the full build sequence — twelve phases, each with a hard verification gate. The agent collects the inputs, then executes.

Mode 2 · The Human

A client interview kit

Part II is an 18-section discovery script — every question needed to build a site that is genuinely the client's. Run it on a call, or send the email in Part III. Transcribe the answers and hand them to the AI alongside this URL.

// The pipeline
01
Interview
Call or email the client
02
Transcribe
Answers → plain text
03
/goal + URL
Brief the AI agent
04
AI Builds
12 gated phases
05
Live Site
Hardened & backed up
I
Part I

The Build Playbook

Instructions to the AI agent. A fresh Ubuntu VPS in, a live customer website out. Static HTML/CSS only — no framework, no build step, no database. The site is reachable because cloudflared dials out; nothing dials in. Work the phases in order. Never skip a GATE.

// Step 1 — Inputs you must collect first

Ask the human for anything you do not have, in one batched message. Never guess a secret.

InputForSource
Customer domainthe site address Customer owns it; nameservers already moved to Cloudflare.
Cloudflare API tokenDNS, Tunnel, Email, tuning CF dashboard → My Profile → API Tokens → Custom. Scopes below.
Cloudflare Account IDAPI calls Dashboard → any domain → Overview → sidebar.
GitHub authprivate backup repo gh auth login, or a fine-grained PAT.
Tailscale auth keyjoin the tailnet headlessly Tailscale admin → Settings → Keys.
Customer contact emailform delivery + analytics From the customer.
Customer's existing inboxwhere domain email forwards A Gmail/Outlook they already read.
Web3Forms access keystatic contact-form backend web3forms.com — free; bind to the contact email.
Customer assetslogo, photos, copy, colors From the customer — see the interview, Part II.
▣ Cloudflare API token — exact scopes (one custom token)
  • Account · Cloudflare Tunnel · Edit — create & configure the tunnel
  • Account · Account Settings · Read — resolve the Account ID
  • Zone · Zone · Read — resolve the Zone ID
  • Zone · DNS · Edit — create the CNAMEs pointing the domain at the tunnel
  • Zone · Zone Settings · Edit — SSL mode, Always-HTTPS, Brotli, cache
  • Zone · Email Routing Rules · Edit — forward hello@domain

Zone Resources → Include → the customer's domain. Set a TTL and rotate. One token does DNS + Tunnel + Email + tuning. GitHub is a separate credential.

// Step 2 — Toolbox & skills
install — fresh ubuntu box
# core
sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get install -y git curl wget unzip jq ufw nginx imagemagick webp pandoc
# cloudflared (cloudflare apt repo) + tailscale + github cli
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
  | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
sudo apt-get install -y cloudflared gh
curl -fsSL https://tailscale.com/install.sh | sh
# node + playwright + chrome — for verification only
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs && npx --yes playwright install chrome
SKILLvps-lockdown — harden & tune the box
SKILLstatic-site — clean HTML/CSS, accessible, no AI-tells
SKILLseo-launch — sitemap, JSON-LD, meta, OG
SKILLcloudflare-tunnel — cloudflared + nginx origin
SKILLweb-deploy — safe deploy + git sync
SKILLupdate-config — harness permissions & hooks
MCPPlaywright — verify every page, desktop + mobile
MCPcontext7 — current docs for nginx & Cloudflare
// Step 3 — The twelve phases
Phase A

Harden & optimize the VPS

Invoke vps-lockdown. Patch & upgrade; set hostname/timezone; confirm a non-root sudo user with key auth; enable unattended security upgrades; apply sysctl tuning; add a 2 GB swapfile if RAM ≤ 2 GB; stage SSH hardening but do not restart sshd yet.

GATE A — box patched, tuned, swap on. The public firewall waits for Phase B, to avoid a lockout.
Phase B

Install Tailscale & lock down to zero public ports

Join the tailnet, verify you can reach the box over Tailscale, then raise the firewall. Order is safety-critical.

tailscale + ufw
sudo tailscale up --auth-key="$TS_AUTHKEY" --ssh --hostname="<customer>"
tailscale ip -4        # verify reachability BEFORE the next block
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on tailscale0
sudo ufw --force enable    # no 80/443/22 public — site still works
GATE B — external nmap shows all ports filtered. Admin works only over Tailscale.
Phase C

Interview the customer

Run Part II of this document — the 18-section script. Ask in small batches, listen, probe vague answers, write it all into intake.md.

GATE Cintake.md complete and customer-approved.
Phase D

Turn the conversation into a build plan

From intake.md produce: a sitemap & nav order; a per-page content outline (one h1 each); design tokens (palette + two fonts as CSS variables); the image list (heroes 16:9); structured-data facts; the contact-form spec.

GATE D — customer approves sitemap, outline, look.
Phase E

Graphics — write Midjourney prompts, process the images

From the image list, write one Midjourney prompt per image. Use a shared style suffix so all images match; heroes are --ar 16:9 (square images cannot fill a banner); one concrete subject per prompt; never use the words "palette", "collage" or "moodboard" (they trigger swatch/grid artifacts). Deliver the set as one copy-paste block — the human runs them on midjourney.com. Then crop with convert and export .webp with cwebp -q 82.

GATE E — every image optimized in site/assets/img/, correctly cropped, no artifacts.
Phase F

Build the website

Invoke static-site. Plain semantic HTML5 + one shared stylesheet; no framework, no build step. One page per service; shared header/nav/footer; one h1 per page; accessible (alt text, labelled fields, focus states, contrast, 44px targets, mobile breakpoint). Match the customer's voice — no AI-tell punctuation. Web3Forms contact form. A friendly 404.

GATE F — every page passes the Playwright MCP at ~1280px and ~390px.
Phase G

SEO

Invoke seo-launch: sitemap.xml, robots.txt, JSON-LD structured data on every page (LocalBusiness / Person), FAQPage schema, unique hand-written titles & meta descriptions, canonical tags, Open Graph + Twitter cards, favicons.

GATE G — structured data validates; titles & descriptions unique.
Phase H

Hosting — nginx, Tunnel, Email Routing, Analytics

nginx origin on localhost:80 — HTML Cache-Control: no-cache, assets immutable, the config a symlink in sites-enabled. Then the tunnel via API:

cloudflare tunnel — api driven
RESP=$(curl -s -X POST "$API/accounts/$ACC/cfd_tunnel" "${AUTH[@]}" \
  --data "{\"name\":\"$DOMAIN-site\",\"config_src\":\"cloudflare\"}")
# PUT ingress: hostname -> http://localhost:80 ; POST proxied CNAMEs
sudo cloudflared service install "$(echo "$RESP" | jq -r .result.token)"

Tune the zone (SSL full, Always-HTTPS, Brotli). Enable Cloudflare Email Routing — forward hello@domain to the customer's inbox (they must click the verification email). Add the cookieless Cloudflare Web Analytics beacon to every page.

GATE H — both hostnames load over HTTPS; tunnel healthy; ports still closed; a test email forwards.
Phase I

GitHub backup repo

gh repo create <owner>/<domain> --private. The repo holds site/, server/, source-assets/, a per-box CLAUDE.md operating manual, an empty runbook.md, and sync.sh. Run git remote -v before every push.

GATE I — private repo created, first commit pushed, origin matches.
Phase J

Deploy

Invoke web-deploy: copy site/ to the web root, chown www-data, then always systemctl reload nginx — a cp can leave open_file_cache with a stale size and 502 the whole site; a reload clears it.

GATE J — every page returns HTTP 200 publicly.
Phase K

Self-healing, backups, monitoring

nginx Restart=always; a 15-minute healthcheck timer that restarts dead services, re-checks that nginx actually answers, and reclaims disk past 85%; a nightly backup timer; a recovery/RECOVERY.md.

GATE K — timers enabled; kill nginx and the healthcheck revives it within 15 minutes.
Phase L

Verify & hand off

Playwright every page, desktop + mobile; submit the contact form for real; test hello@domain; re-confirm zero open ports. Hand the customer the live URL, a plain summary, and a quote that separates one-time build from annual hosting/maintenance.

GATE L — every checklist item passes.
// Golden rules — never violate
VERIFYPass every gate before moving on.
STATICNo framework, no build step — ever.
OUTBOUND-ONLYNo public inbound ports.
ORDERTailscale up & verified before the firewall.
DEPLOYReload nginx after every deploy.
CACHEHTML no-cache; assets immutable; bump ?v=.
HEROESWide 16:9 source images only.
SECRETSNever enter the repo. It is private regardless.
SAFEIdempotent, non-destructive. Beware glob deletes.
RUNBOOKEvery fix → a dated runbook entry.
// Troubleshooting
SymptomCause → fix
Site-wide 502 after a deploy nginx open_file_cache holds a stale file size. systemctl restart nginx; always reload after deploying.
Deploy "did nothing" HTML was browser-cached. Ensure expires -1; on location /; bump the asset ?v=.
Cloudflare parked page DNS record missing, not proxied, or not pointing at <id>.cfargotunnel.com.
Locked out after firewalling ufw raised before Tailscale worked. Recover via the provider console; bring Tailscale up first.
Hero crops faces Square source image. Re-prompt Midjourney with --ar 16:9.
// Definition of done
II
Part II

The Client Interview

Eighteen sections — everything needed to build a site that is genuinely the client's, not a template. Run it as a conversation, not an interrogation: ask in small batches, listen hard, repeat back what you heard, chase the vague answers. The recording is transcribed and handed to the AI with this URL — so capture the client's own words; they become the copy.

01

The Business at a Glance

Get this wrong and everything downstream is wrong. Nail the one-sentence version.
  • What is the business name, exactly as it should appear?
  • In one sentence, what do you do?
  • When did you start — and what's the short origin story?
  • What genuinely makes you different from others who do this?
  • Do you have a tagline, or a phrase you already use a lot?
02

The People Behind It

People buy from people. The About page is often the second-most-visited.
  • Who owns and runs the business — names and roles?
  • Who should appear on the site, with a bio and headshot?
  • Licenses, certifications, designations, memberships — listed exactly.
  • Years of experience, individually and as a business.
  • Why do you do this work? Give me a human detail for the About page.
03

Services & Offerings

Every service becomes a page and a nav item. Miss one and the site feels incomplete.
  • List every service or product you offer.
  • For each — who is it for, and what does it include?
  • Which is your bread-and-butter? Which do you want to grow?
  • Pricing — show prices, ranges, "starting at", or "contact for a quote"?
  • What do people ask for that you don't do?
04

Who the Website Is For

Every word and image is aimed at this person. The sharper we see them, the sharper the site.
  • Describe your ideal customer — age, situation, what's going on in their life.
  • What problem or worry brings them to you?
  • What fears or objections do they have before they get in touch?
  • Are they on a phone, in a hurry, researching, comparing?
  • What do they need to see before they trust you?
05

Goals — What the Site Must Do

A site that looks nice but drives nothing is a failure. Define the win.
  • The single most important action a visitor should take — call, form, book, download?
  • What does a "win" look like three months after launch?
  • Any secondary goals — credibility, explaining a confusing topic, fewer repeat questions?
  • What does your current or old site do badly that we must fix?
06

The Competition & The Field

We position against a field. Know it, then beat it.
  • Name two or three competitors — what do they do well, where do they fall short?
  • Show me two or three websites you like — what specifically appeals?
  • Show me one or two you dislike — what should we avoid?
  • How should you be positioned — premium, friendly, the expert, the affordable choice?
07

Brand & Visual Identity

Colour and type set the mood before a single word is read.
  • Do you have a logo? In which file formats? (Please send them.)
  • Existing brand colours or fonts? Any brand guide?
  • If starting fresh — three words for the brand's personality.
  • Colours or styles you love? Any you hate or that clash with your field?
  • Warm and human, clean and clinical, bold and modern, or classic and established?
08

Voice & Tone

The site should sound like the client on their best day — not like a brochure.
  • Formal or conversational? "We", or first-person "I"?
  • Words and phrases you love. Words you never want used.
  • How much does your audience already know — explain everything, or talk peer-to-peer?
  • Should the writing mostly reassure, persuade, inform, or sell?
09

Pages & Site Map

The sitemap is the skeleton. Agree it before any page is built.
  • Which pages do you need — Home, a page per service, About, Contact, FAQ, Resources, Blog?
  • What should the top navigation menu say, in order?
  • Is there a must-have page unique to your business?
  • Any printable resources, checklists, or downloads to offer?
10

The Home Page

Most visitors judge the business in the first screen of the home page.
  • If a visitor reads only one sentence, what should it say?
  • The three things you most want them to know immediately?
  • What should the big hero image show?
  • What is the home-page call-to-action button?
11

Proof & Credibility

Claims tell, proof sells. This is what turns a reader into a lead.
  • Testimonials or reviews we can quote? (Send them, with names or initials.)
  • Notable numbers — years, clients served, homes sold, results.
  • Awards, press, certifications, partnerships to display?
  • Any guarantee, free consultation, or "no obligation" offer?
  • A Google Business Profile or review page we should point to?
12

Photography & Graphics

Real, specific imagery beats generic stock every time. Decide the look now.
  • Do you have professional photos and headshots? (Please send them.)
  • Photos of your work, your space, your team, your town?
  • If we generate imagery — describe the setting, the people, the mood.
  • Any imagery we should absolutely avoid — stocky, cliché, off-brand?
NOTE  Any image gaps are filled with custom Midjourney art generated from the answers here.
13

Contact & Turning Visitors Into Leads

The whole site exists to produce this moment. Make it effortless.
  • Best phone number and email to publish.
  • A physical address, or "serving [area], by appointment"?
  • Hours of operation.
  • Exact service area — cities, counties, "within X miles".
  • Contact-form fields — name, email, phone, message, plus anything specific?
  • When a lead comes in — who responds, and how fast?
14

Social, Listings & Existing Presence

We link to a living presence, never a dead one.
  • Social profiles you actively maintain.
  • Google Business Profile, industry directories, association listings.
  • Is there an existing website? Keep anything, or full replace?
  • Reviews or content on other platforms we should reflect?
15

Domain, Email & Technical

Boring — but a launch fails on one wrong DNS detail. Get it exact.
  • The domain name for the site — do you own it, and where is it registered?
  • Desired email address(es) on the domain (e.g. hello@, yourname@).
  • Existing email or hosting that must keep working?
  • Anyone else who needs access or to be kept informed?
16

Legal, Compliance & Industry Rules

Some industries have wording rules. Cheaper to ask now than to fix later.
  • Required disclaimers, license numbers, or regulator text to display.
  • Industry rules that affect wording or claims (real estate, health, finance).
  • Do you need a privacy policy or terms page?
  • Any accessibility expectations or obligations?
17

Content — Who Writes What

Clarify who supplies words, or the build stalls waiting on them.
  • Do you have existing copy, brochures, or marketing materials? (Send them.)
  • Happy for us to write the copy from this interview, for your review?
  • Who has final sign-off on words and design?
  • Anything time-sensitive — a seasonal offer, an event, a launch date?
18

Timeline, Budget & After Launch

Scope, schedule and sign-off — agreed up front, no surprises.
  • Target launch date — and is anything driving it?
  • Budget range for the build, so we scope it right.
  • Who is the decision-maker, and what is the approval process?
  • After launch — who maintains the site, and how often will it change?
  • How would you like to receive updates from us during the build?
CLOSE  "Is there anything I should have asked and didn't? Anything you want this site to do that we haven't covered?"
III
Part III

The Client Email

When the client can't take a call, send this. It's the interview compressed to the essentials — grouped, low-pressure, built so they can answer inline in a reply. When their reply comes back, hand it to the AI together with this URL. Fill the [bracketed] fields before sending.

TO [client email] SUBJ A few questions so we can build your website
Hi [Client first name],

Thanks again for the chance to build your new website - I'm looking forward to it.

To make the site genuinely yours, I need to understand your business in your own
words. The best way is a quick 20-30 minute call, but if that's hard to schedule,
just reply to this email with your answers. Don't worry about polish - bullet
points, half-sentences and "you know what I mean" are all perfectly fine. I'll
shape it all into a finished site for your review.

Feel free to attach your logo and any photos you'd like used.

Here's what would help most - answer right under each line:

THE BUSINESS
 - The business name, exactly as it should appear:
 - In a sentence or two, what you do:
 - What makes you different from others who do the same thing:
 - How long you've been doing this:

YOUR CUSTOMERS
 - Who your ideal customer is, and the situation they're in when they need you:
 - The worries or questions they usually have before getting in touch:

YOUR SERVICES
 - The services you offer (and which one matters most):
 - Show prices, or "contact for a quote"?

THE SITE'S JOB
 - The ONE thing you want a visitor to do - call, fill in a form, book...:
 - Which pages you want (Home, About, Contact and a page per service are typical):

LOOK & FEEL
 - Do you have a logo and brand colours? (If so, please attach.)
 - Three words for how the site should feel:
 - Any websites you love - or hate? Links are great:

PROOF
 - Testimonials, reviews, or notable numbers (years, clients, results) to feature:
 - Awards, licenses, or memberships to display:

CONTACT DETAILS
 - Best phone and email to publish:
 - Your address or service area, and your hours:

PRACTICAL
 - The domain name for the site (and do you own it yet?):
 - A target launch date, if you have one:
 - Anything else you'd like me to know:

Reply whenever it's convenient - there are no wrong answers, and I'll follow up
if I need to dig into anything.

Thanks,
[Your name]
[Your phone] - [Your email]

After they reply: paste the returned email to the AI agent along with this page's URL as a /goal. The agent treats their answers as intake.md and proceeds from Phase D.