Brand kit · Direction “Signal”

A precise, evidence-first identity for the people who own the competitive narrative.

RivalScope is an analyst tool, not a marketing site. The brand should feel like a calm, confident instrument — Bloomberg-grade seriousness, Linear-grade restraint. No gimmicks.

Audience
PMM & CI leads at Series B–D B2B SaaS
Position
Premium intelligence platform
Feeling
Intelligent, calm, evidence-first
Board 01 · Color & typography

Ink, paper, and a single trustworthy signal.

The neutral ramp does most of the work. Signal blue earns attention only on what matters — live indicators, evidence highlights, primary actions. Never decorative.

Ink — neutral ramp 50–900
Ink 50
#FAFAF7
oklch(0.98 0.005 90)
--brand-ink-50
Ink 100
#F2F1EC
oklch(0.95 0.006 90)
--brand-ink-100
Ink 200
#E7E5E0
oklch(0.91 0.006 90)
--brand-ink-200
Ink 300
#D4D2CC
oklch(0.85 0.006 90)
--brand-ink-300
Ink 400
#A1A1AA
oklch(0.71 0.006 270)
--brand-ink-400
Ink 500
#6B7280
oklch(0.55 0.020 260)
--brand-ink-500
Ink 600
#3F3F46
oklch(0.36 0.011 270)
--brand-ink-600
Ink 700
#27272A
oklch(0.27 0.008 270)
--brand-ink-700
Ink 800
#18181B
oklch(0.20 0.006 270)
--brand-ink-800
Ink 900
#0A0A0A
oklch(0.15 0.000 0)
--brand-ink-900
Signal — accent
Signal
#1F6FEB
oklch(0.58 0.18 255)
--brand-signal
Signal deep
#1859C7
oklch(0.49 0.18 255)
--brand-signal-deep
Signal soft
#E8F0FE
oklch(0.96 0.025 255)
--brand-signal-soft
Signal on dark
#5B9CFF
oklch(0.71 0.16 255)
--brand-signal-on-dark
Contrast audit (WCAG)
ForegroundBackgroundRatioResult
Ink 900Ink 5019.4:1AAA — body & UI
Ink 600Ink 509.8:1AAA — body & UI
Ink 500Ink 505.0:1AA — body & UI
SignalInk 505.1:1AA — body & UI
SignalInk 1004.8:1AA — body & UI
Ink 50Ink 90019.4:1AAA — dark mode body
Signal on darkInk 9008.1:1AAA — dark mode UI
Typography — Inter
Display · Inter 600 · -2.5% tracking · 60/64
Know what your market moved.
Heading · Inter 600 · 28/32
Every signal, sourced and dated.
Body · Inter 400 · 16/26

RivalScope watches every public surface — pricing, careers, product pages, press — and gives you one evidence-backed feed of what actually moved. No noise. No screenshots in Slack.

Caption · Inter 500 · 12/16 · UPPERCASE 0.12em
Pricing change · 94% confidence · 2h ago
Mono · JetBrains Mono · evidence & timestamps
acme.com/pricing · diff +$30/mo · captured 2026-04-23T08:14Z
Dark mode variant
Dashboard surface · ink 900
Acme Corp raised Pro plan from $49 → $79/mo
Annual billing now offers a 2-month discount · captured 2h ago
94% confidence
Board 02 · Logo concepts

The RivalScope reticle — always tracking.

The mark is a precision scope: a clean circular lens, four short reticle tick marks at 12 / 3 / 6 / 9 o'clock, and a single accent-colored target dot at the center. It reads as a scope first — look again and it's a quiet, confident promise that something specific is being watched.

Hidden meaning

The lens, the four ticks, and the locked-on target dot together read as a scope — the universal symbol for precision observation. The hidden read: we are watching this specific competitor for you, deliberately, and we will not miss the change that matters.

The mark scales cleanly from 16 px favicon to large-format use. The reticle target dot flips to signal blue on light backgrounds and emerald on dark surfaces, matching the existing accent token pair.

RivalScope
Hover me
Micro-interaction

Hover to see the reticle pulse — the only motion in the mark, like a scope acquiring its target.

One pulse per hover, ~5.5s cycle. Auto-disabled for visitors with prefers-reduced-motion set, so the mark stays still for anyone who has opted out of motion.

Primary · light background
RivalScope
Primary · dark background
RivalScope
RivalScope
RivalScope
Icon · 96px
/brand/logo-icon.svg
Favicon · 32px
/brand/favicon.svg
Single-color
/brand/logo-icon-mono.svg
App icon · rounded square
RivalScope monogram
/brand/logo-monogram.svg
Clear space — minimum 1× the icon height on all sides
RivalScope
Board 03 · Brand in action

