Files
awesome-awesomeness/html/atproto.html
2025-07-18 22:22:32 +02:00

185 lines
13 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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 Blueskys AT Protocol</a> - In-depth analysis of
Blueskys 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 Blueskys
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-Webbers
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 ATProtos 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 ATProtos 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&#39;s+pick+a+rando+hot+poster+from+Discovery+feed+--//%60%60%60JavaScript/%2F%2F+downloading+Discovery+feed+posts/let+discoveryFeedPosts+=+(await+fetch(/++&#39;https:%2F%2Fapi.bsky.app%2Fxrpc%2Fapp.bsky.feed.getFeed%3Ffeed=at:%2F%2Fdid:plc:z72i7hdynmk6r22z27h6tvur%2Fapp.bsky.feed.generator%2Fwhats-hot%26limit=100&#39;,/++%7B+headers:+%7B+&#39;accept-language&#39;:+&#39;en&#39;+%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&#39;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&#39;re+after+specifc+handle,+specify+it+now.//%60%60%60JavaScript/let+bskyHandle+=+%2F%2F+&#39;oyin.bo&#39;;+++++++%2F%2F++%3C--+like+this/++hotAuthor.handle;+//let+resolvedAccount+=++await+fetch(/++&#39;https:%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor=&#39;+%2B+bskyHandle).then(x=%3Ex.json())/%60%60%60//%23%23+Finding+PDS+for+that+account//PDS,+personal+data+server+physically+stores+account&#39;s+data.+Usually+it&#39;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&#39;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+&#39;%2Fxrpc%2Fcom.atproto.sync.getRepo%3Fdid=&#39;+%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&#39;ll+come.//%60%60%60JavaScript/import+%7B+readCAR+%7D+from+&#39;https:%2F%2Funpkg.com%2Fcoldsky&#39;;/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(&#39;T&#39;)-%3E%5B0%5D+as+date,+COUNT(*)/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.post%22/++GROUP+BY+createdAt-%3Esplit(&#39;T&#39;)-%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(&#39;T&#39;)-%3E%5B0%5D+as+date,+COUNT(*)/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.like%22/++GROUP+BY+createdAt-%3Esplit(&#39;T&#39;)-%3E%5B0%5D/ORDER+BY+COUNT(*)+DESC/%60%60%60//%23%23+10+favourite+accounts//%60%60%60SQL/SELECT+TOP+10+subject-%3Euri-%3Esplit(&#39;at:%2F%2F&#39;)-%3E%5B1%5D-%3Esplit(&#39;%2F&#39;)-%3E%5B0%5D+as+did,+COUNT(*)+AS+likes/FROM+$4/++WHERE+%5B$type%5D+=+%22app.bsky.feed.like%22/++GROUP+BY+subject-%3Euri-%3Esplit(&#39;at:%2F%2F&#39;)-%3E%5B1%5D-%3Esplit(&#39;%2F&#39;)-%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&#39;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(&#39;https:%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor=&#39;+%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(&#39;at:%2F%2F&#39;)-%3E%5B1%5D-%3Esplit(&#39;%2F&#39;)-%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(&#39;at:%2F%2F&#39;)-%3E%5B1%5D-%3Esplit(&#39;%2F&#39;)-%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(&#39;https:%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor=&#39;+%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 platforms 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>