Koni Studio v1.5 · active

Design System · v1.5 · Brutally Minimal

Fast & gets out of the way.
The shared visual language for every Koni Studio surface.

Active Studio-wide SubWallet · Senti · Koni Finance · ERP Next.js 15 · React 19 · Tailwind 3.4
K to open command menu

§02 · Direction

Brutally Minimal. Type and whitespace do all the work.

Zero decoration. No background gradients, no decorative blobs, no patterns, no grain noise. Product screenshots are the decoration. Mood: someone who values speed looks at this and feels "this is for me, this is fast, this is honest."

Aesthetic peers

Linear · Vercel · PostHog

Developer-tool precision. Monochrome discipline. Geist-grade typesetting.

Not

Glean · Looker · Tableau

Corporate dashboards. Stock-hero marketing. Bubble-pill SaaS. Reject in review.

§03 · Color · Hex literals in globals.css

Restrained. Dark default + monochrome neutrals + one distinctive accent.

The accent is rare and meaningful — reserved for primary action, active state, confidence indicator. v0.14.3 switched off OKLCH because perceptual lightness drift rendered surfaces 30–40% lighter than intent. Canonical values are hex.

Surfaces · neutrals

Background

#0A0A0A

--background

Card · Popover

#161616

--card

Secondary · Muted

#1F1F1F

--secondary

Border

#262626

--border

Input · Hover

#404040

--input

Muted foreground

#A0A0A0

--muted-foreground

Foreground

#FAFAFA

--foreground

Semantic · status

Primary Lime

#A3E635

--primary · --ring

Success

#10B981

ready · valid · saved

Warning

#F59E0B

syncing · low confidence

Error · Destructive

#EF4444

failed · destructive

Info

#3B82F6

cache hit · notices

#A3E635 /* primary accent */

§3 · Rationale

Why lime, and not blue or purple.

Every AI tool defaults to blue ("trust") or violet gradients (Cursor / Claude / OpenAI). Lime signals terminal/CRT energy and builder DNA — and it differentiates Koni in a sea of indistinguishable AI dashboards.

Stripe Blue OpenAI Violet Anthropic Coral — Koni Lime

§04 · Typography · Geist + JetBrains Mono

Free, modern, hinted. Builder-recognizable.

Geist for product surfaces, sans + mono variants share the same metrics. JetBrains Mono for SQL and code blocks — ligatures off, optimized for line-by-line reading.

DisplayGeist 700 · -0.04em
Ask anything.
H1 · PageHeaderGeist 600 · 30px · 1.15 · -0.02em
Data sources
H2Geist 600 · 22px · -0.015em
Connect GitHub and Linear via OAuth
BodyGeist 400 · 15px · 1.5
Sync runs every 6 hours. Cached queries return in under 10ms on warm paths and continue serving the previous result during revalidation.
UI labelGeist 500 · 13px
Connect repository
Caption · EyebrowGeist Mono · 11px · 0.04em UC
Workspace · saved views
Data cellGeist Mono · 13px · tabular-nums
1,284,902.45 USDC · +12.4%
CodeJetBrains Mono · 13px · 1.6
git rebase --interactive HEAD~3
chat · preview.sql · shiki / github dark
-- filter to merged PRs from this week, grouped by author
SELECT
  author,
  COUNT(*) AS prs,
  DATE_TRUNC('week', merged_at) AS week
FROM pull_requests
WHERE state = 'merged'
  AND merged_at >= NOW() - '7 days'::interval
GROUP BY author, week
ORDER BY prs DESC
LIMIT 100;

§05 · Spacing & radius

Base unit 4px. Sharp 2–6px corners. Pill radius only for tags.

Density: tighter than Vercel marketing, looser than Linear's project board. The product values decisive feel over friendly rounding — bubble radii on cards or CTAs are forbidden in review.

Spacing scale

2xs2 px
xs4 px
sm8 px
md12 px
lg16 px
xl24 px
2xl32 px
3xl48 px
4xl64 px

Radius scale

sm · 2pxinline tags · subtle pills
md · 4pxbuttons · inputs
lg · 6pxcards · dialogs · sheets
full · 9999pxavatars · status dots only

§06 · Motion · Minimal-functional

Motion is paid for by a real user action.

No entrance animations on the landing. No scroll-driven fade-ins. No decorative motion ever. State changes, hover, focus, loading — those are the only beats. Hover any demo below to see it.

hover me · ease-out 100ms

Hover · focus · button press

100ms ease-out. Color and background only. Never scale or shadow.

ease-out100ms

Focus ring · input

1px lime ring at 40% opacity. Precise — not the heavy 3px glow shadcn ships by default.

box-shadow100ms

Skeleton loader · subtle pulse

Opacity pulse. No shimmer-gradient — that reads AI-slop and is rejected in review.

opacity2s loop

NavProgressBar · in-app navigation

1px lime segment slides during page transitions. Solid lime, no glow. Mounts above swapping content.

