Developer Tools
Developer tools are used to create, manage, and interact with canisters. ICP provides tooling across several categories: command-line tools, canister development kits (CDKs), client libraries, testing tools, browser-based IDEs, and Candid tooling.
Command-line tools
Section titled “Command-line tools”icp-cli
Section titled “icp-cli”icp-cli is the primary tool for building and deploying applications on the Internet Computer. It manages the full development lifecycle: creating projects, building canisters, deploying to local or mainnet environments, managing identities, and handling cycles and ICP tokens.
Key features:
- Recipes: reusable, versioned build templates for Rust, Motoko, and asset canisters
- Environments: named deployment targets that combine a network, canister set, and settings (e.g., local, staging, production)
- Project scaffolding:
icp newbootstraps new projects from official templates
For installation, see the Quickstart or the full CLI documentation.
Advanced: creating recipes and creating templates are documented on the CLI docs site.
icp-cli collects anonymous usage telemetry. Opt out with icp settings telemetry false or DO_NOT_TRACK=1.
Coming from dfx? See the migration guide.
ic-wasm
Section titled “ic-wasm”ic-wasm is a Wasm post-processing tool required by the official Rust and Motoko recipes. It shrinks binary size, embeds Candid metadata, and strips unused sections. Install it alongside icp-cli. See the Quickstart for setup. You only need to invoke it directly when writing custom build steps.
Resources:
Quill is a minimalistic, offline-first CLI for signing and sending governance messages (NNS and SNS proposals, neuron management) from air-gapped machines. Unlike icp-cli, Quill is designed for cold wallet workflows: you generate signed messages on an offline device, then submit them from a networked machine.
Quill is suited for:
- Submitting NNS governance proposals
- Managing SNS neurons from a hardware wallet or cold key
Resources:
Canister development kits (CDKs)
Section titled “Canister development kits (CDKs)”A canister development kit (CDK) provides a programming language with the libraries and toolchain support needed to compile code to WebAssembly and interact with the ICP system API.
Motoko
Section titled “Motoko”Motoko is ICP’s native programming language, designed around the actor model, orthogonal persistence, and asynchronous message passing. It compiles directly to WebAssembly and includes a standard library (mo:core) with modules for common data structures, cryptography, and system interaction.
Third-party Motoko libraries are distributed through Mops, the Motoko package manager. Use mops add <package> to add a dependency to your project.
For language documentation, see languages/motoko.
Rust CDK (ic-cdk)
Section titled “Rust CDK (ic-cdk)”The Rust CDK (ic-cdk) is the official DFINITY-maintained library for building canisters in Rust. It exposes the ICP system API as safe Rust abstractions, including:
ic_cdk::api: system calls (time, caller, stable memory, management canister)ic_cdk_timers: periodic timers and one-shot timersic_cdk_macros:#[update],#[query],#[init], and other attribute macros
API reference: docs.rs/ic-cdk
For Rust-specific guides, see languages/rust.
Community CDKs
Section titled “Community CDKs”Several community-maintained CDKs extend ICP to other languages:
| Language | CDK | Resources |
|---|---|---|
| TypeScript / JavaScript | Azle | Documentation |
| Python | Kybra | Documentation |
| C++ | icpp-pro | Documentation |
| MoonBit | moonbit-ic-cdk | GitHub repo |
Community CDKs are maintained independently of DFINITY. Check each project’s documentation for current support status.
Client libraries
Section titled “Client libraries”Client libraries handle the protocol details of calling canisters from outside the network: constructing and signing ingress messages, encoding Candid, and verifying responses. For setup and usage patterns, see Calling from clients.
JavaScript / TypeScript
Section titled “JavaScript / TypeScript”The @icp-sdk package provides the agent and companion libraries for browser and Node.js applications. Full documentation at js.icp.build.
| Package | Purpose |
|---|---|
@icp-sdk/core/agent | Send update and query calls to canisters; manage actors |
@icp-sdk/core/candid | Encode and decode Candid values |
@icp-sdk/core/principal | Work with canister and user principal identifiers |
@icp-sdk/core/identity | Manage signing identities |
@icp-sdk/auth | Authentication client for Internet Identity |
@icp-sdk/bindgen | Generate TypeScript bindings from a Candid interface file |
@icp-sdk/bindgen is also available as a Vite plugin and a standalone CLI tool. The official project templates wire it up automatically: generated bindings appear in src/declarations/ after each build.
ic-agent is the official Rust library for building applications and scripts that interact with ICP.
Other languages
Section titled “Other languages”Community-maintained client libraries are available for additional languages:
| Language | Package |
|---|---|
| Go | agent-go by Aviate Labs |
| Java / Android | ic4j-agent by IC4J |
| Dart / Flutter | agent_dart by AstroX |
| .NET | ICP.NET by Gekctek |
| Elixir | icp_agent |
| C | agent-c by Zondax |
Community libraries are maintained independently of DFINITY. Check each repository for current status and security review history before using in production.
Testing tools
Section titled “Testing tools”PocketIC
Section titled “PocketIC”PocketIC is a lightweight, deterministic testing library for canister integration tests. It runs an in-process IC replica: no daemon, no ports, no Docker required. Tests execute synchronously, making them fast and fully reproducible. The icp-cli local development network uses PocketIC under the hood.
| Language | Package | Install |
|---|---|---|
| Rust | pocket-ic | Add to [dev-dependencies] in Cargo.toml |
| JavaScript / TypeScript | @dfinity/pic | npm install --save-dev @dfinity/pic |
| Python | pocket-ic | pip install pocket-ic |
For usage patterns and examples, see the PocketIC guide.
Browser-based IDE
Section titled “Browser-based IDE”ICP Ninja
Section titled “ICP Ninja”ICP Ninja is a web-based IDE for writing and deploying ICP canisters directly from a browser. No local toolchain required. It provides a gallery of example projects (Motoko and Rust backends, React frontends) that you can browse, edit, and deploy to the mainnet in one click.
Deployed canisters remain live for 20 minutes. You can redeploy to reset the timer, or download the project files to continue development locally with icp-cli.
Limitations:
- Projects are limited to 5 MB and 2 canisters
- ICP Ninja is not a replacement for icp-cli for production workflows
Editor tooling
Section titled “Editor tooling”Motoko VS Code extension
Section titled “Motoko VS Code extension”The Motoko extension for VS Code (dfinity/vscode-motoko) adds Motoko language support to VS Code: syntax highlighting, type checking, auto-completion, and inline diagnostics.
Install by searching for “Motoko” in the VS Code extensions panel, or visit the vscode-motoko repository for details.
Candid tools
Section titled “Candid tools”didc is the Candid command-line tool for working with Candid interfaces: encoding and decoding values, checking .did files, generating bindings, and testing Candid compatibility.
Install: download a prebuilt binary from the releases page.
Resources:
- Candid GitHub repo
- Candid specification: candid-spec.md
Next steps
Section titled “Next steps”- Start building: Quickstart: deploy your first canister with icp-cli
- Rust development: Rust language guide
- Motoko development: Motoko language guide