King Tan
← Case Studies / kingtan.com.au

kingtan.com.au

I designed this site. AI built it. I opened an empty repo on 8 June 2026 and the site went live on the 18th. Since then I have added a CMS, a deploy that shouts when it breaks, a glass design system and three case studies. Every step is a commit, and you can scrub through all of them below.

Live since 18 Jun 2026· 86 days· last shipped 13 Sep

I am a digital designer with basic code. In June 2026 I wanted to know whether an AI coding tool could earn a place in my working week, and I learn fastest with something real at stake. I set the brief I could judge better than anyone: my own portfolio, motion-led, on my own domain, with every project editable in a browser afterwards.

I directed. Claude Code built. I described what I wanted in plain language, looked at the result and sent it back until it matched the picture in my head. For the engineering I had never touched, Astro, GitHub Actions, DNS, a deploy pipeline, I read the trade-offs it explained and made the call.

Three months on, the site has 448 commits in its own repo: 245 by AI sessions, 187 by me through the CMS or my Mac. This page replaces the slide deck I wrote in July. The numbers on it come from the build that published it, so they cannot go stale, and the parts you can play with are the site's own.

Sitekingtan.com.au, Astro, static
Live since18 June 2026, 16:15
StackAstro, Sveltia CMS, GSAP, Lenis, Cloudflare Pages
Content30 projects, 16 notes, 3 case studies, one CMS
Built withClaude Code sessions, GitHub Actions, wrangler
Commits448 since 2 July, 245 of them by sessions

01The build, day by day

Every bar is a day and every stop is a decision. The bars count commits to the site, from the first homepage on 10 June to the build that published this page. Hover a bar for its day. Tap a stop, drag the scrubber or swipe the strip for what I decided, what AI built and what I learned; the bar under each stop is my estimate of how the work split between the call and the code.

10 to Thu 11 Jun 24 commits 1 of 17

The first homepage, and the plumbing

I decided

Start with the page that matters. A homepage grid of video tiles before any project page, and a way to ship it before anything else.

AI built

The grid on the Monday night, Astro and a visual CMS the next day, then a GitHub Action that built the site and pushed it to my old host over FTPS.

The lesson

Ship the plumbing on day two. Every change after that had somewhere to go.

Sydney timeJune from the old workspace, July on from this repo's own historyTap a stop, drag the scrubber, or swipe the strip

02Flat to glass, drag it

On 17 August the header was a bar and every control on the site was a hairline: a mono label, a border, a solid gold fill on the selected chip. On the 18th the bar went and they all became glass. Drag the handle across the same header, the same filter row and the same work card. The markup is identical on both sides; one recipe in the stylesheet changed.

Drag the handleLeft, the site on 17 AugustRight, the site today, same markup

The recipe is one fill, one frost and one lit edge, shared by the nav, the wordmark, the menu button, the chips, the pager and the footer bar. I tuned it against real work sitting behind it, so a label stays readable over a white poster frame as well as a dark one. The gold stayed where it was: on the selected chip, and nowhere else.

03One accent, and it means on

Every yellow on this site marks something that is on, happening or just happened: the selected chip, the playhead, the copy toast. No resting control wears it. Click a chip and the gold moves with you. Then give every chip the accent and watch the row stop meaning anything.

The chip row

One gold chip: the category you are looking at.

The toast

The footer's copy button, unchanged. Press it: the accent toast says what just happened, the one job the accent has.

The card

TAL — TAL
01 TAL Motion

The homepage card, link and all. Hover it for the crop marks and the accent title; both are allowed, because it goes somewhere.

The pill, on the bench

Case studies Motion

Move the sliders. The first pill rests, the second is on.

Every control here is the site's own classHover only where a click goes somewhere

The recipe on the bench is the real one: 2px of frost, a 40% black scrim, a rim at 49%. The ON chip is the same glass with gold in place of the scrim, because gold over a black wash reads as army green, the trap that killed the light theme. Nothing here hovers unless a click goes somewhere.

04Push, and it's live

Every save in the CMS and every merge is a push to main, and a push starts this. Press play: sixty-three seconds run in eight. The stages are the real ones from deploy.yml, timed from run 171 on 9 September. Flip the switch to break the build and watch what shouts.

0:00Runner
kingtan.com.au the last good build

Serving the last good build while the runner works.

63 seconds in 8Stage lengths measured on run 171, 9 Sep 2026; the stats step joined after it

The site never goes dark during a deploy, or after a bad one: Cloudflare keeps serving the last good build until a new one lands. Since 17 August a failure can no longer be silent either. A watcher outside the deploy sees the conclusion however early the job died, opens one tracking issue, pushes a line to my phone, and closes the issue on the next green run.

