Configure Scarb.toml, dojo profiles, world settings, and dependencies. Use when setting up project configuration, managing dependencies, or configuring deployment environments.
79
Does it follow best practices?
If you maintain this skill, you can automatically optimize it using the tessl CLI to improve its score:
npx tessl skill review --optimize ./path/to/skillValidation for skill structure
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 mainnetProfile 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 deploymentNamespaces 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.tomlUse 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 permissions3c1874f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.