TL;DR: Crucible is a code generation CLI that scaffolds production-ready components (React / Vue / Angular / React Native) directly into your project. You own every generated file. v1.2 ships a full terminal UI wizard, five component lifecycle commands, a React Native target, and a round of security hardening. Also — I'm deep in a second project: Min-Mozhi, the first Tamil-rooted hardware description language.
What is Crucible?
One line: it's like shadcn/ui, but framework-agnostic and engine-driven.
npx crucible add Button
# → Button/Button.tsx
# → Button/Button.module.css
# → Button/README.md
# Zero runtime deps. Pure code you own.
Enter fullscreen mode Exit fullscreen mode
Crucible generates idiomatic source files for React, Vue, and Angular (and now React Native) from a single component spec. Once generated, the files live in your project — no package import, no black box. The CLI is a devDependency and has zero runtime footprint in your bundle.
What's new in v1.2
crucible ui — TUI wizard
crucible ui # aliases: wizard, tui
Enter fullscreen mode Exit fullscreen mode
A menu-driven interactive console built on @inquirer/prompts (zero new deps). From the console you can:
- Browse all available components and their metadata
- Run a guided install: pick framework → style system → theme → components → Storybook stories
- Run diff / status / update / remove
Bare crucible still prints help; the console only runs when you invoke it explicitly.
5 new lifecycle commands
crucible info Button # metadata: variants, props, deps, peer deps
crucible info Button --deps-tree # hierarchical dependency tree
crucible status # drift report (ok / modified / missing); CI-friendly --json
crucible diff Button # preview what regeneration would change
crucible update # regenerate all tracked components (preserves edits)
crucible update Button --force # regenerate + overwrite local edits
crucible remove Button # delete + untrack; warns on dependents
crucible remove Button --dry-run
Enter fullscreen mode Exit fullscreen mode
The status command is particularly useful for CI: it exits non-zero when tracked files are missing or when your config or engine has drifted from what generated the files.
React Native target (Beta)
crucible add Button --framework react-native
crucible add Button --framework react-native -s nativewind # NativeWind classes
crucible add Button --framework react-native -s stylesheet # StyleSheet.create
Enter fullscreen mode Exit fullscreen mode
First-wave components: Button, Input, Card, Alert, Badge. Same manifest spec, native RN output.
CLI DX wins
crucible completion bash # shell tab completion (bash/zsh/fish)
crucible list --json # machine-readable component registry
crucible doctor --json # structured check result, exits non-zero on failure
crucible add Button --strict # hard errors on plugin collisions / incompatible versions
Enter fullscreen mode Exit fullscreen mode
Package-manager detection: peer installs now read your lockfile to pick pnpm / yarn / bun / npm — no more stray package-lock.json in bun projects.
Security fixes
-
Prototype pollution —
deepMergeskips__proto__/constructor/prototype -
Path traversal — boundary check uses
path.relative, notstartsWith - CodeQL code-injection — template compilation validates framework/styleSystem/component against known enums before any path resolution
-
Math.random()removed from generated component IDs — Vue usesuseId()(3.5+), Angular uses a module-level counter
Other notable fixes
-
--frameworknow actually changes the generated output (was only affecting dependency checks) - Component dependencies are now correctly auto-added (
crucible add Dialogpulls inButton) - Vue DropdownMenu no longer leaks styles — namespaced from
.contentto.menu-content - Package-manager-aware Tailwind installs (respects
--cwd) - SCSS Table camelCase class names fixed (
&Borderednot&-bordered)
Current state
| What | Numbers |
|---|---|
| Components | 25 (+ 5 in RN beta) |
| Frameworks | React, Vue 3.5+, Angular, React Native (Beta) |
| Style systems | CSS Modules, SCSS Modules, Tailwind v4, NativeWind, StyleSheet |
| Unit tests | 556 |
| E2E phases | 245 |
| Runtime footprint | 0 |
Install / update
npm i -D @cruciblelab/crucible
# or: yarn add -D / pnpm add -D / bunx add -D
npx crucible init # first time
npx crucible update # pull latest templates into existing projects
Enter fullscreen mode Exit fullscreen mode
- Docs: https://crucible-docs.naveenr.in
- GitHub: https://github.com/Naveen2070/project_crucible
- npm: https://www.npmjs.com/package/@cruciblelab/crucible
Heads-up: what I'm building in parallel
While v1.2 was stabilizing, I've been full-focus on a very different project — Min-Mozhi (மின்மொழி).
Min-Mozhi is a hardware description language written in Rust. The pitch:
-
Modern syntax — Go/TypeScript-style braces,
: typeannotations, expression-orientedif/match. Nobegin/end, no preprocessor. -
Safe by default — inferred latches, silent truncation, multiple drivers, uninitialized registers, and signed/unsigned mixing are all compile-time errors with stable
E-codes and teaching-quality diagnostics. -
Trilingual — English, Tanglish, and Tamil are keyword skins over one grammar;
mimz translateconverts losslessly between them. The first Tamil-rooted HDL. -
Own simulator —
mimz simruns an in-house event-driven engine, validated bit-for-bit against Icarus Verilog.
module Counter(WIDTH: int = 8) {
clock clk
reset rst
out count: bits[WIDTH]
reg value: bits[WIDTH] = 0
on rise(clk) {
value <- value +% 1
}
count = value
}
Enter fullscreen mode Exit fullscreen mode
v0.1.0 shipped in June with 432 tests and the full compiler + simulator pipeline. The unreleased branch currently has CDC synchronizer primitives (sync.double_flop / sync.pulse), hardware emulation with real LED/UART/audio peripherals, array types, foreach sugar, extern module Verilog FFI, tagged-union construction syntax, and structural bundle matching — all in active development.
I'll write a dedicated post about Min-Mozhi once the next wave of features stabilizes — but wanted to give you a heads-up that this is where most of my engineering hours are going right now.
Happy building. ⚗️
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.