Foundations

Tokens

Every value below is a CSS custom property from @mishrashardendu22/observatory-tokens/tokens.css. The chips render with the token itself, so they show the theme this page is in; the values list both themes. Names, values and notes come from the package's tokens.json.

.card { background: var(--bg-100); border: 1px solid var(--border); border-radius: var(--radius-lg); }

Colour

Themes: Dark, Light. The first is the default; the second applies under prefers-color-scheme: light or data-theme="light".

Grounds

bg-000
dark: #0e0c0alight: #f6f1e8

Page ground. Warm near-black in dark, warm paper in light. Replaces the old --bg #111111.

bg-100
dark: #161311light: #fdfaf5

Cards, the sidebar, table headers, the app frame. Replaces --surface and --bg-card.

bg-200
dark: #1e1a16light: #efe8dc

Raised fills inside a card: inputs, segmented controls, icon tiles, hover rows, flat cards. Replaces --surface2.

bg-300
dark: #27221clight: #ffffff

Popovers, dropdowns, tooltips and the active segment of a segmented control.

Borders

border
dark: #2f2923light: #e1d8ca

Every hairline: card edges, table rules, list dividers, the sidebar edge. Decorative only, never the sole carrier of meaning.

border-strong
dark: #413930light: #c9bdab

Outline buttons, step connectors, empty-state dashes and any edge that must read on bg-200.

border-glow
dark: rgba(217,165,91,0.45)light: rgba(138,92,18,0.45)

Border of a highlighted card (the active step, the primary call-to-action panel). Pair with shadow-glow.

Ink

ink
dark: #f3ebddlight: #1c1712

Headings, body copy, stat values and button labels on bg-000 through bg-300 (16.5:1 dark, 15.8:1 light on bg-000).

ink-secondary
dark: #b9ae9dlight: #5a5145

Subtitles, descriptions, table cells, nav items at rest. Reads on bg-000 through bg-300 (8.9:1 dark, 6.9:1 light).

ink-muted
dark: #8e8374light: #6e6355

Kickers, captions, timestamps, placeholders and the Skipped status, on bg-000 through bg-200 (5.3:1 dark on bg-000, 4.7:1 on bg-200). Not for text on bg-300 in dark (4.2:1): use ink-secondary there.

ink-inverse
dark: #1a1308light: #1a1308

Text and icons on accent-fill. 8.3:1 on the amber fill in both themes.

Accent

accent
dark: #d9a55blight: #8a5c12

The brand amber as ink: kickers, active nav items, links, icon tiles, focus rings and the italic word in a title. 8.8:1 dark and 5.2:1 light on bg-000. Never as a large fill in light (use accent-fill).

accent-hover
dark: #e6b56clight: #6f4a0e

Hover state of accent-coloured text and outlines.

accent-fill
dark: #d9a55blight: #d9a55b

Primary button and toggle fill in both themes, always with ink-inverse on it. Replaces the cream #f5e9d3 button and the violet --accent.

accent-fill-hover
dark: #e6b56clight: #e6b56c

Hover state of accent-fill.

accent-soft
dark: rgba(217,165,91,0.12)light: rgba(138,92,18,0.12)

Tinted fill behind an active nav item, an icon tile, the input focus halo and the Running badge ground.

Info

info
dark: #a094fflight: #5346c9

The old violet accent, kept for the Running state, info notices and the debug log level. 7.6:1 dark, 6.1:1 light on bg-000. Never for calls to action.

info-soft
dark: rgba(160,148,255,0.12)light: rgba(83,70,201,0.12)

Ground of the Running badge and info notices.

Success

success
dark: #4caf7dlight: #25784c

Completed backups, healthy connections, positive deltas, the check mark on a recent-backup row. 7.2:1 dark, 4.8:1 light on bg-000. Always paired with a word or icon: success and danger are told apart by hue only (1.3:1), kept from the source.

success-soft
dark: rgba(76,175,125,0.12)light: rgba(37,120,76,0.12)

Ground of the success badge and success notice.

Danger

danger
dark: #e06060light: #b93838

Failed backups, error log lines, destructive buttons, negative deltas. 5.6:1 dark, 5.1:1 light on bg-000. Always with a word or icon (see success).

danger-soft
dark: rgba(224,96,96,0.12)light: rgba(185,56,56,0.12)

Ground of the error badge, error notice and destructive button.

Warning

warning
dark: #e8893flight: #9a5410

Warn log lines, degraded connections, retry notices. Orange, not amber, so it never reads as the brand colour. 7.5:1 dark, 5.1:1 light on bg-000.

warning-soft
dark: rgba(232,137,63,0.12)light: rgba(154,84,16,0.12)

Ground of the warning badge and warning notice.

Charts

chart-primary
dark: #d9a55blight: #b8822e

The main series in every chart: successful backups, storage over time. 8.8:1 dark, 3.0:1 light on bg-100 (a mark, not text).

chart-failed
dark: #a05a3clight: #a05a3c

Failed series beside chart-primary. Darker, not just redder, so the two bars differ in lightness (3.7:1 dark, 5.0:1 light on bg-100).

chart-skipped
dark: #6b6157light: #8b8073

Skipped series and inactive bars. 3.1:1 dark, 3.7:1 light on bg-100.

chart-grid
dark: rgba(243,235,221,0.07)light: rgba(28,23,18,0.08)

Dashed grid lines (3 3) behind bars and areas.

chart-axis
dark: #8e8374light: #6e6355

