Threads

Threads is Meta's answer to text-first social networking — a sister-app to Instagram that trades photos for conversation.

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
4type steps
3radius steps
8pxspacing base

Threads, in one page

Threads is Meta's answer to text-first social networking — a sister-app to Instagram that trades photos for conversation. The canvas is deliberately quiet: true black (#000000) in the default dark mode and soft paper white (#FFFFFF) in light, chosen to let long-form text breathe without the visual noise of hashtags, trending topics, or a retweet button. Where X is a newsroom, Threads is a notebook. The scroll is slower, the posts are roomier, and the negative space between ideas is part of the voice.

A Thread post is a self-contained text block sitting on a full-bleed canvas, anchored by a 36pt circular profile photo on the leading side and a thin vertical line that runs from the avatar downward to the reply row — a visual "thread" that connects the author's post to its conversation below. Reply nesting renders as an indented stack of smaller avatars with the same thread-line descending to the next reply, creating a branching visual. This thread-line is the brand's structural signature and the element that most distinguishes a Threads post from an X post. Typography carries the conversation feel: body type sits at 15pt weight 400 on generous 1.4 line height, and there are no cards, shadows, or containers around posts — just canvas, avatar, thread-line, body, and a spare 4-icon action row (heart, comment, repost, share).

The accent system is almost non-existent. Text links and @mentions render in Instagram's inherited deep blue (#2D7FF9), the like heart fills Instagram-coral (#FE2C55 — carried over from Instagram's double-tap heart), and that's essentially it. Repost and share icons stay in neutral gray on tap. No badges, no reactions menu, no blue checkmark (Threads accounts rely on Instagram's verification). The app leans heavily into Instagram Sans — Meta's proprietary face since 2022 — with its narrow apertures, tall x-height, and cursive-like ampersand. On the Threads logo in the top-center of the home screen, the "@" symbol is the entire identity; nothing else competes.

Key Characteristics:

Do's and don'ts

