Installation
Bring components into your project with one command.
Inbox is distributed the way shadcn/ui is: not as a package you depend on, but as a registry you install from. The CLI copies the source into your project, so the components are yours to edit — which is what you want from a system that is still changing.
Add a component
npx shadcn@latest add https://ui.whoisroktim.lol/r/button.jsonThat is all it takes. The CLI resolves everything the component needs and writes
it into your project. Asking for modal pulls in button — because the modal's
footer uses it — and both pull in the token layer:
✔ Created 6 files:
- src/styles/tokens.css
- src/styles/typography.css
- src/lib/cn.ts
- src/components/icon.tsx
- src/components/ui/button.tsx
- src/components/ui/modal.tsxIt also adds clsx, tailwind-merge and class-variance-authority to your
package.json.
Register the namespace instead
If you are going to install more than one thing, register it once:
npx shadcn@latest registry add @inbox=https://ui.whoisroktim.lol/r/{name}.jsonThen the commands get short:
npx shadcn@latest add @inbox/button @inbox/modal @inbox/toastThen import the tokens
The one manual step. Add the two generated stylesheets to your global CSS, after Tailwind:
@import "tailwindcss";
@import "./styles/tokens.css";
@import "./styles/typography.css";Components read CSS custom properties and never hardcode a colour, so without these two imports they render unstyled. This is the only step the CLI cannot do for you — it will not edit your global stylesheet.
Requirements
Tailwind CSS v4 and React 19. The token layer uses @theme and @utility,
which are v4 features.
What tokens gives you
Every component depends on one registry item, tokens. It carries the semantic
colour, type, elevation and scale variables — each with a light and a dark
value — plus cn() and the icon set. That is why a component never needs a
dark: variant: bg-raised already resolves correctly in both themes.
If the registry moves
The commands above name https://ui.whoisroktim.lol, read at build time from
REGISTRY_URL. Point that at a new host, redeploy, and every command on this
page updates with it.
Nothing already installed breaks. The CLI copies source into your project, so there is no runtime dependency on this host — components you have already added keep working regardless of where the registry lives. Only future installs need the new URL, and anyone who registered the namespace re-runs one command:
npx shadcn@latest registry add @inbox=https://ui.whoisroktim.lol/r/{name}.jsonBuilding the registry
If you are working on this system rather than consuming it:
npm run registryThat regenerates registry.json and runs shadcn build, which writes
public/r/*.json. npm run build does it for you, and npm run registry:check
fails if the committed output has drifted from the source.
Set REGISTRY_URL for production — items cross-reference each other by absolute
URL, and the default is localhost:3000:
REGISTRY_URL=https://ui.example.com npm run registry