| name | Obsidian Terminal | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| colors |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| typography |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rounded |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| spacing |
|
The badge-face lock is noir-planes.jpeg: overlapping sharp planes, platinum-to-black washes, film grain, no outlines. noir-reference.jpeg still locks the page atmosphere. No cyan. No pink. No purple. No brand rainbow.
Personality is calculated and developer-first. Information is silver on black. Badge edges are the meeting of two tones, never a stroke. If a color is not black, white, or gray, it is wrong.
Canvas is #000000. Elevated panels are #0a0a0a / #111111. Type and glyphs are #f2f2f2 or #cfcfcf. Page cards may keep a hairline. Badges have no border.
- Primary: paper white. Active text, icons, JSON keys.
- Secondary: mid gray. Captions, metadata, deactivated.
- Tertiary: lighter silver used only as a highlight edge, never as a neon fill.
- Error / success / warning: grayscale only. Status is weight and contrast, not hue.
Do not introduce Electric Cyan, Neon Pink, or any chromatic accent. The reference image has none.
Dual stack, same as before:
- Geist: badge labels and UI words.
- Geist Mono: captions, JSON, section ids, monograms.
Rules:
- Category captions stay lowercase (
languages,stack). On GitHub they are bold body text —<sub>is unreadable. - Code / JSON on cards is Geist Mono 14, weight 400, high contrast white on
#0a0a0a. - When unsure, use Mono.
1000px max, left-aligned badge matrix, 20px between categories, 6px from caption to row. Badges wrap; they do not shrink.
Composition borrowed from the reference:
- Content lives on stacked soft-square cards, slightly overlapping, never a marketing hero.
- Depth is layering and hairlines, not drop shadows.
- Atmosphere on the canvas may include grain, smoke, circuit traces.
- Badge faces carry their own grain. That grain is texture, not atmosphere leaking in.
- Base
#000000. Cards#0a0a0a. - Badge face is a flat
#141416square. No left plane. One right wedge at#3a3a42/ 0.12. A diagonal base gradient reads as glass — do not use one. - Grain is baked 1×1 specks in muted gray, not white stars. The profile ships
dist/h40/*.png, left-aligned, 40px tall. - No stroke. No hairline. No drop shadow. No filter. No lift. The outer shape is a 0-radius rectangle and nothing else.
Hard rectangle. Square corners. Flat and sharp.
- Badges: 0px. Not 2px. Not a pill. Not a button.
- Cards / JSON panels: 0px if they sit with the badge row; 8px only for stacked terminal cards
- Overlay panes: 12px
- Pills only for a real action control, never for a tech badge
- Height 40px, width hugs the label. Never clip. Never a huge empty tail.
- Fill: flat
#141416+ muted grain + a single right wedge at 12% opacity. No left glare. Profile README usesdist/h40/*.png, left-aligned. - No stroke. Radius 0. No shadow. The square is the clip, not a box drawn around the face.
- Mark sits on the face, optically centered. Official glyphs 20×20
#cfcfcf. Missing marks use the letter-tile recipe in Missing marks. - Label Geist 13 / 600,
#f2f2f2. Category titles sit in their own paragraph so they breathe above the row. - AnyDesk and RustDesk remain one chip
Match the floating documents in the reference: black rectangle, monospace JSON, dog-ear optional, stacked offset. Use only for atmosphere or a single identity card — not behind every badge.
A chip without a Simple Icons / vendor SVG still ships. Never drop a harness because the logo pack is incomplete. Never invent a mascot, bracket, gear, or sparkle to fake a brand.
The missing mark is a letter tile, occupying the same mark slot as an official glyph (22×22 so two letters fit; glyphs stay 20×20):
- Geist Mono, 10/600,
#f2f2f2on a flat#0a0a0csquare, radius 0, no outline. - The tile is an index, not brand art. Do not present it as the vendor's logo.
Letter recipe (deterministic):
- One token → first two letters (
Pi→PI,Crush→CR). - Two or more tokens → initial of the first two distinctive words (
Grok Build→GB,Open Hands→OH). Skip stopwords. - If two tiles on the same sheet would share a pair, take a more distinctive pair from the later name (
CUAstaysCUonly whileCursoralready has a glyph). - Never more than two letters. Never sit the letters as loose text next to the label (
AImust not read as the start ofAider).
Graduation: drop an official SVG at logos/official/{file-id}.svg and rebuild. File presence wins over a missing Simple Icons slug. The tile dies. Do not keep both.
Black field, hairline border. Focus = brighter hairline (#f2f2f2), no cyan ring. Buttons are ghost + mono label.
White iOS pills. Brand-colored logos. Cyan/pink glow. Invented mascots for tools that only have a letter tile. A title like "Refined Languages Badges Row". Extra tools. A landing-page hero that ignores the badge matrix.