{"id":51423753,"url":"https://github.com/sergebulaev/x-skills","last_synced_at":"2026-07-08T06:00:28.437Z","repository":{"id":369375265,"uuid":"1286762321","full_name":"sergebulaev/x-skills","owner":"sergebulaev","description":"X (Twitter) marketing skills for Claude Code and Codex: write tweets, threads, and replies in your voice, strip AI tells, and publish via Publora. Open source, MIT.","archived":false,"fork":false,"pushed_at":"2026-07-05T00:29:28.000Z","size":4162,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-05T02:04:31.104Z","etag":null,"topics":["ai-agents","ai-marketing","claude-code","claude-skills","codex","content-creation","marketing-automation","publora","social-media-marketing","tweets","twitter","twitter-marketing","x-twitter"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sergebulaev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-02T04:36:57.000Z","updated_at":"2026-07-05T00:29:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sergebulaev/x-skills","commit_stats":null,"previous_names":["sergebulaev/x-skills"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/sergebulaev/x-skills","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergebulaev%2Fx-skills","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergebulaev%2Fx-skills/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergebulaev%2Fx-skills/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergebulaev%2Fx-skills/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sergebulaev","download_url":"https://codeload.github.com/sergebulaev/x-skills/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sergebulaev%2Fx-skills/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35253863,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","ai-marketing","claude-code","claude-skills","codex","content-creation","marketing-automation","publora","social-media-marketing","tweets","twitter","twitter-marketing","x-twitter"],"created_at":"2026-07-05T01:17:08.350Z","updated_at":"2026-07-08T06:00:28.422Z","avatar_url":"https://github.com/sergebulaev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/hero.png\" alt=\"X (Twitter) marketing skills for Claude Code and Codex, open source MIT licensed\" width=\"900\" /\u003e\n\u003c/p\u003e\n\n# X (Twitter) Marketing Skills for Claude Code and Codex\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/sergebulaev/x-skills?color=111827\u0026label=release\" alt=\"Latest release\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Claude_Code-Compatible-D97757?logo=anthropic\u0026logoColor=white\" alt=\"Claude Code Compatible\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Codex-Compatible-111827\" alt=\"Codex Compatible\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Claude-Skills-8A63D2\" alt=\"Claude Skills\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-22C55E.svg\" alt=\"MIT License\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/sergebulaev/x-skills?style=social\" alt=\"GitHub stars\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/PRs-welcome-F59E0B.svg\" alt=\"PRs Welcome\"\u003e\n\u003c/p\u003e\n\n6 skills that help Claude Code and Codex write tweets, threads, and replies on X (Twitter) in your voice. They draft content, strip AI tells, and wait for your approval before anything gets published. No coding required.\n\n## Install\n\nPick whichever way you use Claude Code or Codex:\n\n### Codex CLI\n\n```bash\ncodex plugin marketplace add sergebulaev/x-skills\ncodex plugin add x-skills@x-skills\n```\n\nTo test a local clone before publishing changes:\n\n```bash\ngit clone https://github.com/sergebulaev/x-skills.git\ncd x-skills\ncodex plugin marketplace add .\ncodex plugin add x-skills@x-skills\n```\n\n### claude.ai (web)\n\n1. Open https://claude.ai/code\n2. Go to **Skills** in the sidebar\n3. Click **Add from GitHub**\n4. Paste: `sergebulaev/x-skills`\n5. Done. The skills activate automatically when you ask about X or Twitter.\n\n### Claude Desktop (Mac / Windows)\n\n1. Open Claude Desktop\n2. Open **Settings** (gear icon)\n3. Go to **Skills**\n4. Click **Add from GitHub**\n5. Paste: `sergebulaev/x-skills`\n6. Done. Start a new conversation and ask Claude to write a tweet.\n\n### Claude Code (CLI / VS Code / JetBrains)\n\n```\n/plugin marketplace add sergebulaev/x-skills\n/plugin install x-skills@x-skills\n```\n\nOr clone the repo and open it as your working directory:\n\n```bash\ngit clone https://github.com/sergebulaev/x-skills.git\ncd x-skills\n```\n\n### Any agent (skills CLI)\n\nOne command that works across Claude Code, Codex, Cursor, and any other agent that reads SKILL.md files:\n\n```bash\nnpx skills add sergebulaev/x-skills\n```\n\n## What you can do\n\nOnce installed, just ask Claude Code or Codex for help with X. The right skill activates automatically.\n\n**Write a tweet:**\n\u003e \"Write me a tweet about why most AI agents fail on retries, not reasoning. Make it sharp.\"\n\n**Turn an idea into a thread:**\n\u003e \"Turn my notes into a thread on how we cut agent latency from 9s to 2.1s.\"\n\n**Check a draft before posting:**\n\u003e \"Audit this tweet for AI tells and the 280-char limit: [paste your text]\"\n\n**Reverse-engineer a viral tweet:**\n\u003e \"What hook does this thread use? https://x.com/someone/status/123 (I'll paste the text)\"\n\n**Reply to a creator:**\n\u003e \"Draft a reply to this tweet, I want to add value not dunk: https://x.com/someone/status/123\"\n\n**Plan your week:**\n\u003e \"Plan a week of X content. I'm building an AI agent in public for indie devs.\"\n\nEvery skill shows you a draft first and waits for your OK. Nothing gets posted without your approval.\n\n## The 6 skills\n\n| Skill | What it does |\n|---|---|\n| **Post Writer** | Drafts a single tweet (or short auto-thread) using a 2026 X hook formula picked by goal: replies, reposts, likes, or bookmarks. Respects the 280-char limit (25,000 on Premium) |\n| **Thread Builder** | Builds long-form tweetstorms (listicle, story, curiosity-gap, how-I teardown). Structures tweet 1 as a promise plus open loop, front-loads value, closes for the repost |\n| **Humanizer** | Strips em dashes, AI vocabulary (\"leverage\", \"delve\", \"harness\"), rule-of-three lists, and uniform tweet rhythm. Bundles a `--mode audit` pre-publish check (280-char fit, hook, hashtags, link placement) |\n| **Hook Extractor** | Reverse-engineers the hook from any viral tweet or thread. Maps it to one of the 10 X formulas and returns a blank template you can fill |\n| **Reply Drafter** | Drafts a reply or a value-add quote tweet for any tweet URL. Decides reply vs quote tweet. X has no LinkedIn-style thread flattening, so a reply is just a tweet |\n| **Content Planner** | Creates a weekly plan with a single-to-thread mix, per-day hooks, posting times, daily reply targets, and a goal-mix balance check |\n\n## How threads work on X\n\nX caps a standard tweet at **280 characters** (emoji count as 2 each), or **25,000** on X Premium. For anything longer, you build a thread. Doing that on the native X API means posting tweet 1, capturing its id, posting tweet 2 as a reply to it, and handling partial failures.\n\nThis bundle hands the whole chain to [Publora](https://publora.com). You write the thread as one block (or split it with `---`), and Publora auto-splits it into a numbered `(1/N)` thread at sentence boundaries, reserves room for the marker, and posts it in one call. The Thread Builder and Post Writer skills use this on approval.\n\n## Optional: auto-post with Publora\n\nBy default, the skills draft content for you to copy-paste into X. If you want Claude Code or Codex to publish tweets and threads directly, connect Publora. It takes about 2 minutes.\n\n### What is Publora?\n\n[Publora](https://publora.com) is a publishing API that turns one `create-post` call into a full X thread (and can cross-post the same content to LinkedIn, Threads, and more).\n\n### Setup (2 minutes)\n\n**Step 1.** Sign up at https://app.publora.com/signup (free)\n\n**Step 2.** Connect X: click **Channels** in the left sidebar, then **Add Channel**, pick **X / Twitter**, authorize.\n\n**Step 3.** Find your Platform ID: go to **Channels**, click your X account. The ID looks like `twitter-123456789`. Copy the whole thing including `twitter-`.\n\n**Step 4.** Get your API key: click **Settings** (gear icon, bottom-left), then **API**, then **Create Key**. Copy the `sk_...` string.\n\n**Step 5.** Create a file called `.env` in the x-skills folder:\n\n```\nPUBLORA_API_KEY=sk_paste_your_key_here\nX_PLATFORM_ID=twitter-paste_your_id_here\n```\n\nIf you cloned the repo, copy the template instead:\n\n```bash\ncp .env.example .env\n```\n\nThen open `.env` and replace the placeholders with your real values.\n\n**Step 6.** Install two small Python packages:\n\n```bash\npip install requests python-dotenv\n```\n\n**Step 7.** Test it. Ask Claude Code or Codex:\n\n\u003e \"Schedule a test tweet via Publora 24 hours from now: 'testing the API connection, will cancel in dashboard'.\"\n\nIf Publora returns a `postGroupId`, you're set. Cancel the post in the Publora dashboard before the scheduled time. If you get HTTP 401, your API key is wrong. If you get a `Invalid platform ID format` error, your `X_PLATFORM_ID` is wrong. See [Troubleshooting](#troubleshooting).\n\n\u003e **Note on replies:** X has no reply endpoint on Publora, so the Reply Drafter always returns its draft as a copy-paste block for you to post yourself. Single tweets and threads auto-publish.\n\n## Voice rules\n\nEvery skill follows these rules automatically:\n\n1. No em dashes. Biggest AI tell in 2026.\n2. Capitalize names. Always. Lowercase a brand reads as careless.\n3. No AI vocabulary: \"leverage\", \"fundamentally\", \"streamline\", \"harness\", \"delve\", \"unlock\", \"foster\".\n4. Specific numbers beat adjectives. \"2.4x\" beats \"way better\".\n5. One idea per tweet. The first line carries everything (no \"see more\" fold on X).\n6. 280 chars per tweet on a standard account (emoji = 2 each). 0-1 hashtag, 0-1 emoji.\n\n## Troubleshooting\n\n| Problem | Fix |\n|---|---|\n| Skills don't activate when I ask about X | Make sure you installed via the Skills panel, `/plugin install`, or `codex plugin add`. Try a new conversation. |\n| \"PUBLORA_API_KEY not set\" | Your `.env` file is missing or in the wrong folder. It should be in the `x-skills/` root. |\n| \"401 Invalid API key\" from Publora | Your API key is wrong or revoked. Go to Publora Settings \u003e API \u003e Create a new key. |\n| \"Invalid platform ID format\" | Your `X_PLATFORM_ID` is wrong. Go to Publora Channels and copy the full `twitter-...` string. |\n| My tweet got cut off / split unexpectedly | Emoji count as 2 chars on X. A 278-char tweet with two emoji is over 280, so Publora splits it. Tighten it or make it a deliberate thread. |\n| My reply didn't auto-post | X replies have no Publora endpoint by design. The Reply Drafter returns a copy-paste block. Post it yourself. |\n| `pip install` fails | Use a virtual environment: `python -m venv venv \u0026\u0026 source venv/bin/activate \u0026\u0026 pip install requests python-dotenv` |\n\n## Cross-cutting references\n\n- [`references/hook-formulas.md`](references/hook-formulas.md) - the 10 X hook formulas with skeletons and goal tags\n- [`references/algorithm-heuristics.md`](references/algorithm-heuristics.md) - 2026 X ranking signals, timing, and limits\n- [`references/voice-rules.md`](references/voice-rules.md) - the canonical voice rules every skill inherits\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eFor developers: runtime compatibility, URL parsing, and internals\u003c/b\u003e\u003c/summary\u003e\n\n## Runtime compatibility\n\n```\nx-skills/\n  skills/             SKILL.md frontmatter; native to Claude Code and Codex, others read as markdown\n  .codex-marketplace/ generated nested Codex package (run scripts/sync_codex_marketplace.py)\n  lib/                pure Python, works in any agent runtime\n  references/         pure markdown, works anywhere\n  scripts/            pure Python CLI, works anywhere\n```\n\n| Runtime | Auto-discovers skills? | Setup |\n|---|---|---|\n| **Claude Code** (CLI, Desktop, Web, IDE) | Yes | Install via plugin or clone. Skills activate on matching prompts. |\n| **Codex CLI** | Yes | `codex plugin marketplace add sergebulaev/x-skills` and `codex plugin add x-skills@x-skills`. |\n| **Anthropic Managed Agents** (`/v1/agents`) | Yes | Pass skill files in the agent context. |\n| **Cursor / Cline / Aider** | Manual | Read `SKILL.md` files as prompt context; import `lib/` as Python. |\n| **LangChain / AutoGen** | No | Use `lib/` as a package; feed `references/` as prompt context. |\n\n## Generic Python agent quickstart\n\n```python\nimport sys; sys.path.insert(0, \"path/to/x-skills\")\nfrom lib import parse_x_url, PubloraClient, publish\n\nparsed = parse_x_url(\"https://x.com/paulg/status/1790000000000000000?s=20\")\nprint(parsed[\"handle\"], parsed[\"tweet_id\"])  # paulg 1790000000000000000\n\n# Write side (Publora) - a single tweet or a thread (long content auto-splits)\nclient = PubloraClient()  # reads PUBLORA_API_KEY from env\nclient.create_post(\n    content=\"First tweet of the thread\\n\\n---\\n\\nSecond tweet\\n\\n---\\n\\nThird tweet\",\n    platforms=[\"twitter-123456789\"],\n)\n\n# Or use the high-level wrapper that handles manual / Publora / diy routing\npublish(\"thread\", draft_text=\"...\", target_url=\"https://x.com/compose/tweet\",\n        platforms=[\"twitter-123456789\"])\n```\n\n## URL handling\n\n`lib/url_parser.py` parses X tweet and profile URLs on both hosts:\n\n| URL fragment | Parsed |\n|---|---|\n| `x.com/HANDLE/status/ID` | `{handle, tweet_id, url_type: \"tweet\"}` |\n| `twitter.com/HANDLE/status/ID` | same (normalized to x.com) |\n| `x.com/i/web/status/ID` | `{tweet_id, url_type: \"tweet\"}` |\n| `x.com/HANDLE` | `{handle, url_type: \"profile\"}` |\n\n```bash\npython lib/url_parser.py \"https://x.com/paulg/status/1790000000000000000\"\n```\n\n## Why a reply is just a tweet\n\nLinkedIn flattens reply threads to 2 levels and needs the top-level comment URN as the parent. X does not: replies nest naturally and there is no parent-comment URN to resolve. The Reply Drafter therefore just drafts the text. Publora has no `in_reply_to` on `create-post`, so reply publishing is a copy-paste step by design.\n\n\u003c/details\u003e\n\n## References\n\n- [Publora API docs](https://docs.publora.com) - endpoint reference for the publishing layer\n- [The X recommendation algorithm](https://github.com/twitter/the-algorithm) - the open-sourced ranker behind the 2026 heuristics\n\n## License\n\nMIT. Powered by [Publora](https://publora.com).\n\n## Related open-source skill bundles\n\nPart of a family of AI social-media marketing skill bundles for Claude Code and Codex:\n\n- [linkedin-skills](https://github.com/sergebulaev/linkedin-skills) - LinkedIn\n- **x-skills - X (Twitter) (this repo)**\n- [instagram-skills](https://github.com/sergebulaev/instagram-skills) - Instagram\n- [youtube-skills](https://github.com/sergebulaev/youtube-skills) - YouTube\n- [threads-skills](https://github.com/sergebulaev/threads-skills) - Threads\n- [tiktok-skills](https://github.com/sergebulaev/tiktok-skills) - TikTok\n- [facebook-skills](https://github.com/sergebulaev/facebook-skills) - Facebook Pages\n\nAlso: [Anthropic Skills repo](https://github.com/anthropics/skills), the `awesome-claude-skills` directory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsergebulaev%2Fx-skills","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsergebulaev%2Fx-skills","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsergebulaev%2Fx-skills/lists"}