Site Build Playbook · nixfred.com

NIXFRED // BUILD 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

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

Input For Source
Customer domain the site address Customer owns it; nameservers already moved to Cloudflare.
Cloudflare API token DNS, Tunnel, Email, tuning CF dashboard → My Profile → API Tokens → Custom. Scopes below.
Cloudflare Account ID API calls Dashboard → any domain → Overview → sidebar.
GitHub auth private backup repo gh auth login, or a fine-grained PAT.
Tailscale auth key join the tailnet headlessly Tailscale admin → Settings → Keys.
Customer contact email form delivery + analytics From the customer.
Customer's existing inbox where domain email forwards A Gmail/Outlook they already read.
Web3Forms access key static contact-form backend web3forms.com — free; bind to the contact email.
Customer assets logo, photos, copy, colors From the customer — see the interview, Part II.

Step 2 — Toolbox & skills

# 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

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.

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

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.

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.

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.

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.

Definition of done

The Client Interview

The Business at a Glance

The People Behind It

Services & Offerings

Who the Website Is For

Goals — What the Site Must Do

The Competition & The Field

Brand & Visual Identity

Voice & Tone

Pages & Site Map

The Home Page

Proof & Credibility

Photography & Graphics

Contact & Turning Visitors Into Leads

Social, Listings & Existing Presence

Domain, Email & Technical

Legal, Compliance & Industry Rules

Content — Who Writes What

Timeline, Budget & After Launch

CLOSE  "Is there anything I should have asked and didn't? Anything you want this site to do that we haven't covered?"