uier brand
How uier looks and sounds. This page renders from the @uier/brand package and the UI kit with the brand tokens applied, so it always shows the brand as it ships. The written rules are in BRAND.md; the code is in packages/brand.
Quiet, precise, rounded, and a little pointed.
The brand follows the product. Three principles decide most questions.
Name and voice
Say it on the page.
Review any live website by leaving comments directly on it. Every comment stays pinned to the element it is about, with the browser and viewport it was left from.
tagline · short description · long description, all in src/brand.ts- Always lowercase. uier, even at the start of a sentence. Never “Uier”, never “UIER”. Read “you-eye-er”.
- Sentence case everywhere. No Title Case headings, no ALL CAPS labels, no exclamation marks.
- Say what happens. “The comment stays attached to that element”, not “seamless” or “powerful”.
- Only claim what the product does. No invented stats, customers or features.
- Plain in running text. The name gets the same weight and colour as the words around it.
The mark is a pin
A 1:1 square with three corners at full radius and the top-left corner left sharp. The sharp corner is the pointer: in the product it sits where a comment is anchored, so the logo is the same shape people click on every day.
The wordmark is “uier” in Geist Semibold with −3 % letter-spacing. Do not capitalise the name, recolour the mark, rotate or flip it, add an outline, shadow or gradient, or put a tagline inside the lockup. Use <Logo />, <Mark /> and <Pin /> from the package; never redraw the shape.
Ink on paper. One accent, kept for the review layer.
Neutral greys with no blue cast; dark mode is true black, like the toolbar. The values below are read from the stylesheet in the current theme, so switch the theme above to see both sets.
Geist for everything. Geist Mono for what a machine wrote.
Loaded with next/font from the geist package. Three weights: 400 for reading, 500 for labels and buttons, 600 for headings. Sentence case, tabular figures for counts.
Open any page with review on, click the element you mean, and write. The comment stays attached to that element, with the viewport, browser and device it was left from, so the fix is never a guess.
body · 16 / 26 · 0 · 400Rounded, bordered, barely animated.
Radius grows with the surface. Borders separate, shadows float. Two levels of elevation only.
- 4icon to label
- 8inside a pill, between buttons
- 12list rows, menu padding
- 16card and popover padding
- 24between cards, dialog padding
- 32section inner padding
- 64between marketing sections
- 150ms ease-out enter and exit: fade plus 8 px slide.
- 120ms hover and press: colour only, no scale.
- none on page load. No bounces, parallax or gradient movement.
The signalco UI kit, with the tokens applied.
Real components from @signalco/ui-primitives. Solid is ink, outlined is the border, plain is nothing until hovered. Do not build parallel components.
The review layer is always ink.
The toolbar, pins and inbox are what the product is. They stay black on any site they land on and never try to match it. Threads follow the system theme, because people read and type in them.
Run the web app and the toolbar locally (pnpm dev) and open this page with ?review=true to see the real thing on top of it.
Will first-time visitors get what “the page” means before they scroll? “on the site” might land faster.
The line right under it says “live website”. Keeping it, it is the whole point.
A thread, open right where the comment was left. This one is on the headline.
Assets and where things live
Everything is generated from the mark and the constants; nothing is drawn twice.
- favicon.svg · the bare mark, ink in light tabs and white in dark
- apple-touch-icon.png · black plate, white mark at 54 %
- android-chrome-512x512.png · same plate, maskable
- opengraph-image · the 1200 × 630 social card, generated from the constants
- manifest.webmanifest · name, icons and colours from the constants
- Change the value in
packages/brand: tokens.css for colour and radius, src/brand.ts for names and copy, src/Mark.tsx for the shape. - Update BRAND.md so the rule matches the value.
- Re-render the icons if the mark changed:
pnpm -C packages/brand icons. - Check this page. It renders from the same code, so it shows the change as it ships.
Original design exploration: a Claude Design canvas, October 2026 (private). Everything that matters from it is in BRAND.md.