Introduction
Dowel is a set of 184 React components you install as source. The CLI copies real files into your repository — you read them, change them, and they are yours. There is no runtime package between you and the markup.
What that means in practice
Because the code lives in your project, the usual escape hatches are unnecessary. There is no styles prop to thread through, no theme object to fight, and no wrapper to write when a component does not quite do what you need. You edit the file.
The trade is that updates are not automatic. That is handled deliberately rather than ignored: add records a hash of every file it writes, so update can tell a file you edited from one that changed upstream, and never overwrites your work without being told to.
What is opinionated
- Accessibility is not configurable. Keyboard interaction, focus management and announcements are part of each component, not a prop you remember to set. Where the accessible choice differs from the common one, the reason is written on the component’s page.
- Composition over configuration. Components take children, not configuration objects. A Dialog is a Dialog, a Trigger and a Content, so anything can go anywhere.
- Semantic tokens only. Components reference
bg-primaryandtext-muted-foreground, never a raw colour. Re-skinning the system changes tokens, not components.
Requirements
- React 19
- Tailwind CSS v4 — the tokens use
@theme, which v3 cannot parse. The CLI refuses to install into a v3 project rather than writing CSS that will not build. - TypeScript. JavaScript output is not supported yet.