← back to Secrets Manager

update-viewer/update-items.json

118 lines

{
  "title": "Credentials & Tokens — Update Tracker",
  "origin": "2026-05-30 Kamatera compromise + ongoing token hygiene",
  "items": [
    {
      "id": "dw-admin-pg",
      "title": "PostgreSQL dw_admin password",
      "type": "db-password",
      "severity": "P1",
      "status": "outstanding",
      "gates": "Kamatera deploy (the do-not-deploy flag clears only after this)",
      "exposed": "hardcoded cleartext in 14+ files (scrubbed); Time Machine / Spotlight / possibly remote git history",
      "mintUrl": null,
      "console": [
        "Mint new ≥20-char pw (openssl rand -base64 24)",
        "Kamatera: ssh root@45.61.58.125 → sudo -u postgres psql -c \"ALTER ROLE dw_admin WITH PASSWORD '<NEW>';\"",
        "Local Mac2: psql -U postgres -c \"ALTER ROLE dw_admin WITH PASSWORD '<NEW>';\""
      ],
      "routeBack": "printf 'DW_ADMIN_DB_PASSWORD=<NEW>' | node ~/Projects/secrets-manager/cli.js import-paste",
      "restart": "local: pm2 restart wallco-ai-9905  |  Kamatera: pm2 restart all --update-env",
      "verify": "node ~/Projects/secrets-manager/cli.js check",
      "claudeCanRun": ["routeBack", "restart-local", "verify"]
    },
    {
      "id": "gemini-1",
      "title": "Gemini API key #1",
      "type": "api-key",
      "severity": "P2",
      "status": "outstanding",
      "gates": null,
      "exposed": "hardcoded in 7 Patty routes + 3 DW docs",
      "mintUrl": "https://aistudio.google.com/apikey",
      "console": ["Create new key, DELETE the old one in the same console"],
      "routeBack": "printf 'GEMINI_API_KEY=<NEW>' | node ~/Projects/secrets-manager/cli.js import-paste",
      "restart": null,
      "verify": "node ~/Projects/secrets-manager/cli.js check  (hits Gemini /models)",
      "claudeCanRun": ["routeBack", "verify"]
    },
    {
      "id": "gemini-2",
      "title": "Gemini API key #2",
      "type": "api-key",
      "severity": "P2",
      "status": "outstanding",
      "gates": null,
      "exposed": "hardcoded in PoppyPetitions/lib/gemini.ts",
      "mintUrl": "https://aistudio.google.com/apikey",
      "console": ["Create new key, delete old", "confirm KEY_NAME against routes.json (GEMINI_API_KEY_RALPH or poppy-specific)"],
      "routeBack": "printf '<KEY_NAME>=<NEW>' | node ~/Projects/secrets-manager/cli.js import-paste",
      "restart": null,
      "verify": "node ~/Projects/secrets-manager/cli.js check",
      "claudeCanRun": ["routeBack", "verify"]
    },
    {
      "id": "norma-scoped",
      "title": "Norma sdcc scoped PG user (norma_app_user)",
      "type": "db-scoped-role",
      "severity": "P3 (optional)",
      "status": "outstanding",
      "gates": null,
      "exposed": "Norma currently connects as shared dw_admin on local sdcc; this moves it to least-privilege (does NOT fix dw_admin)",
      "mintUrl": null,
      "console": ["~/Projects/_shared/scripts/rotate-pg-scoped.sh ~/Projects/Norma sdcc norma_app_user NORMA_APP_DB_PASSWORD  (LOCAL only, interactive: type new ≥16-char pw twice)"],
      "routeBack": "handled by the script",
      "restart": "pm2 restart norma-*",
      "verify": "node ~/Projects/secrets-manager/cli.js check",
      "claudeCanRun": []
    },
    {
      "id": "cfg-dw-agents",
      "title": "DW-Agents ecosystem.config.js → env-first DSN",
      "type": "config-fix",
      "severity": "prep",
      "status": "done",
      "gates": null,
      "exposed": "inline DSN wouldn't pick up rotated pw; fixed to process.env.DATABASE_URL || …",
      "mintUrl": null,
      "console": [],
      "routeBack": null,
      "restart": null,
      "verify": "committed f9a7548 on rotation-prestage",
      "claudeCanRun": []
    },
    {
      "id": "cfg-archive-agent",
      "title": "archive-agent ecosystem.config.js DSN",
      "type": "config-fix",
      "severity": "prep",
      "status": "done",
      "gates": null,
      "exposed": "already env-first (no pw literal)",
      "mintUrl": null,
      "console": [],
      "routeBack": null,
      "restart": null,
      "verify": "verified env-first",
      "claudeCanRun": []
    }
  ],
  "toConfigure": [
    { "name": "ANTHROPIC_API_KEY", "desc": "Anthropic API Key", "mintUrl": "https://console.anthropic.com/settings/keys" },
    { "name": "GEMINI_API_KEY_RALPH", "desc": "Gemini key — Letsbegin Ralph runner (rotation #2 target)", "mintUrl": "https://aistudio.google.com/apikey" },
    { "name": "RESEND_API_KEY", "desc": "Resend transactional email — wallco.ai magic-link sign-in", "mintUrl": "https://resend.com/api-keys" },
    { "name": "MAIL_FROM", "desc": "From identity for transactional email (must match verified Resend domain)", "mintUrl": null },
    { "name": "VERCEL_TOKEN", "desc": "Vercel API Token", "mintUrl": "https://vercel.com/account/tokens" },
    { "name": "HEYGEN_API_KEY", "desc": "HeyGen talking-head avatar render (session-debrief skill)", "mintUrl": "https://app.heygen.com/settings" },
    { "name": "STRIPE_WEBHOOK_SECRET", "desc": "Stripe Webhook Signing Secret", "mintUrl": "https://dashboard.stripe.com/webhooks" },
    { "name": "STRIPE_RESTRICTED_KEY", "desc": "Stripe Restricted Key (site-factory)", "mintUrl": "https://dashboard.stripe.com/apikeys" },
    { "name": "SHOPIFY_API_KEY", "desc": "Shopify API Key", "mintUrl": "https://admin.shopify.com" },
    { "name": "GOOGLE_PLACES_API_KEY", "desc": "Google Places API Key", "mintUrl": "https://console.cloud.google.com/apis/credentials" },
    { "name": "NEXT_PUBLIC_GOOGLE_MAPS_API_KEY", "desc": "Google Maps JS Key (browser-exposed; set HTTP-referrer restrictions)", "mintUrl": "https://console.cloud.google.com/apis/credentials" },
    { "name": "NPH_GOOGLE_OAUTH_CLIENT_ID", "desc": "Google OAuth Client ID — buyer sign-in on National Paper Hangers", "mintUrl": "https://console.cloud.google.com/apis/credentials" },
    { "name": "NPH_GOOGLE_OAUTH_CLIENT_SECRET", "desc": "Google OAuth Client Secret — National Paper Hangers", "mintUrl": "https://console.cloud.google.com/apis/credentials" },
    { "name": "GEORGE_AUTH", "desc": "George Gmail Basic Auth (DW microsite leads)", "mintUrl": null },
    { "name": "GOOGLE_GENERATIVE_AI_API_KEY", "desc": "alias of GEMINI_API_KEY (set if a lib expects this name)", "mintUrl": null }
  ]
}