An interactive CLI tool for scaffolding modern web projects. Select your project type, configure your stack through a guided menu, and get a production-ready project generated on disk with pinned library versions.
- Node.js 18+
- npm
Option 1: Install globally (recommended for frequent use)
npm install -g beaver-build
beaverOption 2: Use directly with npx (no installation needed)
npx beaverSimply run the command and follow the interactive prompts:
beaverThe CLI will guide you through:
- Project Type — Choose React + Vite or Chrome Extension
- Project Name — Enter your project directory name
- Configuration — Select your preferred stack (layout, router, state management, styling, linter)
After answering all prompts, your production-ready project will be generated in the specified directory with:
- All dependencies pinned to stable versions
- GitHub Copilot custom instructions for your chosen stack
- Ready to run with
npm install && npm run dev
To contribute or develop locally:
npm install
npm run dev # Run CLI in development mode
npm run build # Compile for distribution| Type | Status |
|---|---|
| React + Vite | Available |
| Chrome Extension | Available |
| Next.js | Upcoming |
| Nuxt | Upcoming |
The CLI walks you through the following choices:
Validated to allow only letters, numbers, hyphens, and underscores ([a-zA-Z0-9_-]).
| Option | Description |
|---|---|
| FSD | Feature Slice Design |
| BPR | Bulletproof React |
| Option | Version |
|---|---|
| Not Using | — |
| TanStack Router | v1.144.0 |
| Option | Version |
|---|---|
| Not Using | — |
| Zustand | v5.0.5 |
| Option | Version |
|---|---|
| Not Using | — |
| TanStack Query | v5.74.4 |
| Option | Version |
|---|---|
| Not Using | — |
| Tailwind CSS | v4.1.3 |
| Option | Version | Notes |
|---|---|---|
| Not Using | — | — |
| Biome | v1.9.4 | All-in-one lint + format |
| ESLint | v9.39.4 | Flat config + typescript-eslint |
Every scaffolded project includes a set of GitHub Copilot custom instructions so that AI-assisted coding inside the project follows the conventions of the chosen stack. The files are layout-aware — the applyTo glob patterns and placement rules change between FSD and BPR.
Files emitted in the generated project:
| File | Scope | Emitted when |
|---|---|---|
.github/copilot-instructions.md |
Repo-wide overview — stack, naming, architecture | Always |
.github/instructions/components.instructions.md |
Component file paths per layout | Always |
.github/instructions/hooks.instructions.md |
Hook file paths per layout | Always |
.github/instructions/tanstack-router.instructions.md |
src/routes/**/*.tsx |
Router = TanStack Router |
.github/instructions/zustand.instructions.md |
Store file paths per layout | State = Zustand |
.github/instructions/tanstack-query.instructions.md |
API/query file paths per layout | Query = TanStack Query |
.github/instructions/biome.instructions.md or eslint.instructions.md |
** |
Linter ≠ none |
The format follows GitHub's path-specific custom instructions spec (applyTo frontmatter).
Rule for contributors: every new option added to the CLI (new router, new state library, new UI framework, etc.) must ship with its own instruction template in src/scaffold/react-vite/templates/copilot-instructions.ts. See Adding a New Option to React + Vite below.
| Package | Version |
|---|---|
| react | 19.1.0 |
| react-dom | 19.1.0 |
| vite | 6.4.3 |
| @vitejs/plugin-react | 4.4.1 |
| typescript | 5.8.3 |
| @types/react | 19.1.1 |
| @types/react-dom | 19.1.1 |
| @tanstack/react-router | 1.144.0 |
| @tanstack/router-devtools | 1.144.0 |
| @tanstack/router-vite-plugin | 1.144.0 |
| zustand | 5.0.5 |
| @tanstack/react-query | 5.74.4 |
| @tanstack/react-query-devtools | 5.74.4 |
| @biomejs/biome | 1.9.4 |
| eslint | 9.39.4 |
| @eslint/js | 9.39.4 |
| typescript-eslint | 8.26.0 |
| eslint-plugin-react-hooks | 5.2.0 |
| eslint-plugin-react-refresh | 0.4.19 |
| globals | 15.15.0 |
src/
index.ts Entry point — greeting, menu, error handling
types/index.ts Cart, ProjectType, ReactViteCore, NextJSCore
constants/index.ts Top-level menu options
options/
index.ts Top-level project type selection
react-vite/
index.ts React + Vite menu flow
constants/index.ts Menu option definitions
types/index.ts MenuOptions type
scaffold/
errors.ts ScaffoldError, isNodeError
utils.ts FileMap, dirExists(), writeProjectFile()
react-vite/
index.ts Scaffold orchestrator
templates/
package-json.ts packageJsonTemplate(cart)
vite-config.ts viteConfigTemplate(cart)
tsconfig.ts tsconfigTemplate(), tsconfigNodeTemplate()
index-html.ts indexHtmlTemplate(projectName)
main-tsx.ts mainTsxTemplate(layout)
app-tsx.ts appTsxFsdTemplate(), appTsxBprTemplate()
router.ts rootRouteTemplate(), indexRouteTemplate()
zustand.ts zustandStoreTemplate()
query.ts queryProviderBprTemplate()
linter.ts biomeConfigTemplate(), eslintConfigTemplate()
gitignore.ts gitignoreTemplate()
copilot-instructions.ts getCopilotInstructionFiles(cart) — Copilot instruction set
fsd-layout.ts getFsdFileMap(cart)
bpr-layout.ts getBprFileMap(cart)
utils/
animation.ts typeWriter effect
user.ts getUserName() from git config
index.ts sleep()
- Set
disabled: falseinsrc/constants/index.ts - Create
src/options/<project-name>/with constants, types, and flow functions - Handle the new type in
src/options/index.ts - Add the interface to
src/types/index.tsand include it in theCartunion - Create
src/scaffold/<project-name>/with templates and an orchestrator
-
Add the constant to
src/options/react-vite/constants/index.ts -
Export the value type from
src/types/index.tsand add the field toReactViteCore -
Add a
menu<OptionName>function insrc/options/react-vite/index.ts -
Call it in
flowReactVite -
Update
getFsdFileMapandgetBprFileMapto handle the new option -
Add a Copilot instruction template in
src/scaffold/react-vite/templates/copilot-instructions.ts:- Write a new template function (e.g.
newOptionTemplate(cart)) returning a markdown string that starts with anapplyTofrontmatter block scoped to the right paths for both FSD and BPR (useFSD_PATHS/BPR_PATHS) - Register it inside
getCopilotInstructionFilesunder a conditional block keyed by the new cart field - If the new option introduces a new kind of file path, extend the
Pathstype and bothFSD_PATHS/BPR_PATHSmaps so every path-specific rule stays layout-aware
This step is mandatory — any user who scaffolds a project with the new option must get a matching Copilot instruction file automatically.
- Write a new template function (e.g.
