How to tell a website was built by AI

There is a house style now, and once you have seen it you cannot stop seeing it. Seven tells, in the order you meet them. Every one of them is something a person can see, read or press, with no developer tools at all.

Somewhere in the last two years a look emerged. Not a bad look. A competent, slightly weightless, everything-in-its-place look that a surprising number of new products now share. You land on the page, everything is fine, and some part of you goes: ah.

These are the seven things that part of you is noticing, roughly in the order you meet them: what you see before you scroll, what you read, what happens when you press something, what happens when you step off the path, and what happens the moment it leaves your desk. No developer tools, no source code. Every one of these is something a person can see, read or press.

1. Everything moves

Before you have read a word: the headline fades up, the cards slide in one after another as you scroll, a soft gradient drifts behind the hero, and a number somewhere counts up from zero to 10,000.

Motion is the cheapest way to make a page feel designed, which is exactly why it is what gets added when there is nothing else to add. A page confident in what it says tends to just say it.

There is a real cost underneath the taste question. Scroll-triggered animation means content is deliberately withheld until you arrive at it, so every reader pays a small tax on every section, forever, and it is worst for the returning visitor who already knows what is there. It also tends to ignore the setting that exists for exactly this: people who get motion sickness from parallax can ask their operating system to stop it, and most generated pages never check.

Fix: keep the motion that tells you something changed: a thing arriving, a panel opening, a row being removed. Delete the motion that only decorates. Then turn on Reduce Motion in your own system settings and load the page again; if it is unchanged, it is ignoring a request somebody made for medical reasons.

2. The tab still says the template’s name

Look at the browser tab. Not the page. The tab.

A startling number of live, paid-for products are still announcing Vite + React + TS or Create Next App up there. The slightly subtler version: every page on the site has the same title, so the tab says the company name whether you are on pricing, on the blog, or on a help article about billing.

This is the cheapest thing on the list to fix and the most expensive to leave. That title is the blue line Google prints in its results. It is the sentence somebody reads when deciding whether to click you or the competitor below you. Nine pages sharing one title also tells a search engine those nine pages are interchangeable, so it picks one and ignores the rest. People building fast care enormously about being found, and this is the single most common way of being invisible.

Fix: click through your own site and read the tab on every page. Each one needs a title that describes that page and could not be pasted onto another. While you are there, paste your URL into any link preview (a message to yourself works) and see what comes back. If it is blank, or the template’s name, that is what every link to you has looked like so far.

Vite + React + TS Create Next App Acme · Acme Pricing · Linear
app.example.com
Vite + React + TSthe starter template’s title, never changed
Create Next Appa different starter, the same story
Acme · Acmethe site name, twice, on every page of the site
Pricing · Linearwhat the tab is for: the page you are on, then the product it belongs to

3. Headings that could be anyone’s

Powerful analytics. Seamless integration. Built for scale.

Each is true of about forty thousand products, which is the same as being true of none. They read as headings because they are the right shape and length, and a competitor could paste any of them onto their own page unchanged.

This is the strongest signal on the list, because it survives a redesign. You can make the page beautiful and it will still be describing a genre rather than a product.

Fix: take each heading and ask whether a competitor could use it word for word. If they could, it is not about you yet. Powerful analytics becomes See which customers stopped opening the app: clumsier as writing, immeasurably better as copy.

4. The sentences have a rhythm

Read a few paragraphs aloud, or just let your eye run down them. Something is metronomic about it, and most people feel it before they can say why.

Things arrive in threes, always: three adjectives, three benefits, three clauses. Sentences come out at roughly one length. Every section closes by restating what it just said in slightly different words. There is a fondness for the shape it is not just a X, it is a Y, and for words that sound like effort: seamless, robust, leverage, unlock, empower.

What is missing is unevenness. Human writing has bad rhythm in it: a four-word sentence landing after a long one, a fragment, a clause that goes on slightly too long because the person was annoyed. Generated prose is smooth all the way down, and smooth all the way down is the tell, for the same reason a perfectly even floor feels like a showroom rather than a room somebody lives in.

This piece is not innocent either. Count how often it reaches for a colon.

It is also the hardest one on this list to fix, because it is invisible to whoever produced it. The text reads correctly. Nothing is wrong with any individual sentence. It simply has no pulse.

Fix: read your homepage out loud. You will hear it immediately. Then cut the third item out of every list of three, delete any sentence that restates the one above it, and let one sentence be very short. Four words is fine.

5. Nothing happens when you press it

Now start clicking. Not the main call to action. That one always works. Click the secondary things: Export, the filter dropdown, the settings gear, the little pencil icon beside a row.