Do

  • Use pure black #000000 as the default dark canvas — Threads opens dark like X
  • Use the thread line (1pt vertical rule from avatar to reply row) — it's the structural signature of the app
  • Use 36pt circular avatars — larger than X's 32pt, reflecting the more photo-forward Instagram heritage
  • Use Instagram-coral (#FE2C55) for the active like heart — NOT red, a pink-leaning coral
  • Keep the action row to FOUR icons: heart, comment, repost, share — no bookmark, no views
  • Use Instagram Sans at weights 400/600/700 only — no light, no thin
  • Keep the tab bar icon-only (no labels) — matches X's minimalism
  • Use 1.4 line height on post body — the generous breathing room is part of the voice
  • Cross-fade repost icon from outline to filled (no color change) — repost stays neutral
  • Keep hashtags OUT of the feed — Threads has no trending panel, no hashtag search
  • Use Instagram gradient only for "Connect with Instagram" flows — never in the feed

Don't

  • Don't use shadows between posts — hairlines are the brand-correct separator
  • Don't render trending topics, hashtag panels, or a "Discover" sidebar — Threads is intentionally minimalist
  • Don't colorize the repost icon green (that's X's pattern) — repost on Threads stays gray, icon fills as the active indicator
  • Don't add a bookmark icon to the action row — Threads omits it
  • Don't use pure red #FF0000 for the like heart — it's Instagram-coral #FE2C55
  • Don't use verified checkmark in Threads' own blue — verification inherits from Instagram (#0095F6)
  • Don't use cards or containers for posts — they sit directly on canvas
  • Don't use medium font weights (500) — Instagram Sans weights are 400 / 600 / 700
  • Don't remove the thread line on multi-post threads — it IS the thread
  • Don't animate aggressively — Threads motion is calm, 250-400ms, matching the slower scroll feel
  • Don't use uppercase button labels — "Post", "Follow" are sentence case

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 Threads design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- Meta Link Blue: #2d7ff9
- Link Blue Pressed: #1a5fd9
- Primary White: #ffffff
- Primary Black: #000000
- Canvas Black: #000000
- Surface 1: #101010
- Surface 2: #181818
- Divider: #222222
- Thread Line: #333333
- Light Canvas: #ffffff

Type:
- families: Instagram Sans, Fallback Stack
- scale: 13, 14, 15, 17
- weights: 400, 600, 700

Shape:
- radius: 6, 10, 20

Spacing: 8, 12, 16

Rules:
- Use pure black `#000000` as the default dark canvas — Threads opens dark like X
- Use the thread line (1pt vertical rule from avatar to reply row) — it's the structural signature of the app
- Use 36pt circular avatars — larger than X's 32pt, reflecting the more photo-forward Instagram heritage
- Use Instagram-coral (`#FE2C55`) for the active like heart — NOT red, a pink-leaning coral
- Keep the action row to FOUR icons: heart, comment, repost, share — no bookmark, no views
- Use Instagram Sans at weights 400/600/700 only — no light, no thin

Avoid:
- Don't use shadows between posts — hairlines are the brand-correct separator
- Don't render trending topics, hashtag panels, or a "Discover" sidebar — Threads is intentionally minimalist
- Don't colorize the repost icon green (that's X's pattern) — repost on Threads stays gray, icon fills as the active indicator
- Don't add a bookmark icon to the action row — Threads omits it
- Don't use pure red `#FF0000` for the like heart — it's Instagram-coral `#FE2C55`
- Don't use verified checkmark in Threads' own blue — verification inherits from Instagram (`#0095F6`)

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

The specification

Colour paletteRead the full spec

Primary

  • Meta Link Blue (#2D7FF9): @mentions, URLs, inline links inside post body — inherited from Instagram's link color.
  • Link Blue Pressed (#1A5FD9): Tapped state on links.
  • Primary White (#FFFFFF): Primary CTA on dark mode ("Post", "Follow"), primary text on dark canvas.
  • Primary Black (#000000): Primary canvas dark, primary CTA on light mode, primary text on light.

Canvas & Surfaces (Dark / Default)

  • Canvas Black (#000000): Primary OLED canvas.
  • Surface 1 (#101010): Card surfaces (rare — mostly on sheet modals), compose background.
  • Surface 2 (#181818): Input field background, higher elevation surfaces.
  • Divider (#222222): Hairline between posts (lighter than X's #2F3336 — Threads divider is subtler).
  • Thread Line (#333333): The signature vertical rule from avatar to reply row.

Canvas & Surfaces (Light)

  • Light Canvas (#FFFFFF): Primary light canvas.
  • Light Surface 1 (#FAFAFA): Card surfaces, input field fills.
  • Light Surface 2 (#F5F5F5): Higher elevation (compose modal on light).
  • Light Divider (#DBDBDB): Hairline in light mode.
  • Light Thread Line (#D9D9D9): The thread-line in light mode.

Text

  • Text Primary Dark (#F5F5F5): Body on dark canvas — off-white, warm.
  • Text Primary Light (#000000): Body on light canvas — pure black.
  • Text Secondary (#777777): @handles, timestamps, metadata — shared across modes at the same contrast ratio.
  • Text Tertiary Dark (#4D4D4D): Disabled text dark mode.
  • Text Tertiary Light (#999999): Disabled text light mode.

Social Action Colors

  • Like Coral (#FE2C55): Active like / heart-fill state — inherited from Instagram's double-tap heart. NOT red, a pink-leaning coral.
  • Action Gray Default (#777777): Comment, repost, and share icons in idle state.
  • Repost Active (#777777 with filled glyph variant): Repost stays gray — no role color — but switches from outlined to filled icon.

Semantic

  • Error Red (#ED4956): Post failed, delete confirmation, destructive actions (slightly less saturated than Instagram's error).
  • Success Green (#58C322): Rare — used on "Posted" toast confirmations.
  • Instagram Verified Blue (#0095F6): Inherited verified badge from Instagram (Threads doesn't issue its own).

Meta Connection Accent

  • Instagram Gradient (pink #F56040 → purple #A020F0 → blue #405DE6): Used only on the "Connect with Instagram" or Instagram-login flows — never in the feed.
Type scaleRead the full spec

Font Family

  • Primary: Instagram Sans (proprietary, 2022, by Meta's type team) — a narrow, tall-x-height sans with a warm humanist quality and a distinctive cursive-like ampersand.
  • Fallback Stack: InstagramSans, -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif
  • CJK / Non-Latin: Instagram Sans ships with Arabic, Hebrew, and a Devanagari companion; CJK falls back to Apple's system fonts.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Screen TitleInstagram Sans17pt7001.25-0.1pt"Threads" logo top nav, "Activity", profile name header
Display NameInstagram Sans15pt6001.30ptPost author's display name in post row
Post BodyInstagram Sans15pt4001.40ptThe thread post text — primary reading
Quoted PostInstagram Sans14pt4001.350ptQuoted post embed body
@Handle / TimestampInstagram Sans14pt4001.30pt@username · 2h — color #777777
Action CountInstagram Sans13pt4001.20ptCount beside heart/comment/repost
Profile Follower CountInstagram Sans14pt4001.30pt"1,234 followers" on profile
Profile BioInstagram Sans15pt4001.40ptMulti-line bio on profile header
Primary ButtonInstagram Sans15pt6001.00pt"Post", "Follow", "Connect"
Secondary ButtonInstagram Sans14pt6001.00pt"Following", "Message"
Compose PlaceholderInstagram Sans17pt4001.30pt"Start a thread..." in compose modal (larger than feed body)
DM BodyInstagram Sans15pt4001.30ptDirect message bubble text
Filter ChipInstagram Sans14pt6001.00ptActivity filter pills ("Replies", "Follows")
Tab Labeln/a————Tab bar is icon-only — no labels

Principles

  • One optical size: Instagram Sans doesn't ship with Display/Text optical variants in the Threads deploy — a single family handles all sizes.
  • Weight concentrated at 400 / 600 / 700: Regular for body, semibold for names and buttons, bold for headlines. No light, no medium, no black.
  • Generous line height: 1.4 on post body (vs 1.33 on X) is the difference that gives Threads its breathing room.
  • Dynamic Type respected: Post body, bio, DM body, and compose placeholder all scale with user preference. Display name and timestamp cap at xxLarge to preserve the threaded layout.
  • Text color is structural, not decorative: Primary text is off-white or pure black; secondary is #777777. Blue #2D7FF9 only on links/mentions. Body text is never colored for emphasis.
Components and layoutRead the full spec

Buttons

Primary "Post" CTA (Compose Submit)

  • Shape: Pill, 500pt corner radius
  • Background dark: #F5F5F5 (off-white) | light: #000000 (intentional inversion)
  • Text: #000000 dark mode | #FFFFFF light mode
  • Padding: 8pt vertical, 20pt horizontal
  • Disabled (no content): opacity 0.3
  • Pressed: opacity 0.8 + soft haptic
  • Font: Instagram Sans 15pt w600

Follow Pill

  • Shape: Pill, 500pt corner radius
  • Not-following: filled primary inverted (white on dark, black on light), "Follow" label
  • Following: transparent with 1pt #777777 border, secondary text color, "Following" label
  • Padding: 8pt vertical, 20pt horizontal
  • Minimum width: 92pt
  • Font: Instagram Sans 14pt w600
  • Pressed "Following": opens a confirmation action sheet ("Unfollow @user?")

Action Icons (Heart, Comment, Repost, Share)

  • Four icons only — no bookmark or views icon
  • Size: 22pt glyph, 44pt hit area
  • Default: #777777 outlined
  • Active Like: #FE2C55 filled heart (coral, not red)
  • Active Repost: #777777 but icon switches to filled two-arrows variant — no color change
  • Comment / Share: always outlined, never activate with color
  • Tap animation: icon scales 0.85 → 1.15 → 1.0 spring over 300ms + soft haptic
  • Like tap: paired with .impact(.light) + count tick-up

"Connect with Instagram" CTA (Onboarding / Migration)

  • Shape: Pill, 500pt corner radius
  • Background: Instagram gradient (pink → purple → blue linear 135deg)
  • Text: #FFFFFF Instagram Sans 15pt w600
  • Padding: 12pt vertical, 24pt horizontal
  • Only appears on onboarding and on Meta-connection prompts — never in the feed

Cards & Containers

Thread Post Row (The Post) The signature component.

  • Full-width, canvas background, divided by 1pt #222222 hairline at bottom
  • Leading: 36pt circular avatar, 16pt inset from left
  • Thread line: starts 4pt below the avatar's bottom edge, 1pt wide, #333333, extends down to just above the reply row (only shown if the post has replies nested below OR is the root of a visible thread)
  • Display name row: Instagram Sans 15pt w600, primary text; trailing @handle · 2h in 14pt w400 #777777; overflow ... 18pt far trailing
  • Post body: Instagram Sans 15pt w400 with 1.4 line height, primary text, aligned to avatar gutter (68pt from left)
  • Media (optional): 16:9 or 1:1 rounded-16pt media below body
  • Action row: 4 icons evenly distributed at 22pt with counts beside heart/comment — no views icon, no bookmark
  • Padding: 16pt top, 12pt bottom
  • Tap: opens thread detail view; tap avatar: opens author profile

Nested Reply Row

  • Same structure as a Thread post but smaller avatar (28pt) and indented 48pt
  • The thread line from the parent post continues downward and connects to this reply's avatar
  • This creates the visual "branching" of a conversation

Profile Header

  • Background: canvas
  • Layout: 80pt avatar on leading side + display name + @handle + bio + follower count on trailing
  • "Instagram account" badge shown as small glyph + link to Instagram profile
  • Below: "Follow" pill (if not own profile) + "Mention" or "Profile" button
  • Tab bar underneath: "Threads" / "Replies" / "Reposts" as text labels with an animated underline indicator

Quoted Post Embed

  • Appears inside a parent post when quote-reposting
  • 1pt #333333 border, 12pt corner radius, 12pt padding
  • Mini author row: 24pt avatar, 14pt w600 name, handle, timestamp
  • Body: 14pt w400 quoted content
  • Media scales down to fit embed width with 8pt radius

Compose Modal

  • Full-screen, slides up from bottom
  • Background: canvas (dark or light based on mode)
  • Thread line appears inside the compose view — running from the user's avatar at the top down to a "+ Add to thread" button at the bottom (enabling multi-post threads)
  • Placeholder: "Start a thread..." in Instagram Sans 17pt w400 #777777
  • Top: "Cancel" text button leading, "Post" pill trailing
  • Bottom toolbar: media picker, GIF, poll, location, tag-people icons at 22pt
  • "Your followers can reply" audience selector below toolbar — pill button

Activity Filter Chip Row

  • Horizontal scroll of 5 chips: "All", "Follows", "Replies", "Mentions", "Quotes", "Reposts", "Verified"
  • Chip: 36pt tall, 500pt radius pill
  • Unselected: transparent fill, 1pt #333333 border, #F5F5F5 text
  • Selected: #F5F5F5 fill, #000000 text
  • Font: Instagram Sans 14pt w600
  • Padding: 8pt vertical, 16pt horizontal

Navigation

Bottom Tab Bar

  • Height: 49pt + safe area (iOS default)
  • Background: rgba(0,0,0,0.9) with .regularMaterial blur on dark; rgba(255,255,255,0.9) light
  • Tabs (5): Home (house), Search (magnifyingglass), Compose (plus.square), Activity (heart), Profile (user avatar)
  • Icon size: 26pt
  • Active color: #F5F5F5 dark / #000000 light (stark contrast, no tinted color)
  • Inactive: #777777
  • Icon-only (no labels)
  • Active icon uses filled variant; inactive uses outlined

Top Nav

  • Height: 44pt + safe area
  • Center: Threads logo (a stylized @ glyph, 28pt, monochrome primary text color)
  • Leading: profile icon (tap opens side menu) — only on Home screen
  • Trailing: filter/sort toggle on Home (open a sheet to switch between "For you" and "Following")
  • Background on scroll: rgba(0,0,0,0.8) blur or rgba(255,255,255,0.8) light

Profile Tab Strip ("Threads" / "Replies" / "Reposts")

Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375pt32pt avatars; post body column narrows to ~276pt
iPhone 13/14/15390ptStandard 36pt avatars; post body column ~302pt
iPhone 15/16 Pro393ptDynamic Island accommodated in nav — @ logo centers away from the island
iPhone 15/16 Pro Max430pt36pt avatars; post body column ~342pt; media scales up
iPad768pt+Centered single-column feed at 600pt max width with surrounding canvas — Threads does not expand into multi-column on iPad

Dynamic Type

  • Post body, bio, DM body, compose placeholder: full scale
  • Display name, @handle, timestamp: cap at xxLarge
  • Action counts: fixed 13pt (layout-sensitive)
  • Tab icons: fixed (icon-only bar)
  • Quoted post body: scales with post body but at relative 93% size

Orientation

  • Home / Activity / Search / Profile / DMs: portrait-locked
  • Media lightbox (photo / video viewer): rotates freely
  • Video playback fullscreen: rotates freely

Touch Targets

  • Action icons: 22pt glyph, 44pt hit area
  • Tab icons: 26pt glyph, 49pt hit (full tab bar height)
  • Avatar tap: 36pt glyph, 44pt hit
  • Follow pill: 32pt tall, 92pt wide minimum
  • Thread line: not interactive (purely structural)
  • Compose FAB equivalent: the Compose tab in the bottom bar is the entry point — no floating circle

Safe Area Handling

  • Top: top nav respects safe area + Dynamic Island; @ logo shifts around the island
  • Bottom: tab bar respects home indicator
  • Sides: 16pt insets on all content; bleed-to-edge only for fullscreen media and profile header backgrounds

Drop-in CSS variables

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

body.theme-threads {--page-bg: #000000;
  --page-bg-gradient: none;
  --text-color: #969696;
  --heading-color: #969696;
  --link-color: #0095f6;
  --link-hover-color: #0076c3;
  --border-color: #1b1b1b;
  --card-bg: #000000;
  --card-shadow: 0 1px 2px rgba(150,150,150,0.06);
  --card-hover-shadow: 0 6px 18px rgba(150,150,150,0.12);
  --header-bg: #141414;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #000000;
  --footer-text-color: #767676;
  --button-bg: #0095f6;
  --button-text-color: #000000;
  --button-hover-bg: #0076c3;
  --button-border: none;
  --button-border-radius: 10px;
  --button-secondary-bg: #090909;
  --button-secondary-text-color: #969696;
  --button-secondary-hover-bg: #121212;
  --button-secondary-border: 1px solid #1b1b1b;
  --prompt-bg: #080808;
  --prompt-text-color: #969696;
  --base-font: var(--font-helvetica);
  --heading-font: var(--font-helvetica);
  --card-border-radius: 10px;
}

Download theme.css

Where this came from

Source document
ios/design-md/social/threads/DESIGN.md · 27.4 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.