Configure Scarb.toml, dojo profiles, world settings, and dependencies. Use when setting up project configuration, managing dependencies, or configuring deployment environments.
Manage Dojo project configuration including Scarb.toml, deployment profiles, and world settings.
Manages configuration files:
Scarb.toml - Package manifest and dependenciesdojo_dev.toml - Local development profiledojo_<profile>.toml - Other environment profilesInteractive mode:
"Update my Dojo configuration"
I'll ask about:
Direct mode:
"Add the Origami library to my dependencies"
"Configure production deployment for Sepolia"
Dojo projects use two types of configuration files:
Scarb.toml - Project ManifestDefines project dependencies and build settings:
[package]
cairo-version = "2.12.2"
name = "my-dojo-game"
version = "1.0.0"
edition = "2024_07"
[[target.starknet-contract]]
sierra = true
build-external-contracts = ["dojo::world::world_contract::world"]
[dependencies]
starknet = "2.12.2"
dojo = "1.7.1"
[dev-dependencies]
cairo_test = "2.12.2"
dojo_cairo_test = "1.7.1"
[tool.scarb]
allow-prebuilt-plugins = ["dojo_cairo_macros"]
dojo_<profile>.toml - Profile ConfigurationProfile-specific deployment settings.
Dojo looks for dojo_dev.toml by default.
[world]
name = "My Game"
description = "An awesome on-chain game"
seed = "my-unique-seed"
cover_uri = "file://assets/cover.png"
icon_uri = "file://assets/icon.png"
[env]
rpc_url = "http://localhost:5050/"
account_address = "0x127fd..."
private_key = "0xc5b2f..."
[namespace]
default = "my_game"
[writers]
"my_game" = ["my_game-actions"]
[owners]
"my_game" = ["my_game-admin"]
Dojo uses profiles to manage different environments:
# Use default 'dev' profile (dojo_dev.toml)
sozo build
sozo migrate
# Use specific profile (dojo_mainnet.toml)
sozo build --profile mainnet
sozo migrate --profile mainnet
Profile file naming: dojo_<profile>.toml
dojo_dev.toml - Development (default)dojo_staging.toml - Stagingdojo_mainnet.toml - Production[world]
name = "My Game" # Human-readable name
description = "A provable game" # Description
seed = "my-unique-seed" # Unique seed for address generation
cover_uri = "ipfs://Qm..." # Cover image (ipfs:// or file://)
icon_uri = "ipfs://Qm..." # Icon image
[world.socials]
x = "https://x.com/mygame"
discord = "https://discord.gg/mygame"
[env]
rpc_url = "http://localhost:5050/"
account_address = "0x127fd..."
private_key = "0xc5b2f..."
# Or use keystore for production:
# keystore_path = "/path/to/keystore"
world_address = "0x077c0..." # Set after first deployment
Namespaces organize your resources:
[namespace]
default = "my_game" # Default namespace for all resources
# Optional: Map specific resources to namespaces
mappings = { "weapons" = ["Sword", "Bow"], "characters" = ["Player", "Enemy"] }
Resources get tagged as <namespace>-<resource_name>.
Set up initial permissions at deployment time:
[writers]
# Namespace-level: actions can write to all resources in my_game
"my_game" = ["my_game-actions"]
# Resource-specific: movement can only write to Position
"my_game-Position" = ["my_game-movement"]
[owners]
# Namespace ownership
"my_game" = ["my_game-admin"]
[dependencies]
starknet = "2.12.2"
dojo = "1.7.1"
[dev-dependencies]
cairo_test = "2.12.2"
dojo_cairo_test = "1.7.1"
Origami (game utilities):
[dependencies]
origami_token = { git = "https://github.com/dojoengine/origami", tag = "v1.0.0" }
Alexandria (math utilities):
[dependencies]
alexandria_math = { git = "https://github.com/keep-starknet-strange/alexandria" }
When using external libraries with models:
[[target.starknet-contract]]
build-external-contracts = [
"dojo::world::world_contract::world",
"armory::models::m_Flatbow", # Format: <crate>::<path>::m_<ModelName>
]
[world]
name = "My Game (Dev)"
seed = "dev-my-game"
[env]
rpc_url = "http://localhost:5050/"
account_address = "0x127fd..."
private_key = "0xc5b2f..."
[namespace]
default = "dev"
[writers]
"dev" = ["dev-actions"]
[world]
name = "My Game"
seed = "prod-my-game"
description = "Production deployment"
cover_uri = "ipfs://YourCoverHash"
icon_uri = "ipfs://YourIconHash"
[env]
rpc_url = "https://api.cartridge.gg/x/starknet/mainnet"
account_address = "0x..."
keystore_path = "~/.starknet_accounts/mainnet.json"
[namespace]
default = "game"
[writers]
"game" = ["game-actions"]
[owners]
"game" = ["game-admin"]
Never commit private keys. Use .gitignore:
# Ignore sensitive configs
dojo_mainnet.toml
dojo_*_secrets.toml
# Keep development config
!dojo_dev.toml
Use keystore for production:
[env]
keystore_path = "~/.starknet_accounts/mainnet.json"
# Instead of: private_key = "0x..."
"Profile not found":
dojo_<profile>.toml exists in project root--profile flag"World not found":
world_address in [env] after first deployment"Account not found":
After configuration:
dojo-deploy skill to deploy with your configdojo-migrate skill when updating deploymentsdojo-world skill to manage runtime permissionsSearch for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer