Local Deployment

We will setup a new project for a Motoko canister from scratch and demonstrate core functionality of the SDK. To deploy a "Hello World", you may consult the official docs.

dfx project from scratch

After installing the SDK you can make a new folder for your project. We will call our project motime. Make sure your project has the following folder structure:

├── dfx.json
└── src/
    └── main.mo


The main configuration file is dfx.json. Lets make a custom configuration for our project. Copy and paste the following into the dfx.json in the root of your project.

  "canisters": {
    "motime": {
      "type": "motoko",
      "main": "src/main.mo"

This defines one single canister called motime. We specify that this canister is based an actor written in Motoko by setting type field to "motoko". We also specify the Motoko file path in the main field.

This is enough for a basic canister build from one single Motoko source code file.


Inside the src folder, make a file called main.mo and put the following actor code inside.

actor {
  public query func hello(name : Text) : async Text {
    return "Hello, " # name # "!";

Starting the local replica

After setting up project files, we need to start a local replica that serves as a local 'testnet' for development purposes. Start the replica by running

dfx start

Two things should be outputted in your terminal:

  • An indication that networks.json is used
  • A link to a locally running dashboard to monitor your replica

Create empty canister

Now the local replica is running, lets create an empty canister.

dfx canister create motime

This creates a temporary .dfx folder in the root of your project. After this step, you should have a canister_ids.json under .dfx/local/. This file contains a canister id (which is a principal) of the empty canister now running on your local replica.

Build Motoko code

Now we can compile the Motoko code into a wasm file by running

dfx build motime

If the build succeeds, the outputs will be stored in .dfx/local/canisters/motime/. This folder contains, amongst other things, a motime.wasm file (the compiled Motoko actor) and a motime.did file (the Interface Description).

Installing the wasm in the canister

Now we can install the wasm module in the canister we created.

dfx canister install motime

If this succeeds, you now have a canister running on your local replica.

Calling the canister

To interact with the running canister from the command line, run this command

dfx canister call motime hello motoko

The output should be ("Hello, motoko!") indicating that the function inside main.mo was called successfully.

dfx deploy

There is a command that combines the previous steps into one step. You need a running replica before running this command.

dfx deploy motime

This command creates a canister (if it doesn't exist already), compiles the code and installs the wasm module in one step.

For a full overview of dfx commands, see the official docs