usva.

beautythat staysusable.

79 components · 3 themes · 8 atmospheres

a highly opinionated design system first, a component library second. the type, the colour and the motion arrive already decided, so every part agrees with every other before you place it.

designed for my work, opened for yours.

the test of a design system is what it already runs. usva runs two apps that pull in opposite directions, off one vocabulary. watch them build.

the beauty pole. it is allowed to be loud, because you look at it once and leave.

the usability pole. students live inside it all term, so nothing here gets to shimmer.

recedes36 of them

most of the system is furniture.

a button, a field, a chip, a row. you are not meant to notice any of them, and there are dozens, because that is what a real app is made of.

enrol on a course4 seats left
find a course
autumnopen5 op
this degreebsc
credits142opleft38op
tell me about2 rules
this term
period 1period 2period 3period 4

a handful of them, live. you read the words, not the widgets. the rest behave the same way.

every primitive
structures27 of them

then the things that hold a page up.

bigger, fewer, opinionated. a pattern has already decided how its parts sit together, which is the part you would otherwise redo on every screen.

autumn 2026

credits, by period
on track
period 1
15 / 15 op
period 2
11 / 15 op
period 3
4 / 15 op

79%

of the degree
empty state

nothing is due.

the next deadline is nine days out.

degree
142 / 180 op

27

patterns in the system

these are the same patterns you install, composed together rather than flattened into screenshots.

every pattern
asserts6, for now

sula is a material, not a component.

a surface that behaves like a liquid: it swells, it merges, it pinches apart, it has mass and it lags. that is the whole idea. you have been watching it do exactly that.

there will be more, but not many and not quickly. a component this loud has to earn the room it takes, and most ideas do not.

the 63 quiet components above are what earn this one the right to be loud. one sula surface per region, and never in a form somebody has to fill in.

↳ kuohu · the surge of a boiling liquid

molten. to melt. the state a solid gives up.

the psychology, not the physics.

↳ kuohu · the surge of a boiling liquid

is the room

at the bottom there is no component left, only weather. an atmosphere is not a sibling of Button. it is the thing Button is standing in, and you are standing in one right now.

8 of them. this one is kajastus.

one square for every component I ship.

65 quiet14 loud

every square is a component. point at one.

the loud ones are the accent squares. count them. that ratio is the design system, and it is the part people get wrong: sula is seasoning, not the diet.
core · primitives
36
core · patterns
27
core · motion
2
sula
6
atmospheres
8
total
79

you are reading this in kajo.

3 themes, one vocabulary. switch it here. nothing forks.

theme 1 of 3

kajo

a faint glow. the light you see before the thing making it. a glow on the horizon at four in the morning, no source in sight.

violet dark, generous radius, real glow. the expressive pole, built for a page you look at rather than work in.

atmosphere
kajastus · the glow spreading along the horizon, light thrown back onto the sky; the glow that was on the horizon, arrived. a curved roof of folded light closing overhead, seen from underneath rather than across.
use it for
portfolios and launch pages, a case study that opens with a full-bleed hero, surfaces where an atmosphere or a sula element is the point.
do not use it for
a dense table someone reads all day, a first-run flow where one control must be found fast, anything that has to survive a white slide.
↳ full showcase at /themes/kajo

two ways in. pick per component.

same source, two distributions. you are allowed to mix them in one project, and most people should: install the boring parts, own the loud ones.

install it

you want fixes to arrive on their own. bun update and the whole surface moves. you do not intend to touch the internals.

soonnot on npm yet
  • updates propagate
  • one version across apps
  • internals stay mine

own it

you want the source in your repo. shadcn-compatible: it copies the same file the package ships, byte for byte, and then it is yours to wreck.

  • source lands in your tree
  • fork freely, no upstream
  • identical to the package source

the long version, with both paths spelled out: /docs/get-started/installation