Skip to main content

setup-devnet

Guides setting up a local Cardano development environment. Triggers: "setup devnet", "local testnet", "Yaci DevKit", "development environment", "local Cardano node", "devnet", "preview testnet", "preprod testnet".

Jump to install

Source facts

Repository
cardano-foundation/cardano-dev-skills
Last source activity
August 26, 2026 at 11:30
Detected SKILL.md language
English
Stars
29
Forks
11

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
3 files

Showing SKILL.md

SKILL.md
Source instructions ยท Read-only preview
name
setup-devnet
description
Guides setting up a local Cardano development environment. Triggers: "setup devnet", "local testnet", "Yaci DevKit", "development environment", "local Cardano node", "devnet", "preview testnet", "preprod testnet".
allowed-tools
Read Grep Glob
disallowed-tools
WebFetch WebSearch
<!-- Documentation lookup path: ${CLAUDE_SKILL_DIR}/../../docs/sources/ --> # Set Up a Cardano Development Environment Help the developer set up a local Cardano development network for building, testing, and deploying smart contracts. ## When to use - Developer wants to run a local Cardano network for development - Setting up Yaci DevKit or similar local devnet tooling - Configuring local chain indexers (Kupo, Ogmios) for development - Establishing a smart contract development workflow (build, deploy, test) - Connecting to Preview or Preprod public testnets - Setting up CI/CD pipelines for Cardano projects ## When NOT to use - Querying mainnet or production chain data (use `query-chain` skill) - Choosing between SDKs or tools broadly (use `suggest-tooling` skill) - Writing smart contract logic in Aiken or Plutus - Wallet integration in a web frontend (use `connect-wallet` skill) ## Key principles 1. **Start local, then move to testnets.** Local devnets give instant feedback. Use Preview/Preprod for integration testing. 2. **Two fast local-devnet options.** Yaci DevKit (standalone CLI tool with a visual explorer) and Evolution SDK devnet (`@evolution-sdk/devnet`, a TypeScript library) are both Docker-based โ€” pick by workflow, not speed. 3. **Automate from day one.** Scripts for devnet startup, contract deployment, and testing save hours. 4. **Match your devnet to your target network.** Ensure protocol parameters and era match what you will deploy to. 5. **Keep test wallets organized.** Use named wallets with known keys for reproducible testing. ## Workflow ### Step 1: Choose the environment Ask the developer (if not already clear): - **Are you developing smart contracts or off-chain code (or both)?** - **Do you need a fully isolated local network or a shared testnet?** - **What OS are you on?** (Docker availability matters) - **Do you need governance features (Conway era)?** | Environment | Best for | Setup time | |---|---|---| | **Yaci DevKit** | Smart contract dev, fast iteration, visual block explorer | 5 minutes | | **Evolution SDK devnet** | TypeScript projects; code-first devnet inside the test suite | 5 minutes | | **Dingo devnet** | Node-side behaviour: consensus, diffusion, mempool, fast epoch boundaries | 10 minutes | | **Preview testnet** | Integration testing, shared state, longer-lived deployments | 10 minutes | | **Preprod testnet** | Pre-production testing, mirrors mainnet parameters | 10 minutes | | **Custom local cluster** | Advanced scenarios, custom protocol params | 30+ minutes | ### Step 2: Search Bundled Documentation Search the bundled documentation for relevant content: - `${CLAUDE_SKILL_DIR}/../../docs/sources/yaci-devkit/` - Yaci DevKit docs - `${CLAUDE_SKILL_DIR}/../../docs/sources/yaci-store/` - Yaci Store docs - `${CLAUDE_SKILL_DIR}/../../docs/sources/evolution-sdk/devnet/` - Evolution SDK devnet docs - `${CLAUDE_SKILL_DIR}/../../docs/sources/cardano-node-wiki/` - Cardano node wiki - `${CLAUDE_SKILL_DIR}/../../docs/sources/dingo/` - Dingo devnet (see the README's DevNet section) ### Step 3: Set up Yaci DevKit (CLI tool, visual explorer) Reference the quickstart guide for detailed commands: ``` File: skills/setup-devnet/references/yaci-devkit-quickstart.md ``` #### Quick setup 1. **Prerequisites**: Docker and Docker Compose installed 2. **Install + start the devnet** (the DevKit ships as a `devkit` script that manages the containers and opens the Yaci CLI): ```bash devkit start # opens yaci-cli yaci-cli:> create-node -o --start # create + start a default devnet ``` 3. **Fund wallets**: `topup <address> <ada>` inside the CLI (the `devnet:default>` prompt), or pre-fund via `config/env` 4. **Access points**: - Yaci Store API (Blockfrost-compatible): `http://localhost:8080/api/v1/` - Yaci Viewer (block explorer): `http://localhost:5173` - CLI/Admin, wallet, MCP: `http://localhost:10000` - cardano-cli against the node: `devkit cli` #### Configure for your needs - Set era (Babbage, Conway) for governance testing - Adjust protocol parameters (min fee, collateral percentage) - Configure slot length for faster/slower block production - Enable/disable Plutus cost model overrides for testing ### Step 3b: Set up Evolution SDK devnet (code-first alternative) If the project is TypeScript-based, `@evolution-sdk/devnet` runs the same local Cardano network as a library โ€” the devnet's genesis, lifecycle, and UTxO queries live in your code and test suite instead of a separate CLI tool. Reference the quickstart: ``` File: skills/setup-devnet/references/evolution-sdk-devnet.md ``` #### Quick setup 1. **Prerequisites**: Docker running, Node.js 18+ 2. **Install**: `pnpm add @evolution-sdk/devnet @evolution-sdk/evolution` 3. **Create and start a cluster** in code: ```typescript import { Cluster } from "@evolution-sdk/devnet"; const cluster = await Cluster.make({ clusterName: "dev", ports: { node: 3001, submit: 3002 }, kupo: { enabled: true, port: 1442 }, ogmios: { enabled: true, port: 1337 }, }); await Cluster.start(cluster); ``` 4. **Fund addresses at genesis** via `shelleyGenesis.initialFunds` โ€” deterministic, no faucet. Genesis UTxOs are not indexed by Kupo; derive them with `Genesis.calculateUtxosFromConfig(...)` and pass via the builder's `availableUtxos`. 5. **Connect a client**: `Client.make(Cluster.getChain(cluster)).withKupmios({ kupoUrl, ogmiosUrl })`. Choose this over Yaci DevKit when you want the devnet managed from inside integration tests; choose Yaci DevKit for its visual block explorer and Blockfrost-compatible REST API. Both run a standard `cardano-node`, so chain behaviour is identical. ### Step 3c: Set up a Dingo devnet (all-Go network, fast epochs) Reach for this when what you are testing is node-side rather than dApp-side: consensus, block diffusion, mempool behaviour, or how your service reacts to epoch boundaries. Yaci DevKit remains the better default for ordinary dApp integration work, because it ships a Blockfrost-compatible API and a block explorer aimed at that job. **What the default profile runs** โ€” a private all-Dingo network: three Dingo block producers, one Dingo relay, and `txpump` feeding transactions into the mempool. Passing `--conformance` instead runs Dingo beside `cardano-node`, which is the configuration to use when you care whether both implementations agree. **Prerequisites**: Docker with the Compose plugin, and Go 1.26+. **Why the fast parameters matter.** The devnet uses 1-second slots and 500-slot epochs โ€” roughly eight minutes per epoch โ€” with `activeSlotsCoeff=0.4` and `k=40`. Epoch transitions, leader election, and stake-snapshot rotation all become observable in minutes, which is the thing a public testnet cannot give you. If your code has epoch-boundary logic, this is where to exercise it. For quick iteration without Docker, `devmode.sh` runs a single Dingo node against a local devnet genesis, resetting state and refreshing genesis timestamps on each run. **Scope caveat.** Dingo's own README places it on testnets and devnets only, not mainnet with real funds. For devnet work that is the intended envelope rather than a limitation, but do not let a Dingo-only devnet be your last check before mainnet โ€” validate against `cardano-node` too, which is what `--conformance` exists for. ### Step 4: Set up local chain indexers If your application needs Ogmios/Kupo (e.g. for Evolution SDK's `.withKupmios`), use the DevKit's built-in services instead of hand-run containers: ```bash # Inside Yaci CLI yaci-cli:> enable-kupomios # Or in the DevKit's config/env ogmios_enabled=true kupo_enabled=true ``` Ogmios serves `ws://localhost:1337`, Kupo `http://localhost:1442`. Since DevKit v0.12.0-beta5, Yaci Store evaluates scripts with `scalus` when Ogmios is not running โ€” Ogmios is optional for transaction evaluation. For standalone (non-DevKit) setups, see `docs/sources/ogmios/` and `docs/sources/kupo/`. ### Step 5: Smart contract workflow #### Aiken build-and-exercise cycle 1. **Build**: `aiken build` compiles validators to UPLC 2. **Generate blueprint**: Produces `plutus.json` with compiled scripts and parameter schemas 3. **Lock**: Use an off-chain SDK (Mesh, Evolution SDK, PyCardano, cardano-client-lib) to read the blueprint, derive the script address, and pay to it with a datum 4. **Spend**: Build a spending transaction that attaches the validator and a redeemer, submit to the local devnet, query results, iterate There is **no deployment step** on Cardano. A validator is not installed on-chain ahead of time โ€” it travels in the witness set of the transaction that spends from it. Publishing a script into a UTxO's `script_ref` (CIP-33) is an optional optimization for large, frequently-spent validators, not a prerequisite; see `optimize-validator`. ```bash # Typical Aiken workflow aiken build aiken check # Run unit tests # Then use an SDK to lock to, and spend from, the script on the local devnet ``` #### Test structure - **Unit tests**: Aiken's built-in `test` keyword for validator logic - **Integration tests**: Off-chain SDK scripts against local devnet - **Property tests**: Aiken's `fuzz` support for property-based testing - **End-to-end**: Full workflow tests against Preview testnet ### Step 6: Connect to public testnets #### Preview testnet - **Purpose**: Testing new features, faster epoch transitions - **Faucet**: https://docs.cardano.org/cardano-testnets/tools/faucet/ - **Network magic**: 2 - **Configuration files**: Download from https://book.play.dev.cardano.org/environments.html #### Preprod testnet - **Purpose**: Pre-production testing, mirrors mainnet parameters - **Faucet**: Same faucet site, select Preprod - **Network magic**: 1 - **Configuration files**: Same source as Preview #### Getting test ADA ```bash # Request test ADA from the faucet (web interface or API) # Provide your testnet address # Dispenses ~10,000 test ADA per request (same on Preview and Preprod) # Faucet is rate-limited per address/API key ``` ### Step 7: CI integration #### GitHub Actions example ```yaml # .github/workflows/cardano-ci.yml name: Cardano CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Aiken uses: aiken-lang/setup-aiken@v1 - name: Build contracts run: aiken build - name: Run unit tests run: aiken check - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install Yaci DevKit run: npm install -g @bloxbean/yaci-devkit - name: Start a devnet run: | nohup yaci-devkit up --enable-yaci-store & # poll http://localhost:8080 until the Yaci Store API answers - name: Run integration tests run: | # Run off-chain integration tests against localhost:8080 ``` #### Key CI considerations - Install the Yaci DevKit npm package and start the devnet in a background step (`yaci-devkit up`) - Cache Aiken build artifacts - Run unit tests first (fast), then integration tests (slower) - Use deterministic wallet keys for reproducible tests - Clean devnet state between test suites if needed ### Step 8: Troubleshooting common issues - **Docker not starting**: Check Docker daemon is running, ports not in use - **Node not syncing**: For local devnet, check logs inside container - **Transactions failing**: Verify era matches (Babbage vs Conway), check collateral - **Slow block production**: Adjust slot length in devnet config - **Out of test ADA**: Re-create devnet (local) or use faucet (testnet) - **cardano-cli version mismatch**: Match CLI version to node version in the devnet ## References - `skills/setup-devnet/references/yaci-devkit-quickstart.md` -- Yaci DevKit quickstart guide - `skills/setup-devnet/references/evolution-sdk-devnet.md` -- Evolution SDK devnet quickstart guide - Yaci DevKit: https://github.com/bloxbean/yaci-devkit - Evolution SDK devnet: https://github.com/IntersectMBO/evolution-sdk - Cardano testnets: https://docs.cardano.org/cardano-testnets/ - Aiken: https://aiken-lang.org - Ogmios: https://ogmios.dev - Kupo: https://cardanosolutions.github.io/kupo
View on GitHub