{
  "schemaVersion": "1.0",
  "item": {
    "slug": "protonmail-claw",
    "name": "Proton Mail",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Christopher-Schulze/protonmail-claw",
    "canonicalUrl": "https://clawhub.ai/Christopher-Schulze/protonmail-claw",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/protonmail-claw",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=protonmail-claw",
    "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",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.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/protonmail-claw"
    },
    "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/protonmail-claw",
    "agentPageUrl": "https://openagent3.xyz/skills/protonmail-claw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/protonmail-claw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/protonmail-claw/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": "ProtonMail 📨",
        "body": "Your encrypted inbox, automated. Because checking emails manually is so 2010."
      },
      {
        "title": "What it does",
        "body": "Login to any ProtonMail account securely\nRead emails from your inbox\nSend new emails with compose functionality\nManage your mailbox like a pro\n\nAll via Playwright browser automation. No API keys, no IMAP/SMTP headaches - just a real browser doing real browser things."
      },
      {
        "title": "Why this exists",
        "body": "You have better things to do than clicking through ProtonMail's beautiful (but slow) UI. Let your agent handle it. While you relax. Or code. Or whatever it is you do.\n\nWe built this because:\n\nProtonMail's web UI is... leisurely\nAutomation is hot\nWhy click when you can script?"
      },
      {
        "title": "The Basics",
        "body": "Node.js 18+ (20+ recommended)\nPlaywright 1.40+ (npm install playwright)\nChromium browser (npx playwright install chromium)"
      },
      {
        "title": "System Dependencies (Linux)",
        "body": "# Ubuntu/Debian\nsudo apt-get update\nsudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 libcairo2\n\n# Raspberry Pi / ARM\nsudo apt-get install -y chromium-browser"
      },
      {
        "title": "The Secret Sauce (Bot Detection Bypass)",
        "body": "This skill includes enterprise-grade bot detection evasion:\n\n// Launch with stealth args\nawait chromium.launch({ \n  headless: true,\n  args: [\n    '--disable-blink-features=AutomationControlled',\n    '--no-sandbox',\n    '--disable-setuid-sandbox',\n    '--disable-dev-shm-usage'\n  ]\n});\n\n// Hide webdriver property\nawait page.addInitScript(() => {\n  Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n});\n\nThis makes Chrome think it's being controlled by a human. Mostly works. ✨"
      },
      {
        "title": "1. Login",
        "body": "const { chromium } = require('playwright');\n\nasync function loginProton(email, password) {\n  const browser = await chromium.launch({ \n    headless: true,\n    args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']\n  });\n  \n  const context = await browser.newContext({\n    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',\n  });\n  \n  const page = await context.newPage();\n  await page.addInitScript(() => {\n    Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n  });\n  \n  await page.goto('https://account.proton.me/login');\n  await page.waitForTimeout(2000);\n  \n  await page.fill('#username', email);\n  await page.fill('#password', password);\n  await page.click('button[type=submit]');\n  await page.waitForTimeout(3000);\n  \n  return { browser, context, page };\n}"
      },
      {
        "title": "2. Check Inbox",
        "body": "await page.goto('https://mail.proton.me/inbox');\nawait page.waitForTimeout(2000);\n\nconst emails = await page.evaluate(() => {\n  return Array.from(document.querySelectorAll('.item')).map(e => ({\n    subject: e.querySelector('.subject')?.innerText,\n    sender: e.querySelector('.sender')?.innerText,\n    time: e.querySelector('.time')?.innerText\n  }));\n});\n\nconsole.log(emails);"
      },
      {
        "title": "3. Read Email",
        "body": "await page.click('.item:first-child');\nawait page.waitForTimeout(2000);\n\nconst content = await page.evaluate(() => \n  document.querySelector('.message-content')?.innerText\n);"
      },
      {
        "title": "4. Send Email (Tested & Working)",
        "body": "// Navigate to compose\nawait page.goto('https://mail.proton.me/compose');\nawait page.waitForTimeout(3000);\n\n// Use keyboard navigation (most reliable)\n// Tab to recipient field\nawait page.keyboard.press('Tab');\nawait page.waitForTimeout(500);\n\n// Type recipient\nawait page.keyboard.type('recipient@email.com');\nawait page.waitForTimeout(500);\n\n// Tab to subject\nawait page.keyboard.press('Tab');\nawait page.waitForTimeout(500);\n\n// Type subject\nawait page.keyboard.type('Your subject here');\nawait page.waitForTimeout(500);\n\n// Tab to body\nawait page.keyboard.press('Tab');\nawait page.waitForTimeout(500);\n\n// Type message\nawait page.keyboard.type('Your message here...');\n\n// Send with Ctrl+Enter\nawait page.keyboard.press('Control+Enter');\nawait page.waitForTimeout(3000);"
      },
      {
        "title": "5. Logout (please, it's polite)",
        "body": "await page.click('button[aria-label=\"Settings\"]');\nawait page.click('text=Sign out');\nawait browser.close();"
      },
      {
        "title": "Environment Variables",
        "body": "Don't hardcode passwords (seriously, don't):\n\nexport PROTON_EMAIL=\"your@email.com\"\nexport PROTON_PASSWORD=\"yourpassword\"\n\nThen in code:\n\nconst email = process.env.PROTON_EMAIL;\nconst password = process.env.PROTON_PASSWORD;"
      },
      {
        "title": "Complete Example",
        "body": "const { chromium } = require('playwright');\n\nasync function main() {\n  const email = process.env.PROTON_EMAIL || 'your@email.com';\n  const password = process.env.PROTON_PASSWORD || 'yourpassword';\n  \n  const browser = await chromium.launch({ \n    headless: true,\n    args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']\n  });\n  \n  const context = await browser.newContext({\n    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',\n  });\n  \n  const page = await context.newPage();\n  await page.addInitScript(() => {\n    Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n  });\n  \n  // Login\n  await page.goto('https://account.proton.me/login');\n  await page.fill('#username', email);\n  await page.fill('#password', password);\n  await page.click('button[type=submit]');\n  await page.waitForTimeout(5000);\n  \n  // Go to compose\n  await page.goto('https://mail.proton.me/compose');\n  await page.waitForTimeout(3000);\n  \n  // Send email using keyboard navigation (most reliable)\n  await page.keyboard.press('Tab');\n  await page.keyboard.type('recipient@email.com');\n  await page.keyboard.press('Tab');\n  await page.keyboard.type('Test Subject');\n  await page.keyboard.press('Tab');\n  await page.keyboard.type('Hello! This is a test email.');\n  await page.keyboard.press('Control+Enter');\n  \n  await page.waitForTimeout(3000);\n  console.log('📧 Email sent!');\n  \n  await browser.close();\n}\n\nmain();"
      },
      {
        "title": "Limitations",
        "body": "2FA: Can't do 2FA via automation (use a browser on your device for initial login, then cookie session)\nRate limiting: ProtonMail might throttle you if you go crazy\nDynamic UI: Class names change. Use text selectors or ARIA when possible\nHeadless detection: Works mostly, but Proton might occasionally notice"
      },
      {
        "title": "\"chromium not found\"",
        "body": "npx playwright install chromium"
      },
      {
        "title": "Bot detection / Login fails",
        "body": "Verify bot detection bypass is enabled\nCheck user agent string is current\nTry headed mode for testing"
      },
      {
        "title": "Timeout errors",
        "body": "Increase waitForTimeout values\nCheck your internet\nProtonMail might be rate limiting"
      },
      {
        "title": "\"libX11 not found\"",
        "body": "Install system dependencies (see Requirements section)"
      },
      {
        "title": "Security Notes",
        "body": "🔒 Credentials should come from environment variables, not hardcoded\n🔑 Use app-specific passwords if ProtonMail supports them\n📝 Always logout when done\n🍪 Session cookies can be saved for re-use (advanced)\n\nMade with 🦞🔒\n\nFrom Claws for Claws. Because reading emails manually is for plebs.\n\nHQ Quality Approved."
      }
    ],
    "body": "ProtonMail 📨\n\nYour encrypted inbox, automated. Because checking emails manually is so 2010.\n\nWhat it does\nLogin to any ProtonMail account securely\nRead emails from your inbox\nSend new emails with compose functionality\nManage your mailbox like a pro\n\nAll via Playwright browser automation. No API keys, no IMAP/SMTP headaches - just a real browser doing real browser things.\n\nWhy this exists\n\nYou have better things to do than clicking through ProtonMail's beautiful (but slow) UI. Let your agent handle it. While you relax. Or code. Or whatever it is you do.\n\nWe built this because:\n\nProtonMail's web UI is... leisurely\nAutomation is hot\nWhy click when you can script?\nRequirements\nThe Basics\nNode.js 18+ (20+ recommended)\nPlaywright 1.40+ (npm install playwright)\nChromium browser (npx playwright install chromium)\nSystem Dependencies (Linux)\n# Ubuntu/Debian\nsudo apt-get update\nsudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 libcairo2\n\n# Raspberry Pi / ARM\nsudo apt-get install -y chromium-browser\n\nThe Secret Sauce (Bot Detection Bypass)\n\nThis skill includes enterprise-grade bot detection evasion:\n\n// Launch with stealth args\nawait chromium.launch({ \n  headless: true,\n  args: [\n    '--disable-blink-features=AutomationControlled',\n    '--no-sandbox',\n    '--disable-setuid-sandbox',\n    '--disable-dev-shm-usage'\n  ]\n});\n\n// Hide webdriver property\nawait page.addInitScript(() => {\n  Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n});\n\n\nThis makes Chrome think it's being controlled by a human. Mostly works. ✨\n\nQuick Start\n1. Login\nconst { chromium } = require('playwright');\n\nasync function loginProton(email, password) {\n  const browser = await chromium.launch({ \n    headless: true,\n    args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']\n  });\n  \n  const context = await browser.newContext({\n    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',\n  });\n  \n  const page = await context.newPage();\n  await page.addInitScript(() => {\n    Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n  });\n  \n  await page.goto('https://account.proton.me/login');\n  await page.waitForTimeout(2000);\n  \n  await page.fill('#username', email);\n  await page.fill('#password', password);\n  await page.click('button[type=submit]');\n  await page.waitForTimeout(3000);\n  \n  return { browser, context, page };\n}\n\n2. Check Inbox\nawait page.goto('https://mail.proton.me/inbox');\nawait page.waitForTimeout(2000);\n\nconst emails = await page.evaluate(() => {\n  return Array.from(document.querySelectorAll('.item')).map(e => ({\n    subject: e.querySelector('.subject')?.innerText,\n    sender: e.querySelector('.sender')?.innerText,\n    time: e.querySelector('.time')?.innerText\n  }));\n});\n\nconsole.log(emails);\n\n3. Read Email\nawait page.click('.item:first-child');\nawait page.waitForTimeout(2000);\n\nconst content = await page.evaluate(() => \n  document.querySelector('.message-content')?.innerText\n);\n\n4. Send Email (Tested & Working)\n// Navigate to compose\nawait page.goto('https://mail.proton.me/compose');\nawait page.waitForTimeout(3000);\n\n// Use keyboard navigation (most reliable)\n// Tab to recipient field\nawait page.keyboard.press('Tab');\nawait page.waitForTimeout(500);\n\n// Type recipient\nawait page.keyboard.type('recipient@email.com');\nawait page.waitForTimeout(500);\n\n// Tab to subject\nawait page.keyboard.press('Tab');\nawait page.waitForTimeout(500);\n\n// Type subject\nawait page.keyboard.type('Your subject here');\nawait page.waitForTimeout(500);\n\n// Tab to body\nawait page.keyboard.press('Tab');\nawait page.waitForTimeout(500);\n\n// Type message\nawait page.keyboard.type('Your message here...');\n\n// Send with Ctrl+Enter\nawait page.keyboard.press('Control+Enter');\nawait page.waitForTimeout(3000);\n\n5. Logout (please, it's polite)\nawait page.click('button[aria-label=\"Settings\"]');\nawait page.click('text=Sign out');\nawait browser.close();\n\nEnvironment Variables\n\nDon't hardcode passwords (seriously, don't):\n\nexport PROTON_EMAIL=\"your@email.com\"\nexport PROTON_PASSWORD=\"yourpassword\"\n\n\nThen in code:\n\nconst email = process.env.PROTON_EMAIL;\nconst password = process.env.PROTON_PASSWORD;\n\nComplete Example\nconst { chromium } = require('playwright');\n\nasync function main() {\n  const email = process.env.PROTON_EMAIL || 'your@email.com';\n  const password = process.env.PROTON_PASSWORD || 'yourpassword';\n  \n  const browser = await chromium.launch({ \n    headless: true,\n    args: ['--disable-blink-features=AutomationControlled', '--no-sandbox']\n  });\n  \n  const context = await browser.newContext({\n    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',\n  });\n  \n  const page = await context.newPage();\n  await page.addInitScript(() => {\n    Object.defineProperty(navigator, 'webdriver', { get: () => undefined });\n  });\n  \n  // Login\n  await page.goto('https://account.proton.me/login');\n  await page.fill('#username', email);\n  await page.fill('#password', password);\n  await page.click('button[type=submit]');\n  await page.waitForTimeout(5000);\n  \n  // Go to compose\n  await page.goto('https://mail.proton.me/compose');\n  await page.waitForTimeout(3000);\n  \n  // Send email using keyboard navigation (most reliable)\n  await page.keyboard.press('Tab');\n  await page.keyboard.type('recipient@email.com');\n  await page.keyboard.press('Tab');\n  await page.keyboard.type('Test Subject');\n  await page.keyboard.press('Tab');\n  await page.keyboard.type('Hello! This is a test email.');\n  await page.keyboard.press('Control+Enter');\n  \n  await page.waitForTimeout(3000);\n  console.log('📧 Email sent!');\n  \n  await browser.close();\n}\n\nmain();\n\nLimitations\n2FA: Can't do 2FA via automation (use a browser on your device for initial login, then cookie session)\nRate limiting: ProtonMail might throttle you if you go crazy\nDynamic UI: Class names change. Use text selectors or ARIA when possible\nHeadless detection: Works mostly, but Proton might occasionally notice\nTroubleshooting\n\"chromium not found\"\nnpx playwright install chromium\n\nBot detection / Login fails\nVerify bot detection bypass is enabled\nCheck user agent string is current\nTry headed mode for testing\nTimeout errors\nIncrease waitForTimeout values\nCheck your internet\nProtonMail might be rate limiting\n\"libX11 not found\"\n\nInstall system dependencies (see Requirements section)\n\nSecurity Notes\n🔒 Credentials should come from environment variables, not hardcoded\n🔑 Use app-specific passwords if ProtonMail supports them\n📝 Always logout when done\n🍪 Session cookies can be saved for re-use (advanced)\n\nMade with 🦞🔒\n\nFrom Claws for Claws. Because reading emails manually is for plebs.\n\nHQ Quality Approved."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Christopher-Schulze/protonmail-claw",
    "publisherUrl": "https://clawhub.ai/Christopher-Schulze/protonmail-claw",
    "owner": "Christopher-Schulze",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/protonmail-claw",
    "downloadUrl": "https://openagent3.xyz/downloads/protonmail-claw",
    "agentUrl": "https://openagent3.xyz/skills/protonmail-claw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/protonmail-claw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/protonmail-claw/agent.md"
  }
}