Nobody sat down and decided to make it look generated. It happened the way these things always happen — a hundred small, individually-defensible defaults, each one the path of least resistance, accumulating into a house style that turned out to be nobody’s. The tells we found were not mistakes. They were the moves a generator reaches for when it wants an interface to look alive and polished at a glance — and they were the moves we had reached for too, for exactly the same reason.
The pulsing dot
If there is one single tell, it is the small green dot that gently pulses next to a status word. • Live. • Online. • Vault context loaded. • Directory sync active. We had them everywhere: on the login screen, in the HexGuard chat header, on pricing badges, before section eyebrows, down the status page. Each one, alone, is harmless. Collectively they are the visual signature of generated software, because they are what a system adds when it wants a screen to feel real-time and inhabited without anything actually being real-time.
A password manager does not need to reassure you that you are online — you know you are online. The dot is theatre. So we pulled all of them: the animated ones first, then the static ones we’d missed, then the ones hiding in CSS pseudo-elements that our first two passes walked straight past. That last part took embarrassingly long, and it is its own small lesson: a visual motif reused through a shared class multiplies faster than you can grep for it. You think you have removed “the dot”; you have removed one of eleven, and the other ten are one selector away.
Gradients doing emotional labour
The second tell is the gradient asked to carry feeling. A violet-to-blue fill on every primary button. Headline words clipped to a rainbow. Soft glowing orbs drifting behind the hero to imply depth that isn’t there. None of it wrong, exactly — but all of it doing the same quiet job: manufacturing energy the content hasn’t earned.
We flattened the buttons to a single solid brand violet, set the headlines in one confident colour, and deleted the blurred glow-blobs entirely. The difference is hard to argue with once you see it: a flat button reads as a decision; a gradient button reads as a default someone left switched on. The gradient was doing the work a clear hierarchy and one good accent colour should be doing, and doing it less well.
Everything centred
Open almost any generated landing page and you will find the same rhythm, section after section: a little centred eyebrow, a centred headline, a centred sentence of supporting copy, a centred grid of three cards. Then the next section does it again. And again. It is the most templated shape in modern web design because it is the safest — centre everything and nothing can look misaligned.
We had it top to bottom. We left-aligned the section headers, gave sections asymmetric layouts, and broke the endless three-column grids into things that vary: editorial rows with a large index number and a problem-then-fix split; a left-to-right pipeline for the encryption flow. Variety of rhythm is one of the clearest signals that a person laid out a page rather than a machine filling a template. Symmetry is the tool’s comfort zone, not yours.
Interfaces that breathe
Then there were the animations whose only job was to look alive. A headline that slowly glows brighter and dimmer on a loop. Cards that scale up and down a hair — “breathing.” A button that pulses with a soft halo when idle, as if impatient to be clicked. A form that shimmers when it isn’t focused. Individually cute; together, exhausting; and unmistakably the output of a system told to “make it feel dynamic.”
We removed every decorative infinite animation and kept only the ones that mean something — the red pulse on an active breach alarm, which is a genuine alert and is allowed to demand attention because it actually has news. That is the whole test: motion should carry information. Motion for its own sake is just the interface fidgeting at you, and a person deciding where the eye should go looks nothing like a template pulsing everything on a timer.
Fake window chrome
A quieter one: the three little red-amber-green “traffic light” dots at the top of every code block and product mockup, mimicking a macOS window. Our code snippets are not windows. Our vault mockups are not windows. The dots were pure decoration, borrowed because they read as “developer-y” and “app-like” — and because every generated template ships them by default.
We took them out. A code block is clearer as a code block than as a costume of a window; a screenshot of your product is more honest than a screenshot dressed up as a screenshot. Skeuomorphic chrome you didn’t need is one more thing you accepted rather than chose.
Why it matters more for a security product
You could argue none of this matters — that a password manager should be judged on its cryptography, not its drop-shadows, and you would be right about what matters most. But trust is not only earned in the threat model. When someone is deciding whether to hand you every password they own, they read a hundred signals before they ever read your security whitepaper, and “does this look like it was made by people who care, or assembled from parts?” is one of them.
Generic reads as careless, and careless is the last thing a security product can afford to read as. The absence of the tells is itself a signal: it says someone looked at every screen and decided how it should be, rather than accepting what the tool produced. Restraint reads as confidence — and confidence is exactly the thing you are trying to sell to someone about to trust you with their secrets.
The pattern underneath
If you want to run the same audit on your own product, the rule underneath is simple — and it is not “remove gradients” or “delete dots.” Those are symptoms. The rule is this:
So the test for any element is not “is it pretty” but “is it doing a job, or is it theatre.” The pulsing dot is theatre. The gradient button is theatre. The breathing card is theatre. Cut the theatre, make the decisions the tool quietly declined to make for you, and the generated look lifts on its own — not because you added taste, but because you stopped accepting defaults.
We shipped every one of these changes in the open, one at a time. If you want to watch the whole thing happen — tell by tell, dot by dot — it is all in the changelog. The most honest version of the story is that our product never looked generated because a machine made it. It looked generated because, for a while, we stopped making choices — and looking crafted turned out to be mostly a matter of starting again.