Generated interfaces are full of plausible controls. Ask for a dashboard and you get an Export button, because dashboards have those. Whether anything is wired to it is a separate question, and often nobody asked it out loud.

This is the most expensive item on the list. A visitor who presses a button and gets nothing back (no spinner, no error, no change) does not file a bug report. They conclude the product is broken, and they are not entirely wrong.

Forms are the same failure with a bigger bill. The classic version has a required field that is hidden, disabled, or pushed off the layout: the browser refuses to submit because something invalid exists, tries to focus the offending field to say so, cannot focus what it cannot show, and gives up silently. The visitor fills in everything they can see, presses the button, and watches nothing happen. Not some visitors. Every one of them. A signup form in that state converts at zero while looking completely normal.

Fix: click every control on your main screen once, in order, with the browser console open, and watch for any observable change at all. Then submit your most important form completely empty: a healthy one jumps to a field and complains, a broken one does nothing.

A sign-up row with every visible field filled in: Work email
          dana@acme.com, plan Pro, and a Get updates button.
Console

An invalid form control with name='company' is not focusable.

not focusablethe browser will not submit, tries to jump to the offending field to say so, cannot show what is hidden, and gives up in silence
Get updatespresses fine, looks fine, and has never worked for a single visitor
A real page, really submitted. The button was pressed in Chromium, the page did not navigate, and the line above is the one the browser printed. Captured by scripts/postshots.cjs.

6. Nothing has a second state

Now go off the happy path on purpose. Turn off your wifi and reload. Open the dashboard on a brand new account with nothing in it. Load a page that does not exist.

What you usually find is that the good path is beautifully built and there is nothing behind it. No empty state, no error state, no loading state, no thought about what a list of four hundred rows looks like when it was designed with four.

The worst version of this is an empty state used as an error state. The request fails, the list comes back with nothing in it, and the page cheerfully announces No projects yet. Create your first one! To a returning user with forty projects, that is not a friendly message. That is a message saying their data is gone.

Fix: for your two most important screens, write down what should happen when it is empty, when it is loading, when the request fails, and when there is far too much data. Four sentences per screen. Most of them will not be built yet.

Acme ProjectsActivityTeamSettings

No projects yet

Create your first project to get started.

New project
Network
GET/api/me200 OK 84 ms
GET/api/projects 500 Internal Server Error1.4 s
500the list is empty because the request failed, and the screen has no way to say so
No projects yetwhat a customer with forty projects is told instead

7. It was never opened on a phone, on real data

Open the site on your actual phone, not the browser’s phone simulator, while you are out, on mobile data, with your wifi off.

Two separate things go wrong there and both are invisible at a desk. The first is layout: a table running off the side, a hero image eating the entire first screen, a sticky bar sitting on top of the button, a menu that opens over itself. It was built at 1440 pixels wide on a large monitor, it looked finished there, and nobody scrolled it on a train.

The second is weight, and it is the one people never think to check. A 4MB hero image and an uncompressed background video are instant on the machine that made them, sitting a metre from the router. On a phone on a train that is ten or fifteen seconds of white screen, which is several times longer than anybody waits. The page is not broken. It is just never seen.

Fix: load it on your phone, outside, on cellular. Count how long until you can read something. Then open your browser’s network panel on the desktop and sort by size. The top two or three items are almost always one enormous image somebody exported once and never looked at again.

Orders
OrderCustomerPlacedStatusTotal
#4821Dana Whitfield12 AugShipped£248.00
#4820Marcus Ellery12 AugRefunded£96.50
#4819Priya Raman11 AugProcessing£1,410.00
Totalthe column everybody opened the page for, past the right edge, on the only screen most people will ever use
Built at 1440 pixels wide, where all five columns fit and nothing looks wrong.

None of this is really about AI

Here is the part worth keeping. Go back through those seven. Not one was invented in the last two years, and not one is a thing a model does badly.

Decorative motion, interchangeable headings, a button wired to nothing, a product with no empty state, a site nobody opened on a phone, a key in the front end: all of it existed in 2015, made entirely by humans, usually late, usually against a deadline. They are the marks of something finished quickly and never revisited. That is all they have ever been.

What changed is the ratio. Building got ten times faster and checking got no faster at all, so the gap between made and examined is wider than it has ever been, and it is widest exactly where these tells live: the second screen, the failure case, the phone, the thing under the hood.

Which is why the fix for all seven is the same, and why it is unglamorous: use your own product like a stranger would, deliberately, on a schedule. Open it cold. Press the thing you never press. Turn the wifi off. Read your own headings and ask whether a competitor could have written them.

Nobody can be surprised by their own work, and that is the whole difficulty. You know the button works, so you never press it. The person who presses it is a stranger, and when nothing happens, they do not file a bug. They leave, and you never find out they were there.