Not a library — a collection of re-usable components you copy into your project. Built on Radix UI primitives and styled with Tailwind CSS. The fastest way to build beautiful, accessible React UIs that you fully own.
You want accessible, well-designed components you can fully customize
You're using React/Next.js with Tailwind CSS
You don't want to be locked into a library's design system
What drives the Trust Score
Last 12 months
You're not using React or Tailwind CSS
You prefer installing a package over copying component code
You want a complete design system with theming tokens out of the box (try Mantine)
Free tier & paid plans
100% free, open-source (MIT)
Free & open-source
Copy-paste components, no subscription ever
Other options worth considering
Complementary tools that pair well with shadcn/ui
Docs, videos, tutorials, and courses
Repository and installation options
View on GitHub
github.com/shadcn-ui/ui
npx shadcn@latest initCopy and adapt to get going fast
# Initialize shadcn/ui in your project
npx shadcn@latest init
# Add components you need (they go into /components/ui)
npx shadcn@latest add button dialog form input label table
# Update a component to the latest version
npx shadcn@latest add button --overwriteCommon usage patterns
Form with validation (react-hook-form + zod)
Accessible form with schema validation built in
"use client";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
const schema = z.object({ email: z.string().email(), name: z.string().min(2) });
export function SignupForm() {
const form = useForm({ resolver: zodResolver(schema) });
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(console.log)} className="space-y-4">
<FormField control={form.control} name="email" render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl><Input {...field} /></FormControl>
<FormMessage />
</FormItem>
)} />
<Button type="submit">Sign up</Button>
</form>
</Form>
);
}Data table with sorting
TanStack Table + shadcn DataTable component
import { DataTable } from "@/components/ui/data-table";
import { ColumnDef } from "@tanstack/react-table";
const columns: ColumnDef<Tool>[] = [
{ accessorKey: "name", header: "Name" },
{ accessorKey: "category", header: "Category" },
{ accessorKey: "trustScore", header: "Trust Score",
cell: ({ row }) => <span className="font-mono">{row.getValue("trustScore")}</span>,
},
];
export function ToolsTable({ tools }: { tools: Tool[] }) {
return <DataTable columns={columns} data={tools} />;
}Toast notifications
Show feedback toasts with the Sonner integration
import { Toaster } from "@/components/ui/sonner";
import { toast } from "sonner";
// In root layout
<Toaster position="bottom-right" />
// Trigger from anywhere
toast.success("Tool saved!", { description: "Your changes have been saved." });
toast.error("Failed to save", { description: err.message });Real experiences from developers who've used this tool