How It Compares
Head-to-head with shadcn-templ (formerly templUI) and goshipit: architecture, testing depth, and what each class of project is best at.
templ-components vs the ecosystem
External facts verified: 2026-10-08 — star counts fetched from the GitHub
API on that date; product claims read from the linked sources on that date.
Internal claims (component/test/golden counts) are drift-guarded by
utils.TestDocsCountDrift. Re-verify the external numbers before citing or
extending this document — they rot fastest.
Re-verify cadence: re-check the external facts (stars, component lists, naming, distribution model) at least QUARTERLY, and immediately after any known competitor event (a rename/rework like templUI→shadcn-templ, a major release, or a star-order-of-magnitude move). Record the new verify date in this header and in the TODO_LIST sweep row; competitor claims shipped stale twice before this cadence existed (templUI/Alpine.js falsehood in README + website, found and fixed 2026-10-08).
The contenders
| Project | What it is | Stars* |
|---|---|---|
| templ-components (this repo) | Server-rendered Go component library: templ + Tailwind v4, HTMX-native, Datastar opt-in. Versioned Go module. | 4 |
| shadcn-templ (formerly templUI) | The shadcn/ui port for templ: same DOM (data-slot), same design language, 8 style themes, copy-paste registry + installable blocks. |
1,754 |
| goshipit (GoShip.it) | DaisyUI-on-Tailwind component library for the GOTH stack, HTMX-driven, with a gsi copy CLI and a demo app. |
277 |
| templ examples (a-h) | Official educational examples in the templ repo — not a library. | — |
* GitHub API, 2026-10-08.
Note on naming: templUI v1 (templui.io, 42 components) was renamed and reworked into shadcn-templ 2.0; templui.io now reads "templUI is now shadcn-templ". Older third-party comparisons that describe templUI as "Alpine.js-based" are describing the old v1 lineage — the current project uses vanilla JS only.
Snapshot
| templ-components | shadcn-templ | goshipit | |
|---|---|---|---|
| License | MIT | MIT | MIT |
| templ version | v0.3.1020 (pinned, zero-diff generator) | v0.3.1070 | not checked |
| Go floor | 1.27 | 1.26 | 1.x |
| Components | 124 primitives + 4 recipe screens | ~64 + 27 installable blocks | 52 |
| Icons | 102 typed names, animated variants | icon component (lucide set) | via DaisyUI/inline |
| CSS | Tailwind v4 (CSS-first), one look | Tailwind v4 + CSS vars, 8 style themes | Tailwind v4 + DaisyUI 5 |
| JavaScript | Per-component CSP-safe inline singletons; native APIs first (<dialog>, Popover API, <details>, CSS tooltips) |
One esbuild-bundled, minified runtime porting Base UI behavior (Floating UI, portals, focus, scroll lock) | HTMX-driven; no custom framework |
| CSP | Strict nonce discipline incl. omit-empty rule, render-table guard | Nonce via templ.GetNonce on the runtime bundle |
not documented |
| HTMX | Built-in package; self-hosted runtime embedded by default | Compatible (htmx fixture-tested) | Native (core design) |
| Datastar | Opt-in package + wire.Action dual transport |
none | none |
| Dark mode | Built-in, scanner-enforced (TestDarkModeCompliance) |
Class strategy + CSS vars | via DaisyUI themes |
| Distribution | go get, semver, 7-module opt-in DAG |
copy-paste registry (shadcn-templ add), you own the code |
copy CLI (gsi) |
| Requires Node.js | No | No | CSS build only |
| Typed props | 65 string enums (64 with IsValid(), compile-time-checked lookup maps |
Base UI-named props, value-only | DaisyUI-shaped props |
| Testing | 279 HTML goldens, 200 pixel goldens, axe gate (default-fail), RTL/motion/dark-mode scanners, fuzz, vnu HTML gate | 52 Go test files + Playwright parity harness vs pinned shadcn/ui (DOM/focus/scroll-lock/pixel) + a11y/behavior suites | demo-site level |
| Charts | Native SVG (Line/Area/Pie/Sparkline/Bar/Heatmap) + opt-in ECharts adapter | client-rendered (Recharts-compatible) | — |
| Error pages | errorpage package + go-error-family integration |
— | — |
Philosophy: who owns the component code?
This is the deepest difference, and it is a genuine tradeoff — neither model is strictly better.
Copy-paste registry (shadcn-templ, goshipit). shadcn-templ add button
copies the .templ/.js source into your repo. You own it: bend any class,
rename any prop, delete what you don't need. There is no version to pin and no
upgrade path — fixes land only when you re-add and re-diff by hand. The
library's own tagline: "Use this to build your own component library."
Versioned module (templ-components). go get a release; go get -u takes
fixes. Semver, CHANGELOG, migration docs, per-module opt-in so an unused
package never enters your dependency graph. The trade: consumers extend via
props, Attrs, slots, and Tailwind overrides — you cannot rewrite a
component's internals without forking.
Where they are ahead
shadcn-templ
- Brand and adoption. 1,754 stars vs 4. The shadcn/ui design language is the most-recognized web UI aesthetic, and their 1:1 DOM fidelity means shadcn tutorials, blocks, and themes transfer directly.
- Design breadth. 8 complete style themes (luma, lyra, maia, mira, nova,
rhea, sera, vega). We ship one look (consumer-overridable via
@theme, but one look). - Installable blocks. dashboard01, 5 login pages, 5 signup pages, 16
sidebar layouts — full screens as one command. Our
recipespackage (Dashboard, SettingsLayout, LoginCard, AuthLayout) ships in the module but is not a scaffold. - Client-rich components. Command palette (cmdk), Input OTP, Resizable panels, Menubar, Navigation Menu, ScrollArea, Toggle Group, chat primitives. Several of these are deliberately demand-gated here (TODO_LIST #217); their adoption is fresh demand evidence for that gate.
- Upstream parity harness. They diff DOM tree, focus, scroll lock, and pixels against a pinned shadcn/ui reference build. We have no external ground truth of that kind — our goldens pin our own output.
goshipit
- DaisyUI ecosystem. Themed components and semantic class names out of the box; if you already run DaisyUI, it is the native choice.
- GOTH app breadth. Ships pricing, timeline, chat, OTP, hero sections — plus a runnable demo app and code/data generator around the components.
Where templ-components is ahead
- Correctness machinery per component. Invariant scanners run on every
source file: dark-mode gaps, missing
motion-reduce:/motion-reduce:duration-0, physical RTL properties (logical-properties-only rule), coarse-pointer fallbacks, CSP nonce regressions, CSS freshness, docs-count drift — most as default-fail CI gates, plus an axe-core sweep over the live demo with a documented debt ledger. Neither competitor documents anything comparable. - Genuinely zero-JS by default. Modals/drawers are native
<dialog>, overlays use the native Popover API, accordions are<details>, tooltips are pure CSS. Less script surface to trust, less to CSP-audit. - Dual transport with one spec.
wire.Actionrenders htmx (default) or Datastar attributes from one typed struct;wire.Handlerserves both dialects from one endpoint with response-header targeting. Kanban drag-and-drop and infinite scroll work under both runtimes. shadcn-templ is htmx-compatible; goshipit is htmx-native; nobody else has a Datastar story. - Server-facing features.
errorpage(family-aware pages + handler integration with go-error-family),FilterInputdebounce, validation summary, dirty-guard — infrastructure components, not just widgets. - Dependency budget. 3 runtime deps (templ, tailwind-merge-go, go-error-family). shadcn-templ's repo carries esbuild, goldmark, freetype (site tooling); goshipit pulls the DaisyUI/Node toolchain for CSS.
- Release discipline. One-commit releases, signed tags for root + all sub-modules, CHANGELOG enforced warm, generator pinned for zero-diff regeneration.
Which one should you pick?
- You want the shadcn/ui look, themes, and ready-made screens, and you are happy to own (and maintain) the component source: shadcn-templ.
- You are all-in on DaisyUI aesthetics and HTMX, and Node-for-CSS is fine: goshipit.
- You want a versioned dependency with strict CSP, accessibility scanners, RTL support, HTMX and Datastar under one API, error pages, and charts: templ-components.
They are not mutually exclusive: our components coexist with any of these in the same app (both are templ + Tailwind v4 at heart).
Sources (read 2026-10-08)
- shadcn-templ: github.com/axadrn/shadcn-templ (repo tree,
go.mod,registry.json,parity/README.md,plans/htmx-616.md,AGENTS.md,llms.txt), GitHub API star/fork counts. - templUI → shadcn-templ rename: templui.io banner + shadcn-templ.com docs.
- goshipit: github.com/haatos/goshipit (README, component tree, package.json), GitHub API counts.
- This repo: README.md / FEATURES.md numbers are guard-verified
(
utils.TestDocsCountDrift), not hand-copied.