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.

Fix favicon to butterfly emoji, fix Tangled source link, add README

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

jack 79db1a20 c23c0e0d

+53 -28
+47 -23
README.md
··· 1 - This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). 1 + # 🦋 bsky.md — Bluesky as Markdown 2 2 3 - ## Getting Started 3 + **Live: https://bsky-md.vercel.app** 4 4 5 - First, run the development server: 5 + Fetch any public Bluesky content as clean, portable Markdown. No auth, no API key, just a URL. 6 6 7 - ```bash 8 - npm run dev 9 - # or 10 - yarn dev 11 - # or 12 - pnpm dev 13 - # or 14 - bun dev 15 - ``` 7 + ## Endpoints 16 8 17 - Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 9 + | Route | Description | 10 + |-------|-------------| 11 + | `GET /profile/:handle` | Bio, stats, avatar/banner | 12 + | `GET /profile/:handle/posts` | Paginated posts feed | 13 + | `GET /profile/:handle/post/:rkey` | Single post with embeds | 14 + | `GET /profile/:handle/post/:rkey/thread` | Full self-reply thread | 15 + | `GET /profile/:handle/feed/:rkey` | Public custom feed | 16 + | `GET /profile/:handle/likes` | Posts the user liked | 17 + | `GET /profile/:handle/followers` | Follower list | 18 + | `GET /profile/:handle/following` | Following list | 19 + | `GET /search?q=:query` | Full-text post search | 20 + | `GET /trending` | Trending topics right now | 21 + | `GET /llms.txt` | Machine-readable API guide for agents | 18 22 19 - You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 23 + ## Features 20 24 21 - This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. 25 + - Rich text facets → Markdown links (mentions, URLs, hashtags) 26 + - Image embeds with alt text + full CDN URLs 27 + - Video embeds (thumbnail + HLS link) 28 + - External link cards (title, description, thumbnail) 29 + - Quote posts rendered as blockquotes 30 + - Custom feeds (What's Hot, etc.) 31 + - Trending topics 32 + - Pagination cursors on all list endpoints 33 + - `Content-Type: text/markdown`, open CORS, edge-cached 22 34 23 - ## Learn More 35 + ## Usage 36 + 37 + ```bash 38 + # Profile 39 + curl https://bsky-md.vercel.app/profile/bsky.app 40 + 41 + # Posts 42 + curl https://bsky-md.vercel.app/profile/bsky.app/posts 43 + 44 + # What's Hot feed 45 + curl https://bsky-md.vercel.app/profile/bsky.app/feed/whats-hot 24 46 25 - To learn more about Next.js, take a look at the following resources: 47 + # Search 48 + curl "https://bsky-md.vercel.app/search?q=atproto" 26 49 27 - - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 - - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 50 + # Trending 51 + curl https://bsky-md.vercel.app/trending 52 + ``` 29 53 30 - You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! 54 + ## For LLMs 31 55 32 - ## Deploy on Vercel 56 + See [`/llms.txt`](https://bsky-md.vercel.app/llms.txt) for a machine-readable guide to every endpoint. 33 57 34 - The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 58 + ## Stack 35 59 36 - Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. 60 + Next.js 16 · TypeScript · `@atproto/api` · Deployed on Vercel
+3 -1
app/layout.tsx
··· 5 5 title: 'bsky.md — Bluesky as Markdown', 6 6 description: 7 7 'Fetch any public Bluesky profile, post, feed, or search as clean Markdown. No auth, no API key.', 8 - icons: { icon: '/icon.svg' }, 8 + icons: { 9 + icon: "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🦋</text></svg>", 10 + }, 9 11 } 10 12 11 13 export default function RootLayout({ children }: { children: React.ReactNode }) {
+3 -4
app/page.tsx
··· 189 189 <header className={s.header}> 190 190 <div className={s.nav}> 191 191 <a href="/" className={s.logo}> 192 - <img src="/icon.svg" alt="" className={s.logoIcon} /> 193 - bsky.md 192 + 🦋 bsky.md 194 193 </a> 195 194 <nav className={s.navLinks}> 196 195 <a href="/trending">Trending</a> 197 196 <a href="/llms.txt">llms.txt</a> 198 - <a href="https://tangled.org/did:plc:4hawmtgzjx3vclfyphbhfn7v/bsky-md" target="_blank" rel="noopener noreferrer"> 197 + <a href="https://tangled.org/j4ck.xyz/bsky-md" target="_blank" rel="noopener noreferrer"> 199 198 Source 200 199 </a> 201 200 </nav> ··· 341 340 <a href="/llms.txt">llms.txt</a> 342 341 <a href="/docs">API Docs</a> 343 342 <a href="/search?q=atproto">Search</a> 344 - <a href="https://tangled.org/did:plc:4hawmtgzjx3vclfyphbhfn7v/bsky-md" target="_blank" rel="noopener noreferrer"> 343 + <a href="https://tangled.org/j4ck.xyz/bsky-md" target="_blank" rel="noopener noreferrer"> 345 344 Source on Tangled 346 345 </a> 347 346 </div>