Open-code foundations
What shadcn/ui is
Understand shadcn/ui as accessible component source code and a distribution system rather than a traditional runtime component package.
shadcn/ui is not a component library you install from npm and import like Material UI. It is a distribution system for accessible component source code. You run the CLI, and it copies designed components into your project. After that, the files live in your repo.
That changes who owns the code. You can open components/ui/button.tsx, read every line, and change it. You are not fighting a distant package API. The tradeoff is maintenance. Registry updates do not patch your local Button automatically. Upgrading a primitive package can still change behavior under your file.
The generated file is yours, but it usually imports runtime packages for primitives, class composition, icons, and animation. Think of shadcn/ui as a source layer on top of those dependencies. Current shadcn/ui can generate components on different accessible primitive bases, including Base UI, Radix, and React Aria. Do not assume every project uses the same base or composition API.
Base UI is the current default base. Radix and React Aria remain supported choices. Read the source generated for your project. An example using asChild, render, or another composition mechanism may belong to a different base even when the visual result looks identical.
This model works well when your team wants to shape a small component system around the product. It is weaker when nobody will own accessibility tests, local changes, and dependency upgrades. “Copy and paste” describes delivery, not the maintenance cost.
Run this from your project root after you add Button:
grep -E 'from "@radix-ui|from "@base-ui|from "react-aria' components/ui/button.tsx
On a Base UI project you might see @base-ui-components/react. On an older Radix project you might see @radix-ui/react-slot. The exact import tells you which primitive base your Button depends on.
Compare this model with one component library installed from npm. Trace a generated Button from your file to its runtime imports. List one advantage, one maintenance responsibility, and one upgrade path created by owning the source.
Lesson completed