spb/countryatlas
Public
TypeScript 57%
Python 38.6%
JavaScript 3.6%
CSS 0.6%
1{2 "app": "countryatlas",3 "label": "CountryAtlas — Understand the world, one country at a time",4 "domain": "www.countryatlas.co",5 "port": 8290,6 "health_path": "/api/v1/health",7 "dir": "~/apps/countryatlas",8 "extra_paths": [],9 "sync_excludes": [10 ".venv/", "__pycache__/", ".pytest_cache/", ".ruff_cache/", "*.egg-info/", ".git/", ".env", ".env.*", "!.env.example",11 "node_modules/", "apps/web/.next/", "apps/web/next-env.d.ts", "*.tsbuildinfo", "apps/web/qa/screens/",12 "/data/", "*.duckdb", "*.duckdb.wal", "logs/", "tmp/", ".DS_Store", ".claude/", "deploy/.admin-token", "docs/sources-research.md"13 ],14 "requires": {15 "runtimes": ["pm2", "node", "pnpm", "uv", "uv-python@3.12"],16 "ram_gb": 6,17 "ports": [8290, 8291]18 },19 "ram_mb_observed": 2500,20 "size_mb": 60,21 "placement": {22 "pin": "M2M32",23 "prefer": null,24 "avoid": ["M3U96b", "M1M32"],25 "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"26 },27 "processes": [28 {29 "name": "countryatlas-api",30 "manager": "pm2",31 "script": "{{HOME}}/apps/countryatlas/.venv/bin/python",32 "args": ["-m", "uvicorn", "countryatlas.api.main:app", "--host", "127.0.0.1", "--port", "8291", "--no-access-log", "--proxy-headers", "--timeout-keep-alive", "75"],33 "interpreter": null,34 "cwd": "{{HOME}}/apps/countryatlas",35 "env": {36 "CA_DATA_DIR": "{{HOME}}/countryatlas-data",37 "CA_API_HOST": "127.0.0.1",38 "CA_API_PORT": "8291",39 "CA_ADMIN_TOKEN": "c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a",40 "CA_SITE_URL": "https://www.countryatlas.co",41 "FRED_API_KEY": "5d6f76382d7d188e9166bb3b96c8f934",42 "PYTHONUNBUFFERED": "1"43 },44 "cron_restart": null,45 "autorestart": true,46 "max_memory_restart": "3G"47 },48 {49 "name": "countryatlas-scheduler",50 "manager": "pm2",51 "script": "{{HOME}}/apps/countryatlas/.venv/bin/ca",52 "args": ["schedule"],53 "interpreter": null,54 "cwd": "{{HOME}}/apps/countryatlas",55 "env": {56 "CA_DATA_DIR": "{{HOME}}/countryatlas-data",57 "CA_ADMIN_TOKEN": "c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a",58 "FRED_API_KEY": "5d6f76382d7d188e9166bb3b96c8f934",59 "CA_TZ": "America/Toronto",60 "CA_REFRESH_HOUR": "3",61 "CA_REFRESH_MINUTE": "15",62 "PYTHONUNBUFFERED": "1"63 },64 "cron_restart": null,65 "autorestart": true,66 "max_memory_restart": "6G"67 },68 {69 "name": "countryatlas-web",70 "manager": "pm2",71 "script": "/opt/homebrew/bin/node",72 "args": ["node_modules/next/dist/bin/next", "start", "-p", "8290", "-H", "0.0.0.0"],73 "interpreter": null,74 "cwd": "{{HOME}}/apps/countryatlas/apps/web",75 "env": {76 "NODE_ENV": "production",77 "API_URL": "http://127.0.0.1:8291",78 "NEXT_PUBLIC_SITE_URL": "https://www.countryatlas.co",79 "CA_ADMIN_TOKEN": "c9ae6c67cdeb415c9df7db09d255c86d3537fb7670cf3c5a",80 "NEXT_TELEMETRY_DISABLED": "1"81 },82 "cron_restart": null,83 "autorestart": true,84 "max_memory_restart": "2G"85 }86 ],87 "ngrok": null,88 "launchd": [],89 "env_overrides": {},90 "hooks": {91 "post_sync": [92 "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'",93 "export PATH=\"/opt/homebrew/bin:$PATH\"; pnpm install --frozen-lockfile --silent && echo ' web deps ok'",94 "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'",95 "mkdir -p $HOME/countryatlas-data/{raw,staging,build,snapshots,exports,logs} && echo ' data dirs ok'"96 ],97 "post_start": []98 },99 "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.",100 "tunnel": {101 "domain": "www.countryatlas.co",102 "gateway": "BHS64",103 "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)"104 }105}106