{
  "schemaVersion": "1.0",
  "item": {
    "slug": "agent-dashboard",
    "name": "Agent Dashboard",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/tahseen137/agent-dashboard",
    "canonicalUrl": "https://clawhub.ai/tahseen137/agent-dashboard",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/agent-dashboard",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=agent-dashboard",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "assets/push-dashboard.sh",
      "assets/templates/dashboard-data.json",
      "assets/templates/setup-supabase.sql",
      "assets/tier1-canvas.html",
      "assets/tier2-github.html"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/agent-dashboard"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/agent-dashboard",
    "agentPageUrl": "https://openagent3.xyz/skills/agent-dashboard/agent",
    "manifestUrl": "https://openagent3.xyz/skills/agent-dashboard/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/agent-dashboard/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Mission Control 🚀",
        "body": "A real-time dashboard showing what your OpenClaw agent is doing, cron job health, issues requiring attention, and recent activity. Check it from anywhere — your phone, your laptop, wherever."
      },
      {
        "title": "Tier 1 — Canvas (Zero Setup) ⚡",
        "body": "No external services. The agent renders the dashboard directly in your OpenClaw session.\n\nHow to use:\n\nShow me the mission control dashboard\n\nThe agent will:\n\nGather current state (active tasks, crons, etc.)\nGenerate a dashboard using the canvas tool\nPresent it inline in your session\n\nThat's it. No deploy, no accounts, nothing to configure."
      },
      {
        "title": "Tier 2 — GitHub Pages + Polling (Recommended) 🌐",
        "body": "Free hosting with 30-second auto-refresh. Takes 2 minutes to set up.\n\nSetup:\n\nCreate a repo:\ngh repo create mission-control --public --clone\ncd mission-control\n\n\n\nCopy the dashboard:\nmkdir -p data\n# Copy tier2-github.html to index.html\n# Copy assets/templates/dashboard-data.json to data/\n\n\n\nEdit index.html:\n\nChange YOUR_PIN_HERE to your chosen PIN\n\n\n\nEnable GitHub Pages:\n\nGo to repo Settings → Pages\nSource: Deploy from branch main\nFolder: / (root)\n\n\n\nDeploy:\ngit add -A && git commit -m \"Initial deploy\" && git push\n\nYour dashboard is now live at https://YOUR_USERNAME.github.io/mission-control/"
      },
      {
        "title": "Tier 3 — Supabase Realtime + Vercel (Premium) ⚡🔥",
        "body": "True websocket realtime — updates appear in under 1 second.\n\nPrerequisites:\n\nSupabase account (free tier works)\nVercel account (free tier works)\n\nStep 1: Create Supabase Table\n\nIn your Supabase SQL Editor, run assets/templates/setup-supabase.sql.\n\nStep 2: Get Your Keys\n\nFrom Supabase Dashboard → Settings → API:\n\nCopy SUPABASE_URL (Project URL)\nCopy SUPABASE_ANON_KEY (anon public key)\n\nThat's it — no service_role key needed. The anon key handles both reads (dashboard) and writes (push script) via table-specific RLS.\n\nStep 3: Edit the Dashboard\n\nIn tier3-realtime.html:\n\nReplace YOUR_SUPABASE_URL with your project URL\nReplace YOUR_SUPABASE_ANON_KEY with your anon key\nReplace YOUR_PIN_HERE with your chosen PIN\n\nStep 4: Deploy to Vercel\n\nmkdir mission-control && cd mission-control\n# Copy tier3-realtime.html as index.html\nvercel deploy --prod\n\nStep 5: Configure Push Script\n\nexport SUPABASE_URL=\"https://YOUR_PROJECT.supabase.co\"\nexport SUPABASE_ANON_KEY=\"eyJ...\"  # Same anon key used by the dashboard"
      },
      {
        "title": "🔄 Keeping It Fresh — Auto-Update Mechanism",
        "body": "The dashboard updates itself automatically. Here's how:"
      },
      {
        "title": "1. Cron Auto-Update (Every 30 Minutes)",
        "body": "Set up a cron job that collects data from OpenClaw APIs and pushes it:\n\nCreate a cron job called \"Dashboard Update\" that runs every 30 minutes.\nIt should:\n1. Run `cron list` to get all cron job statuses, error counts, last run times\n2. Run `sessions_list` to find any active sub-agents and their current tasks\n3. Build the dashboard JSON from this API data\n4. Push to Supabase (or git push for Tier 2)\n\nData sources: Only OpenClaw built-in APIs (cron list, sessions_list). No local files are read. Action items and recent activity are added manually via the \"Manual Update\" command below.\n\nSample cron configuration:\n\nname: Dashboard Update\nschedule: \"*/30 * * * *\"  # Every 30 minutes\nmodel: sonnet             # Fast model for quick updates\nprompt: |\n  Update the Mission Control dashboard:\n  \n  1. Run `cron list` to get job names, statuses, error counts, last run times\n  2. Run `sessions_list` to find active sub-agents and their tasks\n  3. Build JSON matching the dashboard schema from API data only\n  4. Push to Supabase or GitHub\n  \n  Do not read local files. Only use cron list and sessions_list data."
      },
      {
        "title": "2. Real-Time Event Pushes",
        "body": "Beyond the periodic cron, the agent pushes updates immediately when significant events happen:\n\n✅ Task starts or finishes\n❌ Errors or failures\n🚀 Deploys complete\n📧 Important notifications arrive\n\nThis means the dashboard reflects changes within seconds, not just every 30 minutes.\n\nHow to enable: When you start a major task, tell the agent:\n\nAfter this deploy finishes, push an update to Mission Control."
      },
      {
        "title": "3. Force Update Button",
        "body": "Every dashboard tier includes a 🔄 Update button in the header:\n\nTier 2: Re-fetches dashboard-data.json immediately\nTier 3: Re-fetches from Supabase immediately\nResets the \"Updated X ago\" timer\nShows loading spinner while fetching\n\nUse this when you want to confirm the latest state without waiting for auto-refresh."
      },
      {
        "title": "The Result",
        "body": "The combination of periodic cron + real-time pushes + manual refresh keeps your dashboard accurate at all times. You'll always see what your agent is actually doing."
      },
      {
        "title": "🚨 Action Required",
        "body": "Urgent items that need your attention. Highlighted at the top with priority badges (high/medium/low)."
      },
      {
        "title": "⚡ Active Now",
        "body": "What the agent is currently working on, with model name and duration."
      },
      {
        "title": "📊 Products",
        "body": "Your product cards with live/testing/down status badges."
      },
      {
        "title": "⏰ Cron Jobs",
        "body": "Table showing all scheduled jobs with status, last run time, and error counts. Click to expand error details."
      },
      {
        "title": "📋 Recent Activity",
        "body": "Timeline of recent events and accomplishments."
      },
      {
        "title": "🔴 Live Indicator (Tier 3 only)",
        "body": "Green pulsing dot shows websocket is connected. Flash animation when data updates."
      },
      {
        "title": "Requirements by Tier",
        "body": "TierTools NeededExternal AccountsEnv VarsTier 1NoneNoneNoneTier 2git, gh CLIGitHub (free)DASHBOARD_PINTier 3curlSupabase (free), Vercel (free)See below"
      },
      {
        "title": "Environment Variables",
        "body": "VariableRequiredTierPurposeDASHBOARD_PINNoAllPIN code for dashboard access (set directly in HTML config)SUPABASE_URLYesTier 3 onlyYour Supabase project URLSUPABASE_ANON_KEYYesTier 3 onlySupabase anon key — used for both dashboard reads AND push script writes\n\nTier 1 needs zero env vars. Tier 2 needs only a GitHub repo. Tier 3 needs only SUPABASE_URL and SUPABASE_ANON_KEY — no service_role key required."
      },
      {
        "title": "Permissions Used by OpenClaw",
        "body": "TierPermissionsWhyTier 1NoneCanvas is built into OpenClawTier 2execTo run git push to YOUR GitHub repoTier 3execTo run curl to YOUR Supabase project\n\nNo other permissions are used. No read permission needed — this skill does not access local files."
      },
      {
        "title": "Data Schema",
        "body": "The dashboard expects JSON in this format:\n\n{\n  \"lastUpdated\": \"2024-01-15T12:00:00Z\",\n  \"actionRequired\": [\n    {\n      \"title\": \"Review PR #42\",\n      \"url\": \"https://github.com/you/repo/pull/42\",\n      \"priority\": \"high\"\n    }\n  ],\n  \"activeNow\": [\n    {\n      \"task\": \"Deploying new feature\",\n      \"model\": \"opus\",\n      \"startedAt\": \"2024-01-15T11:45:00Z\"\n    }\n  ],\n  \"products\": [\n    {\n      \"name\": \"My App\",\n      \"url\": \"https://myapp.example.com\",\n      \"status\": \"live\",\n      \"lastChecked\": \"2024-01-15T12:00:00Z\"\n    }\n  ],\n  \"crons\": [\n    {\n      \"name\": \"Daily Report\",\n      \"schedule\": \"9:00 AM daily\",\n      \"lastRun\": \"2024-01-15T09:00:00Z\",\n      \"status\": \"ok\",\n      \"errors\": 0,\n      \"lastError\": null\n    }\n  ],\n  \"recentActivity\": [\n    {\n      \"time\": \"2024-01-15T11:30:00Z\",\n      \"event\": \"✅ Deployed v2.1.0 to production\"\n    }\n  ]\n}"
      },
      {
        "title": "Field Reference",
        "body": "FieldTypeDescriptionlastUpdatedISO-8601When data was last refreshedactionRequired[].priorityhigh|medium|lowUrgency levelproducts[].statuslive|testing|downProduct healthcrons[].statusok|error|pausedJob status"
      },
      {
        "title": "Security & Privacy",
        "body": "This is an instruction-only skill — no executable code, no install scripts, no third-party dependencies."
      },
      {
        "title": "What This Skill Does and Doesn't Do",
        "body": "✅ Does❌ Doesn'tRender HTML dashboardsRead local files (no HEARTBEAT.md, no memory files, no source code)Push operational status to YOUR servicesSend data to third-party servicesRead OpenClaw APIs only (cron list, sessions_list)Store, log, or transmit credentialsUse YOUR Supabase/GitHub accountsRequire service_role or admin keys"
      },
      {
        "title": "Exactly What Data Gets Pushed (Tier 2 & 3)",
        "body": "The dashboard pushes ONLY these fields — nothing else:\n\nFieldExampleContains secrets?actionRequired[].title\"Review PR #42\"❌ NoactiveNow[].task\"Deploying v2.0\"❌ Noproducts[].name\"My App\"❌ Noproducts[].url\"https://myapp.com\"❌ No (public URLs only)products[].status\"live\"❌ Nocrons[].name\"Daily Report\"❌ Nocrons[].status\"ok\" / \"error\"❌ Nocrons[].lastError\"timeout after 30s\"❌ No (error messages only)recentActivity[].event\"✅ Deployed v2.1\"❌ No\n\nNever pushed: passwords, API keys, tokens, file contents, database credentials, user data, or PII. The agent builds the JSON from operational status only — task names, timestamps, and status codes."
      },
      {
        "title": "What Data the Agent Reads",
        "body": "The auto-update cron uses ONLY OpenClaw built-in APIs:\n\nSourceWhat it extractsSensitive?cron list (OpenClaw API)Job names, status, error counts❌ Nosessions_list (OpenClaw API)Active task labels, models❌ No\n\nNo local files are read. The cron does not access HEARTBEAT.md, memory files, source code, or any other files on disk. Action items and recent activity are added manually by the user via the \"Manual Update\" command."
      },
      {
        "title": "No Service Role Key Required",
        "body": "This skill does NOT require a Supabase service_role key. The anon key handles both reads and writes via table-specific RLS:\n\nThe dashboard_state table allows anon SELECT and UPDATE (via RLS policy)\nThe anon key can ONLY read/write this single table — it cannot access any other tables\nWorst case if someone gets your anon key: they can overwrite dashboard status data (not sensitive)\nThe anon key is the same one already embedded in your client-side Supabase app"
      },
      {
        "title": "Row Level Security (Tier 3)",
        "body": "The provided SQL (setup-supabase.sql) configures table-specific RLS:\n\nSELECT: Allowed for anon — dashboard can read status\nUPDATE: Allowed for anon on dashboard_state table only — push script can update status\nOther tables: Unaffected — the anon key's existing RLS policies on all other tables remain unchanged\nNo DELETE: Anon cannot delete the dashboard row"
      },
      {
        "title": "PIN Protection — Limitations",
        "body": "The client-side PIN prevents casual access, NOT determined attackers.\n\nFor stronger protection:\n\nTier 2: Make your GitHub Pages repo private (GitHub Pro)\nTier 3: Use Vercel's password protection (Pro plan) or add Supabase Auth\nAll tiers: The dashboard only contains operational status — no secrets to steal even if accessed"
      },
      {
        "title": "Files Included",
        "body": "agent-dashboard/\n├── SKILL.md                      # This file\n├── assets/\n│   ├── tier1-canvas.html         # Lightweight canvas version\n│   ├── tier2-github.html         # GitHub Pages + polling\n│   ├── tier3-realtime.html       # Supabase Realtime version\n│   └── push-dashboard.sh         # Push script for Tier 3\n├── assets/templates/\n│   ├── dashboard-data.json       # Sample data structure\n│   └── setup-supabase.sql        # Supabase table setup\n└── references/\n    └── customization.md          # Theme and layout customization"
      },
      {
        "title": "Dashboard shows \"Disconnected\" (Tier 3)",
        "body": "Check Supabase project is running\nVerify anon key is correct\nEnsure realtime is enabled on the table"
      },
      {
        "title": "Data not updating (Tier 2)",
        "body": "Check GitHub Pages is enabled\nVerify data/dashboard-data.json was pushed\nHard refresh the page (Ctrl+Shift+R)\nClick the Force Update button to confirm data is stale"
      },
      {
        "title": "PIN not working",
        "body": "PINs are case-sensitive\nCheck you're using the same PIN in HTML config"
      },
      {
        "title": "Cron status not accurate",
        "body": "Ensure your Dashboard Update cron is running (cron list)\nCheck for errors in the cron output\nManually run the update: \"Update my Mission Control dashboard now\""
      },
      {
        "title": "Credits",
        "body": "Built for the OpenClaw community. MIT License."
      }
    ],
    "body": "Mission Control 🚀\n\nA real-time dashboard showing what your OpenClaw agent is doing, cron job health, issues requiring attention, and recent activity. Check it from anywhere — your phone, your laptop, wherever.\n\nQuick Start\nTier 1 — Canvas (Zero Setup) ⚡\n\nNo external services. The agent renders the dashboard directly in your OpenClaw session.\n\nHow to use:\n\nShow me the mission control dashboard\n\n\nThe agent will:\n\nGather current state (active tasks, crons, etc.)\nGenerate a dashboard using the canvas tool\nPresent it inline in your session\n\nThat's it. No deploy, no accounts, nothing to configure.\n\nTier 2 — GitHub Pages + Polling (Recommended) 🌐\n\nFree hosting with 30-second auto-refresh. Takes 2 minutes to set up.\n\nSetup:\n\nCreate a repo:\n\ngh repo create mission-control --public --clone\ncd mission-control\n\n\nCopy the dashboard:\n\nmkdir -p data\n# Copy tier2-github.html to index.html\n# Copy assets/templates/dashboard-data.json to data/\n\n\nEdit index.html:\n\nChange YOUR_PIN_HERE to your chosen PIN\n\nEnable GitHub Pages:\n\nGo to repo Settings → Pages\nSource: Deploy from branch main\nFolder: / (root)\n\nDeploy:\n\ngit add -A && git commit -m \"Initial deploy\" && git push\n\n\nYour dashboard is now live at https://YOUR_USERNAME.github.io/mission-control/\n\nTier 3 — Supabase Realtime + Vercel (Premium) ⚡🔥\n\nTrue websocket realtime — updates appear in under 1 second.\n\nPrerequisites:\n\nSupabase account (free tier works)\nVercel account (free tier works)\n\nStep 1: Create Supabase Table\n\nIn your Supabase SQL Editor, run assets/templates/setup-supabase.sql.\n\nStep 2: Get Your Keys\n\nFrom Supabase Dashboard → Settings → API:\n\nCopy SUPABASE_URL (Project URL)\nCopy SUPABASE_ANON_KEY (anon public key)\n\nThat's it — no service_role key needed. The anon key handles both reads (dashboard) and writes (push script) via table-specific RLS.\n\nStep 3: Edit the Dashboard\n\nIn tier3-realtime.html:\n\nReplace YOUR_SUPABASE_URL with your project URL\nReplace YOUR_SUPABASE_ANON_KEY with your anon key\nReplace YOUR_PIN_HERE with your chosen PIN\n\nStep 4: Deploy to Vercel\n\nmkdir mission-control && cd mission-control\n# Copy tier3-realtime.html as index.html\nvercel deploy --prod\n\n\nStep 5: Configure Push Script\n\nexport SUPABASE_URL=\"https://YOUR_PROJECT.supabase.co\"\nexport SUPABASE_ANON_KEY=\"eyJ...\"  # Same anon key used by the dashboard\n\n🔄 Keeping It Fresh — Auto-Update Mechanism\n\nThe dashboard updates itself automatically. Here's how:\n\n1. Cron Auto-Update (Every 30 Minutes)\n\nSet up a cron job that collects data from OpenClaw APIs and pushes it:\n\nCreate a cron job called \"Dashboard Update\" that runs every 30 minutes.\nIt should:\n1. Run `cron list` to get all cron job statuses, error counts, last run times\n2. Run `sessions_list` to find any active sub-agents and their current tasks\n3. Build the dashboard JSON from this API data\n4. Push to Supabase (or git push for Tier 2)\n\n\nData sources: Only OpenClaw built-in APIs (cron list, sessions_list). No local files are read. Action items and recent activity are added manually via the \"Manual Update\" command below.\n\nSample cron configuration:\n\nname: Dashboard Update\nschedule: \"*/30 * * * *\"  # Every 30 minutes\nmodel: sonnet             # Fast model for quick updates\nprompt: |\n  Update the Mission Control dashboard:\n  \n  1. Run `cron list` to get job names, statuses, error counts, last run times\n  2. Run `sessions_list` to find active sub-agents and their tasks\n  3. Build JSON matching the dashboard schema from API data only\n  4. Push to Supabase or GitHub\n  \n  Do not read local files. Only use cron list and sessions_list data.\n\n2. Real-Time Event Pushes\n\nBeyond the periodic cron, the agent pushes updates immediately when significant events happen:\n\n✅ Task starts or finishes\n❌ Errors or failures\n🚀 Deploys complete\n📧 Important notifications arrive\n\nThis means the dashboard reflects changes within seconds, not just every 30 minutes.\n\nHow to enable: When you start a major task, tell the agent:\n\nAfter this deploy finishes, push an update to Mission Control.\n\n3. Force Update Button\n\nEvery dashboard tier includes a 🔄 Update button in the header:\n\nTier 2: Re-fetches dashboard-data.json immediately\nTier 3: Re-fetches from Supabase immediately\nResets the \"Updated X ago\" timer\nShows loading spinner while fetching\n\nUse this when you want to confirm the latest state without waiting for auto-refresh.\n\nThe Result\n\nThe combination of periodic cron + real-time pushes + manual refresh keeps your dashboard accurate at all times. You'll always see what your agent is actually doing.\n\nDashboard Features\n🚨 Action Required\n\nUrgent items that need your attention. Highlighted at the top with priority badges (high/medium/low).\n\n⚡ Active Now\n\nWhat the agent is currently working on, with model name and duration.\n\n📊 Products\n\nYour product cards with live/testing/down status badges.\n\n⏰ Cron Jobs\n\nTable showing all scheduled jobs with status, last run time, and error counts. Click to expand error details.\n\n📋 Recent Activity\n\nTimeline of recent events and accomplishments.\n\n🔴 Live Indicator (Tier 3 only)\n\nGreen pulsing dot shows websocket is connected. Flash animation when data updates.\n\nRequirements by Tier\nTier\tTools Needed\tExternal Accounts\tEnv Vars\nTier 1\tNone\tNone\tNone\nTier 2\tgit, gh CLI\tGitHub (free)\tDASHBOARD_PIN\nTier 3\tcurl\tSupabase (free), Vercel (free)\tSee below\nEnvironment Variables\nVariable\tRequired\tTier\tPurpose\nDASHBOARD_PIN\tNo\tAll\tPIN code for dashboard access (set directly in HTML config)\nSUPABASE_URL\tYes\tTier 3 only\tYour Supabase project URL\nSUPABASE_ANON_KEY\tYes\tTier 3 only\tSupabase anon key — used for both dashboard reads AND push script writes\n\nTier 1 needs zero env vars. Tier 2 needs only a GitHub repo. Tier 3 needs only SUPABASE_URL and SUPABASE_ANON_KEY — no service_role key required.\n\nPermissions Used by OpenClaw\nTier\tPermissions\tWhy\nTier 1\tNone\tCanvas is built into OpenClaw\nTier 2\texec\tTo run git push to YOUR GitHub repo\nTier 3\texec\tTo run curl to YOUR Supabase project\n\nNo other permissions are used. No read permission needed — this skill does not access local files.\n\nData Schema\n\nThe dashboard expects JSON in this format:\n\n{\n  \"lastUpdated\": \"2024-01-15T12:00:00Z\",\n  \"actionRequired\": [\n    {\n      \"title\": \"Review PR #42\",\n      \"url\": \"https://github.com/you/repo/pull/42\",\n      \"priority\": \"high\"\n    }\n  ],\n  \"activeNow\": [\n    {\n      \"task\": \"Deploying new feature\",\n      \"model\": \"opus\",\n      \"startedAt\": \"2024-01-15T11:45:00Z\"\n    }\n  ],\n  \"products\": [\n    {\n      \"name\": \"My App\",\n      \"url\": \"https://myapp.example.com\",\n      \"status\": \"live\",\n      \"lastChecked\": \"2024-01-15T12:00:00Z\"\n    }\n  ],\n  \"crons\": [\n    {\n      \"name\": \"Daily Report\",\n      \"schedule\": \"9:00 AM daily\",\n      \"lastRun\": \"2024-01-15T09:00:00Z\",\n      \"status\": \"ok\",\n      \"errors\": 0,\n      \"lastError\": null\n    }\n  ],\n  \"recentActivity\": [\n    {\n      \"time\": \"2024-01-15T11:30:00Z\",\n      \"event\": \"✅ Deployed v2.1.0 to production\"\n    }\n  ]\n}\n\nField Reference\nField\tType\tDescription\nlastUpdated\tISO-8601\tWhen data was last refreshed\nactionRequired[].priority\thigh|medium|low\tUrgency level\nproducts[].status\tlive|testing|down\tProduct health\ncrons[].status\tok|error|paused\tJob status\nSecurity & Privacy\n\nThis is an instruction-only skill — no executable code, no install scripts, no third-party dependencies.\n\nWhat This Skill Does and Doesn't Do\n✅ Does\t❌ Doesn't\nRender HTML dashboards\tRead local files (no HEARTBEAT.md, no memory files, no source code)\nPush operational status to YOUR services\tSend data to third-party services\nRead OpenClaw APIs only (cron list, sessions_list)\tStore, log, or transmit credentials\nUse YOUR Supabase/GitHub accounts\tRequire service_role or admin keys\nExactly What Data Gets Pushed (Tier 2 & 3)\n\nThe dashboard pushes ONLY these fields — nothing else:\n\nField\tExample\tContains secrets?\nactionRequired[].title\t\"Review PR #42\"\t❌ No\nactiveNow[].task\t\"Deploying v2.0\"\t❌ No\nproducts[].name\t\"My App\"\t❌ No\nproducts[].url\t\"https://myapp.com\"\t❌ No (public URLs only)\nproducts[].status\t\"live\"\t❌ No\ncrons[].name\t\"Daily Report\"\t❌ No\ncrons[].status\t\"ok\" / \"error\"\t❌ No\ncrons[].lastError\t\"timeout after 30s\"\t❌ No (error messages only)\nrecentActivity[].event\t\"✅ Deployed v2.1\"\t❌ No\n\nNever pushed: passwords, API keys, tokens, file contents, database credentials, user data, or PII. The agent builds the JSON from operational status only — task names, timestamps, and status codes.\n\nWhat Data the Agent Reads\n\nThe auto-update cron uses ONLY OpenClaw built-in APIs:\n\nSource\tWhat it extracts\tSensitive?\ncron list (OpenClaw API)\tJob names, status, error counts\t❌ No\nsessions_list (OpenClaw API)\tActive task labels, models\t❌ No\n\nNo local files are read. The cron does not access HEARTBEAT.md, memory files, source code, or any other files on disk. Action items and recent activity are added manually by the user via the \"Manual Update\" command.\n\nNo Service Role Key Required\n\nThis skill does NOT require a Supabase service_role key. The anon key handles both reads and writes via table-specific RLS:\n\nThe dashboard_state table allows anon SELECT and UPDATE (via RLS policy)\nThe anon key can ONLY read/write this single table — it cannot access any other tables\nWorst case if someone gets your anon key: they can overwrite dashboard status data (not sensitive)\nThe anon key is the same one already embedded in your client-side Supabase app\nRow Level Security (Tier 3)\n\nThe provided SQL (setup-supabase.sql) configures table-specific RLS:\n\nSELECT: Allowed for anon — dashboard can read status\nUPDATE: Allowed for anon on dashboard_state table only — push script can update status\nOther tables: Unaffected — the anon key's existing RLS policies on all other tables remain unchanged\nNo DELETE: Anon cannot delete the dashboard row\nPIN Protection — Limitations\n\nThe client-side PIN prevents casual access, NOT determined attackers.\n\nFor stronger protection:\n\nTier 2: Make your GitHub Pages repo private (GitHub Pro)\nTier 3: Use Vercel's password protection (Pro plan) or add Supabase Auth\nAll tiers: The dashboard only contains operational status — no secrets to steal even if accessed\nFiles Included\nagent-dashboard/\n├── SKILL.md                      # This file\n├── assets/\n│   ├── tier1-canvas.html         # Lightweight canvas version\n│   ├── tier2-github.html         # GitHub Pages + polling\n│   ├── tier3-realtime.html       # Supabase Realtime version\n│   └── push-dashboard.sh         # Push script for Tier 3\n├── assets/templates/\n│   ├── dashboard-data.json       # Sample data structure\n│   └── setup-supabase.sql        # Supabase table setup\n└── references/\n    └── customization.md          # Theme and layout customization\n\nTroubleshooting\nDashboard shows \"Disconnected\" (Tier 3)\nCheck Supabase project is running\nVerify anon key is correct\nEnsure realtime is enabled on the table\nData not updating (Tier 2)\nCheck GitHub Pages is enabled\nVerify data/dashboard-data.json was pushed\nHard refresh the page (Ctrl+Shift+R)\nClick the Force Update button to confirm data is stale\nPIN not working\nPINs are case-sensitive\nCheck you're using the same PIN in HTML config\nCron status not accurate\nEnsure your Dashboard Update cron is running (cron list)\nCheck for errors in the cron output\nManually run the update: \"Update my Mission Control dashboard now\"\nCredits\n\nBuilt for the OpenClaw community. MIT License."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/tahseen137/agent-dashboard",
    "publisherUrl": "https://clawhub.ai/tahseen137/agent-dashboard",
    "owner": "tahseen137",
    "version": "1.0.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/agent-dashboard",
    "downloadUrl": "https://openagent3.xyz/downloads/agent-dashboard",
    "agentUrl": "https://openagent3.xyz/skills/agent-dashboard/agent",
    "manifestUrl": "https://openagent3.xyz/skills/agent-dashboard/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/agent-dashboard/agent.md"
  }
}