---
title: "The product is me"
url: https://gardiner.today/past/this-site
tense: past
edition: "2026.11.02"
updated: "2026-11-02"
---

# The product is me

gardiner.today

Independent. Design, engineering and AI, October 2026 to now.

A portfolio reissued every day at noon, with two or three of its design values changed on a versioned token layer, and Ardo, my agent, answers questions about my work.

## Highlights

- [every day since 10 october](https://gardiner.today/past/this-site#so-far): Reissued at noon every day since 10 October 2026, with two or three design values changed.
- [never writes a colour](https://gardiner.today/past/this-site#choosing-not-generating): The AI only picks among values I authored, so every palette is proven to pass WCAG 2.2 AA first.
- [it changed nothing](https://gardiner.today/past/this-site#the-day-it-changed-nothing): The first day the AI chose, it held the design. Now it decides what changes, never whether.
- [every limit in code](https://gardiner.today/past/this-site#the-proxy-i-didn-t-carry-over): Jev checks each message before the model sees it, and every limit lives in code.

## The premise

This site is built like a startup’s product page, with me where the app would be. Every day at noon it reissues itself in a slightly different design, and Ardo, my agent, answers your questions about my work. I built it so the line on the front page, that I make the part people touch and AI makes the part you don’t, is something you can check instead of taking my word for it.

Ask Ardo: [what is the idea behind this site?](https://gardiner.today/future?q=what%20is%20the%20idea%20behind%20this%20site%3F)

## Nothing waits on me

I wanted a daily ritual that could never turn into a chore. Every evening at 6pm the site drafts tomorrow’s design. It posts a signed preview link to a private Slack channel, with a Veto button. If I ignore it, it ships at noon.

The veto started as a signed link. A link-following bot, like Slack’s unfurler, could have pressed it by accident. So it became a button that only a request signed by Slack can spend.

When a part fails, the rest carries on: a failed run posts a notice and keeps yesterday’s design, and missing analytics are marked unknown rather than guessed.

> I wanted a daily ritual that could never turn into a chore.

Ask Ardo: [what happens if he ignores the day’s preview?](https://gardiner.today/future?q=what%20happens%20if%20he%20ignores%20the%20day%E2%80%99s%20preview%3F)

## Choosing, not generating

The AI never writes a colour or a size. I author the values on six axes: six accent hues, three corner radii, three type scales, four depth treatments, three densities and five glows, each as a light and dark pair. That makes about 24 variants and roughly 3,240 combinations, and the AI only picks among them.

It also made safety small enough to check completely. Contrast depends only on hue and mode, twelve pairs, so colour maths proves every palette passes WCAG 2.2 AA before it can be picked. Layout depends on type, density and depth, 36 states in each mode, few enough for Playwright to check every one. Visitors can like a day, or lock one for themselves, and likes feed the choice. Since every candidate is checked first, even a brigade of votes can only push the site to another good combination. You can try on any past day from the dock.

**the call i made**: Let the AI generate the design, or choose among values I wrote?

- Took: Choose among authored values. Twelve colour pairs and 36 layouts are few enough to prove every one passes.
- Turned down: Generate values. A model writing colours could ship a palette nothing had checked.

Ask Ardo: [how does the AI change the design without breaking it?](https://gardiner.today/future?q=how%20does%20the%20AI%20change%20the%20design%20without%20breaking%20it%3F)

## The day it changed nothing

On 11 October, the first day the AI chose the design, it changed nothing. I had asked Jev, the model that makes the site’s structured decisions, whether any change was warranted, and told it a quiet fortnight argued for holding. With no finished days to read, it scored change at 0.08, and at soft-launch traffic it would have kept the same design for weeks.

**0.08**, Jev’s score for any change at all, the first day the AI chose

I had read my own zero-obligation rule as permission to stand still, when it only ever meant I never have to act. Now Jev decides what changes, never whether.

Two axes always change and a third when Jev thinks the day needs it, nothing comes back within a week, and each change ships with a short reason written by Haiku, like “rounder, after two days of sharp corners”, so the sheet on the home page shows a judgement, not only a diff.

> Now Jev decides what changes, never whether.

Ask Ardo: [what happened the first day the AI chose the design?](https://gardiner.today/future?q=what%20happened%20the%20first%20day%20the%20AI%20chose%20the%20design%3F)

## The proxy I didn’t carry over

Ardo replaces a contact form. Paste a job ad, or its link, and it sets each requirement beside the page that shows it, and says plainly what this site doesn’t cover. Some answers, a comparison or a walk through a study, come back laid out from this site’s own parts in Google’s A2UI format, and the site checks each part against my pages before it shows one. My previous site had an AI search too, and its proxy taught me what not to do: no rate limit, any origin allowed, the model and token limit read straight from the request, and every protection its README promised lived in a vendor dashboard. This time every limit is in code. Jev checks each message before the model sees it and refuses prompt injection, failing closed if Jev is unavailable, and the model and its limits are fixed on the server. When a limit trips, Ardo writes a short reply and offers to pass me a note, so a question still reaches me. Ardo is my agent’s name: the letters of Jordan with one taken away. It isn’t a person, and it never speaks as me.

**the call i made**: Keep Ardo’s protections in a vendor dashboard, or in code?

- Took: In code. Every limit is tested and ships with the site.
- Turned down: A dashboard. My last site’s README promised protections no code enforced.

I chose the model by measuring: two Ori comparisons on the real prompt and writing, then probes of the real call. Gemini 3.8 Flash came first at about a third of Sonnet’s cost. Haiku, the cheap option, came back empty at the call site.

Ask Ardo: [what keeps Ardo safe?](https://gardiner.today/future?q=what%20keeps%20Ardo%20safe%3F)

## Your assistant reads it too

A lot of people will meet this site through an assistant, so I built a version for it. Every page of my writing also comes as plain markdown, with the same words and the same AI generated labels. Add .md to an address or ask for text/markdown, and find them all in /llms.txt. I let crawlers train on it too. If a model learns who I am from here, that’s the point.

An MCP server lets an assistant search and read the site itself, and now ask Ardo too, here or through an A2A agent card. It gets the same checks and the same sources you would, in a shorter answer. It can’t write anything, and it can’t reach me. The Future composer and the search field are declared as WebMCP tools too, and neither sends itself.

> If a model learns who I am from here, that’s the point.

- [llms.txt](https://gardiner.today/llms.txt)
- [mcp](https://gardiner.today/mcp)

Ask Ardo: [can an AI assistant read this site?](https://gardiner.today/future?q=can%20an%20AI%20assistant%20read%20this%20site%3F)

## How it was built

I built it in five phases, each a written OpenSpec change I approved before work began and reviewed before the next. They were the live site, the agent, the editions pipeline, the interview pipeline, and search, which matches words and meaning. Claude Code agents wrote most of the code, several at once, each in its own git worktree. My part was the decisions and the checking. Where a choice came down to taste, I had the options built and picked with my own eyes: the page transition from four, the veil over the home page words from three, the six accent hues from ten, the context chip over five rounds. The first round of case study pictures were faithful little mock-ups of interfaces, and I threw them all out for looking machine-made. What you see now are abstract plates cut into strips, drawn in the day’s design.

- [my stance on AI](https://gardiner.today/ai)

Ask Ardo: [how was this site built?](https://gardiner.today/future?q=how%20was%20this%20site%20built%3F)

## So far

It has reissued itself every day at noon since 10 October 2026.

Building it emitted about 53.9 kg of CO2e and running it 1.2 kg so far; I’ve removed 0 g, with 150 kg bought and its record to follow. [emitted and removed](https://gardiner.today/ai#carbon)

Ask Ardo: [how long has the site been reissuing itself?](https://gardiner.today/future?q=how%20long%20has%20the%20site%20been%20reissuing%20itself%3F)

## Ask about gardiner.today

Ardo has read this case study and the rest of the site. Ask it what I didn’t cover, and it shows the pages its answer rests on.

Ask Ardo: [what can the AI change about this site each day, and what can’t it?](https://gardiner.today/future?q=what%20can%20the%20AI%20change%20about%20this%20site%20each%20day%2C%20and%20what%20can%E2%80%99t%20it%3F)

## Read next

- [Hey you, let’s brew](https://gardiner.today/past/hai-coffee) (Hai! Coffee): Where the token layer behind this site started.
- [The biggest piece of tech debt](https://gardiner.today/past/canva) (Canva): Where I first brought AI into a team’s workflow.

[All case studies](https://gardiner.today/past#case-studies)

I live and work in Magandjin, the Jagera name for Brisbane, Australia, on the Country of the Turrbal and Jagera peoples. I pay my respects to their Elders, past, present and emerging. Sovereignty was never ceded.
