{
  "app": "countryatlas",
  "label": "CountryAtlas — Understand the world, one country at a time",
  "domain": "www.countryatlas.co",
  "port": 8290,
  "health_path": "/api/v1/health",
  "dir": "~/apps/countryatlas",
  "extra_paths": [],
  "sync_excludes": [
    ".venv/", "__pycache__/", ".pytest_cache/", ".ruff_cache/", "*.egg-info/", ".git/", ".env", ".env.*", "!.env.example",
    "node_modules/", "apps/web/.next/", "apps/web/next-env.d.ts", "*.tsbuildinfo", "apps/web/qa/screens/",
    "/data/", "*.duckdb", "*.duckdb.wal", "logs/", "tmp/", ".DS_Store", ".claude/", "deploy/.admin-token", "docs/sources-research.md"
  ],
  "requires": {
    "runtimes": ["pm2", "node", "pnpm", "uv", "uv-python@3.12"],
    "ram_gb": 6,
    "ports": [8290, 8291]
  },
  "ram_mb_observed": 2500,
  "size_mb": 60,
  "placement": {
    "pin": "M2M32",
    "prefer": null,
    "avoid": ["M3U96b", "M1M32"],
    "reason": "Mac Studio M2 Max 12 c / 32 Go dédié (aucune autre app), uv + pnpm + node présents, raccordé au tunnel wg1 ; pipeline quotidien + DuckDB en lecture"
  },
  "processes": [
    {
      "name": "countryatlas-api",
      "manager": "pm2",
      "script": "{{HOME}}/apps/countryatlas/.venv/bin/python",
      "args": ["-m", "uvicorn", "countryatlas.api.main:app", "--host", "127.0.0.1", "--port", "8291", "--no-access-log", "--proxy-headers", "--timeout-keep-alive", "75"],
      "interpreter": null,
      "cwd": "{{HOME}}/apps/countryatlas",
      "env": {
        "CA_DATA_DIR": "{{HOME}}/countryatlas-data",
        "CA_API_HOST": "127.0.0.1",
        "CA_API_PORT": "8291",
        "CA_ADMIN_TOKEN": "c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a",
        "CA_SITE_URL": "https://www.countryatlas.co",
        "FRED_API_KEY": "5d6f76382d7d188e9166bb3b96c8f934",
        "PYTHONUNBUFFERED": "1"
      },
      "cron_restart": null,
      "autorestart": true,
      "max_memory_restart": "3G"
    },
    {
      "name": "countryatlas-scheduler",
      "manager": "pm2",
      "script": "{{HOME}}/apps/countryatlas/.venv/bin/ca",
      "args": ["schedule"],
      "interpreter": null,
      "cwd": "{{HOME}}/apps/countryatlas",
      "env": {
        "CA_DATA_DIR": "{{HOME}}/countryatlas-data",
        "CA_ADMIN_TOKEN": "c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a",
        "FRED_API_KEY": "5d6f76382d7d188e9166bb3b96c8f934",
        "CA_TZ": "America/Toronto",
        "CA_REFRESH_HOUR": "3",
        "CA_REFRESH_MINUTE": "15",
        "PYTHONUNBUFFERED": "1"
      },
      "cron_restart": null,
      "autorestart": true,
      "max_memory_restart": "6G"
    },
    {
      "name": "countryatlas-web",
      "manager": "pm2",
      "script": "/opt/homebrew/bin/node",
      "args": ["node_modules/next/dist/bin/next", "start", "-p", "8290", "-H", "0.0.0.0"],
      "interpreter": null,
      "cwd": "{{HOME}}/apps/countryatlas/apps/web",
      "env": {
        "NODE_ENV": "production",
        "API_URL": "http://127.0.0.1:8291",
        "NEXT_PUBLIC_SITE_URL": "https://www.countryatlas.co",
        "CA_ADMIN_TOKEN": "c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a",
        "NEXT_TELEMETRY_DISABLED": "1"
      },
      "cron_restart": null,
      "autorestart": true,
      "max_memory_restart": "2G"
    }
  ],
  "ngrok": null,
  "launchd": [],
  "env_overrides": {},
  "hooks": {
    "post_sync": [
      "export PATH=\"$HOME/.local/bin:/opt/homebrew/bin:$PATH\"; (test -x .venv/bin/python || uv venv --python 3.12 .venv) && uv pip install -q --python .venv/bin/python -e . && echo '  python deps ok'",
      "export PATH=\"/opt/homebrew/bin:$PATH\"; pnpm install --frozen-lockfile --silent && echo '  web deps ok'",
      "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; cd apps/web && API_URL=http://127.0.0.1:8291 NEXT_PUBLIC_SITE_URL=https://www.countryatlas.co CA_ADMIN_TOKEN=c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a NEXT_TELEMETRY_DISABLED=1 pnpm build 2>&1 | tail -3 && echo '  web build ok'",
      "mkdir -p $HOME/countryatlas-data/{raw,staging,build,snapshots,exports,logs} && echo '  data dirs ok'"
    ],
    "post_start": []
  },
  "notes": "v0.1.0 (2026-09-11) : Next 16 :8290 (rewrites /api/v1/* → FastAPI 127.0.0.1:8291), pipeline Python (ca refresh quotidien 03:15 via countryatlas-scheduler), DuckDB snapshot ~/countryatlas-data/atlas.duckdb (swap atomique). Sources : World Bank, IMF WEO, OECD, Eurostat, WHO GHO, FRED, OWID, BIS. Secrets (CA_ADMIN_TOKEN, FRED_API_KEY) uniquement ici.",
  "tunnel": {
    "domain": "www.countryatlas.co",
    "gateway": "BHS64",
    "note": "DNS A www → 51.161.112.61 posé par l'utilisateur le 2026-09-11 ; apex countryatlas.co sans A record (redirect Caddy à poser quand l'A @ existera)"
  }
}
