DNA Overlay · Early access

Every control,
under control.

Permissions, feature flags, user analytics, audit logsand prototyping. Running inside your product. Anyone on your team can read it. An engineer installs it once.

Juniper Lane Your app

Click a control — the panel answers for it. Placing a control that does not exist yet.

Orders

OrderTotal
#4412 $128.00
#4411 $34.00
#4409 $212.00
DNA Overlay
Settings

Click any control

2 of 3 controls are governed by something.

Counted for this screen. It moves as you walk the product.

Pick Hover Demo mode
Inspect Prototype

Open the panel on a screen you already shipped. It counts what governs each control in front of you — two of these three.

Two modes, one panel

Read what is there. Ask for what is not.

Same install, same addresses, same panel. The second mode only works because the first one gave every control a name.

Four features, one control

Everything you already buy separately,answered in one place.

Permissions, feature flags, usage and audit are four readings of the same act. The Overlay puts them on the control itself, rather than in four consoles that have never rendered your product.

It replaces the basics of a tool in each of these categories. Not the deep end of any one of them, and that is the trade: one answer per control, in the product, instead of four subscriptions and four tabs.

Permissions

Who may press this?

Replaces the basics of Permit.io, Cerbos, or the roles table you wrote yourself.

Ask it standing on the button, and get an answer for whoever is actually looking. Change it here too — name the seats that may perform the act, or detach the rule entirely.

The subject is the act, not the button. Two controls that refund an order cannot disagree about who may refund one.

Inspect order.refund
You may Yes
Who may Fulfillment desk · Store manager

View as

Priya Raman · Store manager Yes
Avery Nunes · no seat No
Nobody · signed out No
Feature flags

Is this on, and for whom?

Replaces the basics of LaunchDarkly, Statsig, Unleash.

Flip a feature from inside the product, on the control it affects — no hunting for refund_v2_enabled in a list and hoping it still means this button.

A new flag arrives proposed and governs nothing until somebody with the authority puts it in force. Writing a rule and making it decide are separate grants.

Inspect order.refund

Policies · 2 attached

Instant refunds release On
Partial refunds proposed

Governs nothing until somebody ratifies it.

User analytics

Is anyone actually using it?

Replaces the basics of Amplitude, Mixpanel, PostHog.

How often this control has been used and by how many people, on a window the panel states rather than assumes. A control nothing has happened to has no Used row at all, rather than a row of zeroes.

And it is read, never collected — no event taxonomy to maintain, and no handlers attached to buttons you own.

Inspect order.refund
Used · last 7 days

128

times

14

people

The window is stated, not assumed.

Audit logs

Who did it, and who was stopped?

Replaces the basics of WorkOS Audit Logs, or the events table nobody reads.

Everything that has happened to this control, newest first, with the refusals drawn as refusals. Not a separate export you reconcile later — the same reading, on the same button.

Somebody who could not say who they were tried to refund an order is the most interesting line a log can hold, so an unidentified attempt is recorded like any other rather than dropped for want of a name.

Inspect order.refund

Activity

June Alcott 2m ago Performed
Avery Nunes 1h ago Refused
Unidentified 3h ago Refused
Priya Raman Yesterday Performed

Partners

Working with design partners across three domains

Legal
Media & content
Fractional ownership

We are looking for design partners we can be genuinely useful to.

Installing it

One call. That is the whole install.

No provider to mount, no components to adopt, no concepts to learn first.

// vite.config.ts — the whole installation
import { dna } from "@dna/react/vite";

export default defineConfig({
  plugins: [dna({ host: "app-billing", key: "pk_live_…" }), react()]
});

That one call stamps every element with an address, writes the overlay’s script tag into your document, publishes the build manifest if your pipeline holds a key, and prints coverage at the end of the build.

On anything else, npx dna publish reads your source directly — nothing about it is bundler-specific.

What that gets you

01

Addressable

Every control carries a stable address. You can point at a button and be understood — in a rule, in a ticket, in a conversation — instead of guessing which flag key somebody meant.

02

Bindable

An address reaches an operation — the act the control performs. Now the button has a subject, and two buttons that do the same thing are known to do the same thing.

03

Governable

Rules attach to the act. Permissions — who may perform it. Release — whether it is on at all. Usage — how often, by how many people. Audit — everything that has happened, refusals included, and who was refused.

@dna/react is in private beta. It is not on npm yet. Early-access customers get the package and half an hour of setup with us.

Seven things it will never do

It arrives in a product nobody asked it about. Every one of these is enforced, not promised.

Your markup is unchanged

Rendered output is byte-identical apart from data-dna attributes, and removing the install restores every file byte-for-byte.

It never listens to your buttons

Usage is read from occurrences the platform already writes — never collected by attaching handlers to controls you own.

It cannot fail your build

Unreachable, slow, refusing, or answering a proxy’s HTML — publishing resolves and reports. Your key is never printed, including in transport errors.

The key in your markup is powerless

It identifies the application and nothing more. Which environment this is, whether the overlay may run here, and what the viewer may do are all the server’s answer.

Nothing publishes without a key

A developer’s local build, and a pull request from a fork where the secret is unavailable, send no request at all rather than one that would be refused.

Refusals are enforced twice

The panel hides what you may not do; the server checks again and names which gate stopped a request forged past it. A rule that only exists on the client is not a rule.

Removal is one call

Take the install out and the page is exactly what it was — container, watchers, outlines and both sessionStorage entries, gone.

The same install is what makes the other mode possible: the panel can place a control that does not exist yet, drawn from your own design system and handed to a developer as an address rather than a ticket. See Prototype mode →

Included in every paid plan.

The Overlay is a surface on your model, not a product beside it, so it is never sold separately. Reading the panel is free and unlimited on all plans; we charge for authority, not for looking.

See pricing

FAQ

Do I have to replace my feature flags?

No. Start with the controls that have no governance at all, which is most of them, and leave what works alone. Teams that later consolidate do it because they wanted one answer per control, not because we required it.

What does it do to my bundle?

Almost nothing. The overlay is fetched separately rather than bundled, and can be served only where you want it. What lands in your own output is attributes, and your markup is byte-identical apart from those.

Can anyone who loads my page see our rules?

No. The publishable key carries no capabilities at all. Until somebody identifies, the panel can inspect and nothing more, and names of people are only ever returned to a caller who may govern. A roster served to anyone who views source would be a staff directory.

Does it work if my app is not React?

Vite and Next.js have a one-step install today. Beyond those, npx dna publish reads your source directly. Nothing about it is bundler-specific, so you get addresses and governance without a framework integration at all. Tell us your stack on the form; which one we deepen next is decided by who is asking.

What happens when I turn it off?

The page is exactly what it was. stop() removes the container, the watchers, the outlines and both sessionStorage entries, and taking the install out restores every file byte-for-byte.

Is this ready for production?

It runs against a live stack and every screenshot on this page was taken walking a real script. It is early access rather than generally available: the package is private, we set you up by hand, and we are looking for design partners we can be genuinely useful to.

See it on your own controls.

Install it, open the panel, and read what governs each button in your product. The answer is nothing more often than most teams expect, and that is usually a more interesting conversation than the install was.

Which parts are you interested in? Pick as many as apply.

The most useful box on this page. Rough is fine, and “nowhere, honestly” is a real answer and a common one.

We reply by hand, usually within a day. No sequence, no drip, no spam.