AI Consulting

No banner, because there is nothing on the page to consent to.

The studio site sets no cookies, so it asks for no consent. What it took to be able to say that, and the test that stops it quietly becoming untrue.

Client
A site with no cookie banner
Practice
AI Consulting
Published
26 August 2026
No bannerbecause nothing here needs your permission in the first place
6 namedcompanies touch anything, listed by name and held there by a test
8 of 11old demo pages still borrow a font from someone else, and say so
The problem

A panel slides up over the article you came to read.

It wants you to accept something. Accept is a large coloured button. The other choice is a smaller grey word that opens a second panel with forty toggles in it, arranged so that reading them takes longer than the article. Almost everybody presses the large button, and almost nobody has any idea what they just agreed to.

That panel is now the most common thing on the web, and its origin deserves more precision than it usually gets. It is not a legal requirement that fell out of the sky. It is the receipt for a decision the site made earlier: to load an advertising pixel, or an analytics product that follows you between visits, or a video player that recognises you. The site chose to take something from the visitor, and the panel is the site asking the visitor to carry the paperwork for that choice.

Once you see it as a receipt, the interesting question is not how to design a better one. It is what a site would have to avoid doing to have nothing to hand over.

  • 01The panel is not the obligation. It is the paperwork for an earlier choice
  • 02A visitor who clicks accept without reading has consented to nothing meaningful
  • 03Asking permission for something that is not happening is a dark pattern wearing a suit
The approach

Do not take the thing, and the paperwork disappears.

Every page this studio serves sets no cookies. Page views are counted by a product that does it without a cookie and without an identifier that survives between visits, so there is no profile of you anywhere and nothing to ask you about.

None of that was hard. It was a short list of small refusals, each one taken at the moment the easy option was one line of code away.

Booking a call sends you to the booking company’s own site rather than loading their widget inside this one, which is the single decision that does the most work here: an embedded widget would have brought its own storage with it and the claim would have died on the spot. Prices change by country, and the country is read from a request header the network already sends rather than from anything written to your machine. There is no tag manager, because a tag manager is a door left open for whoever holds the key later.

A banner asking you to consent to tracking that is not happening would be theatre. It would look like compliance and function as noise.

Six outside companies touch this operation at all, and every one is named on the privacy page: the host, the service that sends transactional mail, the booking service, the form handler behind the prayer page, the company that runs the studio’s own email, and the database. That list is not a promise typed into a document. It is pinned name by name in an automated check, so adding a seventh without updating what visitors are told makes the build fail.

No cookie API anywherethe word is banned, not just the writeNo outside script, no framean embed is how storage arrives unannouncedThe six names are pinneda seventh cannot join in silenceThe old demos are countedthe debt cannot grow, only shrinkThe buildgoes redbefore anyonepublishes it
Why the notice stays true on its own. Each rule is enforced where an editor would trip it, not in a document somebody has to remember to read.

One of those four rules had to be narrowed on its first run, and the reason is worth keeping. It began by banning a whole module, and it immediately flagged the correct code that reads the visitor’s country from a header. A rule that fires on work which is doing the right thing gets overridden, then ignored, then deleted. It bans the specific function name instead, which nothing here has any reason to reach for.

The outcome

The dirty corner, published on the same page as the claim.

The check that guards all this failed the first time it ran, and it failed against the studio’s own writing. A manual sweep had looked through the application code, found nothing, and written a confident sentence about the site. The check looked somewhere the manual sweep had not: the folder of plain static files served straight to visitors, which no compiler, no linter and no bundler ever opens, because nothing in the build refers to them.

Eleven such pages exist. Eight of them pull a font from a third party’s servers, which hands that third party a visitor’s address every time one loads. One embeds a map. One borrows a photograph. The temptation at that moment is to soften the check until it passes and call the site clean.

Eleven, eight, one and one are written into the check as exact numbers. If a ninth page starts borrowing a font, the build fails. If somebody cleans one and forgets to lower the number, the build fails too.

So the debt is pinned at the size it actually is, and it is disclosed in plain words on the privacy page rather than hidden behind an average. The eighth of those eight is not a demo: it is the live prayer form, which collects the most sensitive thing anyone sends this domain, and it is named separately so it cannot be quietly folded into a sentence about old mockups.

What a buyer should take from this is not that the studio is unusually pure. It is the shape of the thing. A claim about privacy made in a document decays the first time someone edits the site in a hurry. The same claim, converted into eight automated assertions and four exact counts, cannot decay without somebody seeing it go red first. That conversion is the entire trick, and it is the same one we apply to a client’s system.

You can check the first half of this yourself in one command, without asking us anything: request any page on this domain and look at the response headers for the line that sets a cookie. There is not one.

Built with
  • Next.js
  • TypeScript
  • Vercel