All essays
SERVICE·Threads

Why Threads ships with five grays and one blue

Meta's text platform uses minimal color and system fonts to get out of the way, leaning entirely on Instagram OAuth to earn trust.

May 22, 2026

The visual approach

Threads launched with a design system you could fit on an index card. One primary blue (#0866FF), true black and white, and four gray tokens spanning Gray 50 through Gray 700. The type system uses the platform default—-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto—with six sizes from 32px headings down to 13px captions. The component vocabulary lists three entries: modal, form, cta.

This is not minimalism as aesthetic posture. It is Instagram's product team choosing speed and familiarity over brand differentiation. Where Instagram's visual language is saturated and playful, Threads pulls back to neutral infrastructure. The design does one thing loudly—authenticate via Instagram—and everything else quietly. The blue is Meta's corporate shade, the same #0866FF that appears across Facebook and Messenger. If you squint, the login screen could belong to any Meta property from 2023 onward.

The motion spec is equally restrained. Modals scale from 0.95 to 1.0 over 250ms with ease-out while the backdrop fades to 50% opacity. Hover states darken buttons by roughly 8%, and active states scale them to 0.98. There are no custom easing curves, no spring physics, no stagger delays. The system assumes users have seen these patterns a thousand times and will not notice them—which is the point.

What works

The entire onboarding flow hinges on Instagram OAuth. Users tap a button, authenticate through an existing Instagram session, and land inside Threads with their profile photo, handle, and follower graph intact. No email confirmation, no password creation, no username availability check. The login screen presents two CTAs: a blue primary button for Instagram users and a black fallback for new signups. The blue button does 95% of the work.

This is leveraging inherited trust. Meta does not ask Threads to earn credibility from scratch. The product assumes users already trust Instagram with their identity, content, and social graph, so Threads asks for nothing new. The OAuth handoff takes under three seconds. The modal that surfaces during authentication uses the same 0.95 → 1.0 scale and 250ms timing as every other modal in the app. The design treats login as a solved problem and spends its complexity budget elsewhere.

The gray scale has enough steps to establish hierarchy without requiring designers to invent new tokens. Gray 50 works for backgrounds, Gray 200 for borders, Gray 500 for secondary text, Gray 700 for tertiary labels. The 15px body text sits at 400 weight, while the 15px button text jumps to 600—a small jump that reads clearly on both Retina and standard displays. The contrast ratios pass WCAG AA without tuning.

The hover and focus states follow a single rule: blue for interaction affordance, scale for tactile feedback. Focus rings use a 2-3px blue stroke with 120ms ease-out. Active buttons scale to 0.98 in under 100ms, then spring back. The consistency means engineers can apply these treatments globally without per-component exceptions. StyleX, Meta's atomic CSS-in-JS library, outputs single-purpose utility classes that dedupe across the bundle. The result is a 15KB stylesheet for the entire app.

What a builder can borrow

If your product can lean on OAuth from a platform users already trust, treat onboarding as a handoff rather than a gate. Threads does not try to explain itself before authentication—it assumes Instagram's brand did that work. The login modal is 80% Instagram logo and one sentence of copy. The design gets out of the way because the brand does not need to introduce itself twice.

System fonts remove a entire class of loading states. There is no flash of unstyled text, no wait for a 40KB woff2, no layout shift when the custom face swaps in. The tradeoff is less brand differentiation, but Threads decided that speed on first render outweighed typographic identity. For tools, dashboards, and social utilities, that is often the right call.

Five grays is a good default. Gray 50 / 200 / 500 / 700 / 900 covers backgrounds, borders, body text, secondary labels, and true black. Adding Gray 100, Gray 300, Gray 400 creates decision fatigue without meaningful hierarchy gains. If you need more, your component has a structure problem, not a token problem.

Modal entrance animations feel more natural when they scale from 0.95 rather than sliding from the bottom. The scale implies the modal was always there, just out of focus. The 250ms duration with ease-out is fast enough to feel instant but slow enough to avoid jarring the viewport. Pair it with a simultaneous backdrop fade and the transition reads as a single gesture.

Active state scale (0.98) is tactile feedback you can implement in one line of CSS. It works on buttons, cards, and list items. It does not require custom spring physics or JavaScript. Users perceive it as responsiveness even though the element never moves more than a few pixels. Threads applies this treatment globally, and the consistency makes every interaction feel like it belongs to the same system.