Applied to the surfaces that matter.

The most important touchpoint is the marketing landing page. Below: the live-feed product preview, the auth shell, and the OG card for shared links.

Landing — hero
Competitive intelligence, automated

Know what your competitors changed, before your team has to ask.

Start monitoring free See a live feed
Product — live signal feed
  • PricingAcme Corp raised Pro plan from $49 → $79/mo
    94% confidence
  • HiringGlobex posted 8 new engineering roles
    88% confidence
  • ProductInitech shipped a Team Analytics dashboard
    91% confidence
Auth — sign in
RivalScope

Sign in

Welcome back. Pick up where the signals left off.

Email
you@company.com
Password
••••••••
Sign in
Open Graph card · 1200×630
OG image preview
Board 04 · Guidelines

How to use the brand without breaking it.

Color usage

  • Ink 900 on Ink 50 for body and UI. Ink 600 for secondary, Ink 500 for tertiary.
  • Signal blue is reserved for the live pulse, evidence highlights, primary CTAs, and confidence indicators.
  • Use Signal soft (#E8F0FE) only as a backdrop behind Signal text or chips — never as a section background.
  • On dark surfaces, swap Signal → Signal-on-dark (#5B9CFF) to maintain AAA legibility.
  • Never use Signal for decorative gradients, hero backgrounds, or to indicate danger/warning.

Type hierarchy

  • Display & headings: Inter 600, tight tracking (-0.025em on h1, -0.015em on h2/h3).
  • Body: Inter 400, leading-relaxed (≈1.6), Ink 600 over Ink 50.
  • Eyebrows / labels: Inter 500, 12px, UPPERCASE, 0.12em tracking, Ink 500.
  • Evidence and timestamps: JetBrains Mono 14px — signals the data is captured, not editorial.
  • Never set body copy in display weights or all-caps. Never mix more than two weights on one screen.

Voice & tone

Precise · Calm · Evidence-first · Never breathless

Headline
“Know what your competitors changed, before your team has to ask.”
Onboarding welcome
“Add the first competitor. First material change typically lands Under 24h.”
Empty state
“No signals yet. We're watching — quiet is a finding too.”
Error
“We couldn't reach that source. Retrying in 60s — your watch is unaffected.”
Call-to-action
“Start Monitoring” · “Open the brief” · “Add a competitor”

Accessibility standards

  • All body text and primary UI passes WCAG AA (≥4.5:1). Most pairings hit AAA.
  • Never communicate a signal with color alone — pair every Signal-blue element with a label, percentage, or icon.
  • Focus rings use a 2px ink offset + 2px ink ring on light, swap to Signal-on-dark on dark.
  • Logo carries an explicit aria-label. The icon-only mark is treated as decorative when used alongside the wordmark.
  • Animation: respect prefers-reduced-motion. The live pulse degrades to a static dot.
Exports

Asset package.

Everything below is shipped in /public/brand and wired through globals.css. Drag any file straight into Figma, Notion, or a deck.

AssetPathOpen
Logo · wordmark (light)/brand/logo-wordmark.svgOpen
Logo · wordmark (dark)/brand/logo-wordmark-dark.svgOpen
Logo · wordmark PNG 1×/brand/logo-wordmark.pngOpen
Logo · wordmark PNG 2×/brand/logo-wordmark@2x.pngOpen
Logo · wordmark PNG 3×/brand/logo-wordmark@3x.pngOpen
Logo · icon (light bg)/brand/logo-icon.svgOpen
Logo · icon (dark bg)/brand/logo-icon-dark.svgOpen
Logo · icon (single-color)/brand/logo-icon-mono.svgOpen
Monogram · RivalScope/brand/logo-monogram.svgOpen
App icon · 1024 SVG/brand/app-icon.svgOpen
App icon · 1024 PNG/brand/app-icon-1024.pngOpen
Favicon · SVG/brand/favicon.svgOpen
Favicon · PNG 32/brand/favicon-32.pngOpen
Favicon · PNG 64/brand/favicon-64.pngOpen
Favicon · PNG 96/brand/favicon-96.pngOpen
Open Graph · SVG source/brand/og-image.svgOpen
Open Graph · PNG 1200×630/og-image.pngOpen
Design tokens · DTCG JSON (Figma)/brand/tokens.jsonOpen

Design tokens live as CSS custom properties in src/app/globals.css under the --brand-* namespace, and are consumed by the existing --mkt-* surface tokens used across the marketing routes. The same values are mirrored to /brand/tokens.json in W3C Design Token Community Group format so Figma plugins (Tokens Studio, Variables) can import the brand palette directly. Edit globals.css first, then re-mirror to tokens.json by hand — the sync step is documented in replit.md.