Feedback welcome! Report issues on GitHub, ask questions on the Forum, or chat with us on Discord.
Tutorial
This tutorial walks through deploying a full-stack app on the Internet Computer, explaining each step along the way.
Already did the Quickstart? This tutorial covers the same steps with detailed explanations. The Quickstart used --define flags to skip the interactive prompts — here you’ll see what those prompts are and what they mean.
What is a Canister?
A canister is your application running on the Internet Computer. It combines code and persistent state into a single unit — no servers to manage, no databases to configure. Your code runs on a decentralized network and persists automatically.
In this tutorial, you’ll deploy two canisters:
A backend canister (Motoko) — your application logic
A frontend canister (React) — your web UI, also served from the blockchain
Prerequisites
Required:Node.js (LTS) for the installation commands below.
Windows users: This tutorial requires WSL (for Motoko) and Docker Desktop (for local networks). Install both first, then run all commands inside WSL.
Install the required tools:
Terminal window
# icp-cli and ic-wasm (required)
npminstall-g@icp-sdk/icp-cli@icp-sdk/ic-wasm
# Motoko toolchain (for Motoko projects)
npminstall-gic-mops && mopstoolchaininit
This installs:
icp-cli — the core CLI for building and deploying canisters
ic-wasm — optimizes WebAssembly for the Internet Computer
mops — Motoko package manager, which also installs the Motoko compiler
Alternative methods: See the Installation Guide for shell script, Homebrew, Rust setup, or other options.
Verify the tools are installed:
Terminal window
icp--version
ic-wasm--version
mops--version
Create a Project
Terminal window
icpnewmy-project
You’ll see three prompts:
1. Template selection — Choose hello-world for a full-stack app with backend and frontend.
2. Backend language — Choose motoko (or rust if you prefer).
3. Network type — Choose Default for native local networks. On Windows, Docker is always used regardless of this setting.
Tip: The Quickstart skipped these prompts using --define flags:
This starts a local Internet Computer replica on your machine. The -d flag runs it in the background (detached) so you can continue using your terminal.
Verify the network is running:
Terminal window
icpnetworkstatus
Note: For local development, icp-cli uses an anonymous identity by default. This identity is automatically funded with ICP and cycles on local networks, so you can deploy immediately without setting up a wallet. For mainnet deployment, you’ll create a dedicated identity — see Deploying to Mainnet.
Open the frontend URL in your browser. You’ll see a React app that calls your backend canister.
Candid UI
Open the Candid UI URL (shown next to “backend”). Candid UI is a web interface that lets you interact with any canister that has a known Candid interface — no frontend code required.
Try it:
Find the greet method
Enter a name (e.g., “World”)
Click “Call”
See the response: "Hello, World!"
Candid UI works with any backend canister, not just this example. It’s useful for:
Testing methods during development
Exploring what methods a canister exposes
Debugging without writing frontend code
Command Line
You can also call your backend from the terminal:
Terminal window
icpcanistercallbackendgreet'("World")'
You should see: ("Hello, World!")
The argument format '("World")' is Candid — the interface description language for the Internet Computer.
Interactive Arguments
Don’t want to type Candid manually? Omit the argument and icp-cli will prompt you interactively:
Terminal window
icpcanistercallbackendgreet
You’ll see a prompt asking for the name parameter — just type World and press Enter. This works for any method with any argument types, making it easy to explore canister APIs without memorizing Candid syntax.
Stop the Network
When you’re done:
Terminal window
icpnetworkstop
Next Steps
You’ve deployed a full-stack app on the Internet Computer! Continue your journey: