Press
A quick squash, like cloth giving under a thumb, then it springs back.
A one-minute story
Say, a bike shop where booking a repair takes one tap.
Skip the story01The weekend
One screen, one button. It works.
02The next week
Three buttons, three shapes. Nobody chose that.
03The launch
Dark mode, a long label, a keyboard. Your customers find it first.
66%of developers spend more time fixing "almost-right" AI code.Stack Overflow Developer Survey 2025
04The fix
Every color, shape and word, decided once, with the reason kept beside it.
05How it works
It asks the questions. You answer. It builds every part and checks each one.
06After
Change one value and every part follows, proven in every browser, light and dark.
loosethreads · the design system that designs design systems
A design kit that remembers why. Every color, shape and word comes with the reason it was chosen, written where you and your AI can read it, and proven to look right in every browser, light or dark.
The kit is free and open. Loom, the team workspace, starts at $23 an editor a month. draft price
For builders working with agents
Every new chat starts from zero. Your contracts don't. An agent reads the contract before it writes a line, so it knows the radius, the words and every state. Then the checks run, and anything that breaks a rule comes back to you before it ships.
29%of developers trust the accuracy of AI output, down from 40% in earlier years. Trust follows what you can check.Stack Overflow Developer Survey 2025
Pick a request
Sample sessionloosethreads
Every choice keeps its reason. Nothing frays quietly.
Who decided it, when, and in what words, one step from the pixel.
Three layers, one cloth
Colors, parts and pages, woven together.
The names come from weaving, and the analogy holds. Read the cloth beside this: wherever a part's thread shows on top, that pattern is made with it.
Sample cloth · 6 parts × 5 patterns
Point at a part or a pattern to follow its thread.
Pull one thread
Drag the radius. Every part that asks Dye for it follows, and nothing that did not ask moves. That is what a token was always for, held to a contract.
owner
Matches the contract.
Decided by the owner: controls are rounded rectangles, never pills.
X-ray
Every slot is filled, inherited, not applicable, or marked Open. Every value carries a receipt: the words that decided it, who said them, when, and what they replaced. Pick a slot to read its receipt, or pull the loose thread at the top of the page to x-ray everything.
The receipts here are samples, written for this page.
warp/button
Start free Read a contractReceipt · radius
Controls are rounded rectangles, never pills.
by the owner · Oct 22 · replaced 8px (Oct 16)
Light, dark, mono
Drag the slider. The whole site sits between two modes while you drag, the cloth and the photographs included, then settles on the nearest one when you let go. It is the same Segmented part that sits in the header, and in every Pulp product.
Mode: dark
For people and models
A press is not just a click. It arrives as an intent: which part, in what state, in which flow, for what purpose. People read the screen. Analytics and models read the same events, already labeled, with no tracking plan to keep up.
This site is built the same way. Everything you have pressed so far is in the stream.
Press anything on this site. Its intent shows up here.
0 intents from you so far
Return on Loom
We have not measured how much fraying Loom removes for any team, so we will not quote you a savings figure. Put in your own week instead. Every line of the arithmetic is shown, and the answer is the point where Loom pays for itself.
Familiar is invisible
Move across the words. They loosen under your cursor, like cloth under a thumb.
The gestures you already know each do something small and pleasant. Try them.
Press
A quick squash, like cloth giving under a thumb, then it springs back.
Hold
Hold, and a thread weaves along the bottom edge until the action is sure.
Double-click
Double-click the word, and it shows you the token it is set in.
Different
Proven, not promised
Every story of every part runs in Chromium and WebKit, in light and dark. A part is Verified only when every slot passes in all four. Anything less says "not verified", out loud, on the page. The kit never rounds up.
Loom, the team workspace
Meet Loom
Loom is the paid workspace around the kit. Write contracts together, keep a receipt for every call, prove every part on every pull request, and send what people do to your analytics and your models.
Start with the free kit today. Bring your team into Loom when you want the receipts.
Loom, by loosethreads
Loom is the workspace where your team, and your agents, write contracts, make the calls, and prove every part in every browser and mode. The kit stays free. Loom keeps it honest.
No card to start. People who read, review and comment are always free.
Loom
Make the call once. It sticks.
Loom writes the decision down first, in the words that made it, and nobody is asked twice.
Four tools, one thread
How a call becomes a pixel
Someone asks how round a control should be. Loom searches the receipts first.
The owner answers, or a lead makes a call and marks it as a lead call.
The value goes into the slot with its receipt attached.
Every story reruns in Chromium and WebKit, light and dark.
The part updates everywhere it is used. Nothing else moves.
Guardrails
A pull request that changes a value the owner confirmed waits until a newer decision replaces it. Lead calls on Open slots go straight through.
held: look.radius 10px to 24px. Confirmed Oct 22, no newer receipt.
Before anyone pings the owner, Loom searches the receipts. If the answer is there, it is used, with a link to where it came from.
answered from receipt Oct 24: transitions are smooth, never stuck on Back.
Undecided slots are a visible list on the review page, never a quiet library default that becomes the brand by accident.
Open: look.hover on Button, words.empty on Menu, motion.exit on Sheet.
Who it is for
Start with whoever feels the fraying first. Today that is usually the person prompting the agent.
Builders working with agents
Contracts are plain data, so your agent reads the rules before it writes, and the checks flag anything that breaks one. You review a short list instead of fixing the same screen twice.
Design leads
Your words become the value, and every part follows. Change your mind with a new receipt, not a hunt through files.
Engineers
Every value has its reason one click away. No guessing which gray is the right gray.
Product
What is decided, what is Open and what is proven, per part and per screen, without asking anyone.
Return on Loom
Put in your team and an ordinary week. The calculator shows every line of the math.
Bring your kit into Loom and write your first contract today. Your first 14 days are on us.
Pricing
The kit is free forever. Loom is for teams who want every decision written down and every part proven.
Draft prices. Nothing here is set yet.
For anyone building with the kit, alone or in the open.
The whole kit:
For teams who want every call written down and every part proven.
Everything in Thread, plus:
For organizations running many products on one system.
Everything in Loom, plus:
Your team, your math
Editors change contracts and make decisions. Reviewers read, comment and approve, and never cost anything. Then put in an ordinary week of fraying, and see the point where Loom pays for itself. We show the arithmetic instead of a promise.
Questions
These prices are a concept draft.
Docs · Getting started
You will install the kit, pick a mode, mount a part and ask it why it looks the way it does. No account needed.
Concept docs: the package name, the lt why command and Alt + X are drafts, not shipped.
One package holds Dye, Warp and Weft, with every contract inside it.
pnpm add @loosethreads/kit
Wrap your app once. Light, dark and mono come from the same tokens, and the reader can scrub between them.
import { Dye } from '@loosethreads/kit';
<Dye mode="dark" scrub>
<App />
</Dye>Parts take an intent. It rides along with every press, already labeled, so you never maintain a tracking plan.
import { Button } from '@loosethreads/kit/warp';
<Button intent="start-free">Start free</Button>Every part carries its contract. This is a real excerpt of the Button contract, as it sits in the kit today: one slot filled with its source, one not applicable with its reason, and one lead call that says why.
{ "part": "Button", "layer": "warp", "slots": { "state.busy": { "value": "saving, saved, offline: does nothing when pressed and says so (aria-busy or aria-disabled)", "src": "LT-BTN-009" }, "state.invalid": { "na": "a button has no value to be invalid" }, "meaning.name": { "value": "its visible label; an icon-only button carries an accessible name, shown by its tooltip on hover and focus", "src": "rq-5" }, "text.tooltip": { "value": "an icon-only button hands the label it is given to its tooltip, so the tooltip and the accessible name always match", "by": "lead", "src": "lead: v2.2 IconButton passed nothing to its tooltip; one label for both closes that gap" } } }
Press Alt and X on any page running the kit, this one included. Every part is sewn round with a running stitch and a tag naming its contract and who decided it. Press again to put the paint back.
lt why is blame for pixels. Point it at any slot and it tells you the value, who decided it, when, what it replaced and where it is proven.
$ lt why button.radius
Press Run to ask.
Loom keeps a receipt for every call and proves every part on every pull request. Free for 14 days.
These start as example numbers. Change any of them to match your team.
Where Loom pays for itself
2.8%
Loom prices are a draft.