Axis tick labels at 11px mono. Alias of ink-muted kept separate so charts can be tuned alone.

Focus ring

focus
dark: → accentlight: → accent

The 2px focus ring, offset 3px, on every interactive element. Solid, 8.8:1 dark and 5.2:1 light on bg-000.

Selection

selection
dark: rgba(217,165,91,0.30)light: rgba(217,165,91,0.45)

Text selection highlight.

Overlay

overlay
dark: rgba(8,6,4,0.72)light: rgba(28,23,18,0.45)

Scrim behind the mobile sidebar drawer and modals, including the HITL confirmation dialog.

Success and danger differ by hue alone
They are the source's green and red (1.3:1 against each other), so a status always carries its word or icon. The chart pair is different on purpose: chart-primary against chart-failed differ in lightness.

Type

Families: --font-serif = "Instrument Serif", --font-sans = Inter, --font-mono = "IBM Plex Mono". Each style is also a class in type.css.

Display · serif

display-xl72px / 68pxweight 400tracking -0.025em
Peace of mind for everything you build.

Landing hero headline. Two to three lines, max 640px wide. Emphasise one phrase with an italic accent em.

display-lg56px / 56pxweight 400tracking -0.025em
Set up in minutes, back up forever.

Section headlines on the landing page and the dashboard page title (.page-title).

display-md40px / 44pxweight 400tracking -0.02em
Backup run #1,240

Card headlines and the mobile page title.

display-sm26px / 32pxweight 400tracking -0.015em
Never lose what you build.

Nav-card titles, step titles, empty-state titles, dialog titles.

stat-value36px / 40pxweight 400tracking -0.02em
1,240

The number in a StatCard and StatStrip. Use tabular figures via font-variant-numeric so columns line up.

Text · sans

body-lg17px / 26pxweight 400
Continuous backups, observability, and repository health so your code, issues, wikis and metadata are never lost.

Hero and section subtitles in ink-secondary, max 560px.

body15px / 24pxweight 400
Authorize with GitHub and select repositories to back up.

Default body copy, descriptions and chat messages.

body-sm14px / 20pxweight 400
Set your backup frequency and retention preferences.

Table cells, list rows, nav items (weight 500), card descriptions.

label13px / 16pxweight 600
Repository

Form labels, card titles, button labels (14px in .btn).

caption12px / 16pxweight 400
Last updated 2 minutes ago

Timestamps, deltas, legend entries and helper text in ink-muted.

kicker11px / 16pxweight 700tracking 0.14em
AUTOMATED GITHUB BACKUP PLATFORM

Uppercase eyebrow above a headline (accent) and stat labels or table headers (ink-muted).

Code · mono

code13px / 20pxweight 400
mishra-shardendu/observatory

Repository names, run ids, log lines, SQL and JSON in chat.

code-sm11px / 16pxweight 400
Oct 22 14:02:11

Chart axis labels, log timestamps and nav counts.

Spacing

A 4px base. Components use 8, 12, 16 and 24; page rhythm uses 32 and up. Matches Tailwind v4's numeric scale so utility classes and tokens agree.

space-14px

Icon-to-label gap inside a badge, delta arrow gap.

space-28px

Gap between buttons, between a label and its input, inside a badge.

space-312px

List-row gap, notice padding, sidebar horizontal padding.

space-416px

Grid gap between cards, flat-card padding, table cell horizontal padding (20px).

space-520px

StatCard padding.

space-624px

Card padding, page gutter on small screens.

space-832px

Gap between page sections, hero card padding.

space-1040px

Top padding of the main column.

space-1248px

Page gutter on wide screens, empty-state padding.

space-1664px

Bottom padding of the main column.

space-2496px

Vertical rhythm between landing-page sections.

Radius

Tightened from the old 8/16/28 scale. The 28px card radius is retired: at 24px padding it wasted corner space and read as a toy.

radius-sm6px

Badges without pill shape, checkboxes, list-row icon tiles, skeletons, code chips.

radius-md10px

Buttons, inputs, nav items, flat cards, icon tiles, notices.

radius-lg14px

Cards, stat cards, tables, popovers, the app-preview frame.

radius-xl20px

The hero panel and full-width feature panels.

radius-pill999px

Status badges and the segmented control's outer shell.

Shadow

Edges come from borders, not shadows. Shadows exist only for floating surfaces and the amber glow.

shadow-smdark: 0 1px 2px rgba(0,0,0,0.4)light: 0 1px 2px rgba(28,23,18,0.08)

The active segment of a segmented control, dropdown triggers.

shadow-mddark: 0 8px 24px rgba(0,0,0,0.45)light: 0 8px 24px rgba(28,23,18,0.12)

Popovers, dropdown menus, toasts and dialogs on bg-300.

shadow-glowdark: 0 0 0 1px rgba(217,165,91,0.35), 0 0 32px rgba(217,165,91,0.18)light: 0 0 0 1px rgba(138,92,18,0.30), 0 0 32px rgba(217,165,91,0.25)

The one highlighted card on a page (the call-to-action panel, the current step, a card on hover in the nav-card grid).

Layout

Fixed dimensions of the app shell.

content-max1280px

Max width of the main column (.app-main) and the landing container.

sidebar-width260px

Expanded sidebar, down from 280px.

sidebar-collapsed68px

Icon-only sidebar under html[data-sidebar=collapsed].

topbar-height56px

Landing nav bar and the mobile header.

control-height40px

Buttons and inputs at the default size; 32px small, 48px large.