{
  "schemaVersion": "1.0",
  "item": {
    "slug": "approvals-ui",
    "name": "Approve new channels, and connections to openclaw ui and terminal",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/Fizzy2390/approvals-ui",
    "canonicalUrl": "https://clawhub.ai/Fizzy2390/approvals-ui",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/approvals-ui",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=approvals-ui",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "server.py",
      "SKILL.md",
      "templates/channel_approvals.html",
      "templates/dashboard.html",
      "templates/device_pairings.html",
      "templates/index.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/approvals-ui"
    },
    "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/approvals-ui",
    "agentPageUrl": "https://openagent3.xyz/skills/approvals-ui/agent",
    "manifestUrl": "https://openagent3.xyz/skills/approvals-ui/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/approvals-ui/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": "Approvals UI",
        "body": "A web dashboard for managing OpenClaw device pairings, channel approvals, and a live terminal — all from your browser."
      },
      {
        "title": "Install",
        "body": "Place this folder at:\n\n~/.openclaw/workspace/projects/p1\n\nYour file structure should look like:\n\n~/.openclaw/workspace/projects/p1/\r\n├── SKILL.md\r\n├── server.py\r\n└── templates/\r\n    ├── channel_approvals.html\r\n    ├── dashboard.html\r\n    ├── device_pairings.html\r\n    ├── index.html\r\n    ├── login.html\r\n    └── terminal.html"
      },
      {
        "title": "Requirements",
        "body": "Install Python dependencies:\n\npip install flask flask-socketio"
      },
      {
        "title": "⚠️ Important — Change These Before Running",
        "body": "This skill ships with placeholder credentials that you must change before using:\n\nOpen server.py and update the following values near the top of the file:\n\nWhatVariableDefaultActionDashboard login usernameADMIN_USERNAMEDrinnasChange to your own usernameDashboard login passwordADMIN_PASSWORDadminChange to a strong passwordAPI auth passwordAUTH_PASSWORD / env SERVER_AUTH_PASSWORDBb7766!serverChange to a strong password or set the env varFlask secret keyenv FLASK_SECRET_KEYdev placeholderSet to a random string in your environment\n\nExample:\n\nexport FLASK_SECRET_KEY=\"$(python3 -c 'import secrets; print(secrets.token_hex(32))')\"\r\nexport SERVER_AUTH_PASSWORD=\"your-strong-api-password-here\"\n\nDo not run with the defaults. Anyone who knows the defaults can log in and access your terminal and gateway token."
      },
      {
        "title": "Credential Explanation",
        "body": "There are two separate auth layers:\n\nDashboard login (ADMIN_USERNAME / ADMIN_PASSWORD) — protects the web UI pages (dashboard, device pairings, channel approvals, terminal).\nAPI password (AUTH_PASSWORD / env SERVER_AUTH_PASSWORD) — protects the backend API endpoints (/pair, /sync, /approve) used for programmatic access. These endpoints are not exposed in the web UI but exist for automation/scripting.\n\nBoth should be set to strong, unique values."
      },
      {
        "title": "Usage",
        "body": "Start the server:\n\ncd ~/.openclaw/workspace/projects/p1\r\npython3 server.py\n\nThen open http://127.0.0.1:9100 in your browser."
      },
      {
        "title": "Features",
        "body": "Dashboard — Landing page with quick navigation to all sections.\nDevice Pairings — View pending and paired browser/device connections. Approve or reject pairing requests. Copy your gateway token to clipboard.\nChannel Approvals — Review and approve pending channel pairing requests (Telegram, Discord, WhatsApp, etc). Real-time updates via Socket.IO.\nTerminal — Full interactive terminal session in the browser using xterm.js."
      },
      {
        "title": "How It Works",
        "body": "Reads device pairings directly from ~/.openclaw/devices/pending.json and ~/.openclaw/devices/paired.json.\nReads channel pairing requests from ~/.openclaw/credentials/*-pairing.json.\nReads the gateway token from ~/.openclaw/openclaw.json → gateway.auth.token.\nApprove/reject actions use the openclaw devices approve and openclaw devices reject CLI commands.\nNo external database needed — everything reads from OpenClaw's own state files."
      },
      {
        "title": "Security Notes",
        "body": "Localhost only — The server binds to 127.0.0.1 by default. Do not change this to 0.0.0.0 unless you put it behind a reverse proxy with TLS and strong auth.\nTerminal access — The terminal feature gives full shell access to your machine. If you don't need it, you can remove the /terminal route and terminal.html template.\nSensitive files — The app reads your openclaw.json (gateway token), device pairing files, and credential pairing files. Anyone who can access the web UI can see this data.\nAPI endpoints — POST /pair, POST /sync, and POST /approve accept JSON with a password field. These are protected by AUTH_PASSWORD and are intended for scripting/automation, not the web UI."
      },
      {
        "title": "Configuration",
        "body": "SettingLocationDefaultServer portserver.py bottom9100Dashboard loginserver.py ADMIN_USERNAME / ADMIN_PASSWORDDrinnas / adminAPI passwordserver.py AUTH_PASSWORD / env SERVER_AUTH_PASSWORDBb7766!serverFlask secret keyenv FLASK_SECRET_KEYdev placeholderOpenClaw state direnv OPENCLAW_STATE_DIR~/.openclaw"
      },
      {
        "title": "Tags",
        "body": "ui dashboard pairings approvals terminal web"
      }
    ],
    "body": "Approvals UI\n\nA web dashboard for managing OpenClaw device pairings, channel approvals, and a live terminal — all from your browser.\n\nInstall\n\nPlace this folder at:\n\n~/.openclaw/workspace/projects/p1\n\n\nYour file structure should look like:\n\n~/.openclaw/workspace/projects/p1/\r\n├── SKILL.md\r\n├── server.py\r\n└── templates/\r\n    ├── channel_approvals.html\r\n    ├── dashboard.html\r\n    ├── device_pairings.html\r\n    ├── index.html\r\n    ├── login.html\r\n    └── terminal.html\n\nRequirements\n\nInstall Python dependencies:\n\npip install flask flask-socketio\n\n⚠️ Important — Change These Before Running\n\nThis skill ships with placeholder credentials that you must change before using:\n\nOpen server.py and update the following values near the top of the file:\n\nWhat\tVariable\tDefault\tAction\nDashboard login username\tADMIN_USERNAME\tDrinnas\tChange to your own username\nDashboard login password\tADMIN_PASSWORD\tadmin\tChange to a strong password\nAPI auth password\tAUTH_PASSWORD / env SERVER_AUTH_PASSWORD\tBb7766!server\tChange to a strong password or set the env var\nFlask secret key\tenv FLASK_SECRET_KEY\tdev placeholder\tSet to a random string in your environment\n\nExample:\n\nexport FLASK_SECRET_KEY=\"$(python3 -c 'import secrets; print(secrets.token_hex(32))')\"\r\nexport SERVER_AUTH_PASSWORD=\"your-strong-api-password-here\"\n\n\nDo not run with the defaults. Anyone who knows the defaults can log in and access your terminal and gateway token.\n\nCredential Explanation\n\nThere are two separate auth layers:\n\nDashboard login (ADMIN_USERNAME / ADMIN_PASSWORD) — protects the web UI pages (dashboard, device pairings, channel approvals, terminal).\nAPI password (AUTH_PASSWORD / env SERVER_AUTH_PASSWORD) — protects the backend API endpoints (/pair, /sync, /approve) used for programmatic access. These endpoints are not exposed in the web UI but exist for automation/scripting.\n\nBoth should be set to strong, unique values.\n\nUsage\n\nStart the server:\n\ncd ~/.openclaw/workspace/projects/p1\r\npython3 server.py\n\n\nThen open http://127.0.0.1:9100 in your browser.\n\nFeatures\nDashboard — Landing page with quick navigation to all sections.\nDevice Pairings — View pending and paired browser/device connections. Approve or reject pairing requests. Copy your gateway token to clipboard.\nChannel Approvals — Review and approve pending channel pairing requests (Telegram, Discord, WhatsApp, etc). Real-time updates via Socket.IO.\nTerminal — Full interactive terminal session in the browser using xterm.js.\nHow It Works\nReads device pairings directly from ~/.openclaw/devices/pending.json and ~/.openclaw/devices/paired.json.\nReads channel pairing requests from ~/.openclaw/credentials/*-pairing.json.\nReads the gateway token from ~/.openclaw/openclaw.json → gateway.auth.token.\nApprove/reject actions use the openclaw devices approve and openclaw devices reject CLI commands.\nNo external database needed — everything reads from OpenClaw's own state files.\nSecurity Notes\nLocalhost only — The server binds to 127.0.0.1 by default. Do not change this to 0.0.0.0 unless you put it behind a reverse proxy with TLS and strong auth.\nTerminal access — The terminal feature gives full shell access to your machine. If you don't need it, you can remove the /terminal route and terminal.html template.\nSensitive files — The app reads your openclaw.json (gateway token), device pairing files, and credential pairing files. Anyone who can access the web UI can see this data.\nAPI endpoints — POST /pair, POST /sync, and POST /approve accept JSON with a password field. These are protected by AUTH_PASSWORD and are intended for scripting/automation, not the web UI.\nConfiguration\nSetting\tLocation\tDefault\nServer port\tserver.py bottom\t9100\nDashboard login\tserver.py ADMIN_USERNAME / ADMIN_PASSWORD\tDrinnas / admin\nAPI password\tserver.py AUTH_PASSWORD / env SERVER_AUTH_PASSWORD\tBb7766!server\nFlask secret key\tenv FLASK_SECRET_KEY\tdev placeholder\nOpenClaw state dir\tenv OPENCLAW_STATE_DIR\t~/.openclaw\nTags\n\nui dashboard pairings approvals terminal web"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Fizzy2390/approvals-ui",
    "publisherUrl": "https://clawhub.ai/Fizzy2390/approvals-ui",
    "owner": "Fizzy2390",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/approvals-ui",
    "downloadUrl": "https://openagent3.xyz/downloads/approvals-ui",
    "agentUrl": "https://openagent3.xyz/skills/approvals-ui/agent",
    "manifestUrl": "https://openagent3.xyz/skills/approvals-ui/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/approvals-ui/agent.md"
  }
}