Product · Feature Flags

Ship dark.
Flip live from the delta.

Every flag in Trunk belongs to the delta that added it. Toggle on, ramp to 10%, split A/B — all from the same tab you shipped from. The signal that validates the flag is one link away, not in a separate tool with a separate login.

trunk.dev/norrland/norrland-shop/main/flags
All flags
6
Shape: any State: live Owner: any Delta: any
Sort: Recently changed
Every flag is attached to the delta that added it. Toggle on/off, ramp a rollout, or run an A/B — all from here. When a flag has been at 100% for 30 days, Trunk queues a cleanup delta that removes the wrapper.
cart.empty_state_v2
delta #7 · Sam · pending cleanup in 18d
Release 100% 12d on
checkout.new_address_form
delta #140 · Sam · rollout stage 3 of 4
Rollout 25% 2d at 25%
header.semantic_v2
delta #138 · Chen · winner B (+26.6%)
A/B 50/50 7d
checkout.place_order_copy
delta #141 · Nora · pending cleanup
Release 100% 30d on
nav.right_rail_recs
delta #144 · draft · not rolled out
Release 0% draft
auth.skip_login_returning
delta #138 · Chen
Rollout 10% 1d at 10%
trunk.dev/norrland/norrland-shop/main/flags/checkout-address-form
Flags / checkout.new_address_form Rollout stage 3 of 4 · 25%

Postal-code-first address entry with autofill. Rolled out gradually so each stage's TTFB signal clears before advancing.

Rollout stages
Gated by signals.ttfb_p95
Stage 1 · internal
Team members
✓ passedJul 18
Stage 2 · 10% traffic
Gate: TTFB p95 < 500ms
✓ 380msJul 20
Stage 3 · 25% traffic
Gate: TTFB p95 < 400ms · watching
395ms2d
Stage 4 · 100%
Gate: TTFB p95 < 400ms for 24h
—pending
Owned by
Delta #140 · Sam
3 links
Delta
#140 · Postal-code address form
Open →
PRD
Checkout address v2
Read →
Validating signal
TTFB p95
395ms · watching
Experiment header.semantic_v2
A/B · 7 days in
Control · A
2.14%
checkout conversion
Variant · B
2.71%
+26.6% lift · p<0.01
Ready to graduate.
Targeting cart.empty_state_v2
Who sees this flag
IF user.plan = "pro"
OR user.country in ["SE","NO","FI"]
AND NOT user.opted_out
Matches 3,481 users · rules versioned with the delta
One SDK · one place

Ship dark. Flip live.

Wrap new code in a flag and merge to main. The code is in production but off. Flip it on for yourself, then 10%, then everyone — from the same tab that owns the delta.

No separate flag vendor. No copy-pasting flag keys between dashboards. When the flag is retired, Trunk opens a cleanup delta that removes the wrapper.

cart.tsx
// One import — same SDK as Signals
import { trunk } from "@trunk/sdk";

// Wrap the new code path in a flag
if (trunk.flag("cart.empty_state_v2")) {
  return <EmptyStateV2 />;
}
return <EmptyStateV1 />;

// A/B — Trunk splits, tracks, and picks a winner
const variant = trunk.experiment("header.semantic_v2");
return variant === "B" ? <HeaderB /> : <HeaderA />;
Three shapes · one tab

Release · Rollout · Experiment.

Every flag in Trunk fits one of three shapes. Each one is tied back to the delta that added it and the signal that will validate it.

Release
On / off · kill switch

Ship code dark, flip on when ready. One click reverts if a Signal alerts. The kill is the flag — no revert PR, no redeploy.

Rollout
Gradual · gated by signals

Ramp 1% → 10% → 50% → 100%. Each stage's advance gate is a Signal — no click-through until the numbers say so.

Experiment
A/B · variant selection

Split traffic across variants. Trunk runs the stats and files a "graduate winner" delta when the interval clears.

Flag · delta · signal
Every flag is born from a delta and dies from a signal.

Trunk creates the flag when the delta enters Code phase, ramps it when a Signal clears the gate, and files the cleanup delta when the flag has been at 100% for the retention window. No orphan flags. No dead code paths.

1. Delta
#142
Sam · Cart empty-state
2. Flag
empty_state_v2
on · 100% · 12 days
3. Signal
CTR +41%
validated · ready to clean up
Trunk queued cleanup delta #148 · remove empty_state_v2 wrapper

Flags connect to everything.

A flag without a delta is dead code waiting to happen. A flag without a signal is a guess. See how flags tie into the rest of Trunk.