Redact.dev · Product design · Case study

AI Forced My Hand: Designing Light Mode and Dark Mode for Redact

Why the rise of AI tooling made a second theme non-negotiable, and how a designer ended up shipping it to production.

RoleLead Product Designer, design through production PRs
TeamMe + AI agents · developers hold final review
ScopeRedact app + frontsite · two themes, one token set
OutcomeLight mode shipped · accent tokens pass WCAG AAA (7:1)

First, some context. Redact is a privacy app that mass-deletes your history across services like Discord, X, Reddit, and Facebook: old posts, messages, comments, wiped on your terms, from one place. Your embarrassing 2014 tweets? Gone. People trust it with the most sensitive thing they have online: everything they've ever said.

I'm the product designer there, and I have been since the early days: sole designer through our runner-up finish (2nd place) at TechCrunch's Miami Spotlight in March 2021, and through the $3.5M valuation that came that September with zero marketing agency help. For most of the app's life it shipped with exactly one theme: dark. This is the story of how it got a second one, and why AI is the reason it finally happened.

Anyone who has worked in a fast-paced, low-manpower startup knows this problem: people have ideas, the ideas get designed, and somewhere along the way they get implemented. But QA? Not so much. The revisions and iterations eat you alive, and the waiting time between each round is the part that really bothers you.

On the graphic design and illustration side for social media, AI already fixed that for us. It freed me up to focus on UX/UI design instead of drawing a bunch of cats for promotions.

On the front end side, the app and the frontsite, not so much. We had to rely on Figma and constantly struggled to keep Figma and prod matching. It's a dance we're all familiar with.

That was the situation until we sat down and started deliberating on our design architecture and the color space we'd been using, so we could finally implement light mode and dark mode. For years, "we don't have the manpower" was the excuse that kept it in the backlog. Once AI took that excuse away, I had no reason left to say no. It forced my hand.

Vampires who hate the light

Redact was a dark mode only application. The reasons were:

  1. We were all code-brained
  2. Vampires who hate the light
  3. We spend all our time in front of a computer

Very shallow reasoning, and we didn't mind it. Until someone put forward this idea:

Security and privacy applications should be in light mode, because light denotes safeness.

And it checks out. Dark is spooky. Hackers operate in the dark, at least in every movie poster ever made. There's something psychological baked into common folk where flat-out darkness reads as threat. It's why kids are afraid of the dark and why no bank paints its lobby black. A dark UI reads as "hacker tool." A light UI reads as "bank." For a privacy product, that perception is basically the product.

And the request wasn't just vibes. Light mode was being asked for because of our privacy theme and branding concerns. We're a privacy company. We should look like one.

That idea stuck with us. I had already created a pseudo light mode for our white-label product for internal and enterprise customers, but that was the extent of it.

So a couple of things made it possible for us to actually implement light and dark mode:

Our CTO enforced a styling framework

Something we could easily review, with a set of form and interactive components built in. That was ShadCN, which uses Radix as its component base, and it has this neat online theme builder called TweakCN where we could quickly preview light mode and dark mode side by side. We also dabbled with Storybook to give visual guidance on what our front end design system looks like, but the manpower is just too low to maintain it.

AI happened

We tested Claude to see if it performs adequately on front end changes, and it did. We also brought in Devin and Cursor as extra agents for code review. I have a little background in front end programming, not really reliable with our front end stack, but confident enough to submit a PR for the programmers to review. With that, I can now be a pseudo front end developer and take my designs 1:1 into production. Which I did.

TweakCN

We started out mapping our color scheme in tweakcn.com. In their own words: "A powerful visual theme editor for shadcn/ui components with Tailwind CSS support."

ShadCN structures its colors into slots like Primary, Secondary, Accent, Base, Card, Popover, Muted, Destructive, Border & Input, Chart, and Sidebar, and each color slot has a background and foreground pair exposed as CSS variables.

TweakCN with the Redact reference theme: a sidebar of ShadCN color slots (Border & Input, Chart, and Sidebar), each with background and foreground hex fields, next to a live dashboard preview rendered in the theme
TweakCN with the Redact reference theme: every ShadCN color slot exposed as a background/foreground pair. The entire color space of the app, in one sidebar.

So the export reads like this:

@import "tailwindcss";

@custom-variant dark (&:is(.dark *));

:root {
  --background: oklch(0.9557 0.0080 114.2220);
  --foreground: oklch(0.2178 0 0);
}

.dark {
  --background: oklch(0.1739 0.0041 285.9665);
  --foreground: oklch(1.0000 0 0);
}

That's a sample of the exported code. We use OKLCH because it has more precise color accuracy. But actually because it's kinda new LOL

The annoying part is the hex-to-OKLCH conversion. Depending on the formula a generator uses, you can get a mismatch when converting it back to RGB again.

Anyways, TweakCN also provides a quick preview of how the ShadCN components will look with your theme applied, so getting approval on the colors we're going for is much faster.

TweakCN previewing the Redact reference theme in light mode: application blocks with a stock market chart, activity feed, and chat, driven by the same color slots TweakCN previewing the Redact reference theme in dark mode: the same application blocks rendered from the dark half of the token set Dark Light
The Redact reference theme in TweakCN's app preview. Drag to flip between dark and light. Same components, same variables, one token set.

The plus side of using ShadCN is that our color space is limited and our components are fixed. The downside is also the same LOL.

Any variation gets strictly swatted down if it doesn't adhere to ShadCN's preset components. But that doesn't mean we can't be free in designing some of the web elements we need, like this Discord server selector.

Redact's Discord server selector in dark mode: a server list with avatars and unread badges on the left, the selected server's channels on the right with a Select All checkbox and per-channel checkmarks, and a footer summarizing 1 server and 4 channels selected
The Discord server and channel selector, in dark mode: a custom element that lives outside ShadCN's presets, still built entirely on the same theme variables. The exception that proves we weren't boxed in.

The color fights

So, talking about colors. There are a few things that bothered me in theme switching. One is that people with low vision or reduced visual acuity literally could not read some of our text, which is the whole thing WCAG AAA contrast guidelines exist to prevent. The other is keeping the color variables strictly on the ShadCN side.

The first thing we debated on was having a link color distinct from our primary color.

The problem is that when our primary and secondary are used as text, they're washed out. Literally unreadable. The solution is a separate color when they're used for links, icons, and the like.

Dark mode bg #101012

Head to account settings to schedule a wipe, or squint at the privacy policy first.

#3F70F7as link text4.4:1 · AAA ✗
#945FE2as link text4.5:1 · AAA ✗
Light mode bg #f0f1eb

Head to account settings to schedule a wipe, or squint at the privacy policy first.

#2d52d8as link text5.6:1 · AAA ✗
#5e2aafas link text7.6:1 · AAA ✓
The culprits, live (not a screenshot). The exact same hexes hold up as solid buttons and wash out as links. Ratios are against the real Redact backgrounds; only one of the four clears WCAG AAA (7:1) for body text.

I proved the point this way: a button is readable as a solid shape, but as text the surface area is too narrow and the color loses its contrast. So we compromised and added new color variables for those scenarios.

The next one: we use an opaque color as the background for our badges too. So what happens there is the badge background is primary at low opacity, and the text uses the new colors we just talked about, primary-accent or secondary-accent, which are new variables.

Dark mode bg #101012

Head to account settings to schedule a wipe, or squint at the privacy policy first.

Primary Secondary
#a2c1ffprimary-accent10.5:1 · AAA ✓
#c9a8ffsecondary-accent9.5:1 · AAA ✓
Light mode bg #f0f1eb

Head to account settings to schedule a wipe, or squint at the privacy policy first.

Primary Secondary
#0d2b91primary-accent10.4:1 · AAA ✓
#471d86secondary-accent10.3:1 · AAA ✓
The fix, live: same sentence, same backgrounds, new text-only tokens. primary-accent and secondary-accent never paint a surface: buttons keep the originals, links use the accents, and badges pair the original color at low opacity with accent text. All four now clear WCAG AAA (7:1).

All these little rules add up, and nobody remembers them all. That's exactly where consistency starts to rot. So having a skill on Claude documenting these kinds of nuances on how to tackle new code generation for design helps a lot. Those skill files give the AI agent more context to perform the task in a way that matches the outcomes we already agreed on.

And it goes beyond the design nuances. Design reviews, code reviews, rebasing, pushing, pulling, creating a new branch. All the things that used to take more time for us not-technical, not-always-coding people are now easily accessible using AI agents.

The new workflow

So the workflow with an AI agent now looks like this:

A mere designer can now get a front end change up and running without bothering other developers with these minute changes. Basically you have additional manpower to fix your website LOL.

With that said, it still took me a fair bit of time fixing light mode and dark mode across the Redact app and frontsite. This isn't magic, it's just fewer bottlenecks.

One of the pretty cool parts of having a coding agent: they can code a visual placeholder instead of using images. Which is dope. And that coded placeholder can be animated, so it's much faster than loading a GIF or video on your site. A plus for the devs.

Though the additional lines of code are a slight headache for that concession.

The extra manpower was inside us all along

Here's the thing AI actually did for us. It didn't replace anyone. It created additional manpower out of people who were already on the team. A designer who can ship front end changes. A non-coder who can rebase a branch. In a low-manpower startup, that's the difference between light mode shipping now or sitting in the backlog for another quarter.

I think more companies should work this way, and most of them won't, for one reason: people stepping on other people's toes. A designer pushing code feels like trespassing on developer territory. I get it. But nothing here removes the guardrails. Agents review the code, developers still have the final say, and nothing merges without a human. The territory didn't shrink. The team just got bigger.

The point was never to claim anyone's territory. It was to stop losing quarters to a backlog nobody had hands for.

Redact has a light mode now. The security app finally looks like what it is: safe. And it got there because the line between design and development got blurry, in a good way.

Yow, what's up? 👋

Want a designer who ships to production?

raymarlobaton@gmail.com