Switch between the rendered Visual preview and the Raw DESIGN.md.
OpenSpec's design embodies a minimalist, technical aesthetic grounded in precision and clarity. The system prioritizes readability and spec-driven structure through monospaced typography, ultra-thin borders, and high-contrast layouts on a near-black backdrop. The visual language feels like reading technical documentation—clean, unburdened, and direct—while selective accent colors (blue, lime green, and coral) provide semantic meaning without visual noise. This is a design system built for developers, by developers, where every pixel serves the specification rather than decoration.
Key Characteristics
#09090B): Primary container background for the entire interface, creating maximum contrast for content#000000): Pure black accents and text on light surfaces, strongest possible contrast#60A5FA): Primary interactive accent for links, highlights, and focal points; represents action and emphasis#7EE787): Success and positive states; used for accepted specs and passing scenarios#FFA198): Warning and cautionary states; indicates potential issues or deprecated items#F85149): Critical errors and failed states; strongest semantic warning#A1A1AA): Neutral interactive text for navigation, secondary actions, and borderless buttons#E8E8E8): Light neutral for active button states and hover effects#3F3F46): Subtle borders on form inputs and cards, providing definition without harshness#FFFFFF): Pure white text and minimal highlights on dark backgrounds#F4F4F5): Very light background accents and secondary surfaces#E8E8E8): Card and container borders, large-use neutral element#71717A): Secondary text and muted content#27272A): Tertiary backgrounds and recessive elements#27272A): 2px borders defining card and container boundaries#3F3F46): Primary border color for inputs, dividers, and structural elements#0A0A0A): Deepest background layer for nested or floating content#2EA043): Primary success indicator for validated specs and positive outcomes#22C55E): Brighter success color for prominent success messaging and scenarios#C8E64A): Warning color for cautions and advisory information#EF4444): Error indicator for failed specs and blocking issuesPrimary: 'JetBrains Mono', 'Courier New', monospace
A technical monospaced font chosen for its precision and developer familiarity. Every measurement feels intentional.
Secondary: Arial, 'Helvetica Neue', sans-serif
Used for button labels where slightly more neutrality is required.
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display H1 | JetBrains Mono | 18.8px | 400 | 1.2 | 0px | Main page headline; large but restrained |
| Heading H2 | JetBrains Mono | 16.45px | 700 | normal | 0px | Section headers; only role using weight 700 |
| Heading H3 | JetBrains Mono | 14.1px | 400 | normal | 0px | Subsection headers and feature titles |
| Body / Paragraph | JetBrains Mono | 18.8px | 400 | 1.6 | 0px | Primary content text; generous default line height |
| Body Large | JetBrains Mono | 16.45px | 400 | 1.5 | 0px | Links and interactive text |
| Button | Arial | 13.3333px | 400 | normal | 0px | Button labels; slightly smaller than body |
| Caption / Small | JetBrains Mono | 15.04px | 400 | 1.8 | 0px | List items and secondary content |
| Code / Meta | JetBrains Mono | 14.1px | 400 | normal | 0px | Inline code and metadata text |
background-color: #E8E8E8
color: #09090B
font-family: 'JetBrains Mono', monospace
font-size: 16.45px
font-weight: 400
padding: 14.1px 28.2px
border: 1px solid #E8E8E8
border-radius: 0px
box-shadow: none
height: auto
line-height: normal
Hover State:
background-color: #FFFFFF
border-color: #FFFFFF
background-color: transparent
color: #A1A1AA
font-family: 'JetBrains Mono', monospace
font-size: 14.1px
font-weight: 400
padding: 23.5px
border: 0px none
border-radius: 0px
box-shadow: none
height: auto
line-height: normal
Hover State:
color: #E8E8E8
background-color: transparent
color: #A1A1AA
font-family: 'JetBrains Mono', monospace
font-size: 14.1px
font-weight: 400
padding: 0px
border: 0px none
border-radius: 0px
box-shadow: none
height: auto
line-height: normal
Hover State:
color: #60A5FA
background-color: #09090B
color: #FFFFFF
font-family: 'JetBrains Mono', monospace
font-size: 18.8px
font-weight: 400
padding: 0px
border: 2px solid #27272A
border-radius: 0px
box-shadow: rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px
line-height: normal
background-color: #09090B
color: #FFFFFF
font-family: 'JetBrains Mono', monospace
font-size: 18.8px
font-weight: 400
padding: 37.6px
border: 2px solid #27272A
border-radius: 0px
box-shadow: rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px
line-height: normal
background-color: #09090B
color: #FFFFFF
font-family: 'JetBrains Mono', monospace
font-size: 18.8px
font-weight: 400
padding: 0px
border: 2px solid #27272A
border-radius: 0px
box-shadow: rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px
line-height: normal
background-color: transparent
color: #E8E8E8
font-family: 'JetBrains Mono', monospace
font-size: 16.45px
font-weight: 400
padding: 14.1px 18.8px
border: 1px solid #3F3F46
border-radius: 0px
box-shadow: none
height: 52.1875px
line-height: normal
Focus State:
border-color: #60A5FA
color: #FFFFFF
Placeholder:
color: #71717A
background-color: transparent
color: #FFFFFF
font-family: 'JetBrains Mono', monospace
font-size: 18.8px
font-weight: 400
padding: 0px
border: 0px none
border-radius: 0px
box-shadow: none
line-height: normal
Link in Navigation:
color: #A1A1AA
text-decoration: none
Active Link:
color: #60A5FA
background-color: transparent
color: #E8E8E8
font-family: 'JetBrains Mono', monospace
font-size: 16.45px
font-weight: 400
padding: 0px
border: 0px none
border-radius: 0px
box-shadow: none
text-decoration: none
line-height: normal
cursor: pointer
Hover State:
color: #60A5FA
text-decoration: underline
background-color: #000000
color: #E8E8E8
font-family: 'JetBrains Mono', monospace
font-size: 14.1px
font-weight: 400
padding: 16px
border: 1px solid #3F3F46
border-radius: 0px
box-shadow: none
line-height: 1.6
overflow-x: auto
background-color: #2EA043
color: #FFFFFF
font-family: 'JetBrains Mono', monospace
font-size: 14.1px
font-weight: 400
padding: 4px 8px
border: 0px none
border-radius: 0px
line-height: normal
background-color: #C8E64A
color: #09090B
font-family: 'JetBrains Mono', monospace
font-size: 14.1px
font-weight: 400
padding: 4px 8px
border: 0px none
border-radius: 0px
line-height: normal
background-color: #EF4444
color: #FFFFFF
font-family: 'JetBrains Mono', monospace
font-size: 14.1px
font-weight: 400
padding: 4px 8px
border: 0px none
border-radius: 0px
line-height: normal
Base Unit: 4px
Scale:
4px: Micro spacing for internal padding in small elements8px: Tight spacing for button padding, small gaps12px: Not explicitly extracted but inferred for small gaps16px: Standard padding for most containers20px: Comfortable spacing between sections24px: Generous spacing for major sections28px: Large section dividers32px: Extra-large container padding36px: Massive padding for sprawling content areas76px: Page-level gutters and margins188px: Hero section and full-bleed spacingUsage Context:
14.1px (between 8px and 16px)37.6px (between 32px and 76px)28.2px horizontal, 14.1px vertical23.5px for list-item spacing76px on pages; reduced to 20px–24px on smaller viewports24px–36px gaps1100px on desktop)Whitespace in OpenSpec is structural, not decorative. Every pixel of space is justified by content flow and readability. The system avoids bloat by using tight padding within cards (0px in some cases) while maintaining generous margins between major sections. This creates visual breathing room without appearing empty—the monospaced text and thin borders provide sufficient visual weight.
0px: All elements use sharp, right-angle corners—no rounding50%: Reserved for circular elements (avatars, icon buttons) if needed, but generally avoided| Level | Treatment | Use |
|---|---|---|
| Base | none | Default surface background (near-black) |
| Raised (Small) | rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px | Cards, containers, subtle elevation |
| Raised (Medium) | rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.5) 0px 4px 24px 0px | Modals, dropdowns, prominent overlays |
| Overlay | 0px 12px 28px rgba(0, 0, 0, 0.8) | Floating elements, tooltips (inferred) |
| Inline | none | Text, buttons, inline controls |
Shadow Philosophy:
OpenSpec's elevation system is restrained and technical. Rather than soft, photorealistic shadows, the design uses crisp, geometric borders (2px solid) paired with minimal drop shadows. The small shadow (0px 1px 2px) creates subtle depth for cards, while the larger shadow (0px 4px 24px) reserves itself for modal overlays. This approach maintains the minimalist aesthetic while providing just enough visual separation to prevent UI elements from feeling flat or merged.
#09090B as the default background for all surfaces—maintain this consistent deep-black foundation#27272A border to every card and container to create clear visual boundaries#60A5FA, #7EE787, #FFA198) for semantic meaning: links, success, warnings#A1A1AA for secondary/ghost button text and navigation items to indicate lower action priority0px globally; no rounded corners anywhere in the system14.1px, 23.5px, 37.6px) without deviation0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px) for standard cards#E8E8E8 for primary button background fill; use #E8E8E8 for input borders0px or 50%#09090B or deepest background layers#E8E8E8) on light backgrounds; always maintain high contrast| Breakpoint Name | Width | Key Changes |
|---|---|---|
| Mobile | 320px–767px | Reduce side padding to 20px, stack cards vertically, hide non-essential navigation |
| Tablet | 768px–1023px | Increase padding to 24px–32px, layout cards in 2-column grids where applicable |
| Desktop | 1024px+ | Full padding (76px sides), multi-column layouts, expanded card widths (1100px target) |
| Ultra-wide | 1400px+ | Maintain max-width of ~1200px for cards, center layout, increase side margins |
44px × 44px (standard mobile accessibility)52.1875px height for all interactive buttons on touch devices16px minimum gap between clickable link elements52.1875px minimum height for form inputs to allow comfortable thumb interaction768px breakpoint768px; revert to single-column below 480px37.6px to 20px below 768px to preserve screen real estate480px; maintain 24px gaps between sections76px to 24px below 768px; adjust section width constraints accordingly#60A5FA)#2EA043) or Bright Success (#22C55E)#C8E64A)#EF4444)#09090B)#27272A)#FFFFFF)#A1A1AA)#3F3F46)#E8E8E8)All backgrounds are #09090B (near-black). Every surface, card, container, and section uses this as the foundation. No light backgrounds.
Every card and container has a 2px border in #27272A. Never omit this; it defines all structural boundaries. The border always pairs with the small shadow: rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px.
Typography is 100% monospaced (JetBrains Mono primary, Arial for buttons only). No variable-width fonts. Every text element references the extracted font-family and font-size exactly.
Font sizes are precise and non-negotiable: Display 18.8px, Heading H2 16.45px, Heading H3 14.1px, Button 13.3333px, Caption 15.04px. Scale in this exact sequence; never interpolate.
All corner radii are 0px. No rounding anywhere. Pure right angles on buttons, inputs, cards, modals, badges—everything.
Padding uses the scale: 4px, 8px, 16px, 20px, 24px, 28px, 32px, 36px, 76px, 188px. For hybrid values like button padding (14.1px, 28.2px), use the extracted values exactly. Never round or substitute.
Semantic colors are strict: Links = #60A5FA, Success = #2EA043 or #22C55E, Warning = #C8E64A, Error = #EF4444. Use these only for their intended semantic purpose; never deviate.
Interactive text is #A1A1AA by default (secondary/ghost). Primary button text is dark (#09090B) on light button background (#E8E8E8). Links in body are #E8E8E8 until hover, then #60A5FA.
Inputs and form elements: background-color: transparent, border: 1px solid #3F3F46, color: #E8E8E8, padding: 14.1px 18.8px, height: 52.1875px. No rounding, no background fill.
Line-height defaults to normal (1.0) except body text (1.6), lists (1.8), and captions (1.8). Maintain readability in long-form content while preserving tight monospaced alignment elsewhere.
No letter-spacing, no font-weight variation beyond the scale (400 or 700 for H2 only). Hierarchy comes from size and color, not weight.
Hover states are minimal: Links underline or change color to #60A5FA. Buttons shift background brightness. Ghost buttons reveal the blue accent. Never apply dramatic transforms or heavy transitions.
For elevation, use only two shadow patterns: Small (cards) = rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px; Medium (modals) = rgb(39, 39, 42) 0px 0px 0px 2px, rgba(0, 0, 0, 0.5) 0px 4px 24px 0px. Always pair with the 2px border.
Responsive breakpoints: Mobile 320–767px (reduce padding to 20px), Tablet 768–1023px (expand to 24–32px), Desktop 1024px+ (full 76px gutters). Below 480px, stack everything single-column.
Status colors are self-contained: Success badge = #2EA043 background, white text; Warning = #C8E64A with dark text; Error = #EF4444 with white text. Each is a complete mini-component; no mixing.