skills/SKILL.md
Create, schedule, and manage social media posts via Typefully. ALWAYS use this skill when asked to draft, schedule, post, or check tweets, posts, threads, or social media content for Twitter/X, LinkedIn, Threads, Bluesky, or Mastodon.
npx skillsauth add ahmadawais/typefully-cli typefullyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create, schedule, and publish social media content across multiple platforms using Typefully.
tfly # interactive — pick text, platform, schedule
tfly "Hello, world!" # instant draft (uses default platforms)
tfly rm # interactive draft picker to delete
tfly rm <draft_id> # delete specific draft
CRITICAL: When you receive an "API key not found" error from the CLI:
Tell the user to run the setup command - The setup is interactive and requires user input, so you cannot run it on their behalf:
typefully setup
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.
The CLI supports a default social set - once configured, most commands work without specifying the social_set_id.
You can pass the social set either way:
typefully drafts list 123typefully drafts list --social-set-id 123When determining which social set to use:
Check for a configured default first - Run typefully config show to see if a default is already set:
typefully config show
If default_social_set is configured, the CLI uses it automatically when you omit the social_set_id.
Check project context - Look for configuration in project files like CLAUDE.md or AGENTS.md:
## Typefully
Default social set ID: 12345
Single social set shortcut - If the user only has one social set and no default is configured, use it automatically
Multiple social sets, no default - Ask the user which to use, then offer to save their choice as the default:
typefully config set-default
This command lists available social sets and saves the choice to the config file.
Reuse previously resolved social set - If determined earlier in the session, use it without asking again
| User says... | Action |
|--------------|--------|
| "Draft a tweet about X" | typefully drafts create --text "..." (uses default social set) |
| "Post this to LinkedIn" | typefully drafts create --platform linkedin --text "..." |
| "Post to X and LinkedIn" (same content) | typefully drafts create --platform x,linkedin --text "..." |
| "X thread + LinkedIn post" (different content) | Create one draft, then typefully drafts update to add platform (see Publishing to Multiple Platforms) |
| "What's scheduled?" | typefully drafts list --status scheduled |
| "Show my recent posts" | typefully drafts list --status published |
| "Schedule this for tomorrow" | typefully drafts create ... --schedule "2025-01-21T09:00:00Z" |
| "Post this now" | typefully drafts create ... --schedule now or typefully drafts publish <draft_id> --use-default |
| "Add notes/ideas to the draft" | typefully drafts create ... --scratchpad "Your notes here" |
| "Set my default platforms" | typefully config set-platforms |
| "Delete a draft" | tfly rm [draft_id] |
| "Check available tags" | typefully tags list |
Follow this workflow when creating posts:
Check if a default social set is configured:
typefully config show
If default_social_set shows an ID, skip to step 3.
If no default, list social sets to find available options:
typefully social-sets list
If multiple exist, ask the user which to use and offer to set it as default:
typefully config set-default
Create drafts (social_set_id is optional if default is configured):
typefully drafts create --text "Your post"
Note: If --platform is omitted, uses defaultPlatforms config if set, else first connected platform. Set defaults with typefully config set-platforms.
For multi-platform posts: See Publishing to Multiple Platforms — always use a single draft, even when content differs per platform.
Schedule or publish as needed
Tags help organize drafts within Typefully. Always check existing tags before creating new ones:
List existing tags first:
typefully tags list
Use existing tags when available - if a tag with the desired name already exists, use it directly when creating drafts:
typefully drafts create --text "..." --tags existing-tag-name
Only create new tags if needed - if the tag doesn't exist, create it:
typefully tags create --name "New Tag"
Important: Tags are scoped to each social set. A tag created for one social set won't appear in another.
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.
When the content is the same across platforms, create a single draft with multiple platforms:
# Specific platforms
typefully drafts create --platform x,linkedin,threads,bluesky --text "Big announcement!"
# All connected platforms
typefully drafts create --all --text "Posting everywhere!"
IMPORTANT: 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:
# 1. Create draft with the primary platform first
typefully drafts create --platform linkedin --text "Excited to share our new feature..."
# Returns: { "id": "draft-123", ... }
# 2. Update the same draft to add another platform with different content
typefully drafts update draft-123 --platform x --text "Thread time!
---
Here's what we shipped and why it matters..." --use-default
So make sure to NEVER create multiple drafts unless the user explicitly wants separate drafts for each platform.
| Command | Description |
|---------|-------------|
| typefully me | Get authenticated user info |
| typefully social-sets list | List all social sets you can access |
| typefully social-sets get <id> | Get social set details including connected platforms |
All drafts commands support an optional [social_set_id] positional argument or --social-set-id <id> flag — 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.
| Command | Description |
|---------|-------------|
| typefully drafts list [social_set_id] | List drafts (add --status scheduled to filter, --sort to order) |
| typefully drafts get [social_set_id] <draft_id> | Get a specific draft with full content (single-arg requires --use-default if a default is configured) |
| typefully drafts create [social_set_id] --text "..." | Create a new draft (auto-selects platform) |
| typefully drafts create [social_set_id] --platform x --text "..." | Create a draft for specific platform(s) |
| typefully drafts create [social_set_id] --all --text "..." | Create a draft for all connected platforms |
| typefully drafts create [social_set_id] --file <path> | Create draft from file content |
| typefully drafts create ... --media <media_ids> | Create draft with attached media |
| typefully drafts create ... --reply-to <url> | Reply to an existing X post |
| typefully drafts create ... --community <id> | Post to an X community |
| typefully drafts create ... --share | Generate a public share URL for the draft |
| typefully drafts create ... --scratchpad "..." | Add internal notes/scratchpad to the draft |
| typefully drafts update [social_set_id] <draft_id> --text "..." | Update an existing draft (single-arg requires --use-default if a default is configured) |
| typefully drafts update [social_set_id] <draft_id> --tags "tag1,tag2" | Update tags on an existing draft (content unchanged) |
| typefully drafts update ... --share | Generate a public share URL for the draft |
| typefully drafts update ... --scratchpad "..." | Update internal notes/scratchpad |
| typefully drafts update [social_set_id] <draft_id> --append --text "..." | Append to existing thread |
Safety note: These commands require --use-default when using the default social set with a single argument (to prevent accidental operations from ambiguous syntax).
| Command | Description |
|---------|-------------|
| typefully drafts delete <social_set_id> <draft_id> | Delete a draft (explicit IDs) |
| typefully drafts delete <draft_id> --use-default | Delete using default social set |
| typefully drafts schedule <social_set_id> <draft_id> --time next-free-slot | Schedule to next available slot |
| typefully drafts schedule <draft_id> --time next-free-slot --use-default | Schedule using default social set |
| typefully drafts publish <social_set_id> <draft_id> | Publish immediately |
| typefully drafts publish <draft_id> --use-default | Publish using default social set |
| Command | Description |
|---------|-------------|
| typefully tags list [social_set_id] | List all tags |
| typefully tags create [social_set_id] --name "Tag Name" | Create a new tag |
| Command | Description |
|---------|-------------|
| typefully media upload <file_path> [social_set_id] | Upload media, wait for processing, return ready media_id |
| typefully media upload <file_path> --no-wait | Upload and return immediately (use media status to poll) |
| typefully media upload <file_path> --timeout <seconds> | Set custom timeout (default: 60) |
| typefully media status <media_id> [social_set_id] | Check media upload status |
| Command | Description |
|---------|-------------|
| typefully setup | Interactive setup - prompts for API key, storage location, and default social set |
| typefully setup --key <key> --location <global\|local> | Non-interactive setup for scripts/CI (auto-selects default if only one social set) |
| typefully setup --key <key> --default-social-set <id> | Non-interactive setup with explicit default social set |
| typefully setup --key <key> --no-default | Non-interactive setup, skip default social set selection |
| typefully config show | Show current config, API key source, and default social set |
| typefully config set-default [social_set_id] | Set default social set (interactive if ID omitted) |
| typefully config set-platforms | Set default platforms used when creating drafts (interactive multiselect) |
| typefully config set-platforms --platforms x,linkedin | Set default platforms non-interactively |
tfly)tfly is a short alias for typefully. The default command creates drafts directly:
| Command | Description |
|---------|-------------|
| tfly "text" | Create draft instantly with default platforms — no flags needed |
| tfly | Interactive flow: prompts for text, platforms (pre-ticked from config), and schedule |
| tfly rm | Interactive picker — loads drafts, pick one or more to delete |
| tfly rm <draft_id> | Delete a specific draft directly |
| tfly create-draft "text" | Full create-draft alias with all flag support |
| tfly update-draft <id> "text" | Full update-draft alias with all flag support |
# Check current config
typefully config show
# Set default (interactive - lists available social sets)
typefully config set-default
# Set default (non-interactive)
typefully config set-default 123 --location global
typefully drafts create --text "Hello, world!"
# Positional
typefully drafts create 123 --text "Hello, world!"
# Flag
typefully drafts create --social-set-id 123 --text "Hello, world!"
typefully drafts create --platform x,linkedin,threads --text "Big announcement!"
typefully drafts create --all --text "Posting everywhere!"
typefully drafts create --text "Scheduled post" --schedule next-free-slot
typefully drafts create --text "Marketing post" --tags marketing,product
typefully drafts list --status scheduled --sort scheduled_date
typefully drafts create --platform x --text "Great thread!" --reply-to "https://x.com/user/status/123456"
typefully drafts create --platform x --text "Community update" --community 1493446837214187523
typefully drafts create --text "Check this out" --share
typefully drafts create --text "Launching next week!" --scratchpad "Draft for product launch. Coordinate with marketing team before publishing."
# Single command handles upload + polling - returns when ready!
typefully media upload ./image.jpg
# Returns: {"media_id": "abc-123-def", "status": "ready", "message": "Media uploaded and ready"}
# Create post with the media attached
typefully drafts create --text "Check out this image!" --media abc-123-def
# Upload each file (each waits for processing)
typefully media upload ./photo1.jpg # Returns media_id: id1
typefully media upload ./photo2.jpg # Returns media_id: id2
# Create post with multiple media (comma-separated)
typefully drafts create --text "Photo dump!" --media id1,id2
# Upload media
typefully media upload ./new-image.jpg # Returns media_id: xyz
# Update draft with media (456 is the draft_id)
typefully drafts update 456 --text "Updated post with image" --media xyz --use-default
typefully setup
# Auto-selects default social set if only one exists
typefully setup --key typ_xxx --location global
# With explicit default social set
typefully setup --key typ_xxx --location global --default-social-set 123
# Skip default social set selection entirely
typefully setup --key typ_xxx --no-default
Use these exact names for the --platform option:
x - X (formerly Twitter)linkedin - LinkedInthreads - Threadsbluesky - Blueskymastodon - MastodonTypefully draft URLs contain the social set and draft IDs:
https://typefully.com/?a=<social_set_id>&d=<draft_id>
Example: https://typefully.com/?a=12345&d=67890
a=12345 → social_set_idd=67890 → draft_idWhen the user explicitly asks to add notes, ideas, or anything else in the draft scratchpad, use the --scratchpad flag—do NOT write to local files!
The --scratchpad option attaches internal notes directly to the Typefully draft. These notes:
# CORRECT: Notes attached to the draft in Typefully
typefully drafts create --social-set-id 123 --text "My post" --scratchpad "Ideas for expanding: 1) Add stats 2) Include quote"
# WRONG: Do NOT write notes to local files when the user wants them in Typefully
# Writing to /tmp/scratchpad/ or any local file is NOT the same thing
When automating posts, especially on X, follow these rules to keep accounts in good standing:
When in doubt, create drafts for user review rather than publishing directly.
Publishing 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.
--platform is omitted, the first connected platform is auto-selectedtypefully config set-platforms to save preferred platforms (e.g. x,linkedin,threads) — used automatically on every new drafttfly instead of typefully for all commandstfly with no args to get a guided prompt for text, platforms, and scheduletfly rm loads your drafts and lets you pick which to delete--all to post to all connected platforms at once--- on its own line to split into multiple posts (thread)next-free-slot to let Typefully pick the optimal time--platform x,linkedin--title for internal organization (not posted to social media)--scratchpad to attach notes to the draft in Typefully (NOT local files!) - perfect for thread ideas, research, context--file ./post.txt instead of --text to read content from a file--sort with values like created_at, -created_at, scheduled_date, etc.--json to any command for raw JSON output (useful for scripting)testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".
testing
Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).
testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".
testing
Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).