components.json
The components.json file tracks the components and theme currently installed in your project.
Unlike some other CLI tools, you don't create or edit this file by hand, the buridan CLI creates and updates it automatically the first time you run buridan apply or buridan add. Its main purpose is to give you (and the CLI) a single place to see exactly what's installed, at what version, and under what theme.
Note: components.json is written to the root of your Reflex project, alongside rxconfig.py. It's safe to commit to version control, treat it like a lockfile for your design system.
Structure
{
"components": {
"button": "1.0.0",
"card": "latest",
"core": "latest"
},
"theme": {
"preset": "b0",
"baseId": "neutral",
"colorId": "blue",
"chartId": "blue",
"styleId": "default",
"fontId": "inter",
"radius": "0.5rem"
}
}
The two sections are updated independently, running buridan add never touches theme, and running buridan apply never touches components.
components
A map of installed component names to the version installed.
{
"components": {
"button": "1.0.0"
}
}
- The key is the component's registry name, without any
@versionsuffix. - The value is either a specific version string (e.g.
"1.0.0") if you pinned one withburidan add button@1.0.0, or the literal string"latest"if you installed it unpinned, or if the component doesn't have multiple published versions.
This section is updated every time you run buridan add. See the CLI docs for how version pinning and conflicts are resolved.
theme
Records the theme preset currently applied to your project.
{
"theme": {
"preset": "b0",
"baseId": "neutral",
"colorId": "blue",
"chartId": "blue",
"styleId": "default",
"fontId": "inter",
"radius": "0.5rem"
}
}
This section is written by buridan apply --preset <ID> and fully overwritten (not merged) on every subsequent apply, it always reflects only the most recently applied preset.
theme.preset
The raw preset ID from the theme builder, exactly as passed to --preset. This is the source of truth for the rest of the fields below, since it fully encodes the theme, it's the most reliable value to reference if you ever need to reconstruct or re-apply the same theme programmatically.
{
"theme": {
"preset": "b2D0wqNxT"
}
}
theme.baseId
The base theme (background, foreground, and neutral tones) the preset is built on.
theme.colorId
The accent color palette applied on top of the base theme.
theme.chartId
The color palette used for chart-specific CSS variables (--chart-1 through --chart-5, etc.). This can differ from colorId if the preset uses a separate chart palette.
theme.styleId
The component style variant (e.g. spacing, shadow, and border conventions) the preset applies.
theme.fontId
The font family applied by the preset.
theme.radius
The border-radius value applied by the preset, e.g. "0.5rem". Omitted from components.json if the preset doesn't override the style's own default radius.
Any field above that wasn't set by a given preset is left out of components.json entirely rather than written as null, so the file only ever shows what was actually specified.