Signal

Signal's iOS app is the calmest messaging surface on the platform, and the calm is the point.

Back to all styles

A live page in this style is not built yet — the CSS variables and the prompt below are enough to reproduce it.

At a glance

24tokens
7type steps
2radius steps
2pxspacing base

Signal, in one page

Signal's iOS app is the calmest messaging surface on the platform, and the calm is the point. There is no feed, no Stories ring vying for a tap, no badge gamification, no ad slot, no vanity metric. The canvas is plain white (#FFFFFF) in light mode and a soft near-black (#1B1B1B) in dark mode, and the entire interface is built from three ingredients: a list of conversations, a thread of bubbles, and one accent — Signal Blue (#3A76F0). The restraint communicates the product thesis before a single word of copy: this app's job is to move your message privately and then get out of the way.

The chat thread is the heart of the design. Outgoing messages are Signal Blue bubbles with white text, right-aligned; incoming messages are a neutral gray (#E9E9EB light, #2A2A2A dark) with primary-color text, left-aligned. Bubbles use a generous corner radius (18pt) with a subtle tail-side tightening so a run of messages from the same sender visually groups. The send affordance is a single filled blue circle with an upward arrow — it appears only when there is text to send, sliding up from the composer with a brief spring. Nothing pulses, nothing demands attention. Privacy primitives are surfaced as quiet glyphs rather than marketing: a small lock for sealed-sender, a clock-ring chip for disappearing-message timers, a shield in safety-number screens.

Typography is Inter throughout — a neutral, highly legible humanist sans at weights 400 / 500 / 700. There is no display type, no editorial flourish; the largest text in the steady-state UI is a 17pt conversation name. The hierarchy is functional: conversation names at 17pt medium, message bodies at 16pt regular, timestamps and read receipts at 12pt regular gray. The app trusts plain, well-set text and a single trustworthy blue. The aesthetic could be summarized as "a utility you'd want handling a sensitive conversation": neutral, quiet, predictable, and visually honest — never trying to capture attention it doesn't need.

Key Characteristics:

Do's and don'ts

Do

  • Keep it privacy-minimal: no ads, no algorithmic feed, no vanity counts — calm is the brand
  • Use white (#FFFFFF) / soft-black (#1B1B1B) canvases — never pure #000000
  • Reserve Signal Blue (#3A76F0) for outgoing bubbles, the send button, links, and primary actions
  • Make outgoing bubbles blue with white text; incoming neutral gray with primary text
  • Show the send circle only when there's text; revert to a mic glyph when empty
  • Render disappearing-timer state as a quiet gray clock-ring chip, never a marketing banner
  • Group same-sender bubbles by tightening the tail corner to 6pt
  • Set everything in Inter at weights 400/500/700 only

Don't

  • Don't add ads, Stories pressure, streaks, or like-counts — the absence is the feature
  • Don't introduce a second accent color — blue is the only one
  • Don't put shadows on bubbles — they separate by fill contrast, not elevation
  • Don't use pure black canvas in dark mode — #1B1B1B is the soft-black target
  • Don't show the send button when the composer is empty
  • Don't shout about privacy — sealed-sender and timers are quiet glyphs, not banners
  • Don't use display-size type — the 28pt large title is the ceiling
  • Don't color body text — only links and the active tab are blue

Copy this into your AI builder

Paste it as-is. Every value below was measured from the original site, not guessed.

Assembled from the measured tokens — the source document has no prompt block.

Build a page in the Signal design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- Signal Blue: #3a76f0
- Signal Blue Pressed: #2f5fcc
- Signal Blue Tint: #e7eefd
- Canvas White: #ffffff
- Surface Gray: #f5f5f5
- Incoming Bubble: #e9e9eb
- Divider: #e5e5e5
- Text Primary: #000000
- Text Secondary: #6b6b6b
- Text Tertiary: #9a9a9a

Type:
- families: Inter, Fallback Stack, Weights, SF Mono
- scale: 10, 12, 13, 15, 16, 17, 28
- weights: 400, 500, 600, 700

Shape:
- radius: 10, 18

Spacing: 2, 9, 14

Rules:
- Keep it privacy-minimal: no ads, no algorithmic feed, no vanity counts — calm is the brand
- Use white (`#FFFFFF`) / soft-black (`#1B1B1B`) canvases — never pure `#000000`
- Reserve Signal Blue (`#3A76F0`) for outgoing bubbles, the send button, links, and primary actions
- Make outgoing bubbles blue with white text; incoming neutral gray with primary text
- Show the send circle only when there's text; revert to a mic glyph when empty
- Render disappearing-timer state as a quiet gray clock-ring chip, never a marketing banner

Avoid:
- Don't add ads, Stories pressure, streaks, or like-counts — the absence is the feature
- Don't introduce a second accent color — blue is the only one
- Don't put shadows on bubbles — they separate by fill contrast, not elevation
- Don't use pure black canvas in dark mode — `#1B1B1B` is the soft-black target
- Don't show the send button when the composer is empty
- Don't shout about privacy — sealed-sender and timers are quiet glyphs, not banners

Keep every value literal. If a token is given, use that exact value.

The specification

Colour paletteRead the full spec

Primary

  • Signal Blue (#3A76F0): Outgoing message bubble, send button, links, primary buttons, active tab, selection.
  • Signal Blue Pressed (#2F5FCC): Pressed/active state for blue buttons and the send circle.
  • Signal Blue Tint (#E7EEFD): Light-mode selected row, blue-wash backgrounds (link previews on outgoing).

Canvas & Surface (Light)

  • Canvas White (#FFFFFF): Conversation list, chat background, navigation bars.
  • Surface Gray (#F5F5F5): Grouped settings sections, search field, composer field background.
  • Incoming Bubble (#E9E9EB): Left-aligned received message bubble.
  • Divider (#E5E5E5): Hairline dividers between conversation rows, settings rows.
  • Text Primary (#000000): Conversation names, incoming message text, primary labels.
  • Text Secondary (#6B6B6B): Message previews, timestamps, read receipts, secondary labels.
  • Text Tertiary (#9A9A9A): Placeholders, disabled labels.

Canvas & Surface (Dark)

  • Dark Canvas (#1B1B1B): Conversation list, chat background.
  • Dark Surface (#2A2A2A): Grouped sections, search field, incoming bubble (dark).
  • Dark Divider (#3A3A3A): Hairline dividers in dark mode.
  • Dark Text Primary (#FFFFFF): Conversation names, incoming text (dark).
  • Dark Text Secondary (#9A9A9A): Previews, timestamps (dark).
  • Dark Incoming Bubble (#2A2A2A): Received message bubble in dark mode.

Message-Specific

  • Outgoing Bubble (#3A76F0): Sent message background (both modes).
  • Outgoing Text (#FFFFFF): Text on outgoing bubbles (both modes).
  • Outgoing Meta (#CBD9F9): Timestamp + read check inside an outgoing bubble (soft blue-white).
  • Read Check Blue (#3A76F0): Double-check "read" indicator on outgoing.

Semantic

  • Disappearing Timer (#6B6B6B): Clock-ring chip color (neutral — privacy is quiet, not loud).
  • Sealed Sender Lock (#6B6B6B): Lock glyph tint in message info.
  • Safety Shield (#3A76F0): Verified safety-number shield accent.
  • Error Red (#D7263D): Failed-to-send retry, destructive "Delete" actions.
  • Success Green (#3AB54A): "Saved", verified-checkmark confirmations.
Type scaleRead the full spec

Font Family

  • Primary: Inter (humanist sans — neutral, highly legible at message sizes)
  • Fallback Stack: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif
  • Monospace (safety numbers): 'SF Mono', ui-monospace, Menlo, monospace — the 60-digit safety number is grouped monospace
  • Weights: 400 (regular), 500 (medium), 700 (bold)

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Large TitleInter28pt7001.2-0.3pt"Chats" nav large title
Conversation NameInter17pt5001.30ptRow title in the chat list
Thread TitleInter17pt6001.250ptContact name in the chat header
Message BodyInter16pt4001.40ptThe bubble text — core reading size
Message PreviewInter15pt4001.30ptLast-message snippet in chat list
Section HeaderInter13pt6001.20.4pt"CONTACTS", grouped settings headers (uppercase)
Timestamp (Row)Inter13pt4001.20ptTime on a conversation row
Bubble MetaInter12pt4001.20ptTime + read check inside a bubble
Read ReceiptInter12pt4001.20pt"Read 9:41 PM" under last outgoing
Button (Primary)Inter16pt6001.00ptBlue "Send"/"Next"/"Create" labels
Button (Text)Inter16pt4001.00ptBlue text actions ("Edit", "Cancel")
Tab LabelInter10pt5001.00.1ptBottom tab bar labels
Timer ChipInter12pt5001.00ptDisappearing-message duration ("1w", "8h")
Safety NumberSF Mono15pt4001.50.5pt60-digit grouped safety number
System MessageInter13pt4001.350pt"Messages are end-to-end encrypted" centered note

Principles

  • One typeface, three weights: Inter 400/500/700 only — no display, no condensed, no italic for UI
  • Message body at 16pt / line-height 1.4: comfortable reading without wasted vertical space
  • System notices are centered, gray, small: encryption + safety messages whisper, never shout
  • Safety number is monospace and grouped: 5-digit chunks for human verification
  • Dynamic Type respected on names, message bodies, previews; tab labels and bubble meta are layout-fixed
  • No color in text except links and the active tab — blue is structural, content text is neutral
Components and layoutRead the full spec

Buttons

Send Button (Signature)

  • Shape: Circle, diameter 32pt (composer-trailing)
  • Background: #3A76F0
  • Icon: upward arrow glyph arrow.up, 16pt, #FFFFFF
  • Visibility: hidden when composer is empty; slides up + fades in (180ms spring) when text exists
  • Pressed: scale 0.90, background #2F5FCC, soft haptic
  • Voice-note alternate: when empty, a microphone glyph replaces send (same circle)

Primary Button ("Next", "Create Group", "Verify")

  • Background: #3A76F0
  • Text: #FFFFFF, Inter 16pt weight 600
  • Padding: 14pt vertical, full-width (28pt horizontal inset)
  • Corner radius: 10pt
  • Pressed: #2F5FCC, scale 0.99

Text Button ("Edit", "Cancel", "Add")

  • Inter 16pt weight 400 (600 if it's the confirming action)
  • Color: #3A76F0
  • No background; 44pt hit area; pressed opacity 0.5

Destructive Action ("Delete", "Block", "Leave")

  • Text/label color: #D7263D
  • Same geometry as text button or list-row trailing

Icon Action (Attach, Camera, Voice, Call, Video)

  • Glyph 22pt, hit area 44pt
  • Default: #6B6B6B (light) / #9A9A9A (dark)
  • Active/primary (call accept): #3AB54A; (call in header): #3A76F0

Cards & Containers

Conversation Row

  • Height: 72pt
  • Layout: 48pt circular avatar (leading) → name (17pt w500) + last-message preview (15pt w400 #6B6B6B, 1-line clamp) → trailing column: timestamp (13pt #6B6B6B) + unread pill
  • Unread pill: #3A76F0 filled circle, white count, min 20pt; muted convo shows a bell-slash glyph instead
  • Disappearing-on conversation: a small clock-ring glyph trails the name
  • Background: canvas; pressed #F5F5F5 (light) / #2A2A2A (dark)
  • Divider: hairline #E5E5E5 inset to text origin (not under avatar)

Message Bubble — Outgoing

  • Background: #3A76F0
  • Text: #FFFFFF, Inter 16pt w400
  • Padding: 9pt vertical, 13pt horizontal
  • Corner radius: 18pt, with the bottom-right corner tightened to 6pt on the last bubble of a same-sender run (tail)
  • Meta: time + read check inside, bottom-right, 12pt #CBD9F9
  • Max width: 75% of thread width; right-aligned with 12pt trailing inset

Message Bubble — Incoming

  • Background: #E9E9EB (light) / #2A2A2A (dark)
  • Text: #000000 (light) / #FFFFFF (dark), Inter 16pt w400
  • Corner radius: 18pt, bottom-left tightened to 6pt on last of run (tail)
  • Meta: time below or trailing, 12pt #6B6B6B
  • Max width: 75%; left-aligned with 12pt leading inset; group sender avatar shown once at the run's bottom

Disappearing-Message Timer Chip (Signature)

  • A pill: clock-ring glyph + duration label (Inter 12pt w500)
  • Color: #6B6B6B glyph + text; background transparent (chat header) or #F5F5F5 (settings)
  • Placed beside the thread title and in the conversation settings
  • Selecting opens a duration picker (Off / 30s / 5m / 1h / 8h / 1d / 1w / custom)

System / Encryption Note

  • Centered, full-width, Inter 13pt w400 #6B6B6B
  • "Messages and calls are end-to-end encrypted." with a tiny lock glyph leading
  • No background; 12pt vertical padding; appears at the top of every new thread

Settings Group

  • Grouped list on #F5F5F5 (light) / #1B1B1B (dark) base, rows on canvas
  • Row height 50pt, leading SF-style glyph 22pt #3A76F0, title 16pt w400, trailing chevron / toggle
  • Section header 13pt w600 uppercase #6B6B6B, 0.4pt tracking

Navigation

Bottom Tab Bar

  • Height: 50pt + safe area
  • Background: #FFFFFF (light) / #1B1B1B (dark), top hairline #E5E5E5 / #3A3A3A
  • Tabs: Chats, Calls, Stories, Settings
  • Icon 24pt; active #3A76F0, inactive #6B6B6B / #9A9A9A
  • Labels: Inter 10pt w500, always shown
  • Chats tab: unread total badge (red dot or count) #3A76F0

Chat List Top Bar

  • Large title "Chats" (28pt w700) collapsing to inline on scroll
  • Trailing: compose glyph (pencil-in-square) 22pt #3A76F0
  • Below title: search field — #F5F5F5 fill, 36pt, corner radius 10pt, placeholder "Search"
  • Leading (on scroll): profile avatar 28pt circular

Thread Header

  • Height: 44pt + safe area, canvas background, bottom hairline
  • Leading: back chevron 22pt #3A76F0 + 32pt avatar + name (17pt w600) + (timer chip if on)
  • Trailing: video-call glyph + audio-call glyph, 22pt #3A76F0, 20pt gap
  • Tap name/avatar: opens conversation settings

Input Fields

Composer

  • Container: pill, #F5F5F5 (light) / #2A2A2A (dark), min height 36pt, corner radius 18pt, 12pt horizontal inset from edges
  • Leading: plus/attach glyph 22pt #6B6B6B
  • Field: Inter 16pt w400, placeholder "Signal message" #9A9A9A, grows to 5 lines then scrolls
  • Trailing inside pill: camera glyph; outside pill: the blue send circle (or mic when empty)
  • Focus: no border change; keyboard accessory stays pinned

Search Field

  • Background: #F5F5F5 (light) / #2A2A2A (dark)
  • Height: 36pt, corner radius 10pt
  • Leading magnifier 16pt #6B6B6B, placeholder "Search" #9A9A9A
  • Focus: cursor #3A76F0, optional "Cancel" text button appears trailing

Distinctive Components

Privacy-Minimal Stance

  • No ads, no algorithmic feed, no Stories pressure (Stories tab exists but is opt-in and quiet), no read-streaks, no like-counts
  • Every screen is either a list, a thread, or a settings group — the absence of clutter is the design
Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375pt64pt rows, bubble max 78% width
iPhone 13/14/15390ptStandard — 72pt rows
iPhone 15/16 Pro393ptDynamic Island clears the header
iPhone 15/16 Pro Max430ptLarger avatars (52pt), wider thread
iPad768pt+Master-detail split: list (left, 360pt) + thread (right)

Dynamic Type

  • Conversation names, message bodies, previews: full scale
  • Message body caps at ~22pt; bubble grows with content
  • Bubble meta, timestamps, tab labels: layout-fixed (do not scale)
  • Safety number: scales one step then clamps (grouping must stay aligned)

Orientation

  • Chat list / thread / settings: portrait + landscape (landscape widens thread, keeps single column on phone)
  • iPad: split view in both orientations
  • Media viewer: rotates freely

Touch Targets

  • Send circle: 32pt visual, 44pt effective hit
  • Conversation rows: full 72pt row tappable
  • Composer attach/camera glyphs: 44pt hit
  • Tab items: 24pt icon, 49pt hit

Safe Area Handling

  • Top: large title + search respect safe area / Dynamic Island
  • Bottom: composer + tab bar respect home indicator; keyboard pushes composer above keyboard inset
  • Sides: 12pt thread insets, 16pt list insets

Drop-in CSS variables

The same values as a theme block. Add the class to <body> and the site repaints.

body.theme-signal {--page-bg: #ffffff;
  --page-bg-gradient: none;
  --text-color: #000000;
  --heading-color: #000000;
  --link-color: #2769ef;
  --link-hover-color: #1050d3;
  --border-color: #d1d1d1;
  --card-bg: #ffffff;
  --card-shadow: 0 1px 2px rgba(0,0,0,0.06);
  --card-hover-shadow: 0 6px 18px rgba(0,0,0,0.12);
  --header-bg: #000000;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #ffffff;
  --footer-text-color: #595959;
  --button-bg: #3a76f0;
  --button-text-color: #000000;
  --button-hover-bg: #1157e6;
  --button-border: none;
  --button-border-radius: 18px;
  --button-secondary-bg: #f0f0f0;
  --button-secondary-text-color: #000000;
  --button-secondary-hover-bg: #e0e0e0;
  --button-secondary-border: 1px solid #d1d1d1;
  --prompt-bg: #f2f2f2;
  --prompt-text-color: #000000;
  --base-font: var(--font-inter);
  --heading-font: var(--font-mono);
  --card-border-radius: 18px;
}

Download theme.css

Visually close to

Measured with a deterministic colour + geometry comparison across 958 styles. Not a hand-picked list.

Where this came from

Source document
ios/design-md/messaging/signal/DESIGN.md · 21.8 KB
Repository
Meliwat/awesome-ios-design-md
Licence
MIT

Source text is reproduced under its original licence. Tokens, similarity scores and page structure are ours.