
A web app can have a manifest, work offline, launch in its own window, and still lose its app-like polish in one tiny settings menu. Ask people to choose between Light, Dark, and System, and the interface quietly hands them a piece of implementation logic that the product could have handled itself.
That is the useful idea behind a fresh CSS-Tricks discussion of two-state dark-mode controls. This is not a new browser capability or a change to PWA installability. It is a product-design argument with direct consequences for how installed web apps feel: follow the device until the user asks for something different, then remember the override without permanently displaying a third choice.
The familiar three-option control appears technically complete. A person can select light, dark, or whatever the operating system currently prefers. That completeness is also its weakness. “System” describes where the answer comes from, while “Light” and “Dark” describe what the person will actually see. The control mixes an implementation source with two visible outcomes.
The alternative highlighted by CSS-Tricks keeps the underlying behavior while reducing the visible interface. When the user has not made a choice, the app follows the system color scheme. If the resulting interface is light, it offers a control to switch to dark. If it is dark, it offers a control to switch to light. Once the person acts, the web app stores that explicit override for later sessions.
There are still three meaningful conditions inside the product: follow the system, force light, or force dark. The difference is that users do not need to manage all three as equal settings. They see the current result and the one action that changes it.
In a browser tab, a theme control can feel like a website preference. In an installed web app, the same control becomes part of a persistent product environment. The app may open from a launcher, occupy a standalone window, and remain part of a user’s daily workflow. Small inconsistencies become more visible because the experience is being judged alongside native and packaged applications.
A system-first default supports that context. The first launch can match the wider device environment without forcing a setup decision. A manual override remains available for someone who wants this particular app to behave differently. The product handles the default; the person handles the exception.
This will not rescue an otherwise weak app experience. It can, however, remove a small piece of friction that makes a web product feel more configured than considered.
The two-state model has a real edge case. Imagine that the system preference is light. A user opens the app, switches to dark, and later switches back to light. Should that second action create a permanent light override, or should it remove the override and return control to the system?
Those outcomes look identical at that moment, but they diverge when the operating system later changes to dark. A fixed light override stays light. A return to system follows the device.
The CSS-Tricks discussion acknowledges this ambiguity. That is important because simplifying the visible control does not eliminate the need for a product decision. It changes where that decision is made. Instead of asking every user to choose among three abstract states, the product team defines a predictable rule and tests whether it matches real behavior.
For many products, the primary control can remain binary while a secondary settings area offers Use device setting or Reset theme. That preserves an escape hatch for people who need it without making “System” a permanent peer of the two outcomes. Products with power users, accessibility-sensitive workflows, or shared devices may reasonably choose a more explicit control. Two states are a design hypothesis to test, not a universal commandment.
Nothing about this proposal changes a web app manifest, service worker, installation prompt, or browser permission. The work belongs in preference handling and interface design.
The key distinction is between effective theme and preference source. Your rendering logic needs both. Your primary interface may not.
There is no credible basis for promising that removing “System” will lift conversion or retention by a particular amount. The commercial case is simpler: settings carry a comprehension cost, and web apps compete against products whose environment often feels automatic. Every control should earn its place by helping users accomplish something they care about.
Theme switching is usually incidental to the reason someone opened an app. A project manager came to update a task. A merchant came to review an order. A creator came to publish. The best theme behavior supports that work quietly. When an interface asks users to manage its internal state model, it spends attention without advancing the job.
That makes this debate larger than dark mode. Installable web apps often expose technical history through their UX: manual install instructions, browser-specific permission explanations, offline caveats, and settings that mirror implementation details. Some of that complexity is unavoidable. The rest is product debt waiting to be removed.
IndApp will watch four practical questions as teams test this pattern:
The strongest lesson is not that every web app must delete its “System” button tomorrow. It is that app-like UX comes from hiding machinery until users actually need it. Light and dark are outcomes people can see. System is plumbing. A well-designed installable web app should think carefully before placing the plumbing in the main control panel.