888 Build with AI / Entry 01 ← 888 Story
Build with AI · Entry 01

Eighteen days,
three versions,
one site that kept
rewriting itself

On a Sunday night in July I had an empty folder and no idea how to write code. Eighteen days later 888story.com was live, on its third major version, with 382 automated checks and three separate ways to undo everything. This is the honest account — including every part of it that broke.

By Henry Lam 26 July – 13 August 2026 888story.com
18
days from empty folder
to version 3
13
working sessions,
most of them evenings
382
automated checks
that run before anything ships
3
outside dependencies
in the whole thing

I am not a developer. I have never written a line of production code in my life. What I have is a clear idea of what I want something to feel like, and enough stubbornness to keep saying "no, not like that" until it does.

888 Story is my community site — a place where I post stories from China, photographs from my travels, and the plan behind the businesses I am building. It sits inside a family of things I call 888, after 八 (bā), which sounds like 發 (fā): prosperity. The site is the front door.

I built it with AI. Not "AI helped me" in the way a spell-checker helps you write a letter — every line of code on 888story.com was written by Claude, working from decisions I made. My job was the harder and more interesting one: knowing what to build, recognising when something was wrong, and refusing to accept the first answer.

What follows is the real timeline, taken from the build log the project keeps of itself. I have left the mistakes in. A story where nothing goes wrong is a story nobody learns anything from.

Session 1 Sunday 26 July 2026 · 19:42

The empty folder

It started at 7:42 on a Sunday evening with nothing but a folder name and a sentence: I want a place where people can read what I write, see what I photograph, and talk back to me — and I want to own it.

By 11:16 that night there was a working site on my laptop. Sign in with your email, get a six-digit code, post something, like it, comment on it. Not a mockup. The real thing, running.

That first night set the constraint everything since has been built inside: no frameworks, no build step, and almost no outside dependencies. Three, in total. It sounded like a limitation. It turned out to be the reason the whole project stayed understandable to someone who cannot read the code.

v1.08 27 – 31 July 2026 · sessions 2–9

Somewhere to put things

Five days of evenings. Photographs and videos that keep their own shape instead of being cropped into squares. A full-screen viewer with arrow keys. A gallery that merges every photo on the site into one grid without ever duplicating a file. Folders, because a few hundred photos with no albums is a shoebox. Bulk selection, so filing a month of pictures is one action rather than forty.

Then something small that turned out to matter more than any of it: a version number under the logo.

What broke

Twice I uploaded a change, refreshed the site, and saw nothing different. Twice I concluded the deploy had failed. Both times it had worked perfectly and my browser was quietly serving me the old page from its own memory. Hours went into a problem that did not exist.

The fix is four characters in the corner of the screen. The version number is baked into each upload, so if it has not changed, the new version is genuinely not running. A question that cost me a whole evening is now answered by looking.

v2.0 → v2.03 Saturday 1 August 2026

The day I stopped building a feed

One long day, four versions. The home page stopped being a single scroll of everything in order and became topic columns — I write into as many topics as a post belongs to, and the reader picks up to five of them and gets a column each, side by side.

The idea underneath it is the one I am still most pleased with. A photograph of Chongqing at night is Photography and China. Forcing me to file it under one would hide my best work from half the people who came for it. So topics are a library I write into, and columns are one reader's arrangement of that library. Same posts, everybody's own front page.

A first-time visitor never sees a chooser or an empty screen. They get my default three. Customising is something you discover, not a form you fill in before you are allowed to read anything.

What broke — 45 seconds

My host runs an image optimiser over everything I upload. I decided I did not want it touching my photographs and switched it off. The site went from fast to taking over forty-five seconds to load. Every photograph, full size, down a domestic connection.

I turned it back on and it has stayed on. Written into the project notes in capitals: that trade is settled, do not suggest turning it off again. Some decisions are worth making once and then defending against your future self.

What broke — the invisible one

A panoramic photograph posted fine and then simply was not there. Not an error, not a warning — the post saved and the picture was a broken box. The optimiser silently refuses images past a certain size, and refuses them after the upload succeeds, so nothing in the site ever knew.

This is the failure mode that scares me most — the one that reports success. Now the browser quietly shrinks anything enormous before it is sent. A 12000-pixel panorama arrives as 3000 and 241 KB becomes 22 KB, while a normal photograph is passed through untouched, byte for byte.

That same day I also added something with no visible benefit at all: 25 automated checks that prove I can still undo everything. Not that the undo script exists — that it genuinely works, that it restores a broken project, that it does not delete itself in the process, and that it never touches my posts, my photographs or my members. A way back that has not been tested is a story you tell yourself, not a safety net.

Live Tuesday 4 August 2026

Launch day

888story.com went live. Nine days from an empty folder to a real site on a real domain, with real photographs on it, that anyone could read without signing up for anything.

There is a version of this story where launch is the ending. It was not even halfway.

v3.0 Wednesday 12 August 2026 · 22:40

The Atlas

Columns are a good answer to "what have you written". They are a terrible answer to "how does any of this connect" — and connection is the whole point of what I am doing. China and photography and the businesses and the reason all three are the same project.

So I built a second layout. The Atlas draws the site as a map: my photograph in the middle, every topic a circle orbiting it, and lines between the circles. The lines are the good part. On any post I can say this connects to that topic, and here is why — and the note matters more than the link. "The shop is most of that 41%" tells you something a bare arrow never could.

It answers a question no version of the site could answer before: not just what this topic contains, but who points at it.

What broke — and it was my fault

The first version put the map on the left and what you were reading on the right, half and half, so you never lost your place. Reasonable. Sensible. I looked at it and said: "that is just a massive back button."

It was. Half my screen was permanently occupied by a way to leave. Now choosing a topic puts the map away entirely and gives the whole width to reading, and a single ✕ brings it back. That was not a coding problem. No amount of AI would have told me the layout felt wrong — it worked exactly as specified. Knowing the difference between "works" and "right" is the part that is still mine.

Two more things about that day I would defend to anyone. First, phones get a different view rather than the map made small — a constellation shrunk to 375 pixels is a smudge. Second, and this is the one I am proudest of: I gave the Atlas thirty days to prove itself.

Two layouts is a tax. I wanted a deadline where one of them dies, so that carrying both could never quietly become permanent. — the reason I set the beta myself, before a line of it was written

Nobody asked me to do that. The site now counts the thirty days itself and will ask me, and only me, when the time is up.

v3.01 Thursday 13 August 2026

What a real site found in an hour

The Atlas went live. Within the hour I had found two faults, and both were the same kind of fault — things that worked perfectly in a demo full of sample content and misbehaved on a real site that is still filling up.

A photograph's description was being cut off at 90 characters for a tidy one-line bar. Every caption in the demo was short, so nobody ever saw it. In the one place a reader has stopped and is properly looking, my own writing ended mid-sentence.

And a button that hides and shows the lines between topics appeared completely broken — because the live site had no lines yet. Pressing it changed nothing. It now carries the count, dims when there is nothing to toggle, and says so when you press it.

The lesson went straight into the project's own notes, where the next session will read it: a demo is a best case, and best cases hide the states a real site spends its first weeks in.

Ahead Around 11 September 2026

The deadline I set for myself

Right now 888story.com runs two layouts at once. Classic columns are the default; the Atlas is one click away for anyone curious. Thirty days from the night the Atlas first ran, one of them gets deleted.

I do not know yet which. That is rather the point — I would rather find out by living in both than by guessing in advance, and I would rather have a date than an opinion.

In the meantime there are three separate ways to undo everything, and they are not interchangeable:

The Classic button
Revert v2
Revert v1
Speed
Instant, one click
A redeploy
A redeploy
Covers
"I prefer the old one"
"v3 is broken"
"v2 is broken too"
Affects
Only the reader who clicks
The whole site
The whole site
Costs
Nothing
All of v3
All of v3 and v2

A layout switch is not a rollback. If the server is wrong, every reader is still getting it wrong no matter which button they pressed. Knowing which of your safety nets actually catches which fall is worth more than having a lot of them.

What the AI did, and what stayed mine

The most common thing people get wrong about building this way is imagining you describe a website and one appears. What actually happens is closer to running a studio where one person can execute anything instantly and has no taste, no memory of what you agreed last week, and no idea what you are really trying to do.

The AI

  • Wrote every line of code — server, database, page, styling
  • Wrote the 382 automated checks and ran them
  • Explained trade-offs in language I could actually follow
  • Remembered why things were done, in notes it keeps for itself
  • Found and fixed its own bugs when I described a symptom
  • Pushed back on me — often, and it was usually right
  • Did in an evening what would have taken me a year to learn

Me

  • Decided what the site is for, and what it refuses to be
  • Killed the half-and-half Atlas: "a massive back button"
  • Set the thirty-day deadline nobody asked for
  • Insisted a topic can never take posts with it when deleted
  • Spotted the two live faults in the first hour, by looking
  • Said "no, not like that" — the most valuable words I have
  • Owned every consequence of every one of those calls

AI removed the ceiling on what I could execute. It did not raise the floor on what I could imagine. That is still entirely on me, and it is the part I would not hand over even if I could.

Seven things I did not know on 26 July

1

The failures that report success are the dangerous ones

A photo that vanishes while the post saves happily. A deploy that works while the browser shows you yesterday. Anything that fails loudly is a nuisance; anything that fails quietly is a trap.

2

A demo is a best case

Sample content is always tidy, always full, always the right length. Real sites are empty, lopsided and full of edge cases. Test against nothing as deliberately as you test against everything.

3

Write down why, not just what

This project keeps its own notes — decisions, reasons, and a list of mistakes with "do not relearn these" at the top. It is why session thirteen was not fighting the same battle as session three.

4

New work does not inherit old lessons

A mistake I had already fixed once came back the moment a fresh file was written, because the lesson lived in the old file. If it matters, it goes in the notes — not just in the code that learned it.

5

Give experiments a death date

Thirty days, then one layout goes. Deciding when you will decide is the cheapest possible protection against a temporary thing becoming permanent by inertia.

6

An untested way back is a story you tell yourself

My first undo script erased the very command that ran it. It worked exactly once and then disarmed itself. Now 58 checks prove both routes back still work — every single time anything changes.

7

Taste is the bottleneck now

When execution costs almost nothing, the scarce thing is knowing what is worth executing — and being willing to throw away a whole day's work because it feels wrong. That skill did not get cheaper. It got more valuable.

Next in this series · coming soon

Interested in starting your own journey to build with AI?

The practical version of this post: how to begin, what to build first, what to expect it to feel like, and the mistakes that are worth making early. Being written now.

Want to start yours?

If any of this made you think I could do that — you can, and I would genuinely like to hear about it. Tell me what you want to build. I will tell you honestly what it takes.