01Principles
Six rules that settle most arguments.
Kinly is opinionated in a small number of places so it can be flexible everywhere else. When a decision is contested, one of these six usually answers it.
- Calm by default
- Structure over decoration
- Money first
- 01
Paper, not screen
Surfaces sit on a warm off-white at hue 80. Cards are crisp white so they lift without a shadow. Nothing is pure #fff on pure #000.
- 02
One accent, spent carefully
A single deep teal marks the primary action. If two things on a screen are teal, one of them is wrong.
- 03
Hairlines over elevation
Structure comes from 1px borders at 10% ink. Shadows appear only where something genuinely floats — dialogs, popovers, drag states.
- 04
Money is tabular, always
Every amount uses tabular lining figures so columns align down the page and digits do not shift as values update.
- 05
Wrap, never truncate
Labels and payees wrap instead of clipping, and controls use min-heights over fixed heights so the longest string never gets cut off.
- 06
Calm at a glance
Status colour is reserved for state that changes a decision. Neutral is the default answer, not a fallback.
02Colour
Warm neutrals. One teal, spent once.
Components reference roles, never raw hues. Neutral surfaces carry the interface; the accent appears only where an action lives; status colour is reserved for state that changes what you would do next.
- oklch throughout
- Role before value
- 4.5:1 body contrast
Surfaces & ink
Sheet
Quiet fill
Deep ink
Intent
Action
On track
Attention
Overdue
The accent budget
One teal per screen
Everything on the left is neutral by design: rules, fills, labels, secondary actions. Exactly one element is allowed to be teal, and it is always the thing you most likely came to do.
03Typography
A serif for voice. A sans for work.
Fraunces carries headings and amounts — it gives the system a human, editorial register that most finance apps refuse themselves. Inter does everything else.
- Fraunces · Inter · JetBrains Mono
- 13.5px body
- Tabular figures
Display family
Fraunces · Serif
Aa Bb
A warm, slightly wonky serif with soft, humanist shapes — drawn for headings, amounts, and long-form reading alike.
Numeric
Amounts · Tabular
$1,700
- Spent
- $1,100
- Left
- $550
- Saved
- +$160
Fixed-width figures keep columns still. A digit changing from 1 to 8 must never move the number beside it.
Type scale
Eight roles, one rhythm
- Display
- 32 / 1.1 · 500
- April budget
- Section
- 24 / 1.15 · 500
- Six jars, one plan
- Card title
- 18 / 1.3 · 600
- Northbank ···4821
- Body
- 13.5 / 1.55 · 400
- Weekly grocery run — shared with Maya.
- Label
- 13 / 1.2 · 500
- Paid from
- Caption
- 12 / 1.55 · 400
- Apr 12 · Groceries
- Money
- 15 / 1.2 · 500 · tnum
- $34
- Mono
- 12.5 / 1.4 · 400
- --primary
04Shape & rhythm
One radius, divided four ways.
Every corner in the system derives from a single 10px base. Control heights come in three, and spacing in eight steps — small enough to memorise, which is the point.
- --radius: 0.625rem
- 36px default control
- 56px section rhythm
Radius ladder
Derived, never guessed
- sm
- Small buttons, kbd, chips
- 6px
- md
- Buttons, inputs, selects
- 8px
- lg
- Cards, dialogs, popovers
- 10px
- xl
- Sheets, large surfaces
- 14px
- full
- Badges, avatars, pills
- 9999px
The ladder, in use
Control heights
- 32px
- smTable and toolbar actions
- 36px
- defaultEverything else
- 44px
- lgPrimary CTA, mobile targets
Spacing
- 1
- 4px
- 1.5
- 6px
- 2
- 8px
- 3
- 12px
- 4
- 16px
- 6
- 24px
- 8
- 32px
- 14
- 56px
05Elevation
A shadow is a promise that it moves.
Four rungs, and the first does most of the work. Structure is a one-pixel hairline; a shadow is spent only on what genuinely floats above the page, so when you see one, you know it can be dismissed.
- hairline first
- shadow-sm · md · lg
- --scrim behind modals
- 01Flat1px hairline
Cards, tables, panels, every band — the default answer.
- 02Raisedshadow-sm
A button you can press, the one elevated card variant.
- 03Floatingshadow-md
Menus, popovers, tooltips, toasts — anchored to something.
- 04Modalshadow-lg + scrim
Dialogs and sheets — the page behind drops under --scrim.
06Layout
Three measures, one floor.
Pages are cut to a reading, band or canvas width and centred in it. Everything is designed from the phone up: at 320px nothing may run past the edge, and a wide table becomes a list of records.
- reading 672
- band 1180
- canvas 1440
- floor 320
Measures, to scale
- Reading
- 672px
Docs, long copy, a single form.
- Band
- 1180px
Every section on the site; 20px gutters.
- Canvas
- 1440px
Component canvas, tables, the app shell body.
Breakpoints
- 320
- The floor — nothing may overflow.
- 390
- The design phone.
- md · 768
- Tables stop being record lists.
- lg · 1024
- Rails dock; two-column sections.
- xl · 1280
- The band reaches its full measure.
08Components
Eighty-five primitives, all of them awake.
These are live controls on a working surface, not a screenshot of an inventory. Focus them, toggle them, drag the slider. The canvas runs wider than the page because a design system does.
- Live states
- Keyboard ready
- Radix underneath
Action · hierarchy and size
Button · ButtonGroupVariants
Sizes · 32 / 36 / 44px
Split action
Input · money and search
InputGroup · SliderChoice · one, many, either
Radio · Switch · ToggleSplit method
Range
Disclosure · progressive detail
Accordion · TabsShortcuts
Pick · choose from a set
Select · ComboboxDate · a range, not a pair
DatePicker · DateRangePickerHint · one-line gloss
TooltipTooltip · one-line gloss
$170
Overlay · ask before acting
Dialog · AlertDialogDialog · edit in place
AlertDialog · the second tap
Destructive actions wait behind a second tap.Menu · actions on demand
DropdownMenu · ContextMenuContextMenu · no hunting
Status · state that changes a decision
Badge · Alert · ProgressBadges
Dining is 118% of plan
Jar progress
States · known and unknown
Skeleton · Spinner · BannerNorthbank needs re-authentication
Balances are 3 days stale until you reconnect.
Spinner · indeterminate waits
Skeleton · the known shape
People · presence and sync
AvatarGroup · StatusDotAvatarGroup · the overflow is explicit
StatusDot · sync at a glance
Meta · detail on request
DescriptionList · CopyButton- Account number
- 0847 1123
- Routing number
- 021000021
- Reference
- KIN-8F2A-4410
CopyButton · quiet, then certain
Activity · a history in hairlines
Timeline- 1
Rent
$2,100Auto-pay · Checking ···4821
- 4
Con Edison
$128.40Estimated
- 9
Mint Mobile
$30Card ···7702
- 12
Chalk Climbing
$89Card ···7702
Data · the ledger
Table| Payee | Jar | Amount |
|---|---|---|
| Whole Foods | Groceries | $34 |
| DoorDash — Noodle House | Dining | $7.40 |
| Rent for April | Rent | $360 |
| April salary | Income | +4$80 |
Rows · accounts and jars
Item · AvatarChecking · synced 2h ago
Savings · synced 2h ago
Wallet · synced 6h ago
Numbers · one scale, tabular
Amount · DeltaAmount · the scale
xs$1,284.50sm$1,284.50md$1,284.50lg$1,284.50signed+$480Delta · up is not always good
Budget · against a limit
MeterOver by $34
Absence · empty and attached
Empty · AttachmentConnect a bank, or add the first one by hand.
Path · breadcrumbs and steps
Breadcrumb · StepperBreadcrumb
Stepper · what’s left
- 1
Connect an account
Northbank, Amex, or a CSV
- 2
Confirm categories
We guess; you correct
- 3
Set a budget
Envelopes for the month
Conversation · asking about money
Message · Bubble09Data
Twelve charts, no charting library.
Every chart is hand-rolled SVG sharing one categorical palette, one tooltip treatment, and one focus model — so a dashboard reads as a single surface instead of a collection of widgets.
- Categorical only
- --chart-1…5
- Focusable series
--chart-1Teal--chart-2Terracotta--chart-3Indigo--chart-4Amber--chart-5RoseChecked for colour-blind separation and 3:1 against the card. Use in order; green and red are status, never series.
10In situ
Six real screens, running inside this page.
Everything above is inventory — tokens, primitives, charts, motion. This is what they add up to. Each panel below is a live route from the screen library, embedded as itself: same tokens, same components, same theme you are reading in. Six different chassis, one language.
- Live routes
- Not screenshots
- Six chassis
Household overview
Safe-to-spend as arithmetic you can check — balances, less the bills that must clear, less what the envelopes still owe.
These six are a sample. The library carries 146 built screens across 13 groups — every one of them a route in this repository, on these tokens.
Browse the screen library