expo.json
Expo Brand Identity
A complete profile of Expo's visual system — colors, typography, components, and personality — extracted from https://expo.dev. Built for designers, agents, and AI tools.
- Page: https://characterquilt.com/branding/expo
- Machine-readable JSON: https://characterquilt.com/branding/expo.json
- Per-page llms.txt: https://characterquilt.com/branding/expo/llms.txt
Quick Facts
| Field | Value |
|---|---|
| Primary | #B8AE63 |
| Accent | #0D74CE |
| Body Font | Inter |
| Heading Font | Inter |
Color Palette
- primary: #B8AE63
- secondary: #0090FF
- accent: #0D74CE
- background: #FFFFFF
- textPrimary: #000000
- link: #0D74CE
Typography
- primary: Inter — https://fonts.google.com/specimen/Inter
- heading: Inter — https://fonts.google.com/specimen/Inter
Visual Assets
- Logo: https://static.expo.dev/static/images/exponential.svg
- Favicon: https://static.expo.dev/static/favicons/favicon-light-48x48.png
- Social card (og:image): https://static.expo.dev/static/home/9-2025/og-image.png
UI Components
- buttonPrimary: background=#000000, textColor=#FFFFFF, borderRadius=48px, shadow=rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px
- buttonSecondary: background=transparent, textColor=#1C2024, borderColor=#CDCED6, borderRadius=48px, shadow=rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px
Brand Personality
Tone: modern · Energy: medium · Audience: developers
Expo Brand in the Wild
Real-world brand assets — ads, campaigns, marketing materials.
- Audit logs - Expo Documentation
- Expo Blog
- Expo Orbit
- Expo Blog
- Mobile CI/CD built for React Native
- Introducing Expo Router v5: the most powerful way to build full-stack native apps
Working with these fonts
Not found on Google Fonts? Agent Instructions that you can follow if you have permission to use the fonts:
CharacterQuilt.com suggests this flow that can help:
- Open the company's homepage in a browser with DevTools open.
- In the Network tab, filter by "Font" (or by extension: woff2, woff, ttf, otf).
- Hard-reload the page and click around (pricing, blog, careers) — some weights only load on specific routes.
- For each captured font URL: right-click → Save As to download the file locally.
- View the page's CSS (DevTools → Sources, or curl the stylesheet URLs) and copy out the matching @font-face declarations. Rewrite each
src: url(...)to point to your local file path.
Programmatic alternative: load the URL with Playwright or Puppeteer, listen for response events whose Content-Type starts with font/, and write the body to disk. The CSS extraction step is the same.
Only do this if you have permission to use the brand assets — most proprietary fonts are licensed and may not be redistributable.
Machine-Readable Profile
{
"colorScheme": "light",
"fonts": [
{
"family": "Inter",
"role": "body"
},
{
"family": "JetBrains Mono",
"role": "monospace"
}
],
"colors": {
"primary": "#B8AE63",
"secondary": "#0090FF",
"accent": "#0D74CE",
"background": "#FFFFFF",
"textPrimary": "#000000",
"link": "#0D74CE"
},
"typography": {
"fontFamilies": {
"primary": "Inter",
"heading": "Inter"
},
"fontStacks": {
"heading": [
"Inter",
"-apple-system",
"system-ui",
"sans-serif"
],
"body": [
"Inter",
"-apple-system",
"system-ui",
"sans-serif"
],
"paragraph": [
"Inter",
"-apple-system",
"system-ui",
"sans-serif"
]
},
"fontSizes": {
"h1": "64px",
"h2": "18px",
"body": "12px"
}
},
"spacing": {
"baseUnit": 4,
"borderRadius": "4px"
},
"components": {
"buttonPrimary": {
"background": "#000000",
"textColor": "#FFFFFF",
"borderRadius": "48px",
"borderRadiusCorners": {
"topLeft": "48px",
"topRight": "48px",
"bottomRight": "48px",
"bottomLeft": "48px"
},
"shadow": "rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px"
},
"buttonSecondary": {
"background": "transparent",
"textColor": "#1C2024",
"borderColor": "#CDCED6",
"borderRadius": "48px",
"borderRadiusCorners": {
"topLeft": "48px",
"topRight": "48px",
"bottomRight": "48px",
"bottomLeft": "48px"
},
"shadow": "rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px"
}
},
"images": {
"logo": "https://static.expo.dev/static/images/exponential.svg",
"favicon": "https://static.expo.dev/static/favicons/favicon-light-48x48.png",
"ogImage": "https://static.expo.dev/static/home/9-2025/og-image.png",
"logoHref": "/",
"logoAlt": "Expo"
},
"__llm_logo_reasoning": {
"selectedIndex": 1,
"reasoning": "Selected #1 because it is in the header, links to the homepage, and matches the brand name 'Expo'.",
"confidence": 0.9,
"source": "llm"
},
"__llm_button_reasoning": {
"primary": {
"index": 0,
"text": "Get started for free",
"reasoning": "Button #0 has a vibrant, dark background color (#000000) with action-oriented text 'Get started for free', making it the primary CTA."
},
"secondary": {
"index": 2,
"text": "Read the docs",
"reasoning": "Button #1 has a transparent background with a border, making it a suitable secondary CTA with the text 'Read the docs'."
},
"confidence": 0.95
},
"personality": {
"tone": "modern",
"energy": "medium",
"targetAudience": "developers"
},
"designSystem": {
"framework": "tailwind",
"componentLibrary": ""
},
"confidence": {
"buttons": 0.95,
"colors": 0.9,
"overall": 0.925
},
"__llm_metadata": {
"logoSelection": {
"llmCalled": true,
"llmSucceeded": true,
"finalSource": "llm",
"rawLogoSelection": {
"selectedLogoIndex": 1,
"selectedLogoReasoning": "Selected #1 because it is in the header, links to the homepage, and matches the brand name 'Expo'.",
"confidence": 0.9
}
},
"buttonClassification": {
"llmCalled": true,
"llmSucceeded": true
}
}
}