Projects
A project is an adduck.json file that holds your connected accounts, guardrails, and schedules. You can have one per app, one per client, or one for everything.
Create a project
Creates adduck.json in the current directory and adds it to adduck's project list. You'll be prompted for a project name.
Skips the prompt and creates the config in the specified directory.
Switch projects
Shows all known projects with their paths and which one is currently active.
Sets my-app as the default project. Subsequent commands use it without needing --config.
Remove a project
Removes the project from adduck's registry. Doesn't delete the adduck.json file itself.
Use a specific config file
Every command accepts --config to point at a config file directly:
Useful for CI pipelines or when you run adduck from a script that can't rely on the active project.
Config file structure
adduck.json is JSON. You can edit it by hand. The top-level keys:
{
"name": "my-app",
"accounts": {
"apple": {
"clientId": "...",
"teamId": "...",
"keyId": "...",
"orgId": "...",
"privateKeyPath": "~/.adduck/apple-key.pem"
},
"reddit": {
"clientId": "...",
"clientSecret": "...",
"refreshToken": "...",
"accountId": "..."
}
},
"guardrails": {
"allowMutations": true,
"maxBudgetChangePct": 25,
"maxDailyBudgetMicros": 500000000,
"protectedCampaigns": []
},
"schedules": []
} Using environment variables
Any credential in adduck.json can be replaced with an environment variable reference:
{
"accounts": {
"apple": {
"clientId": "$APPLE_CLIENT_ID",
"teamId": "$APPLE_TEAM_ID"
}
}
} adduck expands $VAR_NAME values from the shell environment at runtime. Useful for CI or shared configs where you don't want credentials committed to a repo.
Multiple accounts per platform
If you manage multiple Apple org IDs or multiple Meta ad accounts, you can define them as an array:
{
"accounts": {
"apple": [
{ "orgId": "111", "clientId": "...", "teamId": "...", "keyId": "...", "privateKeyPath": "..." },
{ "orgId": "222", "clientId": "...", "teamId": "...", "keyId": "...", "privateKeyPath": "..." }
]
}
} adduck spend will pull from all of them and label each row with the org ID.