05Edit in the browser, no code

Every project on the site is one JSON file, and the CMS at /admin is a form over it. This is that form for TAL, with the card and the homepage filter row wired to it. Change anything. The row rebuilds itself from the work, so a category button exists only while one project carries it: add a category and watch the button appear, untick it and the button goes.

The formsrc/content/work/tal.json
Category
Services
Motion DesignAnimationSocial DesignHTML5 DevelopmentMulti-Size AdaptationAd-Spec Build
What it makes
AllMotionStaticPrintInteractiveBanners
TAL — TAL
01 TAL Motion · Banners

As it is on the site today.

The commit
{
  "title": "TAL",
  "slug": "tal",
  "client": "TAL",
  "year": 2019,
  "cat": [
    "Motion"
  ],
  "services": [
    "Motion Design",
    "Animation",
    "Social Design",
    "HTML5 Development",
    "Multi-Size Adaptation",
    "Ad-Spec Build"
  ]
}

The CMS is Sveltia, at /adminNothing here saves; the real one commits to main

Save in the real CMS and this JSON is the commit; the deploy above runs on it and the card is live a minute later. I load every project this way myself, which is the review no AI can do for me: if a field hurts to fill in, the form is wrong. The category list is a dropdown in the CMS config: a new value there is one line, and its button shows on the homepage the moment a project carries it.

06Built to be read by AI

A page has three readers. A visitor sees the card. Google reads the structured data under it. An answer engine reads /llms.txt, a plain-text summary of the whole site that the build writes from the same JSON. Switch the tabs; it is the same TAL project each time.

TAL — TAL
01TALMotion

Digital work for TAL's "Scars", the brand platform positioning the life insurer as Australia's "Human Insurer," using scars as symbols of strength and a life lived. A DOOH spot and a Financial Standard publisher takeover, both holding the campaign's quiet tone.

RoleDesign, Animation & Build
ServicesMotion Design · Animation · Social Design · HTML5 Development · Multi-Size Adaptation · Ad-Spec Build
Fifteen user agents, one answer
GPTBot200ChatGPT-User200OAI-SearchBot200ClaudeBot200Claude-User200Claude-SearchBot200PerplexityBot200Perplexity-User200CCBot200LinkedInBot200facebookexternalhit200Twitterbot200WhatsApp200Googlebot200Chrome200

Verified 17 August 2026, redirect-check run 32010039724: each agent gets 200 on the homepage and on a work page, and robots.txt carries no AI directives.

Same project, three readersllms.txt is a build-time endpoint, never hand-edited

The AI crawlers were 403-blocked at Cloudflare's edge until July, so nothing could cite the site. A weekly probe now sends fifteen user agents at the homepage and a work page and expects 200 from each; the check that settled it ran on 17 August. Ask an AI who I am, and it has what it needs.

07What I learned directing AI

  1. Taste still leads.

    The art direction was mine on day one and it is mine now: the dark canvas, the single accent, the rule that gold means selected. AI made executing it cheap enough that I restarted the site on day four without flinching.

  2. Rules live in a file, not in my head.

    Every pitfall goes into CLAUDE.md with a date, and the next session reads it before it touches anything. The case-sensitivity trap that once lost a Sydney Metro banner is a guard in the deploy now.

  3. Re-fetch before you diagnose.

    A weekly health check once ran against a clone 98 commits behind and reported two problems I had fixed the week before. A session now fetches the latest main before it reads any file as current, and again before it pushes.

  4. Green is not the same as right.

    A missing image under public/ is not a build error, so a deploy can pass with seven dead images on a project page. It happened once, after a CMS re-save wrote old filenames back. Screenshots before 'done', every time.

  5. A phone bug needs a phone.

    Headless Chromium swore the header was fine on scroll. WebKit was blanking a fixed element with a backdrop filter, in every iPhone browser. The fix was one line. The hour before it went on evidence from the wrong browser.

  6. Name the tool in the body, never the title.

    'Building kingtan.com.au with AI' is the headline on every study, and the tool's name sits in the copy. A title that names the tool reads as the tool's work, and the decisions were mine.

08By the numbers

448
commits since 2 July

in the site's own repo; June lives in the old workspace

245
by AI sessions

the rest are mine, through the CMS or my Mac, plus a few by the deploy

86
days live

since 16:15 on 18 June 2026

30
projects live

23 motion, 8 static, 4 print

233
banner builds in the repo

186 of them live on project pages

16
dated notes

the site's freshness signal, one JSON each

The strip above gets a stop the day this page ships, and every deploy after that rewrites the numbers on it. The next chapter is whatever lands next.

Contact

Got a brief? · Freelance & full-time
Let's talk →
[email protected]
Copied