Artyom Zankevich

How I Built My Personal Site with AI Agents

I rebuilt this site with Claude Code and the ChatGPT app after throwing away the first version. The code came quickly both times. The second time, I spent more attention on choosing what belonged on the site and checking what the agents produced.

Published
Reading time
9 min
Topics
AI-Assisted Development and AI Agents
Contents
  1. What the commit count leaves out
  2. Two builds, six months apart
  3. How I worked with the agents
  4. Claude Code and ChatGPT, side by side
  5. Where it went wrong
  6. What kept it on track
  7. The setup I ended up with
  8. What I would do again

This site is a static Astro build on Cloudflare: a home page, About with my CV, and this blog. AI agents wrote almost all of its code, Claude Code most of it and OpenAI’s ChatGPT app alongside, and I decided what went in. The numbers below come from the git history, since most of the chat sessions are gone.

What the commit count leaves out

I built the site twice. The first version took three days in April. The second, the one you are reading, took eight days in October: 156 commits, 101 of them in the first two days, live on the second day. Across both builds that is 214 commits on 12 working days. Every page scores 100 in Lighthouse on mobile and desktop, passes an axe accessibility check and works without JavaScript.

The first build was fast too, and I replaced it. This time I wanted a site I would keep working on after it went live.

Two builds, six months apart

Apr: 54, May: 0, Jun: 0, Jul: 4, Aug: 0, Sep: 0, Oct: 156. Numbered marks are listed below the chart.050100150200
  1. 1First version: a shader, a blog, VercelApr 2026
  2. 2Move to Cloudflare WorkersJul 2026
  3. 3The redesign as a technical drawingOct 2026
Commits to this site by month in 2026. Two bursts of work with a pause between them; the move to Cloudflare in July was one evening.

The April version was what a coding agent makes when you ask for a personal site: a dark home page with a WebGL shader behind it, a blog with search, pagination and twelve made-up posts, DaisyUI components and hosting on Vercel. It took three days and looked like many other developer sites. In July I moved it to Cloudflare in one evening, and then I stopped opening it.

In October I started over with a different idea: the site as a technical drawing, graphite on tracing paper in the light theme and a cyanotype in the dark one. The shader, the search, the component library and the mock posts all went.

The technical drawing gave me something to judge each addition against. A timeline could use dimension lines; a chart could share the same strokes. In April, I had usually moved on once the page worked. Now I also checked whether it fit the drawing.

How I worked with the agents

The same loop worked for the whole site and for a single detail: look at what exists, get several options, pick one, have it built, run the checks. Then the next detail.

Explore; Choose; Set aside. My choice. Written spec: values and behavior. Repository: build and check.ExploreChooseSet asideMy choiceWritten specvalues and behaviorRepositorybuild and check
A schematic of the choice: several disposable HTML studies, one selected direction. The written specification goes into the repository; the prototype code stays outside it.

The design never started in the repository. I explored it in claude.ai as plain HTML pages: a moodboard with the rules, a study of the navigation, a study of the background at different widths, then the home page at five widths and the inner pages in both themes. They were cheap to make and cheap to throw away, so I asked for far more options than I would ever ask a designer for. Once I had picked one, the repository got a written spec: the values and the behavior to rebuild, with the prototype’s code left behind.

I found it easier to reject a prototype when it was still a separate HTML page. I could decide whether I liked it before working out how it would fit the site’s components.

I ran the work in parallel. Usually one session built while another researched or tried a variant of a drawing. Near the end I had four agents audit the site at once, each with one skill: design, classic SEO, AI search and prose. They came back with 19 fixes, and I took them in three batches.

I enjoyed comparing versions and tuning the one I liked, sometimes a pixel at a time. The Experience timeline on About went through three versions in two hours: names on spans, then dots with a dashed end, then ticks with the project’s span drawn as a dimension line on hover. The pencil strokes that drift over the home page drawing took three rounds in about an hour.

I used to cut this kind of polish from side projects because each round cost an evening. With agents, I could spend a few minutes on another version and compare it on screen before deciding whether to keep going.

Names on spansThe first version
Project
Dots and dashesThe second version
Ticks and dimensionsThe version I kept
Project span
Schematic reconstructions of the three versions, using the same project span for comparison. In the final version, the dimension appears on hover; it is shown here so the difference is visible without interaction.

Claude Code and ChatGPT, side by side

I used two agents at the same time: Claude Code from Anthropic and OpenAI’s ChatGPT desktop app with Codex. They overlap on most tasks, and each still ended up with its own job. This is how they worked for me on this site; I would not use it as a ranking for every kind of project.

Claude Code understood me with less explaining. A short request, often in Russian, was usually enough, where the other agent needed more context spelled out. It was also better at the technical work: the geometry of the drawings, the Lighthouse fixes, the structured data. Most of the code in the repository came from it.

