{
  "schemaVersion": "1.0",
  "item": {
    "slug": "postwall",
    "name": "Postwall",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/casperaiassist/postwall",
    "canonicalUrl": "https://clawhub.ai/casperaiassist/postwall",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/postwall",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=postwall",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "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",
      "slug": "postwall",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T08:38:34.120Z",
      "expiresAt": "2026-05-14T08:38:34.120Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=postwall",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=postwall",
        "contentDisposition": "attachment; filename=\"postwall-1.7.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "postwall"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/postwall"
    },
    "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/postwall",
    "agentPageUrl": "https://openagent3.xyz/skills/postwall/agent",
    "manifestUrl": "https://openagent3.xyz/skills/postwall/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/postwall/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": "PostWall Email Skill",
        "body": "PostWall is a security layer between AI agents and email. Use this skill to:\n\nRead emails that have been approved by the human\nSend emails via draft submission (requires human approval before sending)"
      },
      {
        "title": "Setup",
        "body": "First, authenticate with your API key (get this from PostWall dashboard):\n\npostwall auth pw_your_api_key_here"
      },
      {
        "title": "Check for New Emails",
        "body": "Returns count of unread approved emails. Ideal for polling.\n\npostwall check              # Returns: 5\npostwall check --json       # Returns: {\"count\": 5}"
      },
      {
        "title": "List Approved Emails",
        "body": "Shows all unread approved emails.\n\npostwall inbox              # Human-readable list\npostwall inbox --json       # JSON format\npostwall inbox --limit 10   # Limit results"
      },
      {
        "title": "Read Specific Email",
        "body": "Reads an email by ID. This marks the email as read - it won't appear in future inbox/check calls.\n\npostwall read <email-id>           # Shows email content\npostwall read <email-id> --json    # JSON format"
      },
      {
        "title": "Mark Emails as Read (Without Fetching)",
        "body": "Marks one or more emails as read without fetching their content. Useful for batch processing or when you only need to process email metadata from inbox.\n\npostwall mark-read <id1>                  # Mark single email as read\npostwall mark-read <id1> <id2> <id3>      # Mark multiple emails as read\npostwall mark-read <id1> <id2> --json     # JSON format\n\nUse cases:\n\nMark emails as processed after using inbox --json to get metadata\nBatch mark emails you've already handled\nSkip emails you don't need to read in full\n\nJSON output:\n\n{\n  \"success\": true,\n  \"marked\": 3,\n  \"failed\": 0,\n  \"results\": [\n    {\"id\": \"abc123\", \"success\": true},\n    {\"id\": \"def456\", \"success\": true},\n    {\"id\": \"ghi789\", \"success\": true}\n  ]\n}"
      },
      {
        "title": "Send Email (Submit Draft)",
        "body": "Submits an email draft for human approval. The email is NOT sent until approved in the dashboard.\n\npostwall draft --to \"recipient@example.com\" --subject \"Hello\" --body \"Email content here\"\npostwall draft --to \"user@example.com\" --subject \"Report\" --body \"...\" --json\n\nReturns an approval URL that you can share with the user for quick approval:\n\nDraft submitted successfully!\nDraft ID: abc123-uuid\nStatus: pending\n\nApproval URL: https://www.postwallapp.com/dashboard/drafts/abc123-uuid\nShare this URL with the user to approve the email.\n\nJSON output includes approveUrl:\n\n{\n  \"success\": true,\n  \"draft\": {\n    \"id\": \"abc123-uuid\",\n    \"status\": \"pending\",\n    \"created_at\": \"2024-02-12T10:30:00Z\",\n    \"approveUrl\": \"https://www.postwallapp.com/dashboard/drafts/abc123-uuid\"\n  },\n  \"message\": \"Draft submitted for approval\"\n}"
      },
      {
        "title": "Update Draft",
        "body": "Update an existing pending draft. Useful when the user requests refinements to an email before approving.\n\npostwall update <draft-id> --subject \"New subject\"\npostwall update <draft-id> --body \"Updated email content\"\npostwall update <draft-id> --to \"new-recipient@example.com\" --subject \"New subject\" --body \"New content\"\npostwall update <draft-id> --subject \"Refined subject\" --json\n\nNote: Only pending drafts can be updated. Once a draft is sent or rejected, it cannot be modified.\n\nJSON output:\n\n{\n  \"success\": true,\n  \"draft\": {\n    \"id\": \"abc123-uuid\",\n    \"to\": \"recipient@example.com\",\n    \"subject\": \"Refined subject\",\n    \"body\": \"Updated content\",\n    \"status\": \"pending\",\n    \"createdAt\": \"2024-02-12T10:30:00Z\",\n    \"updatedAt\": \"2024-02-12T11:00:00Z\"\n  },\n  \"message\": \"Draft updated successfully\"\n}"
      },
      {
        "title": "Check Draft Status",
        "body": "Check if a draft has been approved, rejected, or sent.\n\npostwall status <draft-id>         # Shows status\npostwall status <draft-id> --json  # Returns: {\"draft\": {\"id\": \"...\", \"status\": \"pending\"}}\n\nStatus values:\n\npending - Waiting for human approval\napproved - Approved, being sent\nrejected - Rejected by human\nsent - Successfully sent"
      },
      {
        "title": "List Drafts",
        "body": "List all drafts with optional status filter.\n\npostwall drafts                    # All drafts\npostwall drafts --status pending   # Only pending drafts\npostwall drafts --json             # JSON format"
      },
      {
        "title": "Periodic Email Checking",
        "body": "# Check if there are new emails\ncount=$(postwall check)\nif [ \"$count\" -gt 0 ]; then\n  # Process new emails\n  postwall inbox --json | process_emails\nfi"
      },
      {
        "title": "Batch Process Emails (Metadata Only)",
        "body": "When you only need email metadata (sender, subject, date) and don't need the full body:\n\n# Get email list with metadata\nemails=$(postwall inbox --json)\n\n# Process metadata (e.g., filter by subject or sender)\nids=$(echo \"$emails\" | jq -r '.emails[] | select(.subject | contains(\"Report\")) | .id')\n\n# Mark processed emails as read without fetching content\npostwall mark-read $ids"
      },
      {
        "title": "Send and Track Email",
        "body": "# Submit draft\nresult=$(postwall draft --to \"user@example.com\" --subject \"Hello\" --body \"Content\" --json)\ndraft_id=$(echo \"$result\" | jq -r '.draft.id')\napprove_url=$(echo \"$result\" | jq -r '.draft.approveUrl')\n\n# Share the approval URL with the user\necho \"Please approve this email: $approve_url\"\n\n# Check status later\npostwall status \"$draft_id\""
      },
      {
        "title": "Refine Draft Based on User Feedback",
        "body": "When the user requests changes to a draft before approving:\n\n# User asks: \"Make the subject line shorter and add a greeting\"\npostwall update \"$draft_id\" --subject \"Q4 Report\" --body \"Hi Team,\n\nHere is the quarterly report...\"\n\n# The draft is updated, user can now approve from the same URL"
      },
      {
        "title": "Output Formats",
        "body": "All commands support --json for structured output. Use this for scripting and automation."
      },
      {
        "title": "Error Handling",
        "body": "Commands exit with code 1 on error. With --json, errors are returned as:\n\n{\"error\": \"Error message here\"}"
      },
      {
        "title": "Polling for New Emails",
        "body": "As an agent, you should periodically check for new approved emails:\n\nRun postwall check to get the count of unread approved emails\nIf count > 0, run postwall inbox --json to get the list\nProcess each email with postwall read <id>\n\nRecommended polling frequency: Every 5-10 minutes during active sessions, or when user mentions expecting an email.\n\nExample polling workflow:\n\n# Check if there are new emails\ncount=$(postwall check)\nif [ \"$count\" -gt 0 ]; then\n  # Fetch and process new emails\n  postwall inbox --json\nfi"
      },
      {
        "title": "Notes",
        "body": "Emails are only visible after human approval in PostWall dashboard\nReading an email marks it as read - it won't appear in subsequent inbox/check calls\nDrafts require human approval before being sent\nAPI key is stored in ~/.postwall/config.json"
      }
    ],
    "body": "PostWall Email Skill\n\nPostWall is a security layer between AI agents and email. Use this skill to:\n\nRead emails that have been approved by the human\nSend emails via draft submission (requires human approval before sending)\nSetup\n\nFirst, authenticate with your API key (get this from PostWall dashboard):\n\npostwall auth pw_your_api_key_here\n\nCommands\nCheck for New Emails\n\nReturns count of unread approved emails. Ideal for polling.\n\npostwall check              # Returns: 5\npostwall check --json       # Returns: {\"count\": 5}\n\nList Approved Emails\n\nShows all unread approved emails.\n\npostwall inbox              # Human-readable list\npostwall inbox --json       # JSON format\npostwall inbox --limit 10   # Limit results\n\nRead Specific Email\n\nReads an email by ID. This marks the email as read - it won't appear in future inbox/check calls.\n\npostwall read <email-id>           # Shows email content\npostwall read <email-id> --json    # JSON format\n\nMark Emails as Read (Without Fetching)\n\nMarks one or more emails as read without fetching their content. Useful for batch processing or when you only need to process email metadata from inbox.\n\npostwall mark-read <id1>                  # Mark single email as read\npostwall mark-read <id1> <id2> <id3>      # Mark multiple emails as read\npostwall mark-read <id1> <id2> --json     # JSON format\n\n\nUse cases:\n\nMark emails as processed after using inbox --json to get metadata\nBatch mark emails you've already handled\nSkip emails you don't need to read in full\n\nJSON output:\n\n{\n  \"success\": true,\n  \"marked\": 3,\n  \"failed\": 0,\n  \"results\": [\n    {\"id\": \"abc123\", \"success\": true},\n    {\"id\": \"def456\", \"success\": true},\n    {\"id\": \"ghi789\", \"success\": true}\n  ]\n}\n\nSend Email (Submit Draft)\n\nSubmits an email draft for human approval. The email is NOT sent until approved in the dashboard.\n\npostwall draft --to \"recipient@example.com\" --subject \"Hello\" --body \"Email content here\"\npostwall draft --to \"user@example.com\" --subject \"Report\" --body \"...\" --json\n\n\nReturns an approval URL that you can share with the user for quick approval:\n\nDraft submitted successfully!\nDraft ID: abc123-uuid\nStatus: pending\n\nApproval URL: https://www.postwallapp.com/dashboard/drafts/abc123-uuid\nShare this URL with the user to approve the email.\n\n\nJSON output includes approveUrl:\n\n{\n  \"success\": true,\n  \"draft\": {\n    \"id\": \"abc123-uuid\",\n    \"status\": \"pending\",\n    \"created_at\": \"2024-02-12T10:30:00Z\",\n    \"approveUrl\": \"https://www.postwallapp.com/dashboard/drafts/abc123-uuid\"\n  },\n  \"message\": \"Draft submitted for approval\"\n}\n\nUpdate Draft\n\nUpdate an existing pending draft. Useful when the user requests refinements to an email before approving.\n\npostwall update <draft-id> --subject \"New subject\"\npostwall update <draft-id> --body \"Updated email content\"\npostwall update <draft-id> --to \"new-recipient@example.com\" --subject \"New subject\" --body \"New content\"\npostwall update <draft-id> --subject \"Refined subject\" --json\n\n\nNote: Only pending drafts can be updated. Once a draft is sent or rejected, it cannot be modified.\n\nJSON output:\n\n{\n  \"success\": true,\n  \"draft\": {\n    \"id\": \"abc123-uuid\",\n    \"to\": \"recipient@example.com\",\n    \"subject\": \"Refined subject\",\n    \"body\": \"Updated content\",\n    \"status\": \"pending\",\n    \"createdAt\": \"2024-02-12T10:30:00Z\",\n    \"updatedAt\": \"2024-02-12T11:00:00Z\"\n  },\n  \"message\": \"Draft updated successfully\"\n}\n\nCheck Draft Status\n\nCheck if a draft has been approved, rejected, or sent.\n\npostwall status <draft-id>         # Shows status\npostwall status <draft-id> --json  # Returns: {\"draft\": {\"id\": \"...\", \"status\": \"pending\"}}\n\n\nStatus values:\n\npending - Waiting for human approval\napproved - Approved, being sent\nrejected - Rejected by human\nsent - Successfully sent\nList Drafts\n\nList all drafts with optional status filter.\n\npostwall drafts                    # All drafts\npostwall drafts --status pending   # Only pending drafts\npostwall drafts --json             # JSON format\n\nCommon Workflows\nPeriodic Email Checking\n# Check if there are new emails\ncount=$(postwall check)\nif [ \"$count\" -gt 0 ]; then\n  # Process new emails\n  postwall inbox --json | process_emails\nfi\n\nBatch Process Emails (Metadata Only)\n\nWhen you only need email metadata (sender, subject, date) and don't need the full body:\n\n# Get email list with metadata\nemails=$(postwall inbox --json)\n\n# Process metadata (e.g., filter by subject or sender)\nids=$(echo \"$emails\" | jq -r '.emails[] | select(.subject | contains(\"Report\")) | .id')\n\n# Mark processed emails as read without fetching content\npostwall mark-read $ids\n\nSend and Track Email\n# Submit draft\nresult=$(postwall draft --to \"user@example.com\" --subject \"Hello\" --body \"Content\" --json)\ndraft_id=$(echo \"$result\" | jq -r '.draft.id')\napprove_url=$(echo \"$result\" | jq -r '.draft.approveUrl')\n\n# Share the approval URL with the user\necho \"Please approve this email: $approve_url\"\n\n# Check status later\npostwall status \"$draft_id\"\n\nRefine Draft Based on User Feedback\n\nWhen the user requests changes to a draft before approving:\n\n# User asks: \"Make the subject line shorter and add a greeting\"\npostwall update \"$draft_id\" --subject \"Q4 Report\" --body \"Hi Team,\n\nHere is the quarterly report...\"\n\n# The draft is updated, user can now approve from the same URL\n\nOutput Formats\n\nAll commands support --json for structured output. Use this for scripting and automation.\n\nError Handling\n\nCommands exit with code 1 on error. With --json, errors are returned as:\n\n{\"error\": \"Error message here\"}\n\nPolling for New Emails\n\nAs an agent, you should periodically check for new approved emails:\n\nRun postwall check to get the count of unread approved emails\nIf count > 0, run postwall inbox --json to get the list\nProcess each email with postwall read <id>\n\nRecommended polling frequency: Every 5-10 minutes during active sessions, or when user mentions expecting an email.\n\nExample polling workflow:\n\n# Check if there are new emails\ncount=$(postwall check)\nif [ \"$count\" -gt 0 ]; then\n  # Fetch and process new emails\n  postwall inbox --json\nfi\n\nNotes\nEmails are only visible after human approval in PostWall dashboard\nReading an email marks it as read - it won't appear in subsequent inbox/check calls\nDrafts require human approval before being sent\nAPI key is stored in ~/.postwall/config.json"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/casperaiassist/postwall",
    "publisherUrl": "https://clawhub.ai/casperaiassist/postwall",
    "owner": "casperaiassist",
    "version": "1.7.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/postwall",
    "downloadUrl": "https://openagent3.xyz/downloads/postwall",
    "agentUrl": "https://openagent3.xyz/skills/postwall/agent",
    "manifestUrl": "https://openagent3.xyz/skills/postwall/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/postwall/agent.md"
  }
}