An API you can curl, or open in a browser, to receive Bluesky data as markdown!
11
fork

Configure Feed

Select the types of activity you want to include in your feed.

Migrate official host from bsky-md.vercel.app to bsky.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

jack b17f30dd 8d048d0e

+18 -18
+7 -7
README.md
··· 1 1 # 🦋 bsky.md — Bluesky as Markdown 2 2 3 - **Live: https://bsky-md.vercel.app** 3 + **Live: https://bsky.md** 4 4 5 5 Fetch any public Bluesky content as clean, portable Markdown. No auth, no API key, just a URL. 6 6 ··· 36 36 37 37 ```bash 38 38 # Profile 39 - curl https://bsky-md.vercel.app/profile/bsky.app 39 + curl https://bsky.md/profile/bsky.app 40 40 41 41 # Posts 42 - curl https://bsky-md.vercel.app/profile/bsky.app/posts 42 + curl https://bsky.md/profile/bsky.app/posts 43 43 44 44 # What's Hot feed 45 - curl https://bsky-md.vercel.app/profile/bsky.app/feed/whats-hot 45 + curl https://bsky.md/profile/bsky.app/feed/whats-hot 46 46 47 47 # Search 48 - curl "https://bsky-md.vercel.app/search?q=atproto" 48 + curl "https://bsky.md/search?q=atproto" 49 49 50 50 # Trending 51 - curl https://bsky-md.vercel.app/trending 51 + curl https://bsky.md/trending 52 52 ``` 53 53 54 54 ## For LLMs 55 55 56 - See [`/llms.txt`](https://bsky-md.vercel.app/llms.txt) for a machine-readable guide to every endpoint. 56 + See [`/llms.txt`](https://bsky.md/llms.txt) for a machine-readable guide to every endpoint. 57 57 58 58 ## Self-hosting with Docker 59 59
+1 -1
app/cli/route.ts
··· 4 4 export const revalidate = 3600 5 5 6 6 export function GET(req: NextRequest) { 7 - const host = req.headers.get('host') ?? 'bsky-md.vercel.app' 7 + const host = req.headers.get('host') ?? 'bsky.md' 8 8 const scheme = host.startsWith('localhost') ? 'http' : 'https' 9 9 const base = `${scheme}://${host}` 10 10
+1 -1
app/layout.tsx
··· 2 2 import './globals.css' 3 3 import FollowPrompt from './components/FollowPrompt' 4 4 5 - const BASE = 'https://bsky-md.vercel.app' 5 + const BASE = 'https://bsky.md' 6 6 7 7 export const metadata: Metadata = { 8 8 title: 'bsky.md — Bluesky as Markdown',
+9 -9
app/page.tsx
··· 348 348 </div> 349 349 <pre className={s.terminalCode}>{[ 350 350 '# Profile', 351 - 'curl https://bsky-md.vercel.app/profile/j4ck.xyz', 351 + 'curl https://bsky.md/profile/j4ck.xyz', 352 352 '', 353 353 '# Recent posts', 354 - 'curl https://bsky-md.vercel.app/profile/mackuba.eu/posts', 354 + 'curl https://bsky.md/profile/mackuba.eu/posts', 355 355 '', 356 356 '# Followers', 357 - 'curl https://bsky-md.vercel.app/profile/j4ck.xyz/followers', 357 + 'curl https://bsky.md/profile/j4ck.xyz/followers', 358 358 '', 359 359 '# Search', 360 - 'curl "https://bsky-md.vercel.app/search?q=atproto"', 360 + 'curl "https://bsky.md/search?q=atproto"', 361 361 '', 362 362 '# Trending topics', 363 - 'curl https://bsky-md.vercel.app/trending', 363 + 'curl https://bsky.md/trending', 364 364 '', 365 365 '# Custom feed', 366 - 'curl https://bsky-md.vercel.app/profile/bsky.app/feed/whats-hot', 366 + 'curl https://bsky.md/profile/bsky.app/feed/whats-hot', 367 367 '', 368 368 '# Agent skill file', 369 - 'curl -s https://bsky-md.vercel.app/skill.md > ~/.claude/commands/bsky.md', 369 + 'curl -s https://bsky.md/skill.md > ~/.claude/commands/bsky.md', 370 370 ].join('\n')}</pre> 371 371 </div> 372 372 <p className={s.terminalHint}> ··· 422 422 View raw ↗ 423 423 </a> 424 424 <span className={s.agentFooterHint}> 425 - or <code>curl -s https://bsky-md.vercel.app/skill.md {'>'} ~/.claude/commands/bsky.md</code> for Claude Code 425 + or <code>curl -s https://bsky.md/skill.md {'>'} ~/.claude/commands/bsky.md</code> for Claude Code 426 426 </span> 427 427 </div> 428 428 </div> ··· 439 439 Source on Tangled 440 440 </a> 441 441 </div> 442 - <p className={s.footerNote}>Content-Type: text/markdown · bsky-md.vercel.app</p> 442 + <p className={s.footerNote}>Content-Type: text/markdown · bsky.md</p> 443 443 </footer> 444 444 </div> 445 445 )