Agent-friendly installer that scaffolds a Web3 dApp. It supports two stacks — pick one per
run, either through the interactive wizard or with a single flag (--evm / --canton). It works
interactively (a React + Ink TUI) and non-interactively (flag-driven, JSON output) for CI and AI
agents.
- EVM — the original dAppBooster for Ethereum, Polygon, Base, and other EVM chains.
- Canton — dAppBooster for Canton: Daml ledger, Carpincho wallet, off-chain services.
pnpm dlx dappbooster --evm # EVM stack
pnpm dlx dappbooster --canton # Canton stackOmit the flag to be prompted for the stack in the wizard. Jump to the EVM stack or Canton stack section for the details of each.
- Node >= 20
- pnpm (used by the installer itself; the scaffolded project uses pnpm or npm depending on the stack)
pnpm dlx dappboosterThe wizard prompts for stack → project name → mode (full / custom) → features, then clones,
installs, cleans up, and prints next steps. Pass --evm or --canton to skip the stack prompt.
dAppBooster documentation: https://docs.dappbooster.dev/
Non-interactive mode activates automatically when stdout is not a TTY, or explicitly with --ni.
It returns JSON on stdout and a non-zero exit code on error.
Discover stacks and features first, then install:
pnpm dlx dappbooster --info # all stacks + features as JSON
pnpm dlx dappbooster --info --stack canton # filter to one stack (or --info --canton)| Flag | Purpose |
|---|---|
--canton / --evm |
Pick the stack (mutually exclusive shortcuts) |
--stack <evm|canton> |
Pick the stack by name (useful when scripting) |
--name <name> |
Project directory name (/^[a-zA-Z0-9_]+$/) |
--mode <full|custom> |
full installs every feature; custom needs --features |
--features <a,b,c> |
Comma-separated feature keys (custom mode only) |
--ni |
Force non-interactive mode |
Mixing flags that disagree (--canton --evm, or --canton --stack evm) is an error. Each stack
accepts only its own feature keys, and validation errors name the stack:
{
"success": false,
"error": "Unknown features for stack 'canton': subgraph. Valid features: counter, e2e, carpincho, llm"
}Any failure returns { "success": false, "error": "..." } with exit code 1 (e.g. a missing
--name).
A successful install prints:
{
"success": true,
"stack": "evm|canton",
"projectName": "...",
"mode": "full|custom",
"features": ["..."],
"path": "/absolute/path",
"postInstall": ["..."]
}pnpm dlx dappbooster --evmInteractive (skips the stack prompt) or non-interactive:
pnpm dlx dappbooster --evm --ni --name my_dapp --mode full
pnpm dlx dappbooster --evm --ni --name my_dapp --mode custom --features demo,subgraph| Feature | Key | Default | Description |
|---|---|---|---|
| Component Demos | demo |
✓ | Component demos and example pages |
| Subgraph support | subgraph |
✓ | TheGraph subgraph integration |
| Typedoc | typedoc |
✓ | TypeDoc API documentation generation |
| Vocs | vocs |
✓ | Vocs documentation site |
| Husky | husky |
✓ | Git hooks with Husky, lint-staged, and commitlint |
{
"success": true,
"stack": "evm",
"projectName": "my_dapp",
"mode": "full",
"features": ["demo", "subgraph", "typedoc", "vocs", "husky"],
"path": "/absolute/path/to/my_dapp",
"postInstall": [
"Provide your own API key for PUBLIC_SUBGRAPHS_API_KEY in .env.local",
"Run pnpm subgraph-codegen from the project folder"
]
}pnpm dlx dappbooster --cantonInteractive (skips the stack prompt) or non-interactive:
pnpm dlx dappbooster --canton --ni --name my_canton_dapp --mode full
pnpm dlx dappbooster --canton --ni --name my_canton --mode custom --features counter,carpincho| Feature | Key | Default | Description |
|---|---|---|---|
| Counter demo | counter |
✓ | Counter demo dapp (frontend + Daml + wallet-service) |
| E2E tests | e2e |
✓ | Playwright end-to-end test suite (requires counter) |
| Carpincho wallet | carpincho |
✓ | Carpincho browser-extension wallet (frontend + build tooling) |
| LLM & agent artifacts | llm |
✓ | .claude, AGENTS.md, CLAUDE.md, architecture.md, llms.txt, … |
e2e drives the counter dapp, so it requires counter: requesting --features e2e auto-pulls
counter in (the success JSON reports ["counter", "e2e"]), and in the wizard, deselecting
counter also unchecks e2e.
The Canton scaffold uses npm (a property of the generated project, not this installer). After
install: review canton-barebones/.env, run npm run canton:up to start the local Canton stack,
and npm run app:dev to run the counter dapp frontend. When carpincho is included, build the
extension with npm run carpincho:build:extension and load carpincho-wallet/dist-extension as an
unpacked browser extension.
What gets stripped:
- Always (every stack and mode): CI config (
.github) and the husky/commitlint automation (.husky,.lintstagedrc.mjs,commitlint.config.js), plus their entries in the rootpackage.json. - Per feature (custom mode): deselecting a feature removes its files and any
package.jsonscripts that target them — deselectingcarpinchoremovescarpincho-wallet/and its scripts (wallet:dev,carpincho:build:extension); deselectingllmremoves the agent docs. - A full install keeps all four features — including
carpincho-wallet/and the agent docs.
{
"success": true,
"stack": "canton",
"projectName": "my_canton_dapp",
"mode": "full",
"features": ["counter", "e2e", "carpincho", "llm"],
"path": "/absolute/path/to/my_canton_dapp",
"postInstall": [
"Review canton-barebones/.env (created from the example)",
"Run npm run canton:up to start the local Canton stack",
"Run npm run app:dev to start the counter dapp frontend",
"Build the Carpincho extension with npm run carpincho:build:extension",
"Load carpincho-wallet/dist-extension as an unpacked browser extension"
]
}Each stack's source repository and ref can be overridden — useful for forks, or for testing a
feature branch before it lands on main.
| Variable | Effect |
|---|---|
DAPPBOOSTER_EVM_REPO_URL |
Override the EVM stack git URL |
DAPPBOOSTER_EVM_REF |
Override the EVM stack ref (still checks out the latest tag if unset) |
DAPPBOOSTER_CANTON_REPO_URL |
Override the Canton stack git URL |
DAPPBOOSTER_CANTON_REF |
Override the Canton stack branch |
DAPPBOOSTER_CANTON_REF=some-feature-branch \
pnpm dlx dappbooster --canton --ni --name my_canton --mode fullThe Canton stack defaults to BootNodeDev/cn-dappbooster on the main branch. The repo has no
release tags yet, so it tracks main; once a release is tagged, switch the default to
refType: 'tag-latest' (or pin a ref) in source/constants/config.ts.
git clone git@github.com:BootNodeDev/dAppBoosterInstallScript.git
cd dAppBoosterInstallScript
pnpm i
node dist/cli.jsNew releases are automatically uploaded to NPM via GitHub Actions.