{
  "name": "The Helm",
  "nodes": [
    {
      "parameters": {
        "resource": "user",
        "owner": {
          "__rl": true,
          "value": "centricle",
          "mode": "name"
        },
        "returnAll": true
      },
      "type": "n8n-nodes-base.github",
      "typeVersion": 1.1,
      "position": [
        -272,
        336
      ],
      "id": "a48e5383-60ac-4120-9bfc-07942799a080",
      "name": "Check GitHub repos",
      "credentials": {
        "githubApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const sites = [\n  { name: 'centricle', url: 'https://centricle.com' },\n  { name: 'mileweave', url: 'https://mileweave.us' },\n  { name: 'picweave', url: 'https://picweave.us' },\n  { name: 'batteries', url: 'https://batteries.fyi' },\n  { name: 'cables', url: 'https://cables.fyi' },\n  { name: 'fasteners', url: 'https://fasteners.fyi' },\n  { name: 'iron', url: 'https://iron.fyi' },\n  { name: 'mahogany', url: 'https://mahogany.fyi' },\n  { name: 'wings', url: 'https://wings.fyi' },\n  { name: 'packlife', url: 'https://thepacklife.us' },\n  { name: 'yappyhour', url: 'https://yappyhour.us' },\n  { name: 'thoughtstream', url: 'https://thoughtstream.us' },\n  { name: 'thoughtweave', url: 'https://thoughtweave.us' },\n  { name: 'dipshit', url: 'https://dipshit.fyi' },\n  { name: 'doomscrolling', url: 'https://doomscrolling.us' },\n  { name: 'flailspin', url: 'https://flailspin.com' },\n  { name: 'whoami', url: 'https://whoami.fyi' },\n  { name: 'splitsmart', url: 'https://splitsmart.us' },\n  { name: 'choremode', url: 'https://choremode.us' },\n  { name: 'propdock', url: 'https://propdock.us' },\n  { name: 'verbatim', url: 'https://verbatim.fyi' },\n  { name: 'tidewaterweb', url: 'https://tidewaterweb.com' },\n];\n\nreturn sites.map(site => ({ json: site }));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -272,
        -128
      ],
      "id": "e0af2cb3-17f5-4c85-b9b9-48085e6dbb5b",
      "name": "Get domains",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        -128,
        -128
      ],
      "id": "53ae8158-2254-4fd1-81c3-80090651a782",
      "name": "Heartbeat monitor",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "numberInputs": 4
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        80,
        64
      ],
      "id": "0f709f7f-f30a-415d-a8ef-e6867206a6cc",
      "name": "Merge"
    },
    {
      "parameters": {
        "jsCode": "const token = 'YOUR_NETLIFY_TOKEN';\n\n// Get all sites\nconst sitesRes = await\nfetch('https://api.netlify.com/api/v1/sites?per_page=100', {\n  headers: { 'Authorization': `Bearer ${token}` },\n});\nconst sites = await sitesRes.json();\n\n// Get latest deploy for each site\nconst results = [];\nfor (const site of sites) {\n  const deploysRes = await fetch(\n    `https://api.netlify.com/api/v1/sites/${site.id}/deploys?per\n_page=1`,\n    { headers: { 'Authorization': `Bearer ${token}` } }\n  );\n  const deploys = await deploysRes.json();\n  const latest = deploys[0] || {};\n\n  results.push({\n    json: {\n      name: site.name,\n      url: site.ssl_url || site.url,\n      lastDeploy: latest.created_at || 'never',\n      deployStatus: latest.state || 'unknown',\n      updatedAt: site.updated_at,\n    },\n  });\n}\n\nreturn results;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -272,
        16
      ],
      "id": "1dbea992-7adb-4a90-8ef6-80f20fde2953",
      "name": "Check Netlify deployments",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const projects = [\n  { name: 'mileweave', url:\n'https://YOUR_PROJECT.supabase.co', key:\n'YOUR_SUPABASE_SERVICE_KEY' },\n  { name: 'picweave', url:\n'https://YOUR_PROJECT.supabase.co', key:\n'YOUR_SUPABASE_SERVICE_KEY' },\n  { name: 'thoughtstream', url:\n'https://YOUR_PROJECT.supabase.co', key:\n'YOUR_SUPABASE_SERVICE_KEY' },\n  { name: 'doomscrolling', url:\n'https://YOUR_PROJECT.supabase.co', key:\n'YOUR_SUPABASE_SERVICE_KEY' },\n  { name: 'sausaging', url:\n'https://YOUR_PROJECT.supabase.co', key:\n'YOUR_SUPABASE_SERVICE_KEY' },\n];\n\nconst results = [];\nfor (const project of projects) {\n  try {\n    const response = await fetch(\n      `${project.url}/rest/v1/profiles?select=count`,\n      {\n        method: 'HEAD',\n        headers: {\n          'apikey': project.key,\n          'Authorization': `Bearer ${project.key}`,\n          'Prefer': 'count=exact',\n        },\n      }\n    );\n    const count =\nresponse.headers.get('content-range')?.split('/')[1] || '0';\n    results.push({ json: { name: project.name, userCount:\nparseInt(count), status: 'ok' } });\n  } catch (err) {\n    results.push({ json: { name: project.name, userCount: 0,\nstatus: 'error', error: err.message } });\n  }\n}\n\nreturn results;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -272,
        176
      ],
      "id": "c690dc9a-33cb-43cc-b764-c83b8b9c1df7",
      "name": "Check Supabase user counts",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -640,
        112
      ],
      "id": "84c413aa-f12c-4bed-b533-2030d5fb34ae",
      "name": "YOLO"
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "claude-sonnet-4-20250514",
          "mode": "list",
          "cachedResultName": "claude-sonnet-4-20250514"
        },
        "messages": {
          "values": [
            {
              "content": "=You are a fleet operations analyst for ksmith's portfolio of 30+ indie web products. Analyze the following aggregated data and produce a concise fleet health report.\n\n## Raw Fleet Data\n{{ JSON.stringify($input.all().map(item => item.json), null, 2) }}\n\nProduce a report with:\n1. **Fleet Overview** \u2014 total sites, how many healthy vs. stale vs. down\n2. **Attention Needed** \u2014 sites with failed deploys, sites not deployed in 30+ days, any downtime\n3. **Growth Signals** \u2014 user count changes, active repos, recent deploys\n4. **Recommendation** \u2014 top 3 actions for today\n\nBe direct and concise. No fluff."
            }
          ]
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.anthropic",
      "typeVersion": 1,
      "position": [
        224,
        96
      ],
      "id": "acc2907b-824f-47a9-9c5c-cdc9fcc46cb1",
      "name": "Talk to the robot",
      "executeOnce": true,
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Get domains": {
      "main": [
        [
          {
            "node": "Heartbeat monitor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check GitHub repos": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Heartbeat monitor": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Netlify deployments": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check Supabase user counts": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "YOLO": {
      "main": [
        [
          {
            "node": "Check GitHub repos",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get domains",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check Supabase user counts",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check Netlify deployments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Talk to the robot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "versionId": "1cf03292-c8f1-4fd9-8194-3d7ba8065fce",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "axXpvDzgle2k1ou1",
  "tags": []
}