Manifest
The Compose App’s manifest is a YAML file with the following schema. The manifest holds all the relevant information about the Compose App and its tasks. All compose commands will reference your manifest and pick up the configuration there. See full manifest configuration docs here.Example
App targeting
Most commands that operate on a deployed app accept either-n, --name <app> to target by name directly, or -m, --manifest <path> (default compose.yaml) to read the name from a manifest. If neither is provided and no compose.yaml is present, the command errors. A few commands (deploy, wallet create, wallet list) only support -m, --manifest.
Scripting and automation
Most Compose commands can run non-interactively, which lets you drive deploys and inspections from CI, scripts, and agents.Authentication
Every command that talks to the platform needs an auth token. The token is resolved in this order: the-t, --token <token> flag, then the GOLDSKY_API_TOKEN environment variable, then the token written by goldsky login. If none is present, the command errors:
JSON output
Pass--json to any command that talks to the platform for machine-readable output: deploy, callTask, status, list, history, runs, collections list, collections query, source, download, pause, resume, delete, logs, secret list, wallet create, wallet list, writeContract, and deployContract. Note that secret set and secret delete do not accept it.
In --json mode stdout carries only the result document; progress bars and other decoration are suppressed. Failures go to stderr as a JSON envelope and the command exits with code 1:
VALIDATION_FAILED, SECRET_MISSING, DEPLOY_FAILED, ALREADY_DEPLOYED, NOT_FOUND, WRITE_CONTRACT_FAILED, and UNKNOWN.
Non-interactive behavior
In a non-TTY (CI, scripts, agents), interactive prompts are skipped or error out:goldsky compose init <name>accepts the project name as an argument and skips the prompt. Without a name it errors in non-interactive mode.goldsky compose deployaborts on a majorapi_versionmismatch unless you pass--force. A minor mismatch defaults to continuing.goldsky compose cleanandgoldsky compose deleterequire-f, --forcein non-interactive mode.
Example: scripted deploy
Commands
init [name]
Prompts you for a project name and scaffolds a folder of that name containing a working Compose app (a Bitcoin price oracle example you can run right away). Pass the name as an argument to skip the prompt; the name is required in non-interactive mode.start
Starts your app locally. Preserves execution state from previous runs, useful for testing retry behavior and other production scenarios. By default the server binds port 4000; if that port is taken it walks up to 4009 and uses the first free port.-m, --manifest <path>Path to manifest file (default:compose.yaml)--fork-chainsFork all chains referenced in contract interactions locally for testing — see forking--impersonate <mappings>Impersonate wallet addresses on the local fork (e.g."wallet1=0xAddr1,wallet2=0xAddr2"). Requires--fork-chains. See Impersonated wallets-p, --port <port>Bind exactly this port; fails fast if it is already in use (no walking)
deploy
Deploys the app to the cloud. On success it prints the dashboard URL, which is also available asdashboard_url when you pass --json. See monitoring for more info. In a non-TTY, a major api_version mismatch aborts the deploy unless you pass --force; see Scripting and automation.
-m, --manifest <path>Path to manifest file (default:compose.yaml)-t, --token <token>Authentication token for deployment-f, --forceSkip version compatibility prompts--sync-envUpload secrets from your local.envto the cloud before deploying, in one step. See Secrets.--jsonEmit the deploy result as JSON (includesdashboard_url)
Your manifest must include an
api_version field to deploy. All secrets referenced in the manifest must be set before deploying (see Secrets).callTask
Call a task by name with a JSON payload. By default the task runs on your deployed app; pass--env local (or -p, --port) to hit a locally running server instead.
--env <local|cloud>Where to run the task (default:cloud). Passing--portimplies local-p, --port <port>Local port to call. Implies--env local; an error if combined with an explicit--env cloud-n, --name <app>App name (alternative to-m)-m, --manifest <path>Path to manifest file (default:compose.yaml)-t, --token <token>Authentication token--jsonEmit the response as JSON
--port flag, then the .compose/.port file, then 4000.
Both the task name and the JSON payload are required. The payload must be valid JSON:
{foo: "bar"} is invalid, use {"foo": "bar"} (or '{}' if the task takes no input) instead.codegen
Parse ABIs in thesrc/contracts/ folder and generate TypeScript classes for them.
See contracts for more details.
deployContract
Compile a Solidity contract and deploy it to a chain, with gas sponsored from your app’s wallet. The contract is compiled locally (noforge or solc install required) and deployed through a CREATE2 deterministic deployment proxy, so deploying the same contract from the same app produces the same address on every chain. The deployed address is printed before the transaction is sent. The block it was deployed in is printed on success, and the ABI is written to src/contracts/<ContractName>.json so you can run codegen against it.
Imports are resolved from node_modules/, so OpenZeppelin and other published contracts work after a normal npm install. The wallet this deploys from is the same on-chain identity as evm.wallet({ name }) in your task code for a given app and wallet name. deployContract and writeContract both work before your app’s first deploy, so you can deploy a contract and use its address before anything is running.
--chain-id <id>Chain to deploy to, e.g.8453for Base or84532for Base Sepolia (required)--constructor-args <args>Constructor arguments, space-separated (one value per argument)--verifyVerify the contract’s source on the chain’s block explorer after deploying. Opt-in because publishing source is irreversible and verification adds roughly 30 to 90 seconds--wallet <name>Named wallet to deploy from (default:default). Shares identity withevm.wallet({ name })in task code--forceDeploy even ifmsg.senderusage is detected in the constructor (see note below)-m, --manifest <path>Path to manifest file (default:compose.yaml)-t, --token <token>Authentication token--api-server <url>Override the API server URL--jsonEmit the deploy result as JSON
Because deployment routes through the CREATE2 proxy,
msg.sender inside your constructor is the proxy address, not your wallet. If your constructor uses msg.sender (for example Ownable(msg.sender)), pass the address as an explicit constructor argument instead. The CLI warns and stops when it detects this; --force bypasses the check.Constructor and function arguments use forge-style syntax: space-separated, one value per argument (for example
--constructor-args 0xRecipient 1000000). Arrays are written [a,b], tuples are written (a,b), and negative numbers need a leading space (for example " -5").Re-deploying the identical contract from the same app fails with
CONTRACT_ALREADY_DEPLOYED because the CREATE2 address already has code. Passing constructor arguments to a contract that has no constructor is an error. Gas spent by deployContract and writeContract is billed on your normal Goldsky bill, the same as gas used by your deployed tasks.writeContract
Send a gas-sponsored transaction to a contract on any supported chain, using your app’s wallet. Encodes calldata from a function signature and arguments, or accepts raw calldata. This is the same wallet identity your task code uses viaevm.wallet(), so you can use it to trigger events, call admin functions, or make transfers without managing gas or keys. writeContract works before your app’s first deploy. Gas spent by writeContract is billed on your normal Goldsky bill, the same as gas used by your deployed tasks.
--chain-id <id>Chain to transact on (required)--to <address>Target contract address (required)--function <signature>Function signature, e.g."transfer(address,uint256)"--args <args>Function arguments, space-separated (one value per argument)--data <hex>Raw calldata hex, as an alternative to--function+--args--value <wei>Value to send with the transaction. Accepts plain wei or anether/gweisuffix:1000,1ether,0.5ether,100gwei--wallet <name>Named wallet to send from (default:default)-m, --manifest <path>Path to manifest file (default:compose.yaml)-t, --token <token>Authentication token--api-server <url>Override the API server URL--jsonEmit the transaction result as JSON
clean
Deletes your local stage database (.compose/stage.db), wiping all local execution state and collection data. Prompts for confirmation unless -f is passed. In a non-TTY it aborts with Use --force for non-interactive cleanup. unless -f is passed.
-f, --forceSkip the confirmation prompt-c, --config <path>Path to manifest file (default:compose.yaml)
update [version]
Update the Compose CLI. With no argument it updates to the latest version; pass a version to install a specific release.--previewInstall the latest preview build frommaininstead of the current stable release
stable and preview.
App lifecycle
For full examples, see App lifecycle.status
Show the status of a deployed app.-n, --name <name>App name (alternative to-m)-m, --manifest <path>Path to manifest file (default:compose.yaml)-t, --token <token>Authentication token--jsonEmit JSON output (for scripts and agents)
list
List all deployed apps in your project.-t, --token <token>Authentication token--jsonEmit JSON output
pause
Pause a deployed app. Cron triggers stop firing and HTTP triggers return an error until the app is resumed.-n, --name <name>/-m, --manifest <path>-t, --token <token>--json
resume
Resume a paused app.pause.
delete
Delete a deployed app. Interactively prompts you to type the app name to confirm, then asks whether to also delete the app’s hosted Postgres database (unless--delete-database is already set). Pass --force to skip both prompts — required for non-interactive use. In non-TTY environments without --force, the command errors out.
-n, --name <name>/-m, --manifest <path>-t, --token <token>-f, --forceSkip confirmation prompts (required for non-interactive use, e.g. CI)--delete-databaseAlso delete the app’s hosted Postgres database--json
logs
View or tail logs from a deployed app.-n, --name <name>/-m, --manifest <path>-t, --token <token>-f, --followStream logs live--tail <lines>Number of lines to fetch (default:100)--level <levels>Comma-separated log levels (e.g.error,warn)--search <text>Filter log lines by text--since <duration>Only show logs since a relative time (e.g.1h,30m,7d)--max-lines <count>Exit after N lines (useful with-f)--timeout <duration>Exit after a duration (useful with-f)--jsonEmit newline-delimited JSON
Inspecting a deployed app
These commands read back information about a deployed app. They accept the standard targeting flags (-n, --name or -m, --manifest) and --json unless noted.
history
Show the deploy history for an app.-n, --name <name>/-m, --manifest <path>-t, --token <token>Authentication token--limit <n>Number of records to show (default: 20, server caps at 100)--offset <n>Number of records to skip (default: 0)--include-failuresInclude failed deploys in the list--jsonEmit JSON output
Showing 6-7 of 42 records. Use --limit and --offset to page.
runs [runId]
List task runs for an app, or show one run’s detail when you pass a run id.-n, --name <name>/-m, --manifest <path>-t, --token <token>Authentication token--limit <n>Number of runs to show--offset <n>Number of runs to skip--task <name>Filter to runs of a single task--status <success|error|pending>Filter by run status--since <duration>Only show runs since a relative time (e.g.1h,30m,7d)--until <duration>Only show runs before a relative time--jsonEmit JSON output
collections list
List the collection names for an app.-n, --name <name>/-m, --manifest <path>-t, --token <token>Authentication token--jsonEmit JSON output
collections query [collectionName]
Query documents in a collection. The collection name is required.-n, --name <name>/-m, --manifest <path>-t, --token <token>Authentication token--filter <json>Filter documents by a JSON predicate--limit <n>Number of documents to return (default: 100, maximum: 1000)--offset <n>Number of documents to skip--jsonEmit JSON output
source [taskName]
Print the deployed source for an app. With no argument it lists the deployed files; with a task name it prints that task’s source. It never writes to disk.-n, --name <name>/-m, --manifest <path>-t, --token <token>Authentication token--jsonEmit JSON output
download
Download the deployed source archive as<app>.zip by default. Use -o, --output <path> to choose a destination; the command refuses to overwrite an existing file. A downloaded app runs locally as-is: compose start detects the pre-bundled task files and runs them without re-bundling.
-n, --name <name>/-m, --manifest <path>-t, --token <token>Authentication token-o, --output <path>Output path (default:<app>.zip)--jsonEmit JSON output
Wallet management
wallet create
Create a named wallet for this app and print its address. Works before the app’s first deploy, so you can create a wallet, fund it, or pass its address as a constructor argument todeployContract before anything is running.
-m, --manifest <path>Path to manifest file (default:compose.yaml) — the app name is read from here--env <local|cloud>Where to create the wallet (default:cloud)-t, --token <token>--jsonEmit the wallet as JSON
wallet list
List wallets that have been created for this app. Returns an empty list for an app that has never deployed.-m, --manifest <path>Path to manifest file (default:compose.yaml)--env <local|cloud>(default:cloud)-t, --token <token>--jsonEmit the wallets as JSON
Secrets
See Secrets for the full workflow.secret set
Set or update a secret. See Secrets for full details.--value <value>Secret value (required)--env <local|cloud>Where to store the secret (default:cloud)--redeployAfter setting, redeploy the app so the new value takes effect-n, --name <app>/-m, --manifest <path>-t, --token <token>
Secret names must be SCREAMING_SNAKE_CASE. A running app only picks up secret changes after a redeploy: pass
--redeploy or run goldsky compose deploy yourself.secret delete
Delete a secret.--env <local|cloud>Where to delete from (default:cloud)-n, --name <app>/-m, --manifest <path>-t, --token <token>
secret list
List the names of cloud secrets set for this app. Secret values are never shown; see How secrets are stored.-n, --name <app>/-m, --manifest <path>-t, --token <token>--jsonEmit the secret names as JSON