Reading X posts
SkillDev toolsRead tweets and threads from X (Twitter). Use when the user shares an x.com or twitter.com URL and wants to read a post or thread. Covers single-tweet extraction via oEmbed (no auth, instant) and full thread reading via Playwriter.
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Reading X posts skill
What this skill tells your AI
The instructions your AI receives, as published by remorses/opencode-config in skills/reading-x-posts/SKILL.md and read by ahel’s review.
Two methods depending on what you need.
Single tweet (oEmbed, preferred for one post)
Twitter's oEmbed endpoint returns the full text as JSON. No auth, no JS rendering, no rate limits.
curl -s 'https://publish.twitter.com/oembed?url=https://x.com/USER/status/ID' | jq -r '.html' | sed 's/<[^>]*>//g'
Or use WebFetch:
https://publish.twitter.com/oembed?url=https://x.com/USER/status/ID
The response JSON has html (blockquote with full tweet text), author_name, and author_url.
Limitation: oEmbed only returns the single tweet you request. It cannot fetch replies or thread continuations. You would need to know every reply's status ID upfront.
Full thread (Playwriter)
Use Playwriter when you need the full thread, replies, or any content beyond a single post. X is JS-heavy so webfetch/curl on the page itself returns an empty shell.
# 1. Create a session
playwriter session new
# 2. Navigate to the tweet
playwriter -s <ID> -e '
state.page = context.pages().find(p => p.url() === "about:blank") ?? await context.newPage();
await state.page.goto("https://x.com/USER/status/STATUSID", { waitUntil: "domcontentloaded" });
await waitForPageLoad({ page: state.page, timeout: 8000 });
'
# 3. Extract the full thread as markdown
playwriter -s <ID> -e '
const content = await getPageMarkdown({ page: state.page, showDiffSinceLastCall: false });
console.log(content);
'
getPageMarkdown uses Mozilla Readability (same as Firefox Reader View). It strips nav, sidebar, ads, and returns just the thread content. Much cleaner than querying individual [data-testid="tweetText"] elements.
Decision rule
- One tweet, just need the text -> oEmbed. Instant, zero setup.
- Full thread, replies, or visual context -> Playwriter. Requires a session but gets everything.
Never use webfetch or curl directly on x.com page URLs. The HTML is an empty JS shell.
Signals
- GitHub stars
- 43
- Forks
- 2
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
reading-x-posts- Source
- github.com/remorses/opencode-config
github.com/remorses/opencode-config
Related picks
Skill · thedaviddias
The pick for JavaScriptmodern-javascript-patterns
Skill · wshobson
The pick for JavaScripttwitter-automation
Skill · 101-skills
The pick for X / Twittertwitter-thread-style
Skill · dannote
The pick for X / Twitterlark-markdown
Skill · larksuite
The pick for Markdownmarkdown-mermaid-writing
Skill · k-dense-ai
The pick for Markdown