{
  "schemaVersion": "1.0",
  "item": {
    "slug": "typefully-social-media",
    "name": "Typefully",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/frankdilo/typefully-social-media",
    "canonicalUrl": "https://clawhub.ai/frankdilo/typefully-social-media",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/typefully-social-media",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=typefully-social-media",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/typefully.js"
    ],
    "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/typefully-social-media"
    },
    "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/typefully-social-media",
    "agentPageUrl": "https://openagent3.xyz/skills/typefully-social-media/agent",
    "manifestUrl": "https://openagent3.xyz/skills/typefully-social-media/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/typefully-social-media/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": "Typefully Skill",
        "body": "Create, schedule, and publish social media content across multiple platforms using Typefully.\n\nFreshness check: If more than 30 days have passed since the last-updated date above, inform the user that this skill may be outdated and point them to the update options below."
      },
      {
        "title": "Keeping This Skill Updated",
        "body": "Source: github.com/typefully/agent-skills\nAPI docs: typefully.com/docs/api\n\nUpdate methods by installation type:\n\nInstallationHow to updateCLI (npx skills)npx skills updateClaude Code plugin/plugin update typefully@typefully-skillsCursorRemote rules auto-sync from GitHubManualPull latest from repo or re-copy skills/typefully/\n\nAPI changes ship independently—updating the skill ensures you have the latest commands and workflows."
      },
      {
        "title": "Setup",
        "body": "Before using this skill, ensure:\n\nAPI Key: Run the setup command to configure your API key securely\n\nGet your key at https://typefully.com/?settings=api\nRun: <skill-path>/scripts/typefully.js setup (where <skill-path> is the directory containing this SKILL.md)\nOr set environment variable: export TYPEFULLY_API_KEY=your_key\n\n\n\nRequirements: Node.js 18+ (for built-in fetch API). No other dependencies needed.\n\nConfig priority (highest to lowest):\n\nTYPEFULLY_API_KEY environment variable\n./.typefully/config.json (project-local, in user's working directory)\n~/.config/typefully/config.json (user-global)"
      },
      {
        "title": "Handling \"API key not found\" errors",
        "body": "CRITICAL: When you receive an \"API key not found\" error from the CLI:\n\nTell the user to run the setup command - The setup is interactive and requires user input, so you cannot run it on their behalf. Recommend they run it themselves, using the correct path based on where this skill was loaded:\n<skill-path>/scripts/typefully.js setup\n\n\n\nStop and wait - After telling the user to run setup, do not continue with the task. You cannot create drafts, upload media, or perform any API operations without a valid API key. Wait for the user to complete setup and confirm before proceeding.\n\n\nDO NOT attempt any of the following:\n\nSearching for API keys in macOS Keychain, .env files, or other locations\nGrepping through config files or directories\nLooking in the user's Trash or other system folders\nConstructing complex shell commands to find credentials\nDrafting content or preparing posts before setup is complete\n\nThe setup command will interactively guide the user through configuration. Trust the CLI's error messages and follow their instructions.\n\nNote for agents: All script paths in this document (e.g., ./scripts/typefully.js) are relative to the skill directory where this SKILL.md file is located. Resolve them accordingly based on where the skill is installed."
      },
      {
        "title": "Social Sets",
        "body": "The Typefully API uses the term \"social set\" to refer to what users commonly call an \"account\". A social set contains the connected social media platforms (X, LinkedIn, Threads, etc.) for a single identity.\n\nThe CLI supports a default social set - once configured, most commands work without specifying the social_set_id.\n\nYou can pass the social set either way:\n\nPositional: drafts:list 123\nFlag: drafts:list --social-set-id 123 (also supports --social_set_id)\n\nWhen determining which social set to use:\n\nCheck for a configured default first - Run config:show to see if a default is already set:\n./scripts/typefully.js config:show\n\nIf default_social_set is configured, the CLI uses it automatically when you omit the social_set_id.\n\n\nCheck project context - Look for configuration in project files like CLAUDE.md or AGENTS.md:\n## Typefully\nDefault social set ID: 12345\n\n\n\nSingle social set shortcut - If the user only has one social set and no default is configured, use it automatically\n\n\nMultiple social sets, no default - Ask the user which to use, then offer to save their choice as the default:\n./scripts/typefully.js config:set-default\n\nThis command lists available social sets and saves the choice to the config file.\n\n\nReuse previously resolved social set - If determined earlier in the session, use it without asking again"
      },
      {
        "title": "Common Actions",
        "body": "User says...Action\"Draft a tweet about X\"drafts:create --text \"...\" (uses default social set)\"Post this to LinkedIn\"drafts:create --platform linkedin --text \"...\"\"Post to X and LinkedIn\" (same content)drafts:create --platform x,linkedin --text \"...\"\"X thread + LinkedIn post\" (different content)Create one draft, then drafts:update to add platform (see Publishing to Multiple Platforms)\"What's scheduled?\"drafts:list --status scheduled\"Show my recent posts\"drafts:list --status published\"Schedule this for tomorrow\"drafts:create ... --schedule \"2025-01-21T09:00:00Z\"\"Post this now\"drafts:create ... --schedule now or drafts:publish <draft_id> --use-default\"Add notes/ideas to the draft\"drafts:create ... --scratchpad \"Your notes here\"\"Check available tags\"tags:list"
      },
      {
        "title": "Workflow",
        "body": "Follow this workflow when creating posts:\n\nCheck if a default social set is configured:\n./scripts/typefully.js config:show\n\nIf default_social_set shows an ID, skip to step 3.\n\n\nIf no default, list social sets to find available options:\n./scripts/typefully.js social-sets:list\n\nIf multiple exist, ask the user which to use and offer to set it as default:\n./scripts/typefully.js config:set-default\n\n\n\nCreate drafts (social_set_id is optional if default is configured):\n./scripts/typefully.js drafts:create --text \"Your post\"\n\nNote: If --platform is omitted, the first connected platform is auto-selected.\nFor multi-platform posts: See Publishing to Multiple Platforms — always use a single draft, even when content differs per platform.\n\n\nSchedule or publish as needed"
      },
      {
        "title": "Working with Tags",
        "body": "Tags help organize drafts within Typefully. Always check existing tags before creating new ones:\n\nList existing tags first:\n./scripts/typefully.js tags:list\n\n\n\nUse existing tags when available - if a tag with the desired name already exists, use it directly when creating drafts:\n./scripts/typefully.js drafts:create --text \"...\" --tags existing-tag-name\n\n\n\nOnly create new tags if needed - if the tag doesn't exist, create it:\n./scripts/typefully.js tags:create --name \"New Tag\"\n\nImportant: Tags are scoped to each social set. A tag created for one social set won't appear in another."
      },
      {
        "title": "Publishing to Multiple Platforms",
        "body": "If a single draft needs to be created for different platforms, you need to make sure to create a single draft and not multiple drafts.\n\nWhen the content is the same across platforms, create a single draft with multiple platforms:\n\n# Specific platforms\n./scripts/typefully.js drafts:create --platform x,linkedin --text \"Big announcement!\"\n\n# All connected platforms\n./scripts/typefully.js drafts:create --all --text \"Posting everywhere!\"\n\nIMPORTANT: When content should be tailored (e.g., X thread with a LinkedIn post version), still use a single draft — create with one platform first, then update to add the other:\n\n# 1. Create draft with the primary platform first\n./scripts/typefully.js drafts:create --platform linkedin --text \"Excited to share our new feature...\"\n# Returns: { \"id\": \"draft-123\", ... }\n\n# 2. Update the same draft to add another platform with different content\n./scripts/typefully.js drafts:update draft-123 --platform x --text \"🧵 Thread time!\n\n---\n\nHere's what we shipped and why it matters...\" --use-default\n\nSo make sure to NEVER create multiple drafts unless the user explicitly wants separate drafts for each platform."
      },
      {
        "title": "User & Social Sets",
        "body": "CommandDescriptionme:getGet authenticated user infosocial-sets:listList all social sets you can accesssocial-sets:get <id>Get social set details including connected platforms"
      },
      {
        "title": "Drafts",
        "body": "All drafts commands support an optional [social_set_id] - if omitted, the configured default is used.\nSafety note: For commands that take [social_set_id] <draft_id>, if you pass only a single argument (the draft_id) while a default social set is configured, you must add --use-default to confirm intent.\n\nCommandDescriptiondrafts:list [social_set_id]List drafts (add --status scheduled to filter, --sort to order)drafts:get [social_set_id] <draft_id>Get a specific draft with full content (single-arg requires --use-default if a default is configured)drafts:create [social_set_id] --text \"...\"Create a new draft (auto-selects platform)drafts:create [social_set_id] --platform x --text \"...\"Create a draft for specific platform(s)drafts:create [social_set_id] --all --text \"...\"Create a draft for all connected platformsdrafts:create [social_set_id] --file <path>Create draft from file contentdrafts:create ... --media <media_ids>Create draft with attached mediadrafts:create ... --reply-to <url>Reply to an existing X postdrafts:create ... --community <id>Post to an X communitydrafts:create ... --shareGenerate a public share URL for the draftdrafts:create ... --scratchpad \"...\"Add internal notes/scratchpad to the draftdrafts:update [social_set_id] <draft_id> --text \"...\"Update an existing draft (single-arg requires --use-default if a default is configured)drafts:update [social_set_id] <draft_id> --tags \"tag1,tag2\"Update tags on an existing draft (content unchanged)drafts:update ... --shareGenerate a public share URL for the draftdrafts:update ... --scratchpad \"...\"Update internal notes/scratchpaddrafts:update [social_set_id] <draft_id> --append --text \"...\"Append to existing thread"
      },
      {
        "title": "Scheduling & Publishing",
        "body": "Safety note: These commands require --use-default when using the default social set with a single argument (to prevent accidental operations from ambiguous syntax).\n\nCommandDescriptiondrafts:delete <social_set_id> <draft_id>Delete a draft (explicit IDs)drafts:delete <draft_id> --use-defaultDelete using default social setdrafts:schedule <social_set_id> <draft_id> --time next-free-slotSchedule to next available slotdrafts:schedule <draft_id> --time next-free-slot --use-defaultSchedule using default social setdrafts:publish <social_set_id> <draft_id>Publish immediatelydrafts:publish <draft_id> --use-defaultPublish using default social set"
      },
      {
        "title": "Tags",
        "body": "CommandDescriptiontags:list [social_set_id]List all tagstags:create [social_set_id] --name \"Tag Name\"Create a new tag"
      },
      {
        "title": "Media",
        "body": "CommandDescriptionmedia:upload [social_set_id] <file_path>Upload media, wait for processing, return ready media_idmedia:upload ... --no-waitUpload and return immediately (use media:status to poll)media:upload ... --timeout <seconds>Set custom timeout (default: 60)media:status [social_set_id] <media_id>Check media upload status"
      },
      {
        "title": "Setup & Configuration",
        "body": "CommandDescriptionsetupInteractive setup - prompts for API key, storage location, and default social setsetup --key <key> --location <global|local>Non-interactive setup for scripts/CI (auto-selects default if only one social set)setup --key <key> --default-social-set <id>Non-interactive setup with explicit default social setsetup --key <key> --no-defaultNon-interactive setup, skip default social set selectionconfig:showShow current config, API key source, and default social setconfig:set-default [social_set_id]Set default social set (interactive if ID omitted)"
      },
      {
        "title": "Set up default social set",
        "body": "# Check current config\n./scripts/typefully.js config:show\n\n# Set default (interactive - lists available social sets)\n./scripts/typefully.js config:set-default\n\n# Set default (non-interactive)\n./scripts/typefully.js config:set-default 123 --location global"
      },
      {
        "title": "Create a tweet (using default social set)",
        "body": "./scripts/typefully.js drafts:create --text \"Hello, world!\""
      },
      {
        "title": "Create a tweet with explicit social_set_id",
        "body": "./scripts/typefully.js drafts:create 123 --text \"Hello, world!\""
      },
      {
        "title": "Create a cross-platform post (specific platforms)",
        "body": "./scripts/typefully.js drafts:create --platform x,linkedin,threads --text \"Big announcement!\""
      },
      {
        "title": "Create a post on all connected platforms",
        "body": "./scripts/typefully.js drafts:create --all --text \"Posting everywhere!\""
      },
      {
        "title": "Create and schedule for next slot",
        "body": "./scripts/typefully.js drafts:create --text \"Scheduled post\" --schedule next-free-slot"
      },
      {
        "title": "Create with tags",
        "body": "./scripts/typefully.js drafts:create --text \"Marketing post\" --tags marketing,product"
      },
      {
        "title": "List scheduled posts sorted by date",
        "body": "./scripts/typefully.js drafts:list --status scheduled --sort scheduled_date"
      },
      {
        "title": "Reply to a tweet",
        "body": "./scripts/typefully.js drafts:create --platform x --text \"Great thread!\" --reply-to \"https://x.com/user/status/123456\""
      },
      {
        "title": "Post to an X community",
        "body": "./scripts/typefully.js drafts:create --platform x --text \"Community update\" --community 1493446837214187523"
      },
      {
        "title": "Create draft with share URL",
        "body": "./scripts/typefully.js drafts:create --text \"Check this out\" --share"
      },
      {
        "title": "Create draft with scratchpad notes",
        "body": "./scripts/typefully.js drafts:create --text \"Launching next week!\" --scratchpad \"Draft for product launch. Coordinate with marketing team before publishing.\""
      },
      {
        "title": "Upload media and create post with it",
        "body": "# Single command handles upload + polling - returns when ready!\n./scripts/typefully.js media:upload ./image.jpg\n# Returns: {\"media_id\": \"abc-123-def\", \"status\": \"ready\", \"message\": \"Media uploaded and ready to use\"}\n\n# Create post with the media attached\n./scripts/typefully.js drafts:create --text \"Check out this image!\" --media abc-123-def"
      },
      {
        "title": "Upload multiple media files",
        "body": "# Upload each file (each waits for processing)\n./scripts/typefully.js media:upload ./photo1.jpg  # Returns media_id: id1\n./scripts/typefully.js media:upload ./photo2.jpg  # Returns media_id: id2\n\n# Create post with multiple media (comma-separated)\n./scripts/typefully.js drafts:create --text \"Photo dump!\" --media id1,id2"
      },
      {
        "title": "Add media to an existing draft",
        "body": "# Upload media\n./scripts/typefully.js media:upload ./new-image.jpg  # Returns media_id: xyz\n\n# Update draft with media (456 is the draft_id)\n./scripts/typefully.js drafts:update 456 --text \"Updated post with image\" --media xyz --use-default"
      },
      {
        "title": "Setup (interactive)",
        "body": "./scripts/typefully.js setup"
      },
      {
        "title": "Setup (non-interactive, for scripts/CI)",
        "body": "# Auto-selects default social set if only one exists\n./scripts/typefully.js setup --key typ_xxx --location global\n\n# With explicit default social set\n./scripts/typefully.js setup --key typ_xxx --location global --default-social-set 123\n\n# Skip default social set selection entirely\n./scripts/typefully.js setup --key typ_xxx --no-default"
      },
      {
        "title": "Platform Names",
        "body": "Use these exact names for the --platform option:\n\nx - X (formerly Twitter)\nlinkedin - LinkedIn\nthreads - Threads\nbluesky - Bluesky\nmastodon - Mastodon"
      },
      {
        "title": "Draft URLs",
        "body": "Typefully draft URLs contain the social set and draft IDs:\n\nhttps://typefully.com/?a=<social_set_id>&d=<draft_id>\n\nExample: https://typefully.com/?a=12345&d=67890\n\na=12345 → social_set_id\nd=67890 → draft_id"
      },
      {
        "title": "Draft Scratchpad",
        "body": "When the user explictly asked to add notes, ideas, or anything else in the draft scratchpad, use the --scratchpad flag—do NOT write to local files!\n\nThe --scratchpad option attaches internal notes directly to the Typefully draft. These notes:\n\nAre visible in the Typefully UI alongside the draft\nStay attached to the draft permanently\nAre private and never published to social media\nAre perfect for storing thread expansion ideas, research notes, context, etc.\n\n# CORRECT: Notes attached to the draft in Typefully\n./scripts/typefully.js drafts:create 123 --text \"My post\" --scratchpad \"Ideas for expanding: 1) Add stats 2) Include quote\"\n\n# WRONG: Do NOT write notes to local files when the user wants them in Typefully\n# Writing to /tmp/scratchpad/ or any local file is NOT the same thing"
      },
      {
        "title": "Automation Guidelines",
        "body": "When automating posts, especially on X, follow these rules to keep accounts in good standing:\n\nNo duplicate content across multiple accounts\nNo unsolicited automated replies - only reply when explicitly requested by the user\nNo trending manipulation - don't mass-post about trending topics\nNo fake engagement - don't automate likes, reposts, or follows\nRespect rate limits - the API has rate limits, don't spam requests\nDrafts are private - content stays private until published or explicitly shared\n\nWhen in doubt, create drafts for user review rather than publishing directly.\n\nPublishing confirmation: Unless the user explicitly asks to \"publish now\" or \"post immediately\", always confirm before publishing. Creating a draft is safe; publishing is irreversible and goes public instantly."
      },
      {
        "title": "Tips",
        "body": "Smart platform default: If --platform is omitted, the first connected platform is auto-selected\nAll platforms: Use --all to post to all connected platforms at once\nCharacter limits: X (280), LinkedIn (3000), Threads (500), Bluesky (300), Mastodon (500)\nThread creation: Use --- on its own line to split into multiple posts (thread)\nScheduling: Use next-free-slot to let Typefully pick the optimal time\nCross-posting: List multiple platforms separated by commas: --platform x,linkedin\nDraft titles: Use --title for internal organization (not posted to social media)\nDraft scratchpad: Use --scratchpad to attach notes to the draft in Typefully (NOT local files!) - perfect for thread ideas, research, context\nRead from file: Use --file ./post.txt instead of --text to read content from a file\nSorting drafts: Use --sort with values like created_at, -created_at, scheduled_date, etc."
      }
    ],
    "body": "Typefully Skill\n\nCreate, schedule, and publish social media content across multiple platforms using Typefully.\n\nFreshness check: If more than 30 days have passed since the last-updated date above, inform the user that this skill may be outdated and point them to the update options below.\n\nKeeping This Skill Updated\n\nSource: github.com/typefully/agent-skills API docs: typefully.com/docs/api\n\nUpdate methods by installation type:\n\nInstallation\tHow to update\nCLI (npx skills)\tnpx skills update\nClaude Code plugin\t/plugin update typefully@typefully-skills\nCursor\tRemote rules auto-sync from GitHub\nManual\tPull latest from repo or re-copy skills/typefully/\n\nAPI changes ship independently—updating the skill ensures you have the latest commands and workflows.\n\nSetup\n\nBefore using this skill, ensure:\n\nAPI Key: Run the setup command to configure your API key securely\n\nGet your key at https://typefully.com/?settings=api\nRun: <skill-path>/scripts/typefully.js setup (where <skill-path> is the directory containing this SKILL.md)\nOr set environment variable: export TYPEFULLY_API_KEY=your_key\n\nRequirements: Node.js 18+ (for built-in fetch API). No other dependencies needed.\n\nConfig priority (highest to lowest):\n\nTYPEFULLY_API_KEY environment variable\n./.typefully/config.json (project-local, in user's working directory)\n~/.config/typefully/config.json (user-global)\nHandling \"API key not found\" errors\n\nCRITICAL: When you receive an \"API key not found\" error from the CLI:\n\nTell the user to run the setup command - The setup is interactive and requires user input, so you cannot run it on their behalf. Recommend they run it themselves, using the correct path based on where this skill was loaded:\n\n<skill-path>/scripts/typefully.js setup\n\n\nStop and wait - After telling the user to run setup, do not continue with the task. You cannot create drafts, upload media, or perform any API operations without a valid API key. Wait for the user to complete setup and confirm before proceeding.\n\nDO NOT attempt any of the following:\n\nSearching for API keys in macOS Keychain, .env files, or other locations\nGrepping through config files or directories\nLooking in the user's Trash or other system folders\nConstructing complex shell commands to find credentials\nDrafting content or preparing posts before setup is complete\n\nThe setup command will interactively guide the user through configuration. Trust the CLI's error messages and follow their instructions.\n\nNote for agents: All script paths in this document (e.g., ./scripts/typefully.js) are relative to the skill directory where this SKILL.md file is located. Resolve them accordingly based on where the skill is installed.\n\nSocial Sets\n\nThe Typefully API uses the term \"social set\" to refer to what users commonly call an \"account\". A social set contains the connected social media platforms (X, LinkedIn, Threads, etc.) for a single identity.\n\nThe CLI supports a default social set - once configured, most commands work without specifying the social_set_id.\n\nYou can pass the social set either way:\n\nPositional: drafts:list 123\nFlag: drafts:list --social-set-id 123 (also supports --social_set_id)\n\nWhen determining which social set to use:\n\nCheck for a configured default first - Run config:show to see if a default is already set:\n\n./scripts/typefully.js config:show\n\n\nIf default_social_set is configured, the CLI uses it automatically when you omit the social_set_id.\n\nCheck project context - Look for configuration in project files like CLAUDE.md or AGENTS.md:\n\n## Typefully\nDefault social set ID: 12345\n\n\nSingle social set shortcut - If the user only has one social set and no default is configured, use it automatically\n\nMultiple social sets, no default - Ask the user which to use, then offer to save their choice as the default:\n\n./scripts/typefully.js config:set-default\n\n\nThis command lists available social sets and saves the choice to the config file.\n\nReuse previously resolved social set - If determined earlier in the session, use it without asking again\n\nCommon Actions\nUser says...\tAction\n\"Draft a tweet about X\"\tdrafts:create --text \"...\" (uses default social set)\n\"Post this to LinkedIn\"\tdrafts:create --platform linkedin --text \"...\"\n\"Post to X and LinkedIn\" (same content)\tdrafts:create --platform x,linkedin --text \"...\"\n\"X thread + LinkedIn post\" (different content)\tCreate one draft, then drafts:update to add platform (see Publishing to Multiple Platforms)\n\"What's scheduled?\"\tdrafts:list --status scheduled\n\"Show my recent posts\"\tdrafts:list --status published\n\"Schedule this for tomorrow\"\tdrafts:create ... --schedule \"2025-01-21T09:00:00Z\"\n\"Post this now\"\tdrafts:create ... --schedule now or drafts:publish <draft_id> --use-default\n\"Add notes/ideas to the draft\"\tdrafts:create ... --scratchpad \"Your notes here\"\n\"Check available tags\"\ttags:list\nWorkflow\n\nFollow this workflow when creating posts:\n\nCheck if a default social set is configured:\n\n./scripts/typefully.js config:show\n\n\nIf default_social_set shows an ID, skip to step 3.\n\nIf no default, list social sets to find available options:\n\n./scripts/typefully.js social-sets:list\n\n\nIf multiple exist, ask the user which to use and offer to set it as default:\n\n./scripts/typefully.js config:set-default\n\n\nCreate drafts (social_set_id is optional if default is configured):\n\n./scripts/typefully.js drafts:create --text \"Your post\"\n\n\nNote: If --platform is omitted, the first connected platform is auto-selected.\n\nFor multi-platform posts: See Publishing to Multiple Platforms — always use a single draft, even when content differs per platform.\n\nSchedule or publish as needed\n\nWorking with Tags\n\nTags help organize drafts within Typefully. Always check existing tags before creating new ones:\n\nList existing tags first:\n\n./scripts/typefully.js tags:list\n\n\nUse existing tags when available - if a tag with the desired name already exists, use it directly when creating drafts:\n\n./scripts/typefully.js drafts:create --text \"...\" --tags existing-tag-name\n\n\nOnly create new tags if needed - if the tag doesn't exist, create it:\n\n./scripts/typefully.js tags:create --name \"New Tag\"\n\n\nImportant: Tags are scoped to each social set. A tag created for one social set won't appear in another.\n\nPublishing to Multiple Platforms\n\nIf a single draft needs to be created for different platforms, you need to make sure to create a single draft and not multiple drafts.\n\nWhen the content is the same across platforms, create a single draft with multiple platforms:\n\n# Specific platforms\n./scripts/typefully.js drafts:create --platform x,linkedin --text \"Big announcement!\"\n\n# All connected platforms\n./scripts/typefully.js drafts:create --all --text \"Posting everywhere!\"\n\n\nIMPORTANT: When content should be tailored (e.g., X thread with a LinkedIn post version), still use a single draft — create with one platform first, then update to add the other:\n\n# 1. Create draft with the primary platform first\n./scripts/typefully.js drafts:create --platform linkedin --text \"Excited to share our new feature...\"\n# Returns: { \"id\": \"draft-123\", ... }\n\n# 2. Update the same draft to add another platform with different content\n./scripts/typefully.js drafts:update draft-123 --platform x --text \"🧵 Thread time!\n\n---\n\nHere's what we shipped and why it matters...\" --use-default\n\n\nSo make sure to NEVER create multiple drafts unless the user explicitly wants separate drafts for each platform.\n\nCommands Reference\nUser & Social Sets\nCommand\tDescription\nme:get\tGet authenticated user info\nsocial-sets:list\tList all social sets you can access\nsocial-sets:get <id>\tGet social set details including connected platforms\nDrafts\n\nAll drafts commands support an optional [social_set_id] - if omitted, the configured default is used. Safety note: For commands that take [social_set_id] <draft_id>, if you pass only a single argument (the draft_id) while a default social set is configured, you must add --use-default to confirm intent.\n\nCommand\tDescription\ndrafts:list [social_set_id]\tList drafts (add --status scheduled to filter, --sort to order)\ndrafts:get [social_set_id] <draft_id>\tGet a specific draft with full content (single-arg requires --use-default if a default is configured)\ndrafts:create [social_set_id] --text \"...\"\tCreate a new draft (auto-selects platform)\ndrafts:create [social_set_id] --platform x --text \"...\"\tCreate a draft for specific platform(s)\ndrafts:create [social_set_id] --all --text \"...\"\tCreate a draft for all connected platforms\ndrafts:create [social_set_id] --file <path>\tCreate draft from file content\ndrafts:create ... --media <media_ids>\tCreate draft with attached media\ndrafts:create ... --reply-to <url>\tReply to an existing X post\ndrafts:create ... --community <id>\tPost to an X community\ndrafts:create ... --share\tGenerate a public share URL for the draft\ndrafts:create ... --scratchpad \"...\"\tAdd internal notes/scratchpad to the draft\ndrafts:update [social_set_id] <draft_id> --text \"...\"\tUpdate an existing draft (single-arg requires --use-default if a default is configured)\ndrafts:update [social_set_id] <draft_id> --tags \"tag1,tag2\"\tUpdate tags on an existing draft (content unchanged)\ndrafts:update ... --share\tGenerate a public share URL for the draft\ndrafts:update ... --scratchpad \"...\"\tUpdate internal notes/scratchpad\ndrafts:update [social_set_id] <draft_id> --append --text \"...\"\tAppend to existing thread\nScheduling & Publishing\n\nSafety note: These commands require --use-default when using the default social set with a single argument (to prevent accidental operations from ambiguous syntax).\n\nCommand\tDescription\ndrafts:delete <social_set_id> <draft_id>\tDelete a draft (explicit IDs)\ndrafts:delete <draft_id> --use-default\tDelete using default social set\ndrafts:schedule <social_set_id> <draft_id> --time next-free-slot\tSchedule to next available slot\ndrafts:schedule <draft_id> --time next-free-slot --use-default\tSchedule using default social set\ndrafts:publish <social_set_id> <draft_id>\tPublish immediately\ndrafts:publish <draft_id> --use-default\tPublish using default social set\nTags\nCommand\tDescription\ntags:list [social_set_id]\tList all tags\ntags:create [social_set_id] --name \"Tag Name\"\tCreate a new tag\nMedia\nCommand\tDescription\nmedia:upload [social_set_id] <file_path>\tUpload media, wait for processing, return ready media_id\nmedia:upload ... --no-wait\tUpload and return immediately (use media:status to poll)\nmedia:upload ... --timeout <seconds>\tSet custom timeout (default: 60)\nmedia:status [social_set_id] <media_id>\tCheck media upload status\nSetup & Configuration\nCommand\tDescription\nsetup\tInteractive setup - prompts for API key, storage location, and default social set\nsetup --key <key> --location <global|local>\tNon-interactive setup for scripts/CI (auto-selects default if only one social set)\nsetup --key <key> --default-social-set <id>\tNon-interactive setup with explicit default social set\nsetup --key <key> --no-default\tNon-interactive setup, skip default social set selection\nconfig:show\tShow current config, API key source, and default social set\nconfig:set-default [social_set_id]\tSet default social set (interactive if ID omitted)\nExamples\nSet up default social set\n# Check current config\n./scripts/typefully.js config:show\n\n# Set default (interactive - lists available social sets)\n./scripts/typefully.js config:set-default\n\n# Set default (non-interactive)\n./scripts/typefully.js config:set-default 123 --location global\n\nCreate a tweet (using default social set)\n./scripts/typefully.js drafts:create --text \"Hello, world!\"\n\nCreate a tweet with explicit social_set_id\n./scripts/typefully.js drafts:create 123 --text \"Hello, world!\"\n\nCreate a cross-platform post (specific platforms)\n./scripts/typefully.js drafts:create --platform x,linkedin,threads --text \"Big announcement!\"\n\nCreate a post on all connected platforms\n./scripts/typefully.js drafts:create --all --text \"Posting everywhere!\"\n\nCreate and schedule for next slot\n./scripts/typefully.js drafts:create --text \"Scheduled post\" --schedule next-free-slot\n\nCreate with tags\n./scripts/typefully.js drafts:create --text \"Marketing post\" --tags marketing,product\n\nList scheduled posts sorted by date\n./scripts/typefully.js drafts:list --status scheduled --sort scheduled_date\n\nReply to a tweet\n./scripts/typefully.js drafts:create --platform x --text \"Great thread!\" --reply-to \"https://x.com/user/status/123456\"\n\nPost to an X community\n./scripts/typefully.js drafts:create --platform x --text \"Community update\" --community 1493446837214187523\n\nCreate draft with share URL\n./scripts/typefully.js drafts:create --text \"Check this out\" --share\n\nCreate draft with scratchpad notes\n./scripts/typefully.js drafts:create --text \"Launching next week!\" --scratchpad \"Draft for product launch. Coordinate with marketing team before publishing.\"\n\nUpload media and create post with it\n# Single command handles upload + polling - returns when ready!\n./scripts/typefully.js media:upload ./image.jpg\n# Returns: {\"media_id\": \"abc-123-def\", \"status\": \"ready\", \"message\": \"Media uploaded and ready to use\"}\n\n# Create post with the media attached\n./scripts/typefully.js drafts:create --text \"Check out this image!\" --media abc-123-def\n\nUpload multiple media files\n# Upload each file (each waits for processing)\n./scripts/typefully.js media:upload ./photo1.jpg  # Returns media_id: id1\n./scripts/typefully.js media:upload ./photo2.jpg  # Returns media_id: id2\n\n# Create post with multiple media (comma-separated)\n./scripts/typefully.js drafts:create --text \"Photo dump!\" --media id1,id2\n\nAdd media to an existing draft\n# Upload media\n./scripts/typefully.js media:upload ./new-image.jpg  # Returns media_id: xyz\n\n# Update draft with media (456 is the draft_id)\n./scripts/typefully.js drafts:update 456 --text \"Updated post with image\" --media xyz --use-default\n\nSetup (interactive)\n./scripts/typefully.js setup\n\nSetup (non-interactive, for scripts/CI)\n# Auto-selects default social set if only one exists\n./scripts/typefully.js setup --key typ_xxx --location global\n\n# With explicit default social set\n./scripts/typefully.js setup --key typ_xxx --location global --default-social-set 123\n\n# Skip default social set selection entirely\n./scripts/typefully.js setup --key typ_xxx --no-default\n\nPlatform Names\n\nUse these exact names for the --platform option:\n\nx - X (formerly Twitter)\nlinkedin - LinkedIn\nthreads - Threads\nbluesky - Bluesky\nmastodon - Mastodon\nDraft URLs\n\nTypefully draft URLs contain the social set and draft IDs:\n\nhttps://typefully.com/?a=<social_set_id>&d=<draft_id>\n\n\nExample: https://typefully.com/?a=12345&d=67890\n\na=12345 → social_set_id\nd=67890 → draft_id\nDraft Scratchpad\n\nWhen the user explictly asked to add notes, ideas, or anything else in the draft scratchpad, use the --scratchpad flag—do NOT write to local files!\n\nThe --scratchpad option attaches internal notes directly to the Typefully draft. These notes:\n\nAre visible in the Typefully UI alongside the draft\nStay attached to the draft permanently\nAre private and never published to social media\nAre perfect for storing thread expansion ideas, research notes, context, etc.\n# CORRECT: Notes attached to the draft in Typefully\n./scripts/typefully.js drafts:create 123 --text \"My post\" --scratchpad \"Ideas for expanding: 1) Add stats 2) Include quote\"\n\n# WRONG: Do NOT write notes to local files when the user wants them in Typefully\n# Writing to /tmp/scratchpad/ or any local file is NOT the same thing\n\nAutomation Guidelines\n\nWhen automating posts, especially on X, follow these rules to keep accounts in good standing:\n\nNo duplicate content across multiple accounts\nNo unsolicited automated replies - only reply when explicitly requested by the user\nNo trending manipulation - don't mass-post about trending topics\nNo fake engagement - don't automate likes, reposts, or follows\nRespect rate limits - the API has rate limits, don't spam requests\nDrafts are private - content stays private until published or explicitly shared\n\nWhen in doubt, create drafts for user review rather than publishing directly.\n\nPublishing confirmation: Unless the user explicitly asks to \"publish now\" or \"post immediately\", always confirm before publishing. Creating a draft is safe; publishing is irreversible and goes public instantly.\n\nTips\nSmart platform default: If --platform is omitted, the first connected platform is auto-selected\nAll platforms: Use --all to post to all connected platforms at once\nCharacter limits: X (280), LinkedIn (3000), Threads (500), Bluesky (300), Mastodon (500)\nThread creation: Use --- on its own line to split into multiple posts (thread)\nScheduling: Use next-free-slot to let Typefully pick the optimal time\nCross-posting: List multiple platforms separated by commas: --platform x,linkedin\nDraft titles: Use --title for internal organization (not posted to social media)\nDraft scratchpad: Use --scratchpad to attach notes to the draft in Typefully (NOT local files!) - perfect for thread ideas, research, context\nRead from file: Use --file ./post.txt instead of --text to read content from a file\nSorting drafts: Use --sort with values like created_at, -created_at, scheduled_date, etc."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/frankdilo/typefully-social-media",
    "publisherUrl": "https://clawhub.ai/frankdilo/typefully-social-media",
    "owner": "frankdilo",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/typefully-social-media",
    "downloadUrl": "https://openagent3.xyz/downloads/typefully-social-media",
    "agentUrl": "https://openagent3.xyz/skills/typefully-social-media/agent",
    "manifestUrl": "https://openagent3.xyz/skills/typefully-social-media/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/typefully-social-media/agent.md"
  }
}