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 >
2024-05-25 19:28:44 +00:00
< link rel = "stylesheet" href = "../reveal.js/dist/reveal.css" / >
2024-05-20 08:22:33 +00:00
2024-05-25 19:28:44 +00:00
< link rel = "stylesheet" href = "../reveal.js/dist/theme/white.css" id = "theme" / >
2024-05-20 08:22:33 +00:00
< 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-25 19:28:44 +00:00
< li > < a href = "#/slide-org9ccac15" > Introduction< / a > < / li >
< li > < a href = "#/slide-orgecc07a4" > General social media architectures< / a > < / li >
< li > < a href = "#/slide-org2b980de" > Federated social media services< / a > < / li >
< li > < a href = "#/slide-org1c58401" > Bluesky< / a > < / li >
< li > < a href = "#/slide-org3b3e36e" > Bluesky – Identities< / a > < / li >
< li > < a href = "#/slide-org08fb271" > Bluesky – Composable Feeds< / a > < / li >
< li > < a href = "#/slide-orgcd374ae" > Bluesky – The AppView< / a > < / li >
< li > < a href = "#/slide-org11ff99e" > Bluesky – The Relay and the PDS< / a > < / li >
< li > < a href = "#/slide-org2dec4ec" > Bluesky – Moderation< / a > < / li >
< li > < a href = "#/slide-orgdc59907" > Bluesky< / a > < / li >
< li > < a href = "#/slide-org8fc9925" > Resources and further reading< / a > < / li >
2024-05-20 08:22:33 +00:00
< / ul >
< / div >
< / div >
< / section >
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org9ccac15" data-background = "./bCardBackground.png" >
< h2 id = "org9ccac15" > Introduction< / h2 >
< div class = "outline-text-2" id = "text-org9ccac15" >
2024-05-24 14:05:40 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orgf294eb5" data-background = "./bCardBackground.png" >
< h3 id = "orgf294eb5" > Éibhear Ó hAnluain< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-24 14:05:40 +00:00
< ul >
2024-05-24 19:38:02 +00:00
< li class = "fragment appear" > IT professional since 1994< / li >
< li class = "fragment appear" > IT Architect since 2009< / li >
2024-05-24 14:05:40 +00:00
< li class = "fragment appear" > Interested in and promoting federated social services since 2013-ish
< ul >
2024-05-24 19:38:02 +00:00
< li > < a href = "https://www.gibiris.org/eo-blog/gibiris-services.html" > Implementations< / a > < / li >
< li > < a href = "https://www.gibiris.org/eo-blog/tags/selfhosting.html" > Blog posts< / a > < / li >
< li > < a href = "https://www.gibiris.org/eo-blog/posts/2019/04/15_harmful-content-consultation.html" > Representations< / a > to government organisations< / li >
2024-05-24 14:05:40 +00:00
< / ul > < / li >
2024-05-24 19:38:02 +00:00
< li class = "fragment appear" > This presentation uses diagrams created using < a href = "https://structurizr.com/" > Strucutizr< / a >
2024-05-24 14:05:40 +00:00
< ul >
< li > < code > autolayout< / code > throughout< / li >
< / ul > < / li >
< / ul >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org28122e7" data-background = "./bCardBackground.png" >
< h3 id = "org28122e7" > What is Bluesky< / h3 >
2024-05-24 14:05:40 +00:00
< div class = "e-frame" >
< ul >
< li class = "fragment appear" > A new social media service< / li >
2024-05-24 19:38:02 +00:00
< li class = "fragment appear" > < a href = "https://twitter.com/jack/status/1204766078468911106" > Initiated< / a > by Jack Dorsey when he was CEO of Twitter
2024-05-24 14:05:40 +00:00
< ul >
< li > Vision of a decentralised service< / li >
2024-05-24 19:38:02 +00:00
< li > Inspired by Mike Masnick's 2019 "< a href = "https://knightcolumbia.org/content/protocols-not-platforms-a-technological-approach-to-free-speech" > Protocols, Not Platforms: A
Technological Approach to Free Speech< / a > " paper< / li >
2024-05-24 14:05:40 +00:00
< li > Plan was for Twitter to move all its users to the new platform
when ready< / li >
< / ul > < / li >
2024-05-24 19:38:02 +00:00
< li class = "fragment appear" > < a href = "https://en.wikipedia.org/wiki/Bluesky_(social_network)" > Company formed in 2021< / a >
2024-05-24 14:05:40 +00:00
< ul >
< li > Seed funding from Twitter< / li >
< li > Dorsey on the board< / li >
< li > Set up as a public benefit company< / li >
< / ul > < / li >
2024-05-24 19:38:02 +00:00
< li class = "fragment appear" > Privatisation of Twitter in October 2022; Bluesky defunded< / li >
< li class = "fragment appear" > 2023, Dorsey deleteds Bluesky account – not meeting his vision< / li >
< li class = "fragment appear" > April 2024, Dorsey resigns from Bluesky board.< / li >
2024-05-24 14:05:40 +00:00
< / ul >
2024-05-20 08:22:33 +00:00
< / div >
< / section >
< / section >
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orgecc07a4" data-background = "./bCardBackground.png" >
< h2 id = "orgecc07a4" > General social media architectures< / h2 >
< div class = "outline-text-2" id = "text-orgecc07a4" >
2024-05-20 08:22:33 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org561c31e" data-background = "./bCardBackground.png" >
< h3 id = "org561c31e" > Simplistic view 1/2 – overview< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org3650cce" 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-25 19:28:44 +00:00
< section id = "slide-orga310422" data-background = "./bCardBackground.png" >
< h3 id = "orga310422" > 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-25 19:28:44 +00:00
< div id = "org05cdedb" 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-25 19:28:44 +00:00
< section id = "slide-org81c5775" data-background = "./bCardBackground.png" >
< h3 id = "org81c5775" > More realistic view 1/4 – overview< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org8b9da19" 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-25 19:28:44 +00:00
< section id = "slide-org8c410e9" data-background = "./bCardBackground.png" >
< h3 id = "org8c410e9" > 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-25 19:28:44 +00:00
< div id = "orgb398180" 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-25 19:28:44 +00:00
< section id = "slide-orge1aa03f" data-background = "./bCardBackground.png" >
< h3 id = "orge1aa03f" > 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-25 19:28:44 +00:00
< div id = "org23a679f" 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-25 19:28:44 +00:00
< section id = "slide-org5b5e0f3" data-background = "./bCardBackground.png" >
< h3 id = "org5b5e0f3" > 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-25 19:28:44 +00:00
< div id = "org29bbdd9" 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-25 19:28:44 +00:00
< section id = "slide-org2b980de" data-background = "./bCardBackground.png" >
< h2 id = "org2b980de" > Federated social media services< / h2 >
< div class = "outline-text-2" id = "text-org2b980de" >
2024-05-20 08:22:33 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orga398dbc" data-background = "./bCardBackground.png" >
< h3 id = "orga398dbc" > Federated services 1/8 – overview< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org4ad1c2c" 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-25 19:28:44 +00:00
< section id = "slide-orgbec2724" data-background = "./bCardBackground.png" >
< h3 id = "orgbec2724" > 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-25 19:28:44 +00:00
< div id = "org30fa294" 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-25 19:28:44 +00:00
< section id = "slide-org06f0adf" data-background = "./bCardBackground.png" >
< h3 id = "org06f0adf" > 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-25 19:28:44 +00:00
< div id = "orgbc419b6" 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-25 19:28:44 +00:00
< section id = "slide-org9eeed58" data-background = "./bCardBackground.png" >
< h3 id = "org9eeed58" > Federated services 4/8 – federation 2< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "orgaa3a02f" 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-25 19:28:44 +00:00
< section id = "slide-org2c884a1" data-background = "./bCardBackground.png" >
< h3 id = "org2c884a1" > Federated services 5/8 – federation 3< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org6c07421" 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-25 19:28:44 +00:00
< section id = "slide-orga02bdaf" data-background = "./bCardBackground.png" >
< h3 id = "orga02bdaf" > Federated services 6/8 – federation 4< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "orge29a477" 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-25 19:28:44 +00:00
< section id = "slide-org490ac3a" data-background = "./bCardBackground.png" >
< h3 id = "org490ac3a" > Federated services 7/8 – federation 5< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org59eee6e" 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-25 19:28:44 +00:00
< section id = "slide-orgab66133" data-background = "./bCardBackground.png" >
< h3 id = "orgab66133" > Federated services 8/8 – federation 6< / h3 >
2024-05-20 08:22:33 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org78782bf" 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 >
2024-05-25 19:28:44 +00:00
< section id = "slide-org1c58401" data-background = "./bCardBackground.png" >
< h2 id = "org1c58401" > Bluesky< / h2 >
< div class = "outline-text-2" id = "text-org1c58401" >
2024-05-20 13:10:29 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org4dad692" data-background = "./bCardBackground.png" >
< h3 id = "org4dad692" > Basic Bluesky 1/2< / h3 >
2024-05-20 13:10:29 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org4f17692" class = "figure" >
2024-05-20 13:10:29 +00:00
< p > < img src = "structurizr-1-015-BlueskyBasic-01.png" alt = "structurizr-1-015-BlueskyBasic-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org28d95b1" data-background = "./bCardBackground.png" >
< h3 id = "org28d95b1" > Basic Bluesky 2/2< / h3 >
2024-05-20 13:10:29 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
2024-05-25 19:28:44 +00:00
< div id = "org88f86d8" class = "figure" >
2024-05-20 13:10:29 +00:00
< 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 >
2024-05-20 15:43:17 +00:00
< li class = "fragment appear" > User interfaces with a client hosted by the < i > AppView< / i > < / li >
< li class = "fragment appear" > The < i > AppView< / i > includes an API (allowing for 3rd-party and bot-like clients)< / li >
2024-05-20 13:10:29 +00:00
< 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 >
2024-05-24 14:05:40 +00:00
< li class = "fragment appear" > All implemented using a new social protocol call "The AT Protocol", or < i > @proto< / i > .< / li >
2024-05-20 13:10:29 +00:00
< / ul >
< / div >
< / div >
< / section >
< / section >
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org3b3e36e" data-background = "./bCardBackground.png" >
< h2 id = "org3b3e36e" > Bluesky – Identities< / h2 >
< div class = "outline-text-2" id = "text-org3b3e36e" >
2024-05-20 13:10:29 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org54b695f" data-background = "./bCardBackground.png" >
< h3 id = "org54b695f" > Bluesky Identities 1/4< / h3 >
2024-05-20 13:10:29 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 35%" >
2024-05-25 19:28:44 +00:00
< div id = "org34ac80b" class = "figure" >
2024-05-20 13:10:29 +00:00
< 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:
2024-05-25 19:28:44 +00:00
_atproto.eibhear.gibiris.org. 3600 IN TXT < span style = "color: #ffa07a;" > "did=did:plc:23mysztmt7dh3l5lzhinzafi"< / span >
2024-05-20 13:10:29 +00:00
$ curl https://theauldsthretch.bsky.social/.well-known/atproto-did
did:plc:avzdf5esd7xpbgsgh7lx4kzq
< / code > < / pre >
< / div > < / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orga7295f1" data-background = "./bCardBackground.png" >
< h3 id = "orga7295f1" > Bluesky Identities 2/4< / h3 >
2024-05-20 13:10:29 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org1998a63" class = "figure" >
2024-05-20 13:10:29 +00:00
< p > < img src = "structurizr-1-018-BlueskyIdentity-02.png" alt = "structurizr-1-018-BlueskyIdentity-02.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orgc5df1be" data-background = "./bCardBackground.png" >
< h3 id = "orgc5df1be" > Bluesky Identities 3/4< / h3 >
2024-05-20 13:10:29 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org66ca3bd" class = "figure" >
2024-05-20 13:10:29 +00:00
< p > < img src = "structurizr-1-019-BlueskyIdentity-03.png" alt = "structurizr-1-019-BlueskyIdentity-03.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org2c0008d" data-background = "./bCardBackground.png" >
< h3 id = "org2c0008d" > Bluesky Identities 4/4< / h3 >
2024-05-20 13:10:29 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org533df2a" class = "figure" >
2024-05-20 13:10:29 +00:00
< 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 14:53:31 +00:00
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org08fb271" data-background = "./bCardBackground.png" >
< h2 id = "org08fb271" > Bluesky – Composable Feeds< / h2 >
< div class = "outline-text-2" id = "text-org08fb271" >
2024-05-20 14:53:31 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org3a41380" data-background = "./bCardBackground.png" >
< h3 id = "org3a41380" > Bluesky Composable Feeds 1/3< / h3 >
2024-05-20 14:53:31 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
2024-05-25 19:28:44 +00:00
< div id = "orgefa6bb4" class = "figure" >
2024-05-20 14:53:31 +00:00
< p > < img src = "structurizr-1-021-BlueskyFeeds-01.png" alt = "structurizr-1-021-BlueskyFeeds-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 30%" >
< ul >
< li class = "fragment appear" > Algorithmic feeds use an API< / li >
< li class = "fragment appear" > Allows for independent feeds to be created by 3rd parties< / li >
< li class = "fragment appear" > Users' default feed is < i > Following< / i > :
< ul >
< li > A chronological feed of posts from those you follow< / li >
< / ul > < / li >
< li class = "fragment appear" > Users subscribe to other feeds. Examples:
< ul >
< li > < i > Discover< / i > – posts that you may be interested in< / li >
< li > < i > Astronomy< / i > – Posts relating to astronomy< / li >
< li > < i > Quiet Posters< / i > – those you follow but who don't post very often< / li >
< / ul > < / li >
< li class = "fragment appear" > The < i > AppView< / i > will read data from the independent feeds< / li >
< li class = "fragment appear" > The feeds get relevant posts from the PDS< / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org8b76c2d" data-background = "./bCardBackground.png" >
< h3 id = "org8b76c2d" > Bluesky Composable Feeds 2/3 – feeds as a separate application type< / h3 >
2024-05-20 14:53:31 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org40b6633" class = "figure" >
2024-05-20 14:53:31 +00:00
< p > < img src = "structurizr-1-023-BlueskyFeeds-03.png" alt = "structurizr-1-023-BlueskyFeeds-03.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org8c023dc" data-background = "./bCardBackground.png" >
< h3 id = "org8c023dc" > Bluesky Composable Feeds 3/3 – Generic feeds< / h3 >
2024-05-20 14:53:31 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org9113ddd" class = "figure" >
2024-05-20 14:53:31 +00:00
< p > < img src = "structurizr-1-024-BlueskyFeeds-04.png" alt = "structurizr-1-024-BlueskyFeeds-04.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
< / section >
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orgcd374ae" data-background = "./bCardBackground.png" >
< h2 id = "orgcd374ae" > Bluesky – The AppView< / h2 >
< div class = "outline-text-2" id = "text-orgcd374ae" >
2024-05-20 14:53:31 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org9fb3197" data-background = "./bCardBackground.png" >
< h3 id = "org9fb3197" > Bluesky AppView 1/3< / h3 >
2024-05-20 14:53:31 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 60%" >
2024-05-25 19:28:44 +00:00
< div id = "org515eb99" class = "figure" >
2024-05-20 14:53:31 +00:00
< p > < img src = "structurizr-1-025-BlueskyAppView-01.png" alt = "structurizr-1-025-BlueskyAppView-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 40%" >
< ul >
< li class = "fragment appear" > The main application users interact with the < i > AppView< / i > .< / li >
< li class = "fragment appear" > The < i > AppView< / i > consists of the application (web, mobile, etc.) and the API
< ul >
2024-05-20 15:43:17 +00:00
< li > 3rd-party clients (web, mobile, bots) can be created< / li >
2024-05-20 14:53:31 +00:00
< / ul > < / li >
2024-05-20 15:43:17 +00:00
< li class = "fragment appear" > The client is only a part of the < i > AppView< / i > < / li >
< li class = "fragment appear" > The < i > AppView< / i > implements the < i > lexicon< / i > of the service
2024-05-20 14:53:31 +00:00
< ul >
< li > Converts the < i > data< / i > in the PDS into the social media < i > information< / i > < / li >
< / ul > < / li >
2024-05-20 15:43:17 +00:00
< li class = "fragment appear" > Now implemented by Bluesky as a separate service< / li >
< li class = "fragment appear" > < i > AppView< / i > reads from the feeds services, the moderation services and the PDS itelf< / li >
2024-05-20 14:53:31 +00:00
< li class = "fragment appear" > < i > AppView< / i > writes new posts, reposts, likes, replies, etc. to the PDS< / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org0992db0" data-background = "./bCardBackground.png" >
< h3 id = "org0992db0" > Bluesky AppView 2/3 – A 3rd-party independent AppView< / h3 >
2024-05-20 14:53:31 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 60%" >
2024-05-25 19:28:44 +00:00
< div id = "org7b9997d" class = "figure" >
2024-05-20 14:53:31 +00:00
< p > < img src = "structurizr-1-027-BlueskyAppView-03.png" alt = "structurizr-1-027-BlueskyAppView-03.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 40%" >
< ul >
< li > The main application users interact with the < i > AppView< / i > .< / li >
< li > The < i > AppView< / i > consists of the application (web, mobile, etc.) and the API
< ul >
2024-05-20 15:43:17 +00:00
< li > 3rd-party clients (web, mobile, bots) can be created< / li >
2024-05-20 14:53:31 +00:00
< / ul > < / li >
2024-05-20 15:43:17 +00:00
< li > The client is only a part of the < i > AppView< / i > < / li >
< li > The < i > AppView< / i > implements the < i > lexicon< / i > of the service
2024-05-20 14:53:31 +00:00
< ul >
< li > Converts the < i > data< / i > in the PDS into the social media < i > information< / i > < / li >
< / ul > < / li >
2024-05-20 15:43:17 +00:00
< li > Now implemented by Bluesky as a separate service< / li >
< li > < i > AppView< / i > reads from the feeds services, the moderation services and the PDS itelf< / li >
< li > < i > AppView< / i > writes new posts, reposts, likes, replies, etc. to the PDS< / li >
< li class = "fragment appear" > Third parties can also develop separate < i > AppViews< / i > (the client and APIs) …
2024-05-20 14:53:31 +00:00
< ul >
< li > Alternatives to Bluesky's own < i > AppView< / i > < / li >
< li > Implement a new < i > lexicon< / i > for, say, video sharing, long-form posts, etc.< / li >
< / ul > < / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org399c6de" data-background = "./bCardBackground.png" >
< h3 id = "org399c6de" > Bluesky AppView 3/3 – Generic AppView< / h3 >
2024-05-20 14:53:31 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "orgfc397a7" class = "figure" >
2024-05-20 14:53:31 +00:00
< p > < img src = "structurizr-1-028-BlueskyAppView-04.png" alt = "structurizr-1-028-BlueskyAppView-04.png" width = "70%" / >
< / p >
< / div >
< / div >
< / section >
< / section >
2024-05-20 15:43:17 +00:00
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org11ff99e" data-background = "./bCardBackground.png" >
< h2 id = "org11ff99e" > Bluesky – The Relay and the PDS< / h2 >
< div class = "outline-text-2" id = "text-org11ff99e" >
2024-05-20 15:43:17 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org897fac7" data-background = "./bCardBackground.png" >
< h3 id = "org897fac7" > Bluesky Relay 1/2 – 1 PDS into many< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
2024-05-25 19:28:44 +00:00
< div id = "org03c7907" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-029-BlueskyRelay-01.png" alt = "structurizr-1-029-BlueskyRelay-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 30%" >
< ul >
< li class = "fragment appear" > Initially, Bluesky had just 1 PDS< / li >
< li class = "fragment appear" > Separated out into multiple PDSs for performance reasons< / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orgce2dfdf" data-background = "./bCardBackground.png" >
< h3 id = "orgce2dfdf" > Bluesky Relay 2/2 – Relay, as a proxy to the PDSes< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
2024-05-25 19:28:44 +00:00
< div id = "org46c6eac" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-030-BlueskyRelay-02.png" alt = "structurizr-1-030-BlueskyRelay-02.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 30%" >
< ul >
< li > Initially, Bluesky had just 1 PDS< / li >
< li > Separated out into multiple PDSs for performance reasons< / li >
< li class = "fragment appear" > Interfaces for reading PDSs now proxied through < i > the Relay< / i > < / li >
< li class = "fragment appear" > The Relay stores metadata and indexes/indices of posts< / li >
< li class = "fragment appear" > All information about posts are read from the Relay
< ul >
< li > the < i > AppView< / i > < / li >
< li > algorithmic feeds services< / li >
< li > moderation< / li >
< / ul > < / li >
< li class = "fragment appear" > < i > AppView< / i > still writes to the PDS (new posts, etc.)< / li >
< li class = "fragment appear" > With < i > the Relay< / i > , we can now have < b > independent, self-hosted, PDSs< / b > .< / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org9b06846" data-background = "./bCardBackground.png" >
< h3 id = "org9b06846" > Bluesky PDS 1/3 – An independent PDS: "federation" of a sort< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "orgbaafeca" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-032-BlueskyPDS-01.png" alt = "structurizr-1-032-BlueskyPDS-01.png" width = "90%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org98204cf" data-background = "./bCardBackground.png" >
< h3 id = "org98204cf" > Bluesky PDS 2/3 – An independent PDS: "federation" of a sort< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org7ced10c" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-034-BlueskyPDS-03.png" alt = "structurizr-1-034-BlueskyPDS-03.png" width = "90%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org97b3d45" data-background = "./bCardBackground.png" >
< h3 id = "org97b3d45" > Bluesky PDS 3/3 – PDS: "federation" of a sort< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org9b4c327" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-035-BlueskyPDS-04.png" alt = "structurizr-1-035-BlueskyPDS-04.png" width = "80%" / >
< / p >
< / div >
< / div >
< / section >
< / section >
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org2dec4ec" data-background = "./bCardBackground.png" >
< h2 id = "org2dec4ec" > Bluesky – Moderation< / h2 >
< div class = "outline-text-2" id = "text-org2dec4ec" >
2024-05-20 15:43:17 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org18fcb5e" data-background = "./bCardBackground.png" >
< h3 id = "org18fcb5e" > Bluesky Moderation 1/2< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
2024-05-25 19:28:44 +00:00
< div id = "orgbb030f9" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-036-BlueskyModeration-01.png" alt = "structurizr-1-036-BlueskyModeration-01.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 30%" >
< ul >
< li class = "fragment appear" > Moderation separated out as a distinct service< / li >
< li class = "fragment appear" > Moderation tooling reads from the Relay< / li >
< li class = "fragment appear" > Bluesky maintains and operates the top-level moderation
< ul >
< li > Suppresses the really bad stuff, like illegal and abusive material< / li >
< li > and really, really, < i > really< / i > bad stuff like copyright infringement< sup > < a id = "fnr.1" class = "footref" href = "#fn.1" role = "doc-backlink" > 1< / a > < / sup > < / li >
< / ul > < / li >
< li class = "fragment appear" > But separate moderation services can be implemented by 3rd parties< / li >
< / ul >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org76eea11" data-background = "./bCardBackground.png" >
< h3 id = "org76eea11" > Bluesky Moderation 2/2 – A 3rd-party independent Moderation service< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "gridded_frame_with_columns e-frame" >
< div class = "one_of_2_columns" style = "width: 70%" >
2024-05-25 19:28:44 +00:00
< div id = "orga3fb7e8" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-038-BlueskyModeration-03.png" alt = "structurizr-1-038-BlueskyModeration-03.png" width = "100%" / >
< / p >
< / div >
< / div >
< div class = "one_of_2_columns" style = "width: 30%" >
< ul >
< li > Moderation separated out as a distinct service< / li >
< li > Moderation tooling reads from the Relay< / li >
< li > Bluesky maintains and operates the top-level moderation
< ul >
< li > Suppresses the really bad stuff, like illegal and abusive material< / li >
< li > and really, really, < i > really< / i > bad stuff like copyright infringement< / li >
< / ul > < / li >
< li > But separate moderation services can be implemented by 3rd parties< / li >
< li class = "fragment appear" > User subscribes to moderation service< / li >
< li class = "fragment appear" > Users' feeds have material removed or elided by the moderation service< / li >
< li class = "fragment appear" > User can't unsubscribe from Bluesky's moderation< / li >
< / ul >
< / div >
< / div >
< / section >
< / section >
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-orgdc59907" data-background = "./bCardBackground.png" >
< h2 id = "orgdc59907" > Bluesky< / h2 >
< div class = "outline-text-2" id = "text-orgdc59907" >
2024-05-20 15:43:17 +00:00
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org9e351b5" data-background = "./bCardBackground.png" >
< h3 id = "org9e351b5" > Bluesky – Current architecture< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "gridded_frame_with_columns e-frame" >
2024-05-25 19:28:44 +00:00
< div id = "org3936a39" class = "figure" >
2024-05-20 15:43:17 +00:00
< p > < img src = "structurizr-1-038-BlueskyModeration-03.png" alt = "structurizr-1-038-BlueskyModeration-03.png" width = "100%" / >
< / p >
< / div >
< / div >
< / section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org0002bbf" data-background = "./bCardBackground.png" >
< h3 id = "org0002bbf" > Bluesky – Roadmap< / h3 >
2024-05-20 15:43:17 +00:00
< div class = "e-frame" >
< p >
Planned for 2024
< / p >
< ul >
< li class = "fragment appear" > Private/Direct messages (DMs)
< ul >
< li > E2E Encrypted< / li >
< li > 1:1 initially, but group DMs planned< / li >
< / ul > < / li >
< li class = "fragment appear" > Video sharing
< ul >
< li > short clips, 90s or so.< / li >
< / ul > < / li >
< li class = "fragment appear" > Improved custom feeds< / li >
< li class = "fragment appear" > Improved anti-harassment< / li >
< li class = "fragment appear" > OAuth – for allowing 3rd-party clients to authenticate without
an application password< / li >
< / ul >
< / div >
< / section >
< / section >
2024-05-24 14:05:40 +00:00
< section >
2024-05-25 19:28:44 +00:00
< section id = "slide-org8fc9925" data-background = "./bCardBackground.png" >
< h2 id = "org8fc9925" > Resources and further reading< / h2 >
2024-05-24 19:38:02 +00:00
< div class = "e-frame" >
< ul >
< li > Original < a href = "https://knightcolumbia.org/content/protocols-not-platforms-a-technological-approach-to-free-speech" > < i > Protocols, Not Platforms: A Technological Approach to Free Speech< / i > < / a > paper< / li >
< li > < a href = "https://bsky.social/about" > Bluesky main page< / a > < / li >
< li > The < a href = "https://atproto.com/" > ATProtocol specification< / a > < / li >
< li > Bluesky < a href = "https://docs.bsky.app/" > documentation and blogs< / a > < / li >
< li > Bluesky's < a href = "https://github.com/bluesky-social" > github< / a > :
< ul >
< li > The < a href = "https://github.com/bluesky-social/atproto" > < code > atproto< / code > < / a > < / li >
< li > < a href = "https://github.com/bluesky-social/ozone" > Ozone< / a > , stackable content moderation tooling.< / li >
< li > Self-hosting a < a href = "https://github.com/bluesky-social/pds" > PDS< / a > .< / li >
< / ul > < / li >
< li > < a href = "https://docs.bsky.app/showcase" > Community< / a > (i.e. not governed by the Bluesky company) projects (tools, apps, bots, etc.)< / li >
< li > Original < a href = "https://git.gibiris.org/eibhearPublic/blueskyArchitecture" > source for this presentation< / a >
< ul >
< li > Structurizr < a href = "https://git.gibiris.org/eibhearPublic/blueskyArchitecture/src/branch/main/Bluesky.dsl" > DSL file< / a > < / li >
< / ul > < / li >
< / ul >
< / div >
2024-05-24 14:05:40 +00:00
< / section >
< / section >
2024-05-20 08:22:33 +00:00
< / div >
< / div >
2024-05-25 19:28:44 +00:00
< 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 >
2024-05-20 08:22:33 +00:00
< 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 >