Show HN: Basecoat – All of the shadcn/ui magic, none of the React

6 hunvreus 2 5/8/2025, 12:45:10 PM basecoatui.com ↗
In a nutshell: Basecoat is a port of shadcn/ui to HTML and Tailwind CSS. It's a modern, themeable component library; everything from buttons to comboboxes and dialogs.

Why? Well, I got sick of React and moved over to a more "old school" stack (Python, HTMX, Alpine.js and Tailwind).

The one thing I missed was shadcn/ui [1]. Nice defaults, well thought out design system, easy to theme and great to build your own component library with.

I didn't find the alternatives compelling: Flowbite, Preline and the likes encourage you to copy/paste dozens of classes for each element.

That's not how I use Tailwind. I love the utility-first approach, but I don't want walls of classes for each button, form element or tooltip I have in my app.

I had been building my own component library for a project I’m working on (a Vercel for Python apps) and realized it may be worth my time to firm things up.

Why I think it's cool? Well:

- No React. Just Tailwind CSS (with a tiny bit of Alpine.js if you choose to). You can use that with whatever stack you want.

- Jinja and Nunjucks macros. I hope to support more template engines.

- 100% compatible with shadcn/ui themes (you can play with the theme select box on the site).

- Super easy to install and use (there's even a CLI).

- Accessible, with ARIA support.

- Did I mention no React?

Hope some of you find it useful.

[1]: https://ui.shadcn.com/

[2]: https://v4.shadcn.com/ (this is actually the new/upcoming version of shadcn/ui).

Comments (2)

drivingmenuts · 6h ago
Not working in Safari. Did you, perchance, test this only in Chrome?

A sampling of error messages:

- Failed to load resource: Load cannot follow more than 20 redirections

- Cross-origin script load denied by Cross-Origin Resource Sharing policy.

- TypeError: window.basecoat.registerDialog is not a function. (In 'window.basecoat.registerDialog(Alpine)', 'window.basecoat.registerDialog' is undefined)

- Alpine Expression Error: Can't find variable: sidebar

and so on and so forth. It just goes downhill from there.

hunvreus · 5h ago
I tested it in Safari, and just checked: I don't get any of these errors.

Which page did you get that on? The front page?