Projects

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

adduck init

Creates adduck.json in the current directory and adds it to adduck's project list. You'll be prompted for a project name.

adduck init --name my-app --dir ~/projects/my-app

Skips the prompt and creates the config in the specified directory.

Switch projects

adduck projects list

Shows all known projects with their paths and which one is currently active.

adduck projects use my-app

Sets my-app as the default project. Subsequent commands use it without needing --config.

Remove a project

adduck projects remove my-app

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:

adduck spend --config ~/projects/my-app/adduck.json

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.