{
  "schemaVersion": "1.0",
  "item": {
    "slug": "briefed",
    "name": "Briefed",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/jamesnation/briefed",
    "canonicalUrl": "https://clawhub.ai/jamesnation/briefed",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/briefed",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=briefed",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "assets/reader/server.js",
      "assets/reader/package-lock.json",
      "assets/reader/package.json",
      "assets/reader/scripts/requirements.txt"
    ],
    "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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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/briefed"
    },
    "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/briefed",
    "agentPageUrl": "https://openagent3.xyz/skills/briefed/agent",
    "manifestUrl": "https://openagent3.xyz/skills/briefed/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/briefed/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Briefed",
        "body": "A daily newsletter digest pipeline + local web reader. Gmail → Haiku summaries → web app → notification ping."
      },
      {
        "title": "Architecture",
        "body": "[Gmail]\n   ↓  pre-fetch.py (fetches, filters, extracts compact metadata)\n[newsletter-inbox.json]\n   ↓  Haiku cron agent (reads compact JSON, writes AI summaries)\n[newsletter-today.json]\n   ↓  fetch-bodies.py (adds full HTML email bodies)\n[newsletter-today.json + bodies]\n   ↓  Express web reader (default port 3001)\n[Notification ping → user opens reader]\n\nWhy split fetch/summarise? Raw Gmail API JSON overflows Haiku's context. Python handles data wrangling; Haiku handles cognition."
      },
      {
        "title": "Security & Scope",
        "body": "Gmail access is read-only (gmail.readonly).\nOAuth token is stored locally at ~/.openclaw/workspace/briefed-gmail-token.json (or BRIEFED_GMAIL_TOKEN_FILE).\nThe workflow should only read/write the following workspace files:\n\nnewsletter-inbox.json\nnewsletter-today.json\nnewsletter-interests.json\nnewsletter-notes.json\nreading-list.md\n\n\nDo not send newsletter content to external endpoints other than the configured model provider and user-selected notification channel."
      },
      {
        "title": "Prerequisites",
        "body": "Python 3.9+\nPython deps for Gmail API (google-api-python-client, google-auth, google-auth-oauthlib)\nA Google OAuth Desktop client JSON file (for Gmail read-only auth)\nNode.js ≥18 (for the reader web app)\nclaude-haiku-4-5 on the OpenClaw models allowlist\nA notification channel configured in OpenClaw (Telegram, Discord, etc.)"
      },
      {
        "title": "1. Install Python dependencies",
        "body": "cd ~/.openclaw/workspace/briefed\npython3 -m pip install -r scripts/requirements.txt"
      },
      {
        "title": "2. Configure Gmail OAuth",
        "body": "Create a Google Cloud OAuth Desktop app and download the client JSON, then set:\n\nexport BRIEFED_GMAIL_CLIENT_SECRET=~/client_secret.json\n\nOn first script run, Briefed opens a browser OAuth flow and stores a reusable token at:\n\n~/.openclaw/workspace/briefed-gmail-token.json"
      },
      {
        "title": "3. Deploy the reader app",
        "body": "# Copy the reader to the workspace\ncp -r assets/reader/ ~/.openclaw/workspace/briefed/\ncd ~/.openclaw/workspace/briefed\nnpm install"
      },
      {
        "title": "4. Configure Gmail token paths (optional)",
        "body": "Defaults (works for most users):\n\nToken file: ~/.openclaw/workspace/briefed-gmail-token.json\nClient secret: ~/client_secret.json\n\nOverride via env vars if needed:\n\nexport BRIEFED_GMAIL_CLIENT_SECRET=~/path/to/client_secret.json\nexport BRIEFED_GMAIL_TOKEN_FILE=~/.openclaw/workspace/briefed-gmail-token.json"
      },
      {
        "title": "5. Configure interests",
        "body": "Create ~/.openclaw/workspace/newsletter-interests.json (or let it be auto-created on first run):\n\n{\n  \"version\": 1,\n  \"topics\": { \"ai\": 0.9, \"startups\": 0.8, \"design\": 0.75 },\n  \"signals\": [],\n  \"sources\": {}\n}"
      },
      {
        "title": "6. Start the reader",
        "body": "Run manually if you prefer no persistence. LaunchAgent is optional convenience for auto-start.\n\n# Quick test\nnode ~/.openclaw/workspace/briefed/server.js\n\n# Persistent — create ~/Library/LaunchAgents/ai.openclaw.briefed.plist\n\nLaunchAgent plist template:\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\"><dict>\n  <key>Label</key><string>ai.openclaw.briefed</string>\n  <key>ProgramArguments</key><array>\n    <string>/usr/local/bin/node</string>\n    <string>/Users/YOUR_USER/.openclaw/workspace/briefed/server.js</string>\n  </array>\n  <key>EnvironmentVariables</key><dict>\n    <key>BRIEFED_GMAIL_CLIENT_SECRET</key><string>/Users/YOUR_USER/client_secret.json</string>\n    <key>BRIEFED_GMAIL_TOKEN_FILE</key><string>/Users/YOUR_USER/.openclaw/workspace/briefed-gmail-token.json</string>\n  </dict>\n  <key>RunAtLoad</key><true/>\n  <key>KeepAlive</key><true/>\n  <key>WorkingDirectory</key><string>/Users/YOUR_USER/.openclaw/workspace/briefed</string>\n  <key>StandardOutPath</key><string>/tmp/briefed.log</string>\n  <key>StandardErrorPath</key><string>/tmp/briefed.log</string>\n</dict></plist>\n\nlaunchctl load ~/Library/LaunchAgents/ai.openclaw.briefed.plist"
      },
      {
        "title": "7. Create the daily cron job",
        "body": "Use the OpenClaw cron tool with this agent prompt (fill in the placeholders):\n\nRun my daily newsletter digest. Follow these steps exactly:\n\n## Step 1 — Pre-fetch emails\nRun: python3 ~/.openclaw/workspace/briefed/scripts/pre-fetch.py\n\n## Step 2 — Read the compact inbox\nRead: ~/.openclaw/workspace/newsletter-inbox.json\n\n## Step 3 — Write newsletter-today.json with AI summaries\nFor each newsletter, write to **only** this file: ~/.openclaw/workspace/newsletter-today.json.\nDo not modify any other files in this step.\nUse the snippet field to write real summaries — do NOT just repeat the subject line.\nScore by interest: (adjust topics and weights to match your interests)\n  ai/ml=0.9, startups=0.85, design=0.8, finance=0.75, general=0.6\n\nSchema per story:\n{ \"id\", \"rank\", \"source\", \"subject\", \"headline\", \"summary\", \"bullets\": [], \"threadId\", \"gmailUrl\", \"score\", \"body\": \"\" }\n\n## Step 4 — Fetch HTML bodies\nRun: python3 ~/.openclaw/workspace/briefed/scripts/fetch-bodies.py\n\n## Step 5 — Send notification\nSend (via your configured channel):\n\"📬 Today's digest is ready — <N> stories waiting.\\n→ http://YOUR_HOST:3001\"\n\n## Step 6 — Final reply\n📬 *Briefed — [DD Mon YYYY]* · <N> stories\n*<rank>. <Source>* — <Headline>\n<One sentence summary>\n(repeat for all stories)\n_Open the reader → http://YOUR_HOST:3001_\n\nBefore enabling cron, run this once manually to complete OAuth in a browser:\n\npython3 ~/.openclaw/workspace/briefed/scripts/pre-fetch.py\n\nCron schedule: 0 7 * * * (7am daily), model: anthropic/claude-haiku-4-5, delivery: announce."
      },
      {
        "title": "Data Files",
        "body": "All data files live in ~/.openclaw/workspace/:\n\nFilePurposenewsletter-inbox.jsonCompact pre-fetched email metadata (ephemeral)newsletter-today.jsonToday's stories with summaries + HTML bodiesnewsletter-interests.jsonTopic weights + vote/open signalsnewsletter-notes.jsonPer-story user notesreading-list.mdSaved/bookmarked stories"
      },
      {
        "title": "Reader API",
        "body": "EndpointMethodPurpose/api/todayGETAll stories (bodies stripped)/api/story/:idGETSingle story with full HTML body/api/votePOST{ storyId, vote: \"up\"|\"down\"|\"open\" }/api/savePOST{ storyId } — adds to reading-list.md/api/notePOST{ storyId, note }/api/notesGETAll notes"
      },
      {
        "title": "Filtering Transactional Email",
        "body": "scripts/pre-fetch.py has two tunable lists near the top:\n\nSKIP_SUBJECT_PATTERNS — subject substrings that flag an email as transactional\nSKIP_SENDERS — sender names that are always transactional (e.g. banks, shops)\n\nTune these when transactional emails slip through."
      },
      {
        "title": "Branding",
        "body": "The reader shows \"Briefed\" with a blue \"B\" logo by default. To customise, edit public/index.html and public/icon.svg."
      }
    ],
    "body": "Briefed\n\nA daily newsletter digest pipeline + local web reader. Gmail → Haiku summaries → web app → notification ping.\n\nArchitecture\n[Gmail]\n   ↓  pre-fetch.py (fetches, filters, extracts compact metadata)\n[newsletter-inbox.json]\n   ↓  Haiku cron agent (reads compact JSON, writes AI summaries)\n[newsletter-today.json]\n   ↓  fetch-bodies.py (adds full HTML email bodies)\n[newsletter-today.json + bodies]\n   ↓  Express web reader (default port 3001)\n[Notification ping → user opens reader]\n\n\nWhy split fetch/summarise? Raw Gmail API JSON overflows Haiku's context. Python handles data wrangling; Haiku handles cognition.\n\nSecurity & Scope\nGmail access is read-only (gmail.readonly).\nOAuth token is stored locally at ~/.openclaw/workspace/briefed-gmail-token.json (or BRIEFED_GMAIL_TOKEN_FILE).\nThe workflow should only read/write the following workspace files:\nnewsletter-inbox.json\nnewsletter-today.json\nnewsletter-interests.json\nnewsletter-notes.json\nreading-list.md\nDo not send newsletter content to external endpoints other than the configured model provider and user-selected notification channel.\nPrerequisites\nPython 3.9+\nPython deps for Gmail API (google-api-python-client, google-auth, google-auth-oauthlib)\nA Google OAuth Desktop client JSON file (for Gmail read-only auth)\nNode.js ≥18 (for the reader web app)\nclaude-haiku-4-5 on the OpenClaw models allowlist\nA notification channel configured in OpenClaw (Telegram, Discord, etc.)\nSetup\n1. Install Python dependencies\ncd ~/.openclaw/workspace/briefed\npython3 -m pip install -r scripts/requirements.txt\n\n2. Configure Gmail OAuth\n\nCreate a Google Cloud OAuth Desktop app and download the client JSON, then set:\n\nexport BRIEFED_GMAIL_CLIENT_SECRET=~/client_secret.json\n\n\nOn first script run, Briefed opens a browser OAuth flow and stores a reusable token at:\n\n~/.openclaw/workspace/briefed-gmail-token.json\n\n3. Deploy the reader app\n# Copy the reader to the workspace\ncp -r assets/reader/ ~/.openclaw/workspace/briefed/\ncd ~/.openclaw/workspace/briefed\nnpm install\n\n4. Configure Gmail token paths (optional)\n\nDefaults (works for most users):\n\nToken file: ~/.openclaw/workspace/briefed-gmail-token.json\nClient secret: ~/client_secret.json\n\nOverride via env vars if needed:\n\nexport BRIEFED_GMAIL_CLIENT_SECRET=~/path/to/client_secret.json\nexport BRIEFED_GMAIL_TOKEN_FILE=~/.openclaw/workspace/briefed-gmail-token.json\n\n5. Configure interests\n\nCreate ~/.openclaw/workspace/newsletter-interests.json (or let it be auto-created on first run):\n\n{\n  \"version\": 1,\n  \"topics\": { \"ai\": 0.9, \"startups\": 0.8, \"design\": 0.75 },\n  \"signals\": [],\n  \"sources\": {}\n}\n\n6. Start the reader\n\nRun manually if you prefer no persistence. LaunchAgent is optional convenience for auto-start.\n\n# Quick test\nnode ~/.openclaw/workspace/briefed/server.js\n\n# Persistent — create ~/Library/LaunchAgents/ai.openclaw.briefed.plist\n\n\nLaunchAgent plist template:\n\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\"><dict>\n  <key>Label</key><string>ai.openclaw.briefed</string>\n  <key>ProgramArguments</key><array>\n    <string>/usr/local/bin/node</string>\n    <string>/Users/YOUR_USER/.openclaw/workspace/briefed/server.js</string>\n  </array>\n  <key>EnvironmentVariables</key><dict>\n    <key>BRIEFED_GMAIL_CLIENT_SECRET</key><string>/Users/YOUR_USER/client_secret.json</string>\n    <key>BRIEFED_GMAIL_TOKEN_FILE</key><string>/Users/YOUR_USER/.openclaw/workspace/briefed-gmail-token.json</string>\n  </dict>\n  <key>RunAtLoad</key><true/>\n  <key>KeepAlive</key><true/>\n  <key>WorkingDirectory</key><string>/Users/YOUR_USER/.openclaw/workspace/briefed</string>\n  <key>StandardOutPath</key><string>/tmp/briefed.log</string>\n  <key>StandardErrorPath</key><string>/tmp/briefed.log</string>\n</dict></plist>\n\nlaunchctl load ~/Library/LaunchAgents/ai.openclaw.briefed.plist\n\n7. Create the daily cron job\n\nUse the OpenClaw cron tool with this agent prompt (fill in the placeholders):\n\nRun my daily newsletter digest. Follow these steps exactly:\n\n## Step 1 — Pre-fetch emails\nRun: python3 ~/.openclaw/workspace/briefed/scripts/pre-fetch.py\n\n## Step 2 — Read the compact inbox\nRead: ~/.openclaw/workspace/newsletter-inbox.json\n\n## Step 3 — Write newsletter-today.json with AI summaries\nFor each newsletter, write to **only** this file: ~/.openclaw/workspace/newsletter-today.json.\nDo not modify any other files in this step.\nUse the snippet field to write real summaries — do NOT just repeat the subject line.\nScore by interest: (adjust topics and weights to match your interests)\n  ai/ml=0.9, startups=0.85, design=0.8, finance=0.75, general=0.6\n\nSchema per story:\n{ \"id\", \"rank\", \"source\", \"subject\", \"headline\", \"summary\", \"bullets\": [], \"threadId\", \"gmailUrl\", \"score\", \"body\": \"\" }\n\n## Step 4 — Fetch HTML bodies\nRun: python3 ~/.openclaw/workspace/briefed/scripts/fetch-bodies.py\n\n## Step 5 — Send notification\nSend (via your configured channel):\n\"📬 Today's digest is ready — <N> stories waiting.\\n→ http://YOUR_HOST:3001\"\n\n## Step 6 — Final reply\n📬 *Briefed — [DD Mon YYYY]* · <N> stories\n*<rank>. <Source>* — <Headline>\n<One sentence summary>\n(repeat for all stories)\n_Open the reader → http://YOUR_HOST:3001_\n\n\nBefore enabling cron, run this once manually to complete OAuth in a browser:\n\npython3 ~/.openclaw/workspace/briefed/scripts/pre-fetch.py\n\n\nCron schedule: 0 7 * * * (7am daily), model: anthropic/claude-haiku-4-5, delivery: announce.\n\nData Files\n\nAll data files live in ~/.openclaw/workspace/:\n\nFile\tPurpose\nnewsletter-inbox.json\tCompact pre-fetched email metadata (ephemeral)\nnewsletter-today.json\tToday's stories with summaries + HTML bodies\nnewsletter-interests.json\tTopic weights + vote/open signals\nnewsletter-notes.json\tPer-story user notes\nreading-list.md\tSaved/bookmarked stories\nReader API\nEndpoint\tMethod\tPurpose\n/api/today\tGET\tAll stories (bodies stripped)\n/api/story/:id\tGET\tSingle story with full HTML body\n/api/vote\tPOST\t{ storyId, vote: \"up\"|\"down\"|\"open\" }\n/api/save\tPOST\t{ storyId } — adds to reading-list.md\n/api/note\tPOST\t{ storyId, note }\n/api/notes\tGET\tAll notes\nFiltering Transactional Email\n\nscripts/pre-fetch.py has two tunable lists near the top:\n\nSKIP_SUBJECT_PATTERNS — subject substrings that flag an email as transactional\nSKIP_SENDERS — sender names that are always transactional (e.g. banks, shops)\n\nTune these when transactional emails slip through.\n\nBranding\n\nThe reader shows \"Briefed\" with a blue \"B\" logo by default. To customise, edit public/index.html and public/icon.svg."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/jamesnation/briefed",
    "publisherUrl": "https://clawhub.ai/jamesnation/briefed",
    "owner": "jamesnation",
    "version": "1.1.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/briefed",
    "downloadUrl": "https://openagent3.xyz/downloads/briefed",
    "agentUrl": "https://openagent3.xyz/skills/briefed/agent",
    "manifestUrl": "https://openagent3.xyz/skills/briefed/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/briefed/agent.md"
  }
}