Spec-driven development for AI coding agents. Story maps, plans and acceptance criteria live in your repo. Every criterion runs as a Cucumber test, and a story can't be marked done until it passes.
Give your next feature a clear purpose—and a clear definition of done.
Open source. Your repositories. Start with one team.
Start with nikOS
$ npx nikos start
.band-in, .band-start, .install
07
Do & don't
The short version, for people and agents.
Do
Keep the page quiet: paper, ink, hairlines. Let the tool’s dark logo panel be the loud thing.
Use green only for what’s live, and rgb(var(--glyph)) only on dark screens.
Give every command a Copy button, and make it a real command that works today.
Put caveats in their own note, where people will read them.
Check every page at 320px wide: nothing scrolls sideways.
Respect prefers-reduced-motion: animations rest, they don’t vanish.
Don’t
Don’t add a second shadow, gradient or accent colour.
Don’t set body copy in the serif or mono; they’re voices, not text faces.
Don’t lighten the dark screens in dark mode: they’re the brand in both themes.
Don’t redraw a component for a page; use its class.
Don’t promise what a tool doesn’t do yet.
→
The brief
What Copy prompt gives your agent: this page as plain text, built from the same data.
# nikos.tools design language
Use it for every page on nikos.tools and for any tool page or asset that sits next to it. Tokens live in public/style.css. Library: https://nikos.tools/ux/library
## Principles
1. The tool is the hero. Pages stay quiet so each tool’s dark logo panel is the loudest thing on the shelf.
2. Dark screens are the brand. Logo panels, terminals and the closing band stay dark in both themes. That’s where tools come alive.
3. Green means live. The accent marks what works now: a free price, a passing check, the next step. Never decoration.
4. Three voices. Schibsted Grotesk says it. Instrument Serif italic says it with feeling. JetBrains Mono is the machine.
5. Honest by default. Commands are real and copyable, and caveats get their own boxes instead of small print.
## Colour (CSS custom properties)
- Live (--accent): What works now: a free price, a passing check, the next step to take.
- Alive (--glyph): Something running on a dark screen: logos, terminal output, the closing band.
- Quiet (--muted): Everything else: supporting copy, labels and lines that stay out of the way.
Surfaces:
- --bg #f2f3ef light / #0d100e dark: Paper. The page, with a faint green bias toward the accent.
- --surface #ffffff light / #141815 dark: Card. Tiles, cards, notes and the inside of buttons.
- --screen #070a08 light / #070a08 dark: Screen. Logo panels, terminals, the closing band. Dark in both themes.
Ink:
- --fg #111411 light / #ebeee9 dark: Ink. Headlines, body copy and primary buttons.
- --muted #5c625c light / #98a098 dark: Pencil. Ledes, supporting copy, labels and nav.
Lines:
- --line #dcdfd8 light / #232a25 dark: Hairline. Card borders and dividers.
- --line-strong #b9beb6 light / #3a443c dark: Rule. Hover borders, dashed outlines, secondary buttons.
Accent and glyph:
- --accent #14823e light / #4fdc85 dark: Live. Text and marks for what’s live. Readable on paper.
- --accent-soft #e2efe5 light / #15261b dark: Live wash. Behind accent text: the free price, alignment tags.
- --glyph #3cff7a light / #3cff7a dark: Glyph. On dark screens only, as rgb(var(--glyph)). Too bright for paper.
## Type (Schibsted Grotesk, Instrument Serif italic, JetBrains Mono)
- Display (.hero h1): font: 600 var(--step-3)/1.02 var(--f-display); letter-spacing: -.035em. One per page, in the hero. Balanced, at most about 15 characters a line.
- Display italic (.hero h1 em): font: italic 400 1.06em/1 var(--f-serif); letter-spacing: -.01em. The second half of a headline, inside an em. Never on its own line of body copy.
- Section heading (.nk h2): font: 600 var(--step-2)/1.1 var(--f-display); letter-spacing: -.025em. Opens every section. Can end in a serif italic phrase.
- Lede (.lede): font: 400 var(--step-1)/1.5 var(--f-display); color: var(--muted). Under a headline. Pencil, at most 54 characters a line.
- Body (body): font: 400 var(--step-0)/1.6 var(--f-display). Everything else.
- Label (.label): font: 500 var(--step--1)/1.3 var(--f-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--muted). Eyebrows and small headings. Mono, uppercase, tracked.
- Code (.install code): font: 400 .8rem/1.4 var(--f-mono). Commands and file names. Real ones only.
- Scale: --step-3 clamp(2.4rem, 1.7rem + 3.4vw, 4.6rem) (Hero headline); --step-2 clamp(1.6rem, 1.3rem + 1.2vw, 2.3rem) (Section headings, tile titles); --step-1 clamp(1.2rem, 1.1rem + 0.4vw, 1.45rem) (Ledes, card headings); --step-0 clamp(0.98rem, 0.95rem + 0.15vw, 1.06rem) (Body); --step--1 clamp(0.78rem, 0.76rem + 0.1vw, 0.84rem) (Labels).
## Layout and shape
- Column: --max: 1180px. The widest anything gets. Centred.
- Gutter, phones: max(16px, env(safe-area-inset-left, 0px)). Never less than 16px, and clear of the notch.
- Gutter, 720px and up: max(32px, env(safe-area-inset-left, 0px)). Room to breathe on tablets and up.
- Page hero padding: clamp(56px, 9vw, 120px) clamp(40px, 6vw, 72px).
- Section padding: clamp(56px, 8vw, 104px) 0.
- Shelf: 1 column, 2 at 720px, 3 at 1040px. Tiles. The featured tile spans two.
- Split: 5fr 6fr at 960px. Copy beside a figure, the figure sticky.
- Radius: 999px for pills: buttons, filters, chips in lists; var(--radius) (14px) for tiles and cards; 12px for terminals and cards inside cards; 10px for the install command; 7px for copy buttons and the brand mark; 6px for price tags and platform chips.
- Shadow: 0 24px 48px -28px rgba(10, 20, 12, .35). The only shadow. A tile lifts 3px into it on hover or focus.
- Motion: --ease cubic-bezier(.2, .7, .2, 1). Every transition. Fast out, gentle settle.
## Components (classes in public/style.css)
- .btn and .btn.primary: pill buttons; an arrow in .arr nudges on hover.
- .price (free, accent wash) and .price.paid (ink); .chip for platforms.
- .filters: a pill of buttons with aria-pressed.
- .install: a command in mono with a $ prompt and a .copy button.
- .tile: a dark .logo panel above (or beside, when featured) a .body with meta, title, summary, install and links.
- .term: a dark terminal; .tl lines, .ok in glyph green, .dim for quiet lines.
- .honest p: a caveat note with an accent rule; .faq: questions in details and summary.
## Do
- Keep the page quiet: paper, ink, hairlines. Let the tool’s dark logo panel be the loud thing.
- Use green only for what’s live, and rgb(var(--glyph)) only on dark screens.
- Give every command a Copy button, and make it a real command that works today.
- Put caveats in their own note, where people will read them.
- Check every page at 320px wide: nothing scrolls sideways.
- Respect prefers-reduced-motion: animations rest, they don’t vanish.
## Don't
- Don’t add a second shadow, gradient or accent colour.
- Don’t set body copy in the serif or mono; they’re voices, not text faces.
- Don’t lighten the dark screens in dark mode: they’re the brand in both themes.
- Don’t redraw a component for a page; use its class.
- Don’t promise what a tool doesn’t do yet.