slide-progress1.6s loop

§07 · Components · shadcn/ui · we own the source

Radix primitives + Tailwind + cva. Patched away from shadcn 4.6 defaults.

We patched Badge's rounded-4xl bubble, Card's decorative ring, and Input's muddy 30%-opacity gray. Every primitive below ships with the variants the Koni system actually uses.

Button · 5 variants
Badge · paired with lucide icon (§11.5)
ready syncing failed
info primary secondary outline
Input · bg-card, 1px lime focus ring
Alert · 10% tint, 30% border
Sync complete. 1,204 records imported from GitHub.
Low confidence. Query score 0.62 — review before saving.
Cache hit. Served in 4ms from the previous run.
Card · rounded-md · solid border, no ring

Connection · GitHub

koni-studio / koni-erp

Synced 4 minutes ago · 1,204 commits · 24 branches.

ready
Kbd · terminal builder DNA
send · new line
Kcommand menu
/focus search · Escclose
DataTable · §11.6 typed alignment · mono cells · tabular-nums
Repo Author Status PRs Merged Cycle (d)
koni-erplinh.tranready1281192.4
senti-webminh.lesyncing84763.1
subwallethung.phamready2091981.9
koni-financethu.nguyenfailed120
koni-sitean.doqueued36294.0

§08 · Shipped UI patterns

Encode the conventions once. Reach for the pattern, not the riff.

A single <PageHeader/> for every page. A single row shape for every settings list. The lime stripe lives on the row wrapper, never the handle. Three pages drifting in three directions = users have to relearn a layout they already know.

§11.1 · <PageHeader>

Connections

Data sources

Connect GitHub and Linear via OAuth. Sync runs every 6 hours. Cached queries return in under 10ms on warm paths.

§11.8 · §11.10 · List row · active stripe on the wrapper

Foundation FND Default
12 tables · 4 sections · synced 6 min ago
Senti · trading dashboards SNT
8 dashboards · 24 charts · synced 2 hr ago
SubWallet · wallet metrics SWL
14 dashboards · 41 charts · synced 12 min ago
Koni Finance · institutional FIN coming soon
0 dashboards · setup pending

§09 · Anti-slop · REJECT in review

If a PR introduces any of these, flag it.

These aren't preferences. They're the patterns that take Koni out of "developer-tool precision" and into "another AI dashboard." Caught at review, not at design.

Purple/violet gradients as accents. Every AI tool does this; we use lime.
3-column feature grid with icons in colored circles.
Bubble border-radius 9999px on CTA buttons — only for tags, avatars, status dots.
Bubble radius rounded-xl/2xl/4xl on cards or badges. Caps at rounded-md for buttons/inputs/badges.
Decorative ring-1 ring-foreground/10 on cards or inputs — borders, not rings.
Inter · Roboto · Helvetica · Open Sans · Montserrat · Poppins · Space Grotesk as primary font. We use Geist.
Entrance / scroll fade-in animations on the marketing landing.
Stock photography heroes. Product screenshots are the proof.
Decorative blobs · orbs · grain noise as background filler.
Centered-everything layouts. Use editorial asymmetry on marketing.
Generic shimmer-gradient on skeleton loaders.
Inline style={...} colors or hardcoded Tailwind literals (text-emerald-400) bypassing the token system.
Emoji as status indicators in product chrome (✓ ✗ 📌). Use lucide icons.
Random opacity values (bg-secondary/40) producing muddy mid-grays.
Multiple H1 styles per app. Always use <PageHeader> for page-level H1 + description.
Native datetime inputs without the dark-mode picker-indicator filter fix.

§10 · Decisions log

The why behind every canonical choice.

Versioned in DESIGN.md. The system's character — fast, terse, honest, gets out of the way — holds across every surface, whoever the end user is.

Adopt Brutally Minimal aesthetic 2026-04-29
Matches "Fast & gets out of the way." Differentiates from Hex (editorial soft) and Glean (corporate).
Lime #A3E635 as primary accent 2026-04-29
Every AI tool uses blue or violet; lime stakes a unique brand position aligned with terminal/builder DNA.
Sharp 4–6px radius vs SaaS-default 8–12px 2026-04-29
Terminal / IDE feel. Signals decisive over friendly.
OKLCH → hex literals in globals.css v0.14.3
OKLCH lightness drift made surfaces render 30–40% lighter than agreed targets. Hex is unambiguous, pixel-exact.
Patched shadcn 4.6 primitives away from anti-slop defaults v0.14.5
Badge rounded-4xl bubble, Card rounded-xl ring-1, Input dark:bg-input/30 muddy gray — all §9 violations. Replaced with sharp tokens + semantic variants.
Re-applied <PageHeader> to 4 drifted pages v0.22.1
Sign-in / sign-up / settings/workspace / workspaces/new re-implemented H1 inline. Leading drifted to 1.25 vs canonical 1.15. Codified as LESSONS §24.