[![Awesome](https://awesome.re/badge.svg)](https://awesome.re)
# Awesome ATProto > [AT Protocol](https://atproto.com/) is a federated protocol for building social applications on an open, decentralized network ## Contents * [AT Protocol](#at-protocol) * [References](#references) * [Articles](#articles) * [Browsers](#browsers) * [Platforms](#platforms) * [Bluesky](#bluesky) * [Tools](#tools) * [Lexicons](#lexicons) ## AT Protocol ### References * [Glossary](https://atproto.com/guides/glossary) - Quick reference to AT Protocol terms. * [Lexicons, Pinned Posts, and Interoperability](https://docs.bsky.app/blog/pinned-posts) - Post-mortem about the evolution of lexicons and lessons learned. * [Quick start guide to building applications on AT Protocol](https://atproto.com/guides/applications) - Guide to create a basic ATProto application. ### Articles * [First impressions of Bluesky's AT Protocol](https://educatedguesswork.org/posts/atproto-firstlook/) - In-depth analysis of Bluesky's ATProto, highlighting its aim to create a decentralized social media architecture. * [Nostr and ATProto](https://shreyanjain.net/2024/07/05/nostr-and-atproto.html) - Comparison of Nostr and ATProto, two decentralized social media protocols, exploring their origins, similarities, and differences. * [How decentralized is Bluesky really?](https://dustycloud.org/blog/how-decentralized-is-bluesky/) - Critical examination of Bluesky's decentralization claims and its architectural challenges compared to established protocols. * [Reply on Bluesky and Decentralization](https://whtwnd.com/bnewbold.net/3lbvbtqrg5t2t) - Reply to Christine Lemmer-Webber's thoughtful (and widely read) "How decentralized is Bluesky really?" blog post. * [What is atproto.com good for?](https://bnewbold.net/2022/atproto_thoughts/) - Technical exploration of ATProto's design principles, architectural challenges, and potential limitations as a decentralized social media protocol. * [The AT Protocol Architecture](https://hackernoon.com/the-at-protocol-architecture) - Analysis of the ATProto's architecture. * [Notes on Running a Full-Network atproto Relay (July 2024)](https://whtwnd.com/bnewbold.net/entries/Notes%20on%20Running%20a%20Full-Network%20atproto%20Relay%20(July%202024)) - Experience about running an ATProto relay. ## Browsers * [PDSls](https://pdsls.dev/) - ATProto repositories browser. * [ATProto Browser](https://atproto-browser.vercel.app/) - ATProto URIs browser. ## Platforms * [Bluesky](https://bsky.social) - The beloved social network and main ATProto platform. * [Blue Place](https://place.blue/) - Massive real-time collaborative canvas. * [Bookhive](https://bookhive.buzz/) - Goodreads alternative. * [Frontpage](https://frontpage.fyi/) - Federated link aggregator. * [GrayHaze](https://grayhaze.live/about) - Live streaming service (alpha). * [Linkat](https://linkat.blue/) - Link in bio for Bluesky. * [Pastesphere](https://pastesphere.link/) - Pastebin alternative. * [Picosky](https://psky.social/) - ATProto chatting appview. * [PinkSea](https://pinksea.art/) - Oekaki BBS. * [recipe.exchange](https://recipe.exchange/) - Cooking recipes sharing. * [Skylights](https://skylights.my/) - Book reviews. * [Smoke Signal](https://smokesignal.events/) - Event creation and managing. * [Sparta Social](https://github.com/dblock/sparta-social) - Exercise activity tracker (wip). * [Whitewind](https://whtwnd.com/) - Markdown blog service using ATProto with no registration required. ### Bluesky * [ClearSky](https://clearsky.app/) - Tool to explore Bluesky accounts. * [cleanfollow](https://cleanfollow-bsky.pages.dev/) - Select inactive or blocked accounts to unfollow. * [Handles directory](https://blue.mackuba.eu/directory/) - Handles ranking by TLDs. * [Labellers](https://blue.mackuba.eu/labellers/) - List of known labellers. * [BluSki account history](https://mocku.me/nt/#%23+BluSki+account+history//%23%23+Whose+history%3F//Let's+pick+a+rando+hot+poster+from+Discovery+feed+--//%60%60%60JavaScript/%2F%2F+downloading+Discovery+feed+posts/let+discoveryFeedPosts+=+(await+fetch(/++'https:%2F%2Fapi.bsky.app%2Fxrpc%2Fapp.bsky.feed.getFeed%3Ffeed=at:%2F%2Fdid:plc:z72i7hdynmk6r22z27h6tvur%2Fapp.bsky.feed.generator%2Fwhats-hot%26limit=100',/++%7B+headers:+%7B+'accept-language':+'en'+%7D+%7D).then(x+=%3E+x.json())).feed;//%2F%2F+sort+by+likes/let+topTextPost+=+discoveryFeedPosts/++.filter(p+=%3E+p.post.record.text+%26%26+!p.post.record.embed)/++.sort((p1,+p2)+=%3E+p2.post.likeCount+-+p1.post.likeCount)%5B0%5D;//%2F%2F+let's+see+all+the+info+now/let+hotAuthor+=+%7B/++...topTextPost.post.author,/++post:+%7B+...topTextPost.post,+...topTextPost.post.record,+post:+undefined,+record:+undefined,+author:+undefined+%7D/%7D;/%60%60%60//If+you're+after+specifc+handle,+specify+it+now.//%60%60%60JavaScript/let+bskyHandle+=+%2F%2F+'oyin.bo';+++++++%2F%2F++%3C--+like+this/++hotAuthor.handle;+//let+resolvedAccount+=++await+fetch(/++'https:%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor='+%2B+bskyHandle).then(x=%3Ex.json())/%60%60%60//%23%23+Finding+PDS+for+that+account//PDS,+personal+data+server+physically+stores+account's+data.+Usually+it's+one+of+a+couple+dozens+BluSki+servers+in+the+cloud.//By+tradition+they+get+Latin+mushroom+names.//Accounts+sometimes+shift+from+one+mushroom+to+another,+so+we+find+the+latest+most+actual+PDS.//%60%60%60JavaScript/let+plcEntries+=+await+fetch(%60https:%2F%2Fplc.directory%2F$%7BresolvedAccount.did%7D%2Flog%2Faudit%60).then(x+=%3E+x.json());+%2F%2F+full+account+registry/let+lastKnownPds+=+plcEntries.slice().reverse().map(x=%3Ex.operation%3F.services%3F.atproto_pds%3F.endpoint).filter(Boolean)%5B0%5D;+%2F%2F+last+PDS+operation+record/%60%60%60//%23%23+Downloading+the+history+in+CAR%2FCBOR+format//Account+history+is+a+public+service,+because+it's+used+in+distributing+BluSki+data+across+the+network.+The+file+can+be+anything+between+1-50Mb+depending+on+shitposting+power.//The+binary+CAR%2FCBOR+format+saves+storage+and+bandwith,+and+has+extra+funky+cryptographic+signatures+(of+which+no+normal+person+cares).//%60%60%60JavaScript/let+binarySnapshot+=+await+fetch(lastKnownPds+%2B+'%2Fxrpc%2Fcom.atproto.sync.getRepo%3Fdid='+%2B+resolvedAccount.did).then(x+=%3E+x.arrayBuffer());/binarySnapshot.byteLength.toLocaleString()/%60%60%60//%23%23+Extracting+useful+data+from+CAR%2FCBOR//There+are+libraries+for+that+in+every+programming+language.+Just+invoke+and+it'll+come.//%60%60%60JavaScript/import+%7B+readCAR+%7D+from+'https:%2F%2Funpkg.com%2Fcoldsky';/let+parsedRecords+=+await+readCAR(resolvedAccount.did,+binarySnapshot,+%7B+sleep:+600+%7D)/%60%60%60//%23+Finally,+useful+info!//Having+this+rich+history+of+shitposts,+replies,+likes+and+more,+we+are+ready+to+look+at+actual+stats.//%23%23+What+kind+of+activity+dominates%3F//%60%60%60SQL/SELECT+%5B$type%5D,+COUNT(*)/FROM+$4+GROUP+BY+%5B$type%5D/ORDER+BY+COUNT(*)+DESC/%60%60%60//%23%23+5+days+of+heaviest+shitpost//%60%60%60SQL/SELECT+TOP+5+createdAt-%3Esplit('T')-%3E%5B0%5D+as+date,+COUNT(*)/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.post%22/++GROUP+BY+createdAt-%3Esplit('T')-%3E%5B0%5D/ORDER+BY+COUNT(*)+DESC/%60%60%60//%23%23+5+days+of+love:+more+likes+gifted+to+others//%60%60%60SQL/SELECT+TOP+5+createdAt-%3Esplit('T')-%3E%5B0%5D+as+date,+COUNT(*)/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.like%22/++GROUP+BY+createdAt-%3Esplit('T')-%3E%5B0%5D/ORDER+BY+COUNT(*)+DESC/%60%60%60//%23%23+10+favourite+accounts//%60%60%60SQL/SELECT+TOP+10+subject-%3Euri-%3Esplit('at:%2F%2F')-%3E%5B1%5D-%3Esplit('%2F')-%3E%5B0%5D+as+did,+COUNT(*)+AS+likes/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.like%22/++GROUP+BY+subject-%3Euri-%3Esplit('at:%2F%2F')-%3E%5B1%5D-%3Esplit('%2F')-%3E%5B0%5D/ORDER+BY+COUNT(*)+DESC/%60%60%60//%23%23+Who+are+these+people%3F//Account+history+file+refers+to+other+accounts+with+hexadecimal+DID,+which+as+you+see+above+isn't+that+readable.//No+sweat,+BluSki+has+a+service+to+resolve+DID+to+account+name%2Fhandle%2Finfo.+Here+you+go.//%60%60%60JavaScript/Promise.all($8.map(async+entry+=%3E+%7B/++const+profile+=+await+fetch('https:%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor='+%2B+entry.did).then(x+=%3E+x.json());/++return+%7B/++++did:+profile.did,+handle:+profile.handle,+displayName:+profile.displayName,/++++likesCount:+entry.likes,/++++postsCount:+profile.postsCount,/++++...profile/++%7D;/%7D))/%60%60%60//%23%23+10+accounts+getting+most+reply+traffic//%60%60%60SQL/SELECT+TOP+10+reply-%3Eparent-%3Euri-%3Esplit('at:%2F%2F')-%3E%5B1%5D-%3Esplit('%2F')-%3E%5B0%5D+as+did,+COUNT(*)+AS+replies/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.post%22+AND+reply+AND+reply-%3Eparent-%3Euri/++GROUP+BY+reply-%3Eparent-%3Euri-%3Esplit('at:%2F%2F')-%3E%5B1%5D-%3Esplit('%2F')-%3E%5B0%5D/ORDER+BY+COUNT(*)+DESC+/%60%60%60//And+again,+with+names+and+extra.//%60%60%60JavaScript/Promise.all($10.map(async+entry+=%3E+%7B/++const+profile+=+await+fetch('https:%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor='+%2B+entry.did).then(x+=%3E+x.json());/++return+%7B/++++did:+profile.did,+handle:+profile.handle,+displayName:+profile.displayName,/++++repliesCount:+entry.replies,/++++postsCount:+profile.postsCount,/++++...profile/++%7D;/%7D))/%60%60%60//) - Editable notebook to analyze a Bluesky account. * [Starter Packs](https://www.starterpacks.net/) - Search Bluesky starter packs and profiles. * [PDS self-hosting](https://atproto.com/guides/self-hosting) - Self-hosting a Bluesky PDS means running your own Personal Data Server that is capable of federating with the wider ATProto network. * [Bluesky-powered comments for any website](https://github.com/czue/bluesky-comments) - Embed Bluesky comments on your website easily ([announcement](https://www.coryzue.com/writing/bluesky-comments/)). For more Bluesky tools, check [Awesome Bluesky](https://github.com/notjuliet/awesome-bluesky), a more exhaustive list of tools and clients available for Bluesky. ## Tools * [ATFile](https://github.com/ziodotsh/atfile) - Store and retrieve files on the ATmosphere. ## Lexicons Lexicon is a schema definition language used to describe atproto records, HTTP endpoints (XRPC), and event stream messages. Find below each platform's lexicons: * [ATFile](https://github.com/ziodotsh/lexicons/tree/main/blue/zio/atfile) * [Bluemoji](https://github.com/aendra-rininsland/bluemoji/tree/main/schema/blue.moji) * [Bluesky](https://github.com/bluesky-social/atproto/tree/main/lexicons/app/bsky) * [Bookhive](https://github.com/nperez0111/bookhive/tree/main/lexicons) * [Frontage](https://github.com/likeandscribe/frontpage/tree/main/lexicons/fyi/unravel/frontpage) * [GrayHaze](https://github.com/hugeblank/grayhaze.live/tree/main/lexicons/live/grayhaze) * [Linkat](https://github.com/mkizka/linkat/tree/main/lexicons/blue/linkat) * [Pastesphere](https://github.com/echo8/pastesphere/tree/main/lexicons) * [Picosky](https://github.com/psky-atp/appview/tree/main/lexicons/social/psky) * [PinkSea](https://github.com/shinolabs/PinkSea/tree/master/PinkSea.Lexicons/com/shinolabs/pinksea) * [place.blue](https://github.com/QuietImCoding/place.blue/tree/main/atproto/lexicons) * [recipe.exchange](https://recipe.exchange/lexicons/) * [Skylights](https://github.com/Gregoor/skylights/tree/main/web/lexicons) * [Skymdb](https://github.com/safwanyp/skymdb/tree/main/domain/lexicons) * [Smoke Signal](https://github.com/SmokeSignal-Events/lexicon) * [Sparta Social](https://github.com/dblock/sparta-social/tree/main/lexicons) * [Whitewind](https://github.com/whtwnd/whitewind-blog/tree/main/lexicons/com/whtwnd/blog) ## Contributing Contributions welcome! Read the [contribution guidelines](contributing.md) first. [atproto.md Github](https://github.com/atblueprints/awesome-atproto )