The ChatGPT app was the better place to work with agents. It is an ADE, an agentic development environment: an app built around agents running tasks, where an IDE is built around files and a terminal around commands. Keeping several tasks in view, coming back to one later and following what an agent was doing all felt easier there than in a terminal.

So the split settled by itself: the ChatGPT app as the workspace for research and side questions, Claude Code for anything that ended up in the repository. The project’s skills are shared between both agents, so either of them starts with the same rules.

Where it went wrong

45 of the 214 commits start with “fix”. Most of them are layout fixes, such as centering, spacing and labels running into each other at one width, and any site has those. Five other problems came back again and again, and they are the ones worth knowing before you try this.

Copy that sounds machine-written

The agents’ drafts of About read like every AI-written bio: “not X but Y” contrasts, three slogans in a row, the same phrase twice. I rewrote the copy in at least four rounds, and a separate review with a prose skill still found tells after the last one. Text took more of my own time than anything else, and it is where I trust agents least. A layout problem is usually visible at the width where it breaks. A sentence can be grammatical, accurate and still sound like something I would never say. I had to read for that myself.

Numbers nobody confirmed

To fill the layout, an agent put example figures on About. The site went live with them, and I kept About and the CV away from search engines for a week until the real numbers were in. I had accepted a page that looked finished without confirming its figures. Since then the project has a rule: a fact on the site needs my confirmation.

Rules forgotten between sessions

I asked twice to be answered in Russian. Commits came with an AI co-author line after I had said not to add one, and I rewrote the history twice to remove it. I had expected those corrections to carry over to the next session. They did not, so I needed to save them somewhere the next agent would read.

Docs drifting from the code

The two most-edited files in the repository are not code. The redesign plan changed in 85 commits and the design spec in 60, more than any page. The agents kept them in sync only when asked, and an audit still found the spec and the agent instructions contradicting each other. In the end I merged them into five short topic docs and deleted the plan. Every extra description of the same behavior was another place that could disagree with the code. Shorter docs gave me less to keep synchronized and made contradictions easier to find.

Building more than needed

A component library, a Lighthouse CI tool, a page that showed off the drawing kit, an italic font, and the blog itself three times: all added, then removed. Agents add things readily. Removing them took about ten cleanup commits, and every time I was the one who asked. Cheap implementation made it easy to accept an addition before asking whether I wanted to maintain it.

I make the same scope decisions when estimating a software project: something can be useful and still belong outside the current version. On my own site, I had to be the person making that cut.

What kept it on track

Checks the agent cannot argue with

npm run check runs Prettier, the unit tests, the build, a script that checks every page’s title, description and structured data, and an axe accessibility check. Nothing is committed until it passes. npm run check:full adds Lighthouse on mobile and desktop and expects 100 in every category. Those checks gave the agent a result it could work toward without asking me to inspect every detail. They also let me spend more of my review time on the things they could not measure, such as whether a drawing fit or the copy sounded like me.

The checks also caught things I would not have looked for. Cloudflare’s automatic analytics injection cost the mobile score 2 points, so the analytics script now loads a second after the page does. Preloading both font faces scored better than preloading one.

Rules that grow from corrections

Every correction I had to make twice became a line in AGENTS.md, the file every agent reads first. It says that I decide, that files are in English, that npm run check passes before a commit, that there is no email address on the site, that every page works without JavaScript at Lighthouse 100, and that values come from the design tokens. How I like to work, such as pushing and deploying only when I ask, went into the agent’s memory. A new session now has those decisions available before it starts work. I still have to check that it follows them, but I no longer depend on the previous conversation being remembered.

One skill per concern

Skills are packaged instructions an agent loads for a kind of task. I started with eight design skills. Two conflicted and were gone within a minute, and five more went a few days later. Now there is one per concern: design, SEO, AI search, prose, the content plan and positioning. They are pinned in the repository and shared between Claude Code and Codex, so I no longer set up the same rules in every project.

The setup I ended up with

Job Tool Why it fit
Code, docs, checks and commits Claude Code (Claude Opus) Short requests were enough; strongest on code
Research, side questions, following tasks ChatGPT desktop app with Codex A workspace built around agents
Design prototypes claude.ai Throwaway HTML pages, cheap to compare
Audits Four Claude Code agents, one skill each Design, SEO, AI search and prose at once
The site Astro 7 and Tailwind 4 Static pages, SVG drawings built at build time
Hosting Cloudflare Workers Static assets, redirects and analytics
Quality checks Lighthouse and axe Performance, SEO and accessibility on every build

What I would do again

I would keep the prototypes outside the repository and use the agents in parallel. Seeing alternatives made my decisions better, and having one session research while another built kept that work moving. I would also put the rules and checks in place earlier, before a second session had a chance to repeat the first one’s mistakes.

I would spend more time reviewing additions before accepting them. I removed the April design and several dependencies later; the example numbers should never have reached the live site.

The timeline and the pencil strokes are details I would once have dropped. I enjoyed working on them, and I want to leave room for that on the next project too.

RSS