Installation

Starting from nothing

If there is no project yet, the scaffolder writes one and fetches the components for it. It asks what you are building — a starter, a SaaS application or an AI product — and which of the thirteen themes to start on.

Terminal
npx create-dowel-app my-app

The templates do not contain the components. They are the application files plus a list of registry names, and the scaffolder runs the same CLI you would run yourself — so a project created today is built from today’s registry rather than from whatever was current when the template was written.

Adding it to a project you already have

You need a React 19 project with Tailwind CSS v4 already set up, and TypeScript.

1. Initialise

This inspects the project, writes components.json, adds the cn() utility and appends the design tokens to your stylesheet. Nothing you already had is rewritten.

Terminal
pnpm dlx @dowel-ui/cli init

It detects your package manager, path alias and stylesheet, and asks only about what it cannot work out. If your project is not supported — Tailwind v3, or JavaScript — it says so and stops rather than writing files that will not build.

2. Add components

Each component is installed with whatever it depends on. Adding a date picker also installs the calendar, popover and button it is built from.

Terminal
pnpm dlx @dowel-ui/cli add button card input

3. Use them

Imports are rewritten to your project’s own alias as the files are written.

create-project.tsx
import { Button } from "~/components/ui/button";
import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "~/components/ui/card";
import { Input } from "~/components/ui/input";

export function CreateProject() {
  return (
    <Card>
      <CardHeader>
        <CardTitle>Create project</CardTitle>
      </CardHeader>
      <CardContent>
        <Input placeholder="Project name" />
      </CardContent>
      <CardFooter className="justify-end">
        <Button>Create project</Button>
      </CardFooter>
    </Card>
  );
}

Keeping up to date

update compares what you have against the registry and reports each file as up to date, out of date, or locally modified. Files you have edited are left alone unless you pass --overwrite.

See the CLI reference for every command and flag.