{
  "schemaVersion": "1.0",
  "item": {
    "slug": "x-bookmarks",
    "name": "X Bookmarks",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/sharbelayy/x-bookmarks",
    "canonicalUrl": "https://clawhub.ai/sharbelayy/x-bookmarks",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/x-bookmarks",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=x-bookmarks",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "references/auth-setup.md",
      "scripts/fetch_bookmarks.sh",
      "scripts/fetch_bookmarks_api.py",
      "scripts/x_api_auth.py"
    ],
    "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-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-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/x-bookmarks"
    },
    "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/x-bookmarks",
    "agentPageUrl": "https://openagent3.xyz/skills/x-bookmarks/agent",
    "manifestUrl": "https://openagent3.xyz/skills/x-bookmarks/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/x-bookmarks/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": "X Bookmarks v2",
        "body": "Turn X/Twitter bookmarks from a graveyard of good intentions into actionable work.\n\nCore philosophy: Don't just summarize — propose actions the agent can execute."
      },
      {
        "title": "Data Source Selection",
        "body": "This skill supports two backends. Pick the first one that works:"
      },
      {
        "title": "1. bird CLI (preferred if available)",
        "body": "Fast, no API key needed, uses browser cookies\nInstall: npm install -g bird-cli\nTest: bird whoami — if this prints a username, you're good"
      },
      {
        "title": "2. X API v2 (fallback)",
        "body": "Works without bird CLI\nRequires an X Developer account + OAuth 2.0 app\nSetup: see references/auth-setup.md → \"X API Setup\""
      },
      {
        "title": "Auto-detection logic",
        "body": "1. Check if `bird` command exists → try `bird whoami`\n2. If bird works → use bird CLI path\n3. If not → check for X API tokens (~/.config/x-bookmarks/tokens.json)\n4. If tokens exist → use X API path (auto-refresh)\n5. If neither → guide user through setup (offer both options)"
      },
      {
        "title": "Via bird CLI",
        "body": "# Latest 20 bookmarks (default)\nbird bookmarks --json\n\n# Specific count\nbird bookmarks -n 50 --json\n\n# All bookmarks (paginated)\nbird bookmarks --all --json\n\n# With thread context\nbird bookmarks --include-parent --thread-meta --json\n\n# With Chrome cookie auth\nbird --chrome-profile \"Default\" bookmarks --json\n\n# With manual tokens\nbird --auth-token \"$AUTH_TOKEN\" --ct0 \"$CT0\" bookmarks --json\n\nIf user has a .env.bird file or env vars AUTH_TOKEN/CT0, source them first: source .env.bird"
      },
      {
        "title": "Via X API v2",
        "body": "# First-time setup (opens browser for OAuth)\npython3 scripts/x_api_auth.py --client-id \"YOUR_CLIENT_ID\" --client-secret \"YOUR_SECRET\"\n\n# Fetch bookmarks (auto-refreshes token)\npython3 scripts/fetch_bookmarks_api.py -n 20\n\n# All bookmarks\npython3 scripts/fetch_bookmarks_api.py --all\n\n# Since a specific tweet\npython3 scripts/fetch_bookmarks_api.py --since-id \"1234567890\"\n\n# Pretty print\npython3 scripts/fetch_bookmarks_api.py -n 50 --pretty\n\nThe API script outputs the same JSON format as bird CLI, so all downstream workflows work identically.\n\nToken management is automatic: tokens are stored in ~/.config/x-bookmarks/tokens.json and refreshed via the saved refresh_token. If refresh fails, the agent should guide the user to re-run x_api_auth.py."
      },
      {
        "title": "Environment variable override",
        "body": "If the user already has a Bearer token (e.g., from another tool), they can skip the OAuth dance:\n\nX_API_BEARER_TOKEN=\"your_token\" python3 scripts/fetch_bookmarks_api.py -n 20"
      },
      {
        "title": "JSON Output Format (both backends)",
        "body": "Each bookmark returns:\n\n{\n  \"id\": \"tweet_id\",\n  \"text\": \"tweet content\",\n  \"createdAt\": \"2026-02-11T01:00:06.000Z\",\n  \"replyCount\": 46,\n  \"retweetCount\": 60,\n  \"likeCount\": 801,\n  \"bookmarkCount\": 12,\n  \"viewCount\": 50000,\n  \"author\": { \"username\": \"handle\", \"name\": \"Display Name\" },\n  \"media\": [{ \"type\": \"photo|video\", \"url\": \"...\" }],\n  \"quotedTweet\": { \"id\": \"...\" }\n}"
      },
      {
        "title": "1. Action-First Digest (Primary Use Case)",
        "body": "The key differentiator: don't just summarize, propose actions the agent can execute.\n\nFetch bookmarks (bird or API, auto-detected)\nParse and categorize by topic (auto-detect: crypto, AI, marketing, tools, personal, etc.)\nFor EACH category, propose specific actions:\n\nTool/repo bookmarks → \"I can test this, set it up, or analyze the code\"\nStrategy/advice bookmarks → \"Here are the actionable steps extracted — want me to implement any?\"\nNews/trends → \"This connects to [user's work]. Here's the angle for content\"\nContent ideas → \"This would make a great tweet/video in your voice. Here's a draft\"\nQuestions/discussions → \"I can research this deeper and give you a summary\"\n\n\nFlag stale bookmarks (>2 weeks old) — \"Use it or lose it\"\nDeliver categorized digest with actions\n\nFormat output as:\n\n📂 CATEGORY (count)\n• Bookmark summary (@author)\n→ 🤖 I CAN: [specific action the agent can take]"
      },
      {
        "title": "2. Scheduled Digest (Cron)",
        "body": "Set up a recurring bookmark check. Suggest this cron config to the user:\n\nSchedule: daily or weekly\nPayload: \"Check my X bookmarks for new saves since last check.\n  Fetch bookmarks, compare against last digest, summarize only NEW ones.\n  Categorize and propose actions. Deliver to me.\"\n\nTrack state by saving the most recent bookmark ID processed. Store in workspace:\nmemory/bookmark-state.json → { \"lastSeenId\": \"...\", \"lastDigestAt\": \"...\" }"
      },
      {
        "title": "3. Content Recycling",
        "body": "When user asks for content ideas from bookmarks:\n\nFetch recent bookmarks\nIdentify high-engagement tweets (>500 likes) with frameworks, tips, or insights\nRewrite key ideas in the user's voice (if voice data available)\nSuggest posting times based on the bookmark's original engagement"
      },
      {
        "title": "4. Pattern Detection",
        "body": "When user has enough bookmark history:\n\nFetch all bookmarks (--all)\nCluster by topic/keywords\nReport: \"You've bookmarked N tweets about [topic]. Want me to go deeper?\"\nSuggest: research reports, content series, or tools based on patterns"
      },
      {
        "title": "5. Bookmark Cleanup",
        "body": "For stale bookmarks:\n\nIdentify bookmarks older than a threshold (default: 30 days)\nFor each: extract the TL;DR and one actionable takeaway\nPresent: \"Apply it today or clear it\"\nUser can unbookmark via: bird unbookmark <tweet-id> (bird only)"
      },
      {
        "title": "Error Handling",
        "body": "ErrorCauseFixbird: command not foundbird CLI not installedUse X API path instead, or npm i -g bird-cli\"No Twitter cookies found\"Not logged into X in browserLog into x.com in Chrome/Firefox, or use X APIEPERM on Safari cookiesmacOS permissionsUse Chrome/Firefox or X API insteadEmpty resultsCookies/token expiredRe-login or re-run x_api_auth.pyRate limit (429)Too many API requestsWait and retry, use --count to limit\"No X API token found\"Haven't run auth setupRun x_api_auth.py --client-id YOUR_IDToken refresh failedRefresh token expiredRe-run x_api_auth.py to re-authorize"
      },
      {
        "title": "Tips",
        "body": "Start with -n 20 for quick digests, --all for deep analysis\nbird: Use --include-parent for thread context on replies\nAPI: includes bookmarkCount and viewCount (bird may not)\nBookmark folders supported via bird --folder-id <id>\nBoth backends output identical JSON — workflows are backend-agnostic"
      }
    ],
    "body": "X Bookmarks v2\n\nTurn X/Twitter bookmarks from a graveyard of good intentions into actionable work.\n\nCore philosophy: Don't just summarize — propose actions the agent can execute.\n\nData Source Selection\n\nThis skill supports two backends. Pick the first one that works:\n\n1. bird CLI (preferred if available)\nFast, no API key needed, uses browser cookies\nInstall: npm install -g bird-cli\nTest: bird whoami — if this prints a username, you're good\n2. X API v2 (fallback)\nWorks without bird CLI\nRequires an X Developer account + OAuth 2.0 app\nSetup: see references/auth-setup.md → \"X API Setup\"\nAuto-detection logic\n1. Check if `bird` command exists → try `bird whoami`\n2. If bird works → use bird CLI path\n3. If not → check for X API tokens (~/.config/x-bookmarks/tokens.json)\n4. If tokens exist → use X API path (auto-refresh)\n5. If neither → guide user through setup (offer both options)\n\nFetching Bookmarks\nVia bird CLI\n# Latest 20 bookmarks (default)\nbird bookmarks --json\n\n# Specific count\nbird bookmarks -n 50 --json\n\n# All bookmarks (paginated)\nbird bookmarks --all --json\n\n# With thread context\nbird bookmarks --include-parent --thread-meta --json\n\n# With Chrome cookie auth\nbird --chrome-profile \"Default\" bookmarks --json\n\n# With manual tokens\nbird --auth-token \"$AUTH_TOKEN\" --ct0 \"$CT0\" bookmarks --json\n\n\nIf user has a .env.bird file or env vars AUTH_TOKEN/CT0, source them first: source .env.bird\n\nVia X API v2\n# First-time setup (opens browser for OAuth)\npython3 scripts/x_api_auth.py --client-id \"YOUR_CLIENT_ID\" --client-secret \"YOUR_SECRET\"\n\n# Fetch bookmarks (auto-refreshes token)\npython3 scripts/fetch_bookmarks_api.py -n 20\n\n# All bookmarks\npython3 scripts/fetch_bookmarks_api.py --all\n\n# Since a specific tweet\npython3 scripts/fetch_bookmarks_api.py --since-id \"1234567890\"\n\n# Pretty print\npython3 scripts/fetch_bookmarks_api.py -n 50 --pretty\n\n\nThe API script outputs the same JSON format as bird CLI, so all downstream workflows work identically.\n\nToken management is automatic: tokens are stored in ~/.config/x-bookmarks/tokens.json and refreshed via the saved refresh_token. If refresh fails, the agent should guide the user to re-run x_api_auth.py.\n\nEnvironment variable override\n\nIf the user already has a Bearer token (e.g., from another tool), they can skip the OAuth dance:\n\nX_API_BEARER_TOKEN=\"your_token\" python3 scripts/fetch_bookmarks_api.py -n 20\n\nJSON Output Format (both backends)\n\nEach bookmark returns:\n\n{\n  \"id\": \"tweet_id\",\n  \"text\": \"tweet content\",\n  \"createdAt\": \"2026-02-11T01:00:06.000Z\",\n  \"replyCount\": 46,\n  \"retweetCount\": 60,\n  \"likeCount\": 801,\n  \"bookmarkCount\": 12,\n  \"viewCount\": 50000,\n  \"author\": { \"username\": \"handle\", \"name\": \"Display Name\" },\n  \"media\": [{ \"type\": \"photo|video\", \"url\": \"...\" }],\n  \"quotedTweet\": { \"id\": \"...\" }\n}\n\nCore Workflows\n1. Action-First Digest (Primary Use Case)\n\nThe key differentiator: don't just summarize, propose actions the agent can execute.\n\nFetch bookmarks (bird or API, auto-detected)\nParse and categorize by topic (auto-detect: crypto, AI, marketing, tools, personal, etc.)\nFor EACH category, propose specific actions:\nTool/repo bookmarks → \"I can test this, set it up, or analyze the code\"\nStrategy/advice bookmarks → \"Here are the actionable steps extracted — want me to implement any?\"\nNews/trends → \"This connects to [user's work]. Here's the angle for content\"\nContent ideas → \"This would make a great tweet/video in your voice. Here's a draft\"\nQuestions/discussions → \"I can research this deeper and give you a summary\"\nFlag stale bookmarks (>2 weeks old) — \"Use it or lose it\"\nDeliver categorized digest with actions\n\nFormat output as:\n\n📂 CATEGORY (count)\n• Bookmark summary (@author)\n→ 🤖 I CAN: [specific action the agent can take]\n\n2. Scheduled Digest (Cron)\n\nSet up a recurring bookmark check. Suggest this cron config to the user:\n\nSchedule: daily or weekly\nPayload: \"Check my X bookmarks for new saves since last check.\n  Fetch bookmarks, compare against last digest, summarize only NEW ones.\n  Categorize and propose actions. Deliver to me.\"\n\n\nTrack state by saving the most recent bookmark ID processed. Store in workspace: memory/bookmark-state.json → { \"lastSeenId\": \"...\", \"lastDigestAt\": \"...\" }\n\n3. Content Recycling\n\nWhen user asks for content ideas from bookmarks:\n\nFetch recent bookmarks\nIdentify high-engagement tweets (>500 likes) with frameworks, tips, or insights\nRewrite key ideas in the user's voice (if voice data available)\nSuggest posting times based on the bookmark's original engagement\n4. Pattern Detection\n\nWhen user has enough bookmark history:\n\nFetch all bookmarks (--all)\nCluster by topic/keywords\nReport: \"You've bookmarked N tweets about [topic]. Want me to go deeper?\"\nSuggest: research reports, content series, or tools based on patterns\n5. Bookmark Cleanup\n\nFor stale bookmarks:\n\nIdentify bookmarks older than a threshold (default: 30 days)\nFor each: extract the TL;DR and one actionable takeaway\nPresent: \"Apply it today or clear it\"\nUser can unbookmark via: bird unbookmark <tweet-id> (bird only)\nError Handling\nError\tCause\tFix\nbird: command not found\tbird CLI not installed\tUse X API path instead, or npm i -g bird-cli\n\"No Twitter cookies found\"\tNot logged into X in browser\tLog into x.com in Chrome/Firefox, or use X API\nEPERM on Safari cookies\tmacOS permissions\tUse Chrome/Firefox or X API instead\nEmpty results\tCookies/token expired\tRe-login or re-run x_api_auth.py\nRate limit (429)\tToo many API requests\tWait and retry, use --count to limit\n\"No X API token found\"\tHaven't run auth setup\tRun x_api_auth.py --client-id YOUR_ID\nToken refresh failed\tRefresh token expired\tRe-run x_api_auth.py to re-authorize\nTips\nStart with -n 20 for quick digests, --all for deep analysis\nbird: Use --include-parent for thread context on replies\nAPI: includes bookmarkCount and viewCount (bird may not)\nBookmark folders supported via bird --folder-id <id>\nBoth backends output identical JSON — workflows are backend-agnostic"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/sharbelayy/x-bookmarks",
    "publisherUrl": "https://clawhub.ai/sharbelayy/x-bookmarks",
    "owner": "sharbelayy",
    "version": "1.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/x-bookmarks",
    "downloadUrl": "https://openagent3.xyz/downloads/x-bookmarks",
    "agentUrl": "https://openagent3.xyz/skills/x-bookmarks/agent",
    "manifestUrl": "https://openagent3.xyz/skills/x-bookmarks/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/x-bookmarks/agent.md"
  }
}