Builds / EXP-004

EXP-004● LiveProductionLive since 14 October 2026 and edited through its own content editor. It went to production without a test environment; staying there safely needs deploy previews, an agent that checks its work before pushing, and four launch items closed: Search Console, the CV variants, DMARC (email authentication for the domain) and two-factor sign-in.▸ Live▸ Under the hood

The bottleneck moved: where the time goes when an AI agent writes the code

A Claude agent wrote my professional site, content editor included: its first commit, one evening in October 2026, was the whole site, and the last launch change came about 42 hours later. The time went elsewhere: on accounts and sign-ins, on decisions only I could make, and on an agent that couldn't run what it wrote, which made production its test environment. Here's who did what, what broke, and what I'd change.

emilysas.com · Oct 2026

The question

When an AI agent can write a whole website in one session, where do the time and the risk actually go?

Started
Oct 2026
Status
Live
Readiness
Production
Tools
Astro · Keystatic · Netlify · the stack

This one is running. It opens in its own tab.

Open emilysas.com (opens in a new tab)

Timeline. Branding on the morning of Tuesday 13 October 2026, then design; the first commit at 18:32 that evening. The site went public around 13:30 on Wednesday 14 October. The launch post went out at 08:00 on Thursday 15 October, and the last launch change was committed at 12:48 that day. Branded video-call backgrounds followed on 26 October.

Stack

  • Astro: every page is built to static HTML at deploy time; only the content editor runs on demand
  • Keystatic: the content editor at /keystatic, signed in with GitHub; each save is a commit to the repo, and the layout stays locked in code so whatever I add is branded automatically
  • Netlify: hosting, the contact form and the image CDN, on the Personal plan
  • Namecheap: the domain and DNS, with email left where it was
  • Umami: cookieless analytics, counting emilysas.com only, with a /no-track page so my own visits stay out
  • Kit: the newsletter, with the sign-up form on the site posting straight to Kit
  • A Claude agent (Opus 5.5) in the Claude app, with a shell, git and push access to GitHub, in a cloud workspace that couldn't install packages

Demo. The Live tab is the site itself.

In July 2025 I deliberately didn't build my own website, because a coded site would have competed for my time. In October 2026 I built one with a Claude agent that wrote all the code, about 42 hours elapsed from first commit to final launch change. The interesting part isn't the speed; it's where the time went instead.

How it went

Brand first. The site came out of setting up my consultancy. I ran brand and logo directions from two AI tools, Claude and GPT 6, side by side and critiqued each against the other, rejected four directions as too corporate or too literal, and landed on a set of soft shapes: an E made of stacked pills on a spine, an S made of two half-moons and a dot. I kept the S even though it barely reads as a letter, because a monogram needs to be distinctive, not legible. The brand session exported the whole kit, from favicon to CV template, in one go.

Design before code. I asked to design the site together before any code was written; the agent produced several directions and I chose a playful grid of brand tiles that spin when you hover over them. I brought references, and advice from my mentor to write for the people who already believe in what you do and to work back from buyers' problems. Many rounds of critique followed, before and after the first commit: the name too small, weak stats, a chaotic footer, repetition between pages, and "What went wrong" renamed "With hindsight".

The build. The first commit was the whole site: 66 files, about 2,800 lines, every page template, the content-editor schema, and starter copy drafted from my CV and notes. The next morning I dictated the hindsight stories for three of the four case studies and the agent drafted while I corrected. By early afternoon on day two the site was public, and I'd run three external audits (SEO, performance and security); the agent's fixes went in that afternoon.

Outside eyes. Two people reviewed it after launch. The first reader said the positioning was clear within seconds, and their challenges led me to anonymise every case study and add a confidentiality line; a second reader told me that mentioning openness to permanent roles undermined the consultancy pitch, and I moved it off the homepage. Both reviews arrived after the launch post was scheduled, which is the first thing I'd change.

Who did what

The agent produced the design directions, all the code, first drafts of most of the copy (pages, case studies, the CV PDF, LinkedIn sections, the newsletter email, the launch post), the generated assets, the audit fixes, and step-by-step instructions for every account problem.

I made every judgement (design direction, positioning, what to claim and what to leave out, tone, anonymisation, the reversal on permanent roles); supplied what only I had (recommendations, hindsight stories, my reasons for each mistake); caught the accuracy and risk problems the agent missed (a job title I never held, wording that read as a red flag, the risk of offering free work in a proposal step); did all the account work; and ran the test loop, checking on my phone and pasting errors back.

Put simply, the agent did the making, and I did the deciding, the checking, and everything that needed my identity or my accounts. It wrote code faster than I could review it, so my judgement became the bottleneck, which is the thesis of this whole lab in a single build.

What broke, and why most of it was one problem

The agent couldn't install packages in its workspace, so it couldn't run the site it was writing. Errors only appeared when I ran it on my laptop or when the host built it, which meant production quietly became the test environment. That one constraint explains most of what went wrong:

  • Hosting credits ran out on launch day. Every push triggered a production deploy; about 25 in a day used up the free plan, which took the site offline, so I upgraded to the Personal plan mid-launch. From then on I had the agent batch its pushes, which it should have done from the start.
  • Mobile was an afterthought. The site was designed desktop-first and took four rounds of fixes after I looked at it on my phone; the second reader still found the mobile homepage congested. Most launch visitors arrived on phones, through LinkedIn's in-app browser.

There were other problems too: the content editor's sign-in failed four times in a row; the contact form returned a 404; the newsletter sent new subscribers to the old site's thank-you page; and my own visits skewed the launch analytics.

The judgement problems are the ones I find most instructive. Agent drafts implied a title I'd never held, phrased a hindsight story in a way that read as a red flag, and named clients in the case studies until the first reader pointed it out. None of those was a coding error, and none would have been caught by any test.

What I'd do differently

  1. Give the agent eyes before giving it hands. Run it somewhere it can build and preview the site and check its own work with screenshots before anything is pushed. That alone removes most of the list above.
  2. Never let production be the test environment. Branches with deploy previews, batched merges, and knowing the host's pricing before the first push.
  3. Do accounts and infrastructure on day one, with a placeholder page: they involve the most waiting and the least judgement.
  4. Design for phones first, and check on a phone every round.
  5. Settle the hard positioning calls and house rules in the brief: anonymised by default, which claims need evidence, who the site is for.
  6. Get outside eyes before the launch date, not after it's scheduled.
  7. Use a launch checklist (tracked links, share previews, analytics excluding my own visits, forms tested end to end).
  8. Keep the build log as I go. This one had to be reconstructed from git history.

Three builds, three ways of building

Built withTook (elapsed)
Launchling (2025)Tally and Zapier, then Framer, then React, Vercel, GPT-4o and Airtable, plus a Python evaluation systemMonths
emilybuilds.ai v1 (July 2025)Notion and Super.soSeveral days
emilysas.com (October 2026)Astro, Keystatic and Netlify, with all code written by an AI agentAbout 42 hours from first commit to final launch change, after a branding session

Both of the bigger builds lost sight of something: Launchling lost sight of its quality and its costs, and emilysas.com briefly went offline when its free hosting credits ran out. The common lesson is the one I keep relearning, which is to be able to see the consequences of what you're doing from the first action.

What happens next

This lab is the next data point. I'm rebuilding it with an agent that can run and preview what it builds, and logging the build as I go, so the two can be compared honestly. You can follow it in This lab, rebuilt.

If you're bringing coding agents into a team and working out where the time and the risk will go, I'd be glad to compare notes. Get in touch.

Then / Now

Aspectemilysas.com, Oct 2026This lab, two weeks later
The agent's feedback loopIt couldn't install packages, so it wrote the site without running it; I ran it on my Mac and pasted the errors backIn its first session it ran type, contrast and 360-pixel checks, and Lighthouse on three pages; it has checked several later changes in a browser at phone width
Where changes are testedEvery push went straight to productionWork happens on a preview branch, and preview deploys are password-protected
Hosting costAbout 25 deploys in a day used up Netlify's free plan, which took the site offline until I upgradedNetlify's Personal plan, $9 (about £7) a month; the lab's build log has no deploy count
MobileDesigned for desktop; four rounds of fixes after I checked it on my phoneChecked at 360 pixels wide across 15 pages from the first session
The build logReconstructed from git history two weeks laterWritten session by session, with every time figure marked as elapsed or worked

Who did what

I framed

  • The ask: a professional home for my consultancy that links to this lab
  • The approach: design the site together before any code was written
  • The positioning: consultancy first, health and care named explicitly, my writing moved across, and the CV as a timeline plus a PDF
  • A content editor that keeps the layout locked, so anything I add is branded automatically

I set up the team

1 builder session · 2 other · 3 people · 5 standing rules · 4 constraints

See the team ↓

I decided

  • The brand: soft shapes, keeping an S that barely reads as a letter because a monogram needs to be distinctive, not legible
  • The design direction: a playful grid of brand tiles that spin when hovered
  • The stack, from the options put to me: Astro and Keystatic, Netlify for hosting, Umami for analytics, and a newsletter form on the site posting to Kit
  • Keeping the site's code in GitHub
  • Renaming "What went wrong" to "With hindsight"
  • Which essays move across, and which project posts stay on the lab
  • Every claim about me: I caught a title I never held, hindsight wording that read as a red flag, and the risk of offering free work in a proposal step
  • A /no-track page, so my own visits stay out of the analytics
  • Upgrading to Netlify's Personal plan mid-launch, rather than waiting with the site offline, and batching pushes from then on
  • After a first reader's review: anonymising every case study, adding a confidentiality line, and moving two proof numbers into the hero in place of the lower stats row
  • After a second reader's review: taking permanent roles off the homepage, and a calmer mobile homepage with problems as a list, leaner value cards and swipeable testimonials

Claude built

  • The design directions, all the code, and first drafts of most of the copy: pages, case studies, the CV PDF, LinkedIn sections, the newsletter email and the launch post
  • The options I chose the stack from
  • The brand kit, share images, the email template and the video-call backgrounds
  • Fixes from three external audits (SEO, performance and security)
  • Step-by-step instructions for every account, DNS and sign-in problem

The team

How the team workedMe at the top, then the people working with me, then lanes for Builds, Other. Arrows show briefs from me to Builds. Inside 5 standing rules and 4 constraints.How the team workedMe at the top, then the people working with me, then lanes for Builds, Other. Arrows show briefs from me to Builds. Inside 5 standing rules and 4 constraints.

Agents and models

NameRoleModelWhat it was for
Build agentBuildsClaude Opus 5.5Design directions, all the code, copy drafts and audit fixes, in one session in the Claude app with a shell, git and push access to GitHub; it couldn't install packages, so it couldn't run the site
Brand sessionOtherClaude Opus 5.5Logo directions drawn as SVG on a design canvas, then the whole brand kit exported, in a separate chat
ChatGPTOtherGPT 6Brand and logo design, as a second set of directions from a prompt Claude wrote, so each could be critiqued against the other

People

  • Me The brief and every judgement; all the accounts; and the test loop, running the site on my Mac, checking it on my phone and running the audits
  • A first reader My mentor, whose advice shaped the brief; reviewed the positioning the evening the site went public
  • A second reader Reviewed the positioning and the mobile homepage the morning of the launch post

Standing rules

  • Layout, colours and section order live in code; everything else is content, styled automatically
  • Every case study has a "With hindsight" section
  • Case studies are anonymised (from the evening of 14 October); clients are named on the site, and details of their work stay confidential unless they've agreed
  • After the free plan ran out: batch pushes, and skip the deploy for changes that don't touch the site
  • Leave the email DNS records alone when pointing the domain at Netlify

Constraints and unblocking

  • Netlify's free plan: about 25 production deploys in a day used it up and took the site offline
  • A cloud workspace that couldn't install packages, so the agent couldn't run the site it wrote
  • Free tiers for Umami and Kit
  • Set up the editor's GitHub App (four failed attempts first), Netlify, Namecheap DNS, Umami and Kit

Reviewers

  • A first reader Is the positioning clear, and does it speak to the people buying?
  • A second reader Positioning and the mobile homepage
  • Three external audits SEO, performance and security; I ran them and pasted the findings back

Tools

  • Claude app (cloud workspace) Where the build agent ran: shell, git and GitHub push, but no package installs
  • A design canvas Logo and site design directions, compared side by side
  • GitHub The repo, and the GitHub App the content editor signs in through
  • My Mac and phone Running the site locally, and checking it on a phone
  • LinkedIn Post Inspector Checking share previews; it found the missing author and date

Ledger

ItemValueBasisNote
First commit to public siteAbout 19 hoursMeasuredElapsed, not worked. From the first commit (18:32, Tue 13 Oct, from git) to the site going public around 13:30 on Wed 14 Oct (from the session transcript).
First commit to final launch changeAbout 42 hoursMeasuredElapsed, not worked: 18:32 Tue 13 Oct to 12:48 Thu 15 Oct, both from git (42 hours 16 minutes).
My active timeRoughly 12–14 hours across three days, plus a branding sessionEstimatedWorked, not elapsed. Reconstructed afterwards from the session transcript and confirmed by me; nothing was logged at the time.
Commits to launch35MeasuredCounted in git from the first commit to the final launch change: 8 on Tuesday, 26 on Wednesday (one of them a merge) and 1 on Thursday.
Production deploys on launch dayAbout 25EstimatedEach push to main deployed to production. Git shows 25 commits on Wednesday besides the merge; several commits can share a push, so this is approximate.
CodeAbout 2,500 lines of Astro, TypeScript and CSSMeasuredLine count of every .astro, .ts, .mjs and .css file at the final launch change (2,482), including the editor's configuration; content files and the share-image script not counted.
Running cost$9 (about £7) a monthMeasuredNetlify's Personal plan, an upgrade on launch day when the free plan's credits ran out. Astro, Keystatic, and the free tiers of Umami and Kit cost nothing; the domain was already mine.
Measured
counted or timed directly
Modelled
estimated from a stated method
Upper bound
the most it could be
Estimated
my own estimate, not measured

Time figures say whether they are elapsed or worked. Time between commits is never presented as hours worked.

Non-sterling costs show the amount paid, with an approximate sterling figure at that month's average rate. Rates from HMRC's monthly exchange rates.

Outside the lab

What this would take in an organisation.

In an organisation, the lesson isn't "AI builds websites now"; it's that when making gets cheap, review capacity, environments and judgement become the constraint. Teams adopting coding agents need preview environments, cost guardrails on deployment, and named people accountable for what gets claimed in the copy, because the agent will faithfully build whatever the brief says, including the parts of the brief that are wrong.