2024-05-20 08:22:33 +00:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" / >
< title > Bluesky Architecture compared to other social media services< / title >
< meta name = "author" content = "Éibhear Ó hAnluain" / >
< meta name = "description" content = "A discussion of Bluesky's architecture as it relates to other social media services" / >
< meta name = "keywords" content = "" / >
< style type = "text/css" >
.underline { text-decoration: underline; }
< / style >
< link rel = "stylesheet" href = "./reveal.js/dist/reveal.css" / >
< link rel = "stylesheet" href = "./reveal.js/dist/theme/white.css" id = "theme" / >
< link rel = "stylesheet" href = "./e-reveal.css" / >
< link rel = "stylesheet" href = "./gridding.css" / >
< / head >
< body >
< div class = "reveal" >
< div class = "slides" >
< section id = "sec-title-slide" data-background = "./bCardBackground.png" > < h1 class = "title" > Bluesky Architecture compared to other social media services< / h1 > < p class = "subtitle" > < a href = "?print-pdf" > Printable version< / a > < / p >
< h2 class = "author" > Éibhear Ó hAnluain< / h2 > < h2 class = "email" > < a href = "mailto:eibhear.geo@gmail.com" > eibhear.geo@gmail.com< / a > < / h2 > < h2 class = "date" > 2024-05-24 Fri 00:00< / h2 >
< / section >
< section id = "sec-table-of-contents" data-background = "./bCardBackground.png" > < div id = "table-of-contents" role = "doc-toc" >
< h2 > Table of Contents< / h2 >
< div id = "text-table-of-contents" role = "doc-toc" >
< ul >
2024-05-20 13:10:29 +00:00
< li > < a href = "#/slide-org4f8ae77" > Introduction< / a > < / li >
< li > < a href = "#/slide-orgd38ec38" > General social media architectures< / a > < / li >
< li > < a href = "#/slide-orge44ce74" > Federated social media services< / a > < / li >
< li > < a href = "#/slide-org230375d" > Bluesky< / a > < / li >
< li > < a href = "#/slide-org9a49751" > Bluesky – Identities< / a > < / li >
2024-05-20 08:22:33 +00:00
< / ul >
< / div >
< / div >
< / section >
< section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org4f8ae77" data-background = "./bCardBackground.png" >
< h2 id = "org4f8ae77" > Introduction< / h2 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
< p >
Boo!
< / p >
< / div >
< / section >
< / section >
< section >
2024-05-20 13:10:29 +00:00
< section id = "slide-orgd38ec38" data-background = "./bCardBackground.png" >
< h2 id = "orgd38ec38" > General social media architectures< / h2 >
< div class = "outline-text-2" id = "text-orgd38ec38" >
2024-05-20 08:22:33 +00:00
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org28f44a5" data-background = "./bCardBackground.png" >
< h3 id = "org28f44a5" > Simplistic view 1/2 – overview< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "orgecdb1a0" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-001-GenericSocial-01.png" alt = "structurizr-1-001-GenericSocial-01.png" width = "90%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org399a495" data-background = "./bCardBackground.png" >
< h3 id = "org399a495" > Simplistic view 2/2 – services< / h3 >
2024-05-20 11:25:54 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" >
2024-05-20 08:22:33 +00:00
2024-05-20 13:10:29 +00:00
< div id = "orgeb3935b" class = "figure" >
2024-05-20 11:25:54 +00:00
< p > < img src = "structurizr-1-002-GenericSocial-02.png" alt = "structurizr-1-002-GenericSocial-02.png" width = "40%" / >
2024-05-20 08:22:33 +00:00
< / p >
< / div >
< / div >
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
< ul >
< li class = "fragment appear" > Social media user access the app< / li >
< li class = "fragment appear" > The app interacts with the API< / li >
< li class = "fragment appear" > The API is the gateway for the database of posts, responses, likes, etc.< / li >
< / ul >
< / div >
< / div >
2024-05-20 08:22:33 +00:00
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org3782a70" data-background = "./bCardBackground.png" >
< h3 id = "org3782a70" > More realistic view 1/4 – overview< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org33a7cb3" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-003-RealisticSocial-01.png" alt = "structurizr-1-003-RealisticSocial-01.png" width = "90%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org6e7c56b" data-background = "./bCardBackground.png" >
< h3 id = "org6e7c56b" > More realistic view 2/4 – basic services< / h3 >
2024-05-20 11:25:54 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" >
2024-05-20 08:22:33 +00:00
2024-05-20 13:10:29 +00:00
< div id = "orgcc7daf2" class = "figure" >
2024-05-20 11:25:54 +00:00
< p > < img src = "structurizr-1-004-RealisticSocial-02.png" alt = "structurizr-1-004-RealisticSocial-02.png" width = "70%" / >
2024-05-20 08:22:33 +00:00
< / p >
< / div >
< / div >
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
< ul >
< li class = "fragment appear" > Social media user access the app< / li >
< li class = "fragment appear" > The app interacts with the API< / li >
< li class = "fragment appear" > The API is the gateway for the database of posts, responses, likes, etc.< / li >
< li class = "fragment appear" > The API also captures data for building profiles of users for targeting purposes< / li >
< li class = "fragment appear" > The algorithmic feed generator guides the API on what posts to place into the app's feed< / li >
< / ul >
< / div >
< / div >
2024-05-20 08:22:33 +00:00
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org38114eb" data-background = "./bCardBackground.png" >
< h3 id = "org38114eb" > More realistic view 3/4 – the algorithm< / h3 >
2024-05-20 11:25:54 +00:00
< div class = "gridded_frame_with_columns e-frame" >
2024-05-20 08:22:33 +00:00
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
2024-05-20 13:10:29 +00:00
< div id = "org09bb742" class = "figure" >
2024-05-20 11:25:54 +00:00
< p > < img src = "structurizr-1-005-RealisticSocial-03.png" alt = "structurizr-1-005-RealisticSocial-03.png" width = "70%" / >
2024-05-20 08:22:33 +00:00
< / p >
< / div >
< / div >
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
< ul >
< li > Social media user access the app< / li >
< li > The app interacts with the API< / li >
< li > The API is the gateway for the database of posts, responses, likes, etc.< / li >
< li > The API also captures data for building profiles of users for targeting purposes< / li >
< li > The algorithmic feed generator guides the API on what posts to place into the app's feed< / li >
< li > Algorithmic feeds are created by the service administrator, using an app only < i > they< / i > have access to< / li >
< / ul >
< / div >
< / div >
2024-05-20 08:22:33 +00:00
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org9bdf383" data-background = "./bCardBackground.png" >
< h3 id = "org9bdf383" > More realistic view 4/4 – content moderation< / h3 >
2024-05-20 11:25:54 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" >
2024-05-20 08:22:33 +00:00
2024-05-20 13:10:29 +00:00
< div id = "org1cb03f2" class = "figure" >
2024-05-20 11:25:54 +00:00
< p > < img src = "structurizr-1-006-RealisticSocial-04.png" alt = "structurizr-1-006-RealisticSocial-04.png" width = "100%" / >
2024-05-20 08:22:33 +00:00
< / p >
< / div >
< / div >
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
< ul >
< li > Social media user access the app< / li >
< li > The app interacts with the API< / li >
< li > The API is the gateway for the database of posts, responses, likes, etc.< / li >
< li > The API also captures data for building profiles of users for targeting purposes< / li >
< li > The algorithmic feed generator guides the API on what posts to place into the app's feed< / li >
< li > Algorithmic feeds are created by the service administrator, using an app only < i > they< / i > have access to< / li >
< li > Moderation is also performed by a member of the service's staff, using a dedicate app and services the the user doesn't have access to< / li >
< / ul >
< / div >
< / div >
2024-05-20 08:22:33 +00:00
< / section >
< / section >
< section >
2024-05-20 13:10:29 +00:00
< section id = "slide-orge44ce74" data-background = "./bCardBackground.png" >
< h2 id = "orge44ce74" > Federated social media services< / h2 >
< div class = "outline-text-2" id = "text-orge44ce74" >
2024-05-20 08:22:33 +00:00
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org9a577a7" data-background = "./bCardBackground.png" >
< h3 id = "org9a577a7" > Federated services 1/8 – overview< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org5e45ba4" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-007-FederatedSocial-01.png" alt = "structurizr-1-007-FederatedSocial-01.png" width = "75%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-orgb69e512" data-background = "./bCardBackground.png" >
< h3 id = "orgb69e512" > Federated services 2/8 – internal, administration and content moderation services< / h3 >
2024-05-20 11:25:54 +00:00
< div class = "gridded_frame_with_columns e-frame" >
2024-05-20 08:22:33 +00:00
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
2024-05-20 13:10:29 +00:00
< div id = "orga88c98c" class = "figure" >
2024-05-20 11:25:54 +00:00
< p > < img src = "structurizr-1-008-FederatedSocial-02.png" alt = "structurizr-1-008-FederatedSocial-02.png" width = "70%" / >
2024-05-20 08:22:33 +00:00
< / p >
< / div >
< / div >
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" >
< ul >
< li class = "fragment appear" > Same as before, the user access the service through an App that uses an API< / li >
< li class = "fragment appear" > As federated services are small, the administrator and the moderator are the one person< / li >
< li class = "fragment appear" > No algorithmic feeds, though
< ul >
< li > not popular in the fediverse community< / li >
< li > difficult to implement in a federated environment.< / li >
< / ul > < / li >
< / ul >
< / div >
< / div >
2024-05-20 08:22:33 +00:00
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org15b2c44" data-background = "./bCardBackground.png" >
< h3 id = "org15b2c44" > Federated services 3/8 – federation 1< / h3 >
2024-05-20 11:25:54 +00:00
< div class = "gridded_frame_with_columns e-frame" >
2024-05-20 08:22:33 +00:00
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" style = "width: 60%" >
2024-05-20 13:10:29 +00:00
< div id = "org311f8aa" class = "figure" >
2024-05-20 11:25:54 +00:00
< p > < img src = "structurizr-1-009-FederatedSocial-03.png" alt = "structurizr-1-009-FederatedSocial-03.png" width = "100%" / >
2024-05-20 08:22:33 +00:00
< / p >
< / div >
< / div >
2024-05-20 11:25:54 +00:00
< div class = "one_of_2_columns" style = "width: 40%" >
< ul >
< li > Same as before, the user access the service through an App that uses an API< / li >
< li > As federated services are small, the administrator and the moderator are the one person< / li >
< li > No algorithmic feeds, though
< ul >
< li > not popular in the fediverse community< / li >
< li > difficult to implement in a federated environment.< / li >
< / ul > < / li >
< li class = "fragment appear" > Federation service to push activity out to the federated network< / li >
< li class = "fragment appear" > Federation API to take in activity from other nodes< / li >
< li class = "fragment appear" > A logical database of inbound federated posts< / li >
< li class = "fragment appear" > Federation using ActivityPub standard< / li >
< / ul >
< / div >
< / div >
2024-05-20 08:22:33 +00:00
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-orgad94bf1" data-background = "./bCardBackground.png" >
< h3 id = "orgad94bf1" > Federated services 4/8 – federation 2< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org8d27a22" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-010-FederatedSocial-04.png" alt = "structurizr-1-010-FederatedSocial-04.png" width = "75%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org8221162" data-background = "./bCardBackground.png" >
< h3 id = "org8221162" > Federated services 5/8 – federation 3< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org239cb08" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-011-FederatedSocial-05.png" alt = "structurizr-1-011-FederatedSocial-05.png" width = "75%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org8005eff" data-background = "./bCardBackground.png" >
< h3 id = "org8005eff" > Federated services 6/8 – federation 4< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org8080e39" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-012-FederatedSocial-06.png" alt = "structurizr-1-012-FederatedSocial-06.png" width = "75%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-org44a52d8" data-background = "./bCardBackground.png" >
< h3 id = "org44a52d8" > Federated services 7/8 – federation 5< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org4d8eff7" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-013-FederatedSocial-07.png" alt = "structurizr-1-013-FederatedSocial-07.png" width = "75%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-20 13:10:29 +00:00
< section id = "slide-orgee80194" data-background = "./bCardBackground.png" >
< h3 id = "orgee80194" > Federated services 8/8 – federation 6< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-20 13:10:29 +00:00
< div id = "org667e94a" class = "figure" >
2024-05-20 08:22:33 +00:00
< p > < img src = "structurizr-1-014-FederatedSocial-08.png" alt = "structurizr-1-014-FederatedSocial-08.png" width = "75%" / >
< / p >
< / div >
< / div >
< / section >
< / section >
2024-05-20 13:10:29 +00:00
< section >
< section id = "slide-org230375d" data-background = "./bCardBackground.png" >
< h2 id = "org230375d" > Bluesky< / h2 >
< div class = "outline-text-2" id = "text-org230375d" >
< / div >
< / section >
< section id = "slide-orga5a9952" data-background = "./bCardBackground.png" >
< h3 id = "orga5a9952" > Basic Bluesky 1/2< / h3 >
< div class = "e-frame" >
< div id = "org98d6475" class = "figure" >
< p > < img src = "structurizr-1-015-BlueskyBasic-01.png" alt = "structurizr-1-015-BlueskyBasic-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
< section id = "slide-orgb7864f1" data-background = "./bCardBackground.png" >
< h3 id = "orgb7864f1" > Basic Bluesky 2/2< / h3 >
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
< div id = "orgccd97e0" class = "figure" >
< p > < img src = "structurizr-1-016-BlueskyBasic-02.png" alt = "structurizr-1-016-BlueskyBasic-02.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 30%" >
< ul >
< li class = "fragment appear" > User interfaces with an app hosted by the < i > AppView< / i > < / li >
< li class = "fragment appear" > The < i > AppView< / i > includes an API (allowing for bot-like interactions)< / li >
< li class = "fragment appear" > The < i > AppView< / i > stores and reads data from the < i > Personal Data Server< / i > (PDS)< / li >
< li class = "fragment appear" > Bluesky resolved user identities using "DIDs" (Distributed IDs)< / li >
< li class = "fragment appear" > The Bluesky admin uses a separate service for preparing algorithmic feeds< / li >
< li class = "fragment appear" > The Bluesky moderator applies labels and actions to posts for trust and safety through a dedicated service< / li >
< / ul >
< / div >
< / div >
< / section >
< / section >
< section >
< section id = "slide-org9a49751" data-background = "./bCardBackground.png" >
< h2 id = "org9a49751" > Bluesky – Identities< / h2 >
< div class = "outline-text-2" id = "text-org9a49751" >
< / div >
< / section >
< section id = "slide-orgf33e1e3" data-background = "./bCardBackground.png" >
< h3 id = "orgf33e1e3" > Bluesky Identities 1/4< / h3 >
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 35%" >
< div id = "orgb4e3b8a" class = "figure" >
< p > < img src = "structurizr-1-017-BlueskyIdentity-01.png" alt = "structurizr-1-017-BlueskyIdentity-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 65%" >
< ul >
< li class = "fragment appear" > User's typical Bluesky ID is < code > @< user-handle> .bsky.social< / code >
< ul >
< li > e.g. < code > @theauldsthretch.bsky.social< / code > < / li >
< / ul > < / li >
< li class = "fragment appear" > Users can set up their own handle, < code > @< user-handle> .< domain> < / code > . E.g. (and these are all real IDs) …
< ul >
< li > < code > @astrokatie.com< / code > – a cosmologist< / li >
< li > < code > @eibhear.gibiris.org< / code > – the author< / li >
< li > < code > @wyden.senate.gov< / code > – a U.S. Senator< / li >
< / ul > < / li >
< li class = "fragment appear" > User must control the domain or be a legitimate member of the domain's community< / li >
< li class = "fragment appear" > < p >
Domain-based handle resolves to a DID, either by DNS or < code > .well-known< / code > :
< / p >
< div class = "org-src-container" >
< pre class = "src src-shell" > < code trim > $ dig _atproto.eibhear.gibiris.org TXT
...
;; ANSWER SECTION:
_atproto.eibhear.gibiris.org. 3600 IN TXT < span style = "color: #8b2252;" > "did=did:plc:23mysztmt7dh3l5lzhinzafi"< / span >
$ curl https://theauldsthretch.bsky.social/.well-known/atproto-did
did:plc:avzdf5esd7xpbgsgh7lx4kzq
< / code > < / pre >
< / div > < / li >
< / ul >
< / div >
< / div >
< / section >
< section id = "slide-orgd207d91" data-background = "./bCardBackground.png" >
< h3 id = "orgd207d91" > Bluesky Identities 2/4< / h3 >
< div class = "e-frame" >
< div id = "orga95c836" class = "figure" >
< p > < img src = "structurizr-1-018-BlueskyIdentity-02.png" alt = "structurizr-1-018-BlueskyIdentity-02.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
< section id = "slide-org5e49a33" data-background = "./bCardBackground.png" >
< h3 id = "org5e49a33" > Bluesky Identities 3/4< / h3 >
< div class = "e-frame" >
< div id = "orgb2410fb" class = "figure" >
< p > < img src = "structurizr-1-019-BlueskyIdentity-03.png" alt = "structurizr-1-019-BlueskyIdentity-03.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
< section id = "slide-org649da93" data-background = "./bCardBackground.png" >
< h3 id = "org649da93" > Bluesky Identities 3/4< / h3 >
< div class = "e-frame" >
< div id = "org97e4d09" class = "figure" >
< p > < img src = "structurizr-1-020-BlueskyIdentity-04.png" alt = "structurizr-1-020-BlueskyIdentity-04.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
< / section >
2024-05-20 08:22:33 +00:00
< / div >
< / div >
< script src = "./reveal.js/dist/reveal.js" > < / script >
< script src = "./reveal.js/plugin/markdown/markdown.js" > < / script >
< script src = "./reveal.js/plugin/zoom/zoom.js" > < / script >
< script src = "./reveal.js/plugin/notes/notes.js" > < / script >
< script >
// Full list of configuration options available here:
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
plugins: [RevealMarkdown, RevealZoom, RevealNotes],
transition:'none', margin: 0.1, slideNumber:true
});
< / script >
< / body >
< / html >