tweet-replicate
Tweet Replicate
Freeze a public X/Twitter post into a rerenderable local build that always emits a high-quality tweet-replica.mp4 master and a companion tweet-replica.gif preview, with only the GIF kept under 24 MB.
Verified against live public statuses on April 9, 2026.
Call-Bluff First
Do not promise a browser-level or forever-stable clone of X. X can change layout, metrics drift, media URLs expire, and the local renderer is intentionally deterministic rather than a replay of X's private renderer.
What this skill does well:
- capture a public status into a frozen
snapshot.json - download the avatar and primary media locally at the highest available quality
- rebuild the tweet chrome in deterministic local HTML/CSS
- record the replica viewport with Playwright without creating a larger padded stage around the tweet
- export a high-quality MP4 master and a companion GIF in the same directory
Decision Tree
- If the user wants one public X/Twitter post rebuilt as local video assets, run
scripts/render_tweet_replica.py. - If they only need tweet text, metrics, or media URLs, use a text/media extraction workflow instead of this skill.
- If they only need the raw media file, use a media downloader instead of this skill.
- If they want a live browser capture of X itself, stop and explain that this skill is for deterministic local replicas, not recordings of the real X UI.
- If they need full threads, deep quote stacks, carousels, or authenticated states, explain that this version supports one public status plus one nested quoted post card.
Default Save Path Rule
When the user does not give a destination, propose ./pieces/ first. If they agree or do not care, run with --save-root ./pieces or let the script default to the current working directory's pieces/ folder.
The generated build layout stays the same:
<save-root>/tweet-replicate-status-<id>-<timestamp>/
assets/
snapshot.json
tweet-replica.html
capture.webm
tweet-replica.mp4
tweet-replica.gif
Quick Reference
| Task | Command | Why |
|---|---|---|
| Render from a status URL into the default designated save root | python3 scripts/render_tweet_replica.py 'https://x.com/.../status/...' --save-root ./pieces |
Creates a rerenderable build folder under ./pieces/ with a high-quality MP4 master |
| Re-render the same frozen post later | python3 scripts/render_tweet_replica.py ./tweet-build/snapshot.json |
Saves beside the snapshot and avoids count drift |
| Keep everything in one named build folder | python3 scripts/render_tweet_replica.py '<url>' --workdir ./tweet-build |
Leaves snapshot, local high-quality assets, HTML, WebM, MP4, and GIF together |
| Inspect the extracted snapshot only | python3 scripts/fetch_tweet_snapshot.py '<url>' --output ./tweet-build/snapshot.json --asset-dir ./tweet-build/assets |
Useful before layout tuning |
| Record a prepared HTML replica only | python3 scripts/record_tweet_replica.py ./tweet-build/tweet-replica.html ./tweet-build/capture.webm |
Useful when tuning CSS without refetching |
| Run real pipeline checks against live tweet URLs | python3 scripts/probe_tweet_replica.py 'https://x.com/.../status/...' --save-root ./tmp-tests --cleanup |
Verifies MP4, GIF, durations, GIF size cap, and output frame geometry |
Scope
Positive triggers
- "replicate this tweet"
- "replicate this X post"
- "turn this tweet into mp4 and gif"
- "freeze this tweet into video"
- "make this status look like X"
- "tweet screenshot but playable"
- "preserve caption, counts, playback, and a rerenderable build"
Negative triggers
- simple tweet reading or extraction
- raw media download only
- live embed debugging
- feeds, search pages, DMs, Spaces
- multi-post thread cinematics
- claims that the output is an exact browser-level clone of X
Working Rule
Treat the snapshot as the truth, not the live tweet page. Fetch once, freeze the data, keep the downloaded local media at full quality, then iterate locally from snapshot.json.
Reading Guide
| Need | Read |
|---|---|
| End-to-end workflow, save-root behavior, and artefact layout | references/workflow.md |
| Layout heuristics, sizing rules, and tuning knobs | references/layout.md |
| Failure modes, GIF sizing, drift, and unsupported cases | references/gotchas.md |
Gotchas
- Counts drift quickly. Re-render from
snapshot.jsonwhen the user cares about likes, reposts, or views from a specific moment. - The GIF is a preview asset, not a second master video. The renderer keeps the MP4 as the high-quality master and only lowers GIF resolution, frame rate, and palette depth as needed to stay under 24 MB.
- This renderer rebuilds the tweet chrome locally. It does not claim byte-for-byte or pixel-for-pixel parity with X's own renderer.
- Public X media URLs can expire. Keep the downloaded local media inside the workdir if the output may need to be reproduced later.
- Playwright's viewport recording is visual-only. The final MP4 preserves the recorded visual master at high quality and muxes original media audio back in when a local video file has an audio stream. The GIF never carries audio.
- One nested quoted post is supported, including quoted video playback, but deeper quote chains and full thread reconstruction are out of scope.
- The rendered WebM and MP4 should match the tweet canvas width and the measured tweet height. If the post appears stuck in the upper-left with extra gray or empty space, fix the capture geometry before retuning the tweet CSS.
More from jpcaparas/skills
markdown-new
Use markdown.new when the user explicitly wants markdown.new, Cloudflare Markdown for Agents, URL-to-Markdown conversion, file-to-Markdown conversion, crawl-to-Markdown, or the hosted markdown.new editor. Trigger on: 'markdown.new', 'convert this URL to markdown', 'crawl this docs site into markdown', 'file to markdown', 'upload this PDF to markdown', 'markdown.new API', or 'markdown editor'. Do NOT trigger for generic web search/scraping when another tool is enough, or for editing local Markdown without using the markdown.new service.
34skill-creator-advanced
Advanced skill creator for mission-critical, installable skills — API wrappers, progressively-disclosed technical documentation, CLI tool integrations, and complex multi-reference skills. Use when creating or improving skills that demand rigorous progressive disclosure, verified examples, tested operations, cross-harness compatibility, smart placement into the right repo-local or global skills directory, and self-improvement feedback loops. Triggers on: 'advanced skill', 'create API skill', 'create wrapper skill', 'production skill', 'installable skill', 'improve this skill for progressive disclosure', 'rigorous skill', 'mission-critical skill', or when skill-creator's output needs to be more thorough. Also use when upgrading an existing skill to production quality.
34synthetic-search
Use this skill when the user explicitly wants Synthetic Search, the Synthetic API, `api.synthetic.new`, `SYNTHETIC_API_KEY`, or zero-data-retention web search with raw `curl`/`jq` examples. It covers live-verified search requests, quota checks, and a zero-dependency Node helper for readable output. Triggers on: 'Synthetic Search', 'Synthetic API', 'api.synthetic.new', 'SYNTHETIC_API_KEY', 'Synthetic quotas'. Do NOT trigger for general browser automation, full-site crawling, or unrelated search providers.
32azure-devops-wiki-markdown
Use when writing, fixing, or reviewing Azure DevOps wiki Markdown, Mermaid diagrams, `_TOC_` and `_TOSP_`, collapsible `<details>` blocks, query-table embeds, `@` mentions, work-item links, KaTeX math, HTML video embeds, code fences, or Azure DevOps surface-specific support differences across Wiki, PR, README, Widget, and Done fields. Triggers on Azure DevOps wiki, markdown guidance, Mermaid sequence/graph/timeline/ER diagrams, proposal decision trees, table-of-subpages, query-table, code fence aliases, line-break bugs, and wiki page formatting. Do NOT use for GitHub-only Markdown, generic Mermaid authoring outside Azure DevOps, or non-Azure documentation platforms.
32ripgrep
Prefer ripgrep (`rg`) for text search, recursive codebase search, ignore-aware grep replacement, filename discovery via `rg --files`, and machine-readable search output. Use when the user asks to search for text, find occurrences, inspect a large tree, locate files by name or pattern, or when `grep`, `grep -R`, `find | grep`, or manual file reads would be slower. Triggers on: 'search for', 'find occurrences', 'grep', 'grep -R', 'ripgrep', 'rg', 'find files', 'look for pattern'. Do NOT trigger for reading entire files, structured JSON queries better handled by `jq`, or filesystem metadata tasks that need `find` or `fd`.
31nanobanana-infographic
Create sleek, low-noise infographics with Nano Banana 2 for blog posts, executive decks, reports, and editorial explainers. Use when the user wants infographic prompt variants, Nano Banana 2 image-generation guidance, or render workflows that avoid clutter, poster energy, and filler. Triggers on: 'infographic', 'Nano Banana 2', 'Gemini image', 'executive visual', 'blog diagram', 'presentation visual'. Do NOT trigger for photorealistic art, mascot illustrations, logo design, meme cards, or raw dashboard screenshots.
31