01 · INTER — DISPLAY
Build product decisions that compound
H1 · 52/1.05
The Findry loop
H3 · 28/1.2
One gap, 330 degrees of arc
NO SERIF · NO ITALIC · MECHANICAL SANS THROUGHOUT
02 · INTER — BODY + JETBRAINS MONO
Findry is where product hypotheses live, get tested, and get validated. The body voice is calm, declarative — never hyped. Never italic.
JETBRAINS MONO · META 0.18–0.22em tracking
FINDRY · LOGOTYPE v1.0 · 25 APR 2026 ● SIGNALS
--font-display: var(--font-inter), 'PP Neue Montreal', Söhne, system-ui, sans-serif
--font-body: var(--font-inter), 'PP Neue Montreal', Inter, system-ui, sans-serif
--font-mono: var(--font-jetbrains-mono), JetBrains Mono, Fira Code, monospace
03 · NIGHT — FOUNDRY INTERIOR
OVERLAY · MODALS
DAYLIGHT · FG ON NIGHT
#B8B6B0
daylight-soft
9.5:1
#76767E
daylight-mute
4.3:1
#4A4A52
daylight-faint
2.2:1
04 · PAPER — COOL NEUTRAL LIGHT
INK · FG ON PAPER
05 · HEAT — THE SIGNATURE
TEMPERED ORANGE · USE SPARINGLY — ONE ACCENT PER COMPOSITION
#C2410C
gold-deep · pressed
Findry IN USE
Findry canonical aliases: --color-heat (#EA580C) · --color-heat-deep (#C2410C) · --color-heat-glow (18%) · --color-heat-whisper (6%)
06 · SEMANTIC — STATUS ONLY
QUIET — NEVER DECORATIVE
WASH + LINE SCALES
open running pending invalid valid closed
Heat is precious, not decorative. Heat marks focus and selection. It never fills a hover state or a background.
State Token Pattern Default (rest) --night-raised Background or border on rest state Hover --color-heat-whisper bg OR --border-strong border Never heat fill on hover Focus --color-heat outline, 2px, offset 2px Heat is the focus indicator Selected/Active --color-heat fill or --color-heat-border border Heat marks selection Disabled --night-edge border + --daylight-faint text No heat on disabled
10 · MOTION — TOKEN-DRIVEN
dur-1 · 120ms · hover
dur-2 · 200ms · default
dur-3 · 320ms · layout
dur-4 · 560ms · entrance
no bounces · no springs
EASING CURVES
ease-soft cubic-bezier(0.4, 0, 0.2, 1) ease-out cubic-bezier(0.22, 1, 0.36, 1) ease-in cubic-bezier(0.4, 0, 1, 1)
prefers-reduced-motion: reduce → specimens go static. All motion communicates state only.
11 · BUTTONS
Add signal Cancel Discard Invalidate
Save draft Save Commit bet
Primary: bg --gold · hover --gold-deep · text --night · font-weight 500 Secondary: bg --night-raised · border --night-edge · hover --color-heat-whisper wash Danger: bg --err-wash · border --err-line · text --err
13 · BADGE + PILL
BADGE · SQUARE RADIUS · CATEGORY TAGS
Label Outline Heat With dot
Signals Hypotheses Tests Bets Outcomes Pulse
PILL · ROUND RADIUS · STATUS TAGS
open running pending closed invalid valid
Badge radius: --radius-xs (2px) → categorical. Pill radius: 999px → sequential status.
14 · AVATAR
SIZE SCALE
ACCENT COLORS
AC BS CR DM EF
Initials from name (max 2 chars). Optional accentColor overrides border + text color.
15 · SEPARATOR
HORIZONTAL · PLAIN
HORIZONTAL · WITH LABEL
or continue with
3 signals · 1 active test
VERTICAL · IN FLEX ROW
Signals Hypotheses Tests
16 · SKELETON — LOADING STATES
RECT · CARD PLACEHOLDER
TEXT LINES
CIRCLE · AVATAR PLACEHOLDER
COMPOSITE · CARD SKELETON
17 · EMPTY STATE
No signals yet
Signals are the raw observations and data points that feed your hypotheses. Add your first one to get started.
Add signal
No active tests
Commit a hypothesis to a bet to start running tests.
17B · PHASE EMPTY STATES (LOOP-AWARE)
TEACHING — entry point, no upstream SIGNALS · 0 Signals are raw observations — a user quote, a support ticket, a data point. Everything you'll eventually ship should trace back to at least one.
BLOCKED — needs upstream content first HYPOTHESES · 0 Hypotheses are built from signals. Capture 2–3 first, then come back to articulate what they suggest.
READY — upstream has content, proceed HYPOTHESES · 0 12 signals captured Ready to articulate a hypothesis from what you’ve seen?
READY — with inline action rows (Bets) BETS · 0 3 supported hypotheses ready to promote Pick the strongest one and stake a sprint on it. RICE, predicted impact, owner, ship date — all in writing before code.
0.78 Onboarding tooltip drives 1st-week activation Promote
0.71 Inline pricing on /vs page lifts trial signups Promote
0.66 Slack capture cuts time-to-first-signal Promote
DIAGNOSTIC — Outcomes integration health OUTCOMES · 0 Outcomes close the loop. The first HIT/MISS/PARTIAL lands here automatically once a tracker reports on a shipped bet.
4 bets shipped Tracker: PostHog connected Awaiting first metric report DIAGNOSTIC — needs tracker connection OUTCOMES · 0 Outcomes close the loop. Connect your analytics tracker so verdicts can be detected automatically.
2 bets shipped Tracker: not connected FILTERED — for any phase SIGNALS · 0 · FILTERED No signals match these filters. Try widening the source list or removing the date range.
17C · INTEGRATION LOGOS — MONOCHROME (CURRENTCOLOR)
RESTING — daylight-soft ACTIVE — daylight 18 · TOAST — NOTIFICATIONS
STATIC PREVIEW — LIVE SYSTEM VIA useToast() + TOASTER PROVIDER
Hypothesis H-042 updated by @paulo Test committed — running for 5% cohort Signal confidence below threshold (62%) Failed to save — check connection Provider: <Toaster /> at root layout (fixed bottom-right)
Usage: const {toast} = useToast(); toast('msg', 'success')
Stack: max 5 · auto-dismiss 4s · entrance translateY(8px) 200ms
19 · CARDS — HYPOTHESIS PATTERN
Hypotheses running
Digest mode drives weekly retention
PA @paulo · 3 signals
H-041 closed
Onboarding compresses to 3 steps
validated · shipped 12 Apr
20 · EYEBROW — TWO MODES
A · MARKETING · SECTION LABEL Inter · 11px · 0.12em · uppercase
For product teams who build on evidence The state of things
B · PRODUCT META · DATA LABELS JetBrains Mono · 0.18–0.22em
H-0042 · BETS ● RUNNING v0.2.3
Marketing eyebrows: Inter 11/0.12em, uppercase, heat orange. Product meta (IDs, versions, status): Mono 0.18–0.22em — reserved for data signals.