Open source · Free · No account

Tweets are just markdown now.

Treat them that way. Swap x.com for x.pcstyle.dev in any public post URL and the post, its thread, or the full article comes back as Markdown your agent can read.

Opens the converted post in a new tab — the same result as swapping the host by hand.

x.pcstyle.dev/trq212/status/2052809885763747935 text/markdown
## 1/2 — Thariq (@trq212)

Source: https://x.com/trq212/status/2052809885763747935
Stats: 17,717 likes · 2,275 reposts

## Using Claude Code: The Unreasonable
   Effectiveness of HTML

Markdown has become the dominant file
format used by agents to communicate
with us…

You see the same post either way. Your agent doesn't.

$ curl x.com/trq212/status/2052809885763747935

no content
<!DOCTYPE html><html lang="en" dir="ltr"
data-app-env="prod"><head><meta charSet="utf-8"
nonce="JCApsPM44mDDnid3Yl…"><meta
name="viewport" content="width=device-width…

…hundreds of KB of markup,
zero post text…

JavaScript is not available.

$ curl x.pcstyle.dev/trq212/status/2052809885763747935

markdown
## 1/2 — Thariq (@trq212)

Source: x.com/trq212/status/…
Stats: 17,717 likes · 14.4M views

## Using Claude Code: The
   Unreasonable Effectiveness
   of HTML

Markdown has become the dominant
file format used by agents to
communicate with us…

Pipe it anywhere

The response is plain text/markdown, so curl … > post.md drops a tweet straight into your vault.

Your notes, your scripts, and your agents all speak Markdown. X speaks JavaScript. x.md is the translation layer: keep the URL, change the host, read the post.

Nothing important gets dropped.

Conversion keeps the parts that matter when you're saving a post for later — or feeding it to a model.

Threads

The full reply chain comes back by default, numbered in order. Add ?thread=off when you only want the one post.

Media

Images and video survive as Markdown links instead of disappearing into a player.

Quote posts

Quoted posts are nested inline where they appear, not dropped or reduced to a bare link.

X Articles

Long-form articles convert with their full body — headings, lists, and embedded posts included.

Obsidian frontmatter

?format=obsidian adds YAML frontmatter with author, date, and source URL, ready for your vault.

Three ways to point an agent at it.

One line is enough: "To read an X post, swap x.com for x.pcstyle.dev." Every agent that can fetch a URL now reads tweets.

One command teaches Amp, Claude Code, and friends the host swap permanently.

$ bunx skills add pc-style/x-md -g -y

GET /api/v1/posts?url=… returns the same Markdown with JSON and raw variants. Every route, parameter, and limit is written down in the API documentation and described again in OpenAPI.

Common questions.

Do I need an X or Twitter API key to use x.md?

No. The hosted service reads public X content through public upstream providers, so there is no X API key, no developer account, and no sign-in of any kind. Rate limits take the place of authentication.

Does it return whole threads, or only a single post?

Whole threads by default. A status URL returns the conversation: parent posts, the author thread numbered in order, and top replies. Add ?thread=off for only the requested post, or ?context=thread to leave out unrelated replies.

Can x.md read private, protected, or deleted posts?

No. x.md only returns what X already serves publicly. Protected and private accounts, suspended accounts, and deleted posts are never available, and X Lists and direct messages are not supported.

Is there a rate limit?

Yes. Live search is the scarce path: public callers get 5 uncached searches per minute per IP address, plus a further per-IP budget over a fifteen-minute window. Post and profile reads are cached for an hour by default, so repeat reads of the same URL usually never reach upstream.

Can x.md post, reply, follow, or like on my behalf?

No. x.md is strictly read-only. It has no write path to X, never holds your credentials, and cannot act on any account.

What output formats are available?

Compact Markdown by default. Add ?full=true for dates and metrics, ?format=obsidian for YAML frontmatter, or ?format=json (or an Accept: application/json header) for structured JSON carrying both the rendered Markdown and the raw post data.

How do I point an agent at it?

Three ways: tell the agent in its prompt to swap x.com for x.pcstyle.dev, install the browse-x skill, or call the documented HTTP API described at /docs, /openapi.json, and /mcp.

Read a post the way your agent does.

MIT-licensed. Fork it, deploy to Vercel, and the same swap works on your own domain.