Full Soroban dApp scaffold with Vite + React, wallet wiring, and binding placeholders. Not sure this is the right path? See Choosing a project scaffold.
- First Caatinga or Soroban dApp
- You want Vite + React, Stellar Wallets Kit, and
@caatinga/clientpre-configured - You prefer learning the full loop: build → deploy → dev server → wallet → invoke
For CLI-only projects without a bundled UI, use Minimal project instead.
npx ctg init my-dapp
cd my-dapp
npm installPick a different bundled template:
npx ctg zk init my-zk-dapppnpm install also works. The react-vite-counter template ships pnpm-workspace.yaml for pnpm 10.26+/11.x — see Templates — pnpm.
Without a global CLI install, use npx ctg init my-dapp.
| Path / file | Purpose |
|---|---|
caatinga.config.ts |
Contracts, WASM paths, networks, frontend.bindingsOutput |
caatinga.artifacts.json |
Per-network deployed contract IDs (empty until deploy) |
contracts/<name>/ |
Rust Soroban contract source |
src/ |
Vite + React app, wallet adapter, caatinga.ts client wiring |
src/contracts/generated/ |
Placeholder bindings until deploy generates real ones |
src/stubs/ |
Wallet SDK stubs (Trezor, HOT, Safe) for clean browser bundles |
vite.config.ts, tsconfig.json |
Frontend toolchain |
The default contract is counter in react-vite-counter.
Follow Getting started — CLI loop, then start the UI:
npm run devdeploy auto-generates bindings. Use ctg read for getters and invoke for mutations. The Vite app needs a deployed contractId for on-chain calls.
Placeholder bindings still in use (CAATINGA_PLACEHOLDER_BINDING):
npx ctg generate counter --network testnetRestart the dev server after bindings change.
Contract not deployed in the UI: deploy before npm run dev — the frontend reads contractId from caatinga.artifacts.json.
npm install warnings or audit findings: the template ships required npm/pnpm overrides. See Templates and Wallets — bundler workarounds.