185 lines
13 KiB
HTML
185 lines
13 KiB
HTML
<div data-align="center">
|
||
<p><img src="https://raw.githubusercontent.com/atblueprints/awesome-atproto/main/assets/logo.png" width="300px"></p>
|
||
<p><a href="https://awesome.re"><img src="https://awesome.re/badge.svg"
|
||
alt="Awesome" /></a></p>
|
||
</div>
|
||
<h1 id="awesome-atproto">Awesome ATProto</h1>
|
||
<blockquote>
|
||
<p><a href="https://atproto.com/">AT Protocol</a> is a federated
|
||
protocol for building social applications on an open, decentralized
|
||
network</p>
|
||
</blockquote>
|
||
<h2 id="contents">Contents</h2>
|
||
<ul>
|
||
<li><a href="#at-protocol">AT Protocol</a>
|
||
<ul>
|
||
<li><a href="#references">References</a></li>
|
||
<li><a href="#articles">Articles</a></li>
|
||
</ul></li>
|
||
<li><a href="#browsers">Browsers</a></li>
|
||
<li><a href="#platforms">Platforms</a>
|
||
<ul>
|
||
<li><a href="#bluesky">Bluesky</a></li>
|
||
</ul></li>
|
||
<li><a href="#tools">Tools</a></li>
|
||
<li><a href="#lexicons">Lexicons</a></li>
|
||
</ul>
|
||
<h2 id="at-protocol">AT Protocol</h2>
|
||
<h3 id="references">References</h3>
|
||
<ul>
|
||
<li><a href="https://atproto.com/guides/glossary">Glossary</a> - Quick
|
||
reference to AT Protocol terms.</li>
|
||
<li><a href="https://docs.bsky.app/blog/pinned-posts">Lexicons, Pinned
|
||
Posts, and Interoperability</a> - Post-mortem about the evolution of
|
||
lexicons and lessons learned.</li>
|
||
<li><a href="https://atproto.com/guides/applications">Quick start guide
|
||
to building applications on AT Protocol</a> - Guide to create a basic
|
||
ATProto application.</li>
|
||
</ul>
|
||
<h3 id="articles">Articles</h3>
|
||
<ul>
|
||
<li><a
|
||
href="https://educatedguesswork.org/posts/atproto-firstlook/">First
|
||
impressions of Bluesky’s AT Protocol</a> - In-depth analysis of
|
||
Bluesky’s ATProto, highlighting its aim to create a decentralized social
|
||
media architecture.</li>
|
||
<li><a
|
||
href="https://shreyanjain.net/2024/07/05/nostr-and-atproto.html">Nostr
|
||
and ATProto</a> - Comparison of Nostr and ATProto, two decentralized
|
||
social media protocols, exploring their origins, similarities, and
|
||
differences.</li>
|
||
<li><a
|
||
href="https://dustycloud.org/blog/how-decentralized-is-bluesky/">How
|
||
decentralized is Bluesky really?</a> - Critical examination of Bluesky’s
|
||
decentralization claims and its architectural challenges compared to
|
||
established protocols.</li>
|
||
<li><a href="https://whtwnd.com/bnewbold.net/3lbvbtqrg5t2t">Reply on
|
||
Bluesky and Decentralization</a> - Reply to Christine Lemmer-Webber’s
|
||
thoughtful (and widely read) “How decentralized is Bluesky really?” blog
|
||
post.</li>
|
||
<li><a href="https://bnewbold.net/2022/atproto_thoughts/">What is
|
||
atproto.com good for?</a> - Technical exploration of ATProto’s design
|
||
principles, architectural challenges, and potential limitations as a
|
||
decentralized social media protocol.</li>
|
||
<li><a href="https://hackernoon.com/the-at-protocol-architecture">The AT
|
||
Protocol Architecture</a> - Analysis of the ATProto’s architecture.</li>
|
||
<li><a
|
||
href="https://whtwnd.com/bnewbold.net/entries/Notes%20on%20Running%20a%20Full-Network%20atproto%20Relay%20(July%202024)">Notes
|
||
on Running a Full-Network atproto Relay (July 2024)</a> - Experience
|
||
about running an ATProto relay.</li>
|
||
</ul>
|
||
<h2 id="browsers">Browsers</h2>
|
||
<ul>
|
||
<li><a href="https://pdsls.dev/">PDSls</a> - ATProto repositories
|
||
browser.</li>
|
||
<li><a href="https://atproto-browser.vercel.app/">ATProto Browser</a> -
|
||
ATProto URIs browser.</li>
|
||
</ul>
|
||
<h2 id="platforms">Platforms</h2>
|
||
<ul>
|
||
<li><a href="https://bsky.social">Bluesky</a> - The beloved social
|
||
network and main ATProto platform.</li>
|
||
<li><a href="https://place.blue/">Blue Place</a> - Massive real-time
|
||
collaborative canvas.</li>
|
||
<li><a href="https://bookhive.buzz/">Bookhive</a> - Goodreads
|
||
alternative.</li>
|
||
<li><a href="https://frontpage.fyi/">Frontpage</a> - Federated link
|
||
aggregator.</li>
|
||
<li><a href="https://grayhaze.live/about">GrayHaze</a> - Live streaming
|
||
service (alpha).</li>
|
||
<li><a href="https://linkat.blue/">Linkat</a> - Link in bio for
|
||
Bluesky.</li>
|
||
<li><a href="https://pastesphere.link/">Pastesphere</a> - Pastebin
|
||
alternative.</li>
|
||
<li><a href="https://psky.social/">Picosky</a> - ATProto chatting
|
||
appview.</li>
|
||
<li><a href="https://pinksea.art/">PinkSea</a> - Oekaki BBS.</li>
|
||
<li><a href="https://recipe.exchange/">recipe.exchange</a> - Cooking
|
||
recipes sharing.</li>
|
||
<li><a href="https://skylights.my/">Skylights</a> - Book reviews.</li>
|
||
<li><a href="https://smokesignal.events/">Smoke Signal</a> - Event
|
||
creation and managing.</li>
|
||
<li><a href="https://github.com/dblock/sparta-social">Sparta Social</a>
|
||
- Exercise activity tracker (wip).</li>
|
||
<li><a href="https://whtwnd.com/">Whitewind</a> - Markdown blog service
|
||
using ATProto with no registration required.</li>
|
||
</ul>
|
||
<h3 id="bluesky">Bluesky</h3>
|
||
<ul>
|
||
<li><a href="https://clearsky.app/">ClearSky</a> - Tool to explore
|
||
Bluesky accounts.</li>
|
||
<li><a href="https://cleanfollow-bsky.pages.dev/">cleanfollow</a> -
|
||
Select inactive or blocked accounts to unfollow.</li>
|
||
<li><a href="https://blue.mackuba.eu/directory/">Handles directory</a> -
|
||
Handles ranking by TLDs.</li>
|
||
<li><a href="https://blue.mackuba.eu/labellers/">Labellers</a> - List of
|
||
known labellers.</li>
|
||
<li><a
|
||
href="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//">BluSki
|
||
account history</a> - Editable notebook to analyze a Bluesky
|
||
account.</li>
|
||
<li><a href="https://www.starterpacks.net/">Starter Packs</a> - Search
|
||
Bluesky starter packs and profiles.</li>
|
||
<li><a href="https://atproto.com/guides/self-hosting">PDS
|
||
self-hosting</a> - Self-hosting a Bluesky PDS means running your own
|
||
Personal Data Server that is capable of federating with the wider
|
||
ATProto network.</li>
|
||
<li><a href="https://github.com/czue/bluesky-comments">Bluesky-powered
|
||
comments for any website</a> - Embed Bluesky comments on your website
|
||
easily (<a
|
||
href="https://www.coryzue.com/writing/bluesky-comments/">announcement</a>).</li>
|
||
</ul>
|
||
<p>For more Bluesky tools, check <a
|
||
href="https://github.com/notjuliet/awesome-bluesky">Awesome Bluesky</a>,
|
||
a more exhaustive list of tools and clients available for Bluesky.</p>
|
||
<h2 id="tools">Tools</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ziodotsh/atfile">ATFile</a> - Store and
|
||
retrieve files on the ATmosphere.</li>
|
||
</ul>
|
||
<h2 id="lexicons">Lexicons</h2>
|
||
<p>Lexicon is a schema definition language used to describe atproto
|
||
records, HTTP endpoints (XRPC), and event stream messages.</p>
|
||
<p>Find below each platform’s lexicons:</p>
|
||
<ul>
|
||
<li><a
|
||
href="https://github.com/ziodotsh/lexicons/tree/main/blue/zio/atfile">ATFile</a></li>
|
||
<li><a
|
||
href="https://github.com/aendra-rininsland/bluemoji/tree/main/schema/blue.moji">Bluemoji</a></li>
|
||
<li><a
|
||
href="https://github.com/bluesky-social/atproto/tree/main/lexicons/app/bsky">Bluesky</a></li>
|
||
<li><a
|
||
href="https://github.com/nperez0111/bookhive/tree/main/lexicons">Bookhive</a></li>
|
||
<li><a
|
||
href="https://github.com/likeandscribe/frontpage/tree/main/lexicons/fyi/unravel/frontpage">Frontage</a></li>
|
||
<li><a
|
||
href="https://github.com/hugeblank/grayhaze.live/tree/main/lexicons/live/grayhaze">GrayHaze</a></li>
|
||
<li><a
|
||
href="https://github.com/mkizka/linkat/tree/main/lexicons/blue/linkat">Linkat</a></li>
|
||
<li><a
|
||
href="https://github.com/echo8/pastesphere/tree/main/lexicons">Pastesphere</a></li>
|
||
<li><a
|
||
href="https://github.com/psky-atp/appview/tree/main/lexicons/social/psky">Picosky</a></li>
|
||
<li><a
|
||
href="https://github.com/shinolabs/PinkSea/tree/master/PinkSea.Lexicons/com/shinolabs/pinksea">PinkSea</a></li>
|
||
<li><a
|
||
href="https://github.com/QuietImCoding/place.blue/tree/main/atproto/lexicons">place.blue</a></li>
|
||
<li><a href="https://recipe.exchange/lexicons/">recipe.exchange</a></li>
|
||
<li><a
|
||
href="https://github.com/Gregoor/skylights/tree/main/web/lexicons">Skylights</a></li>
|
||
<li><a
|
||
href="https://github.com/safwanyp/skymdb/tree/main/domain/lexicons">Skymdb</a></li>
|
||
<li><a href="https://github.com/SmokeSignal-Events/lexicon">Smoke
|
||
Signal</a></li>
|
||
<li><a
|
||
href="https://github.com/dblock/sparta-social/tree/main/lexicons">Sparta
|
||
Social</a></li>
|
||
<li><a
|
||
href="https://github.com/whtwnd/whitewind-blog/tree/main/lexicons/com/whtwnd/blog">Whitewind</a></li>
|
||
</ul>
|
||
<h2 id="contributing">Contributing</h2>
|
||
<p>Contributions welcome! Read the <a
|
||
href="contributing.md">contribution guidelines</a> first.</p>
|
||
<p><a href="https://github.com/atblueprints/awesome-atproto">atproto.md
|
||
Github</a></p>
|