commit 00cf8686ed2beef63a86a1b6dea9089fe2c7337f Author: Éibhear Ó hAnluain Date: Mon May 20 09:22:33 2024 +0100 First cut in new repo diff --git a/Bluesky.dsl b/Bluesky.dsl new file mode 100644 index 0000000..4ba34ef --- /dev/null +++ b/Bluesky.dsl @@ -0,0 +1,1064 @@ +workspace "Bluesky" "Bluesky architecture" { + + model { + + properties { + "structurizr.groupSeparator" "/" + } + + socialUser = person "Social Media User" "A regular social media user" typical + socialAdmin = person "Social Media Administrator" "The admin of a social media site" adminey + socialModerator = person "Social Media Moderator" "The moderator of a social media site" moderation + + genericSocial = softwareSystem "A generic social media site" "A generic Social media site" typical { + group genericSocialTypical { + genericSocialApp = container "Social App" "Application to access the social media site" "" typical + genericSocialDB = container "Social database" "Database of social media service" "" "database,typical" + genericSocialAPI = container "Social API" "API for accessing database" "" typical + } + + genericSocialAppToGenericSocialDB = genericSocialApp -> genericSocialAPI "Interacts" + genericSocialAPIToGenericSocialDB = genericSocialAPI -> genericSocialDB "Read and write" + + socialUserToGenericSocialApp = socialUser -> genericSocialApp "Uses" + } + + socialUserToGenericSocial = socialUser -> genericSocial "Enjoys" + socialAdminToGenericSocial = socialAdmin -> genericSocial "Manages" + socialModeratorToGenericSocial = socialModerator -> genericSocial "Builds trust" + + realisticSocial = softwareSystem "A more realistic social media site" "A more realistic social media site" typical { + group realisticSocialTypical { + realisticSocialApp = container "Social App" "Application to access the social media site" "" typical + realisticSocialAPI = container "Social API" "API for accessing database" "" typical + realisticSocialPostsDB = container "Posts database" "Posts, replies, likes, re-posts, follows, media, etc." "" "database,typical" + } + group realisticSocialModeration { + realisticSocialModeratingApp = container "Moderating App" "Application to label posts or users for moderation" "" moderation + realisticSocialModerationAPI = container "Social Moderation API" "API for accessing database" "" moderation + } + group realisticSocialFeeds { + realisticSocialFeeds = container "Feed algorithms" "What posts to present, in what order" "" algorithmic + realisticSocialFeedDesigner = container "Feed algorithm designer" "Tooling for designing algorithms" "" algorithmic + realisticSocialProfileDB = container "User and use profile database" "Public user profiles, network graphs, viewing histories, like histories, demographics, etc." "" "database,algorithmic" + } + + realisticSocialAPI -> realisticSocialFeeds "Reads" + realisticSocialFeedDesigner -> realisticSocialFeeds "Writes" + realisticSocialAPI -> realisticSocialPostsDB "Writes" + realisticSocialAPI -> realisticSocialProfileDB "Writes" + realisticSocialApp -> realisticSocialAPI "Reads and writes" + + realisticSocialFeeds -> realisticSocialPostsDB "Consumes" + realisticSocialFeeds -> realisticSocialProfileDB "Consumes" + + realisticSocialModerationAPI -> realisticSocialPostsDB "Writes" + realisticSocialModeratingApp -> realisticSocialModerationAPI "Interacts" + + socialUserToRealisticSocialApp = socialUser -> realisticSocialApp "Uses" + socialModeratorToRealisticSocialModeratingApp = socialModerator -> realisticSocialModeratingApp "Labels" + socialAdminToRealisticSocialFeedDesigner = socialAdmin -> realisticSocialFeedDesigner "Design feeds" + } + + socialUserToRealisticSocial = socialUser -> realisticSocial "Enjoys" + socialAdminToRealisticSocial = socialAdmin -> realisticSocial "Manages" + socialModeratorToRealisticSocial = socialModerator -> realisticSocial "Builds trust" + + federatedSocial1User = person "User of a federated service" "User of a federated service" typical + federatedSocial1Admin = person "Administrator of a federated service" "Administrator of a federated service" adminey + + federatedSocial2User = person "User of another federated service" "User of a federated service" typical + federatedSocial2Admin = person "Administrator of another federated service" "Administrator of a federated service" adminey + + federatedSocial3User = person "User of a third federated service" "User of a federated service" typical + federatedSocial3Admin = person "Administrator of a third federated service" "Administrator of a federated service" adminey + + federatedSocial4User = person "User of a fourth federated service" "User of a federated service" typical + federatedSocial4Admin = person "Administrator of a fourth federated service" "Administrator of a federated service" adminey + + federatedSocial1 = softwareSystem "A federated social media site" "A federated social media site" federation { + group federatedSocial1Typical { + federatedSocial1App = container "Social App" "Application to access the social media site" "" typical + federatedSocial1API = container "Social API" "API for accessing database" "" typical + federatedSocial1PostsDB = container "Posts database" "Posts, replies, likes, re-posts, follows, media, etc." "" "database,typical" + } + group federatedSocial1Moderation { + federatedSocial1ModeratingApp = container "Moderating App" "Application to label posts or users for moderation" "" moderation + federatedSocial1ModerationAPI = container "Social Moderation API" "API for accessing database" "" moderation + } + + group federatedSocial1Federation { + federatedSocial1Federation = container "Federation" "Shares posts with other federated services" "" federation + federatedSocial1FederationAPI = container "Federation API" "Takes posts from other federated services" "" federation + federatedSocial1FederatedPostsDB = container "Federated Posts database" "Posts and related metadata from other" "" "database,federation" + } + + federatedSocial1Federation -> federatedSocial1PostsDB "Reads" + federatedSocial1FederationAPI -> federatedSocial1FederatedPostsDB "Writes" + federatedSocial1API -> federatedSocial1PostsDB "Reads and writes" + federatedSocial1API -> federatedSocial1FederatedPostsDB "Reads" + federatedSocial1App -> federatedSocial1API "Reads and writes" + + federatedSocial1ModerationAPI -> federatedSocial1PostsDB "Writes" + federatedSocial1ModerationAPI -> federatedSocial1FederatedPostsDB "Writes" + federatedSocial1ModeratingApp -> federatedSocial1ModerationAPI "Interacts" + + federatedSocial1UserToFederatedSocial1App = federatedSocial1User -> federatedSocial1App "Uses" + federatedSocial1AdminToFederatedSocial1ModeratingApp = federatedSocial1Admin -> federatedSocial1ModeratingApp "Labels" + } + + federatedSocial1UserToFederatedSocial1 = federatedSocial1User -> federatedSocial1 "Enjoys" + federatedSocial1AdminToFederatedSocial1Admin = federatedSocial1Admin -> federatedSocial1 "Manages" + federatedSocial1AdminToFederatedSocial1Moderates = federatedSocial1Admin -> federatedSocial1 "Builds trust" + + federatedSocial2 = softwareSystem "Another federated social media site" "A federated social media site" federation { + group federatedSocial2Typical { + federatedSocial2App = container "Social App" "Application to access the social media site" "" typical + federatedSocial2API = container "Social API" "API for accessing database" "" typical + federatedSocial2PostsDB = container "Posts database" "Posts, replies, likes, re-posts, follows, media, etc." "" "database,typical" + } + group federatedSocial2Moderation { + federatedSocial2ModeratingApp = container "Moderating App" "Application to label posts or users for moderation" "" moderation + federatedSocial2ModerationAPI = container "Social Moderation API" "API for accessing database" "" moderation + } + + group federatedSocial2Federation { + federatedSocial2Federation = container "Federation" "Shares posts with other federated services" "" federation + federatedSocial2FederationAPI = container "Federation API" "Takes posts from other federated services" "" federation + federatedSocial2FederatedPostsDB = container "Federated Posts database" "Posts and related metadata from other" "" "database,federation" + } + + federatedSocial2Federation -> federatedSocial2PostsDB "Reads" + federatedSocial2FederationAPI -> federatedSocial2PostsDB "Writes" + federatedSocial2API -> federatedSocial2PostsDB "Reads and writes" + federatedSocial2API -> federatedSocial2FederatedPostsDB "Reads" + federatedSocial2App -> federatedSocial2API "Reads and writes" + + federatedSocial2ModerationAPI -> federatedSocial2PostsDB "Writes" + federatedSocial2ModerationAPI -> federatedSocial2FederatedPostsDB "Writes" + federatedSocial2ModeratingApp -> federatedSocial2ModerationAPI "Interacts" + + socialUserToFederatedSocial2App = socialUser -> federatedSocial2App "Uses" + socialAdminToFederatedSocial2ModeratingApp = socialAdmin -> federatedSocial2ModeratingApp "Labels" + } + + federatedSocial2UserToFederatedSocial2 = federatedSocial2User -> federatedSocial2 "Enjoys" + federatedSocial2AdminToFederatedSocial2Admin = federatedSocial2Admin -> federatedSocial2 "Manages" + federatedSocial2AdminToFederatedSocial2Moderates = federatedSocial2Admin -> federatedSocial2 "Builds trust" + + federatedSocial3 = softwareSystem "A third federated social media site" "A federated social media site" federation { + group federatedSocial3Typical { + federatedSocial3App = container "Social App" "Application to access the social media site" "" typical + federatedSocial3API = container "Social API" "API for accessing database" "" typical + federatedSocial3PostsDB = container "Posts database" "Posts, replies, likes, re-posts, follows, media, etc." "" "database,typical" + } + group federatedSocial3Moderation { + federatedSocial3ModeratingApp = container "Moderating App" "Application to label posts or users for moderation" "" moderation + federatedSocial3ModerationAPI = container "Social Moderation API" "API for accessing database" "" moderation + } + + group federatedSocial3Federation { + federatedSocial3Federation = container "Federation" "Shares posts with other federated services" "" federation + federatedSocial3FederationAPI = container "Federation API" "Takes posts from other federated services" "" federation + federatedSocial3FederatedPostsDB = container "Federated Posts database" "Posts and related metadata from other" "" "database,federation" + } + + federatedSocial3Federation -> federatedSocial3PostsDB "Reads" + federatedSocial3FederationAPI -> federatedSocial3PostsDB "Writes" + federatedSocial3API -> federatedSocial3PostsDB "Reads and writes" + federatedSocial3API -> federatedSocial3FederatedPostsDB "Reads" + federatedSocial3App -> federatedSocial3API "Reads and writes" + + federatedSocial3ModerationAPI -> federatedSocial3PostsDB "Writes" + federatedSocial3ModerationAPI -> federatedSocial3FederatedPostsDB "Writes" + federatedSocial3ModeratingApp -> federatedSocial3ModerationAPI "Interacts" + + socialUserToFederatedSocial3App = socialUser -> federatedSocial3App "Uses" + socialAdminToFederatedSocial3ModeratingApp = socialAdmin -> federatedSocial3ModeratingApp "Labels" + } + + federatedSocial3UserToFederatedSocial3 = federatedSocial3User -> federatedSocial3 "Enjoys" + federatedSocial3AdminToFederatedSocial3Admin = federatedSocial3Admin -> federatedSocial3 "Manages" + federatedSocial3AdminToFederatedSocial3Moderates = federatedSocial3Admin -> federatedSocial3 "Builds trust" + + federatedSocial4 = softwareSystem "A fourth federated social media site" "A federated social media site" federation { + group federatedSocial4Typical { + federatedSocial4App = container "Social App" "Application to access the social media site" "" typical + federatedSocial4API = container "Social API" "API for accessing database" "" typical + federatedSocial4PostsDB = container "Posts database" "Posts, replies, likes, re-posts, follows, media, etc." "" "database,typical" + } + group federatedSocial4Moderation { + federatedSocial4ModeratingApp = container "Moderating App" "Application to label posts or users for moderation" "" moderation + federatedSocial4ModerationAPI = container "Social Moderation API" "API for accessing database" "" moderation + } + + group federatedSocial4Federation { + federatedSocial4Federation = container "Federation" "Shares posts with other federated services" "" federation + federatedSocial4FederationAPI = container "Federation API" "Takes posts from other federated services" "" federation + federatedSocial4FederatedPostsDB = container "Federated Posts database" "Posts and related metadata from other" "" "database,federation" + } + + federatedSocial4Federation -> federatedSocial4PostsDB "Reads" + federatedSocial4FederationAPI -> federatedSocial4PostsDB "Writes" + federatedSocial4API -> federatedSocial4PostsDB "Reads and writes" + federatedSocial4API -> federatedSocial4FederatedPostsDB "Reads" + federatedSocial4App -> federatedSocial4API "Reads and writes" + + federatedSocial4ModerationAPI -> federatedSocial4PostsDB "Writes" + federatedSocial4ModerationAPI -> federatedSocial4FederatedPostsDB "Writes" + federatedSocial4ModeratingApp -> federatedSocial4ModerationAPI "Interacts" + + socialUserToFederatedSocial4App = socialUser -> federatedSocial4App "Uses" + socialAdminToFederatedSocial4ModeratingApp = socialAdmin -> federatedSocial4ModeratingApp "Labels" + } + + federatedSocial4UserToFederatedSocial4 = federatedSocial4User -> federatedSocial4 "Enjoys" + federatedSocial4AdminToFederatedSocial4Admin = federatedSocial4Admin -> federatedSocial4 "Manages" + federatedSocial4AdminToFederatedSocial4Moderates = federatedSocial4Admin -> federatedSocial4 "Builds trust" + + federatedSocial1Federation -> federatedSocial2FederationAPI "Sends" + federatedSocial1Federation -> federatedSocial3FederationAPI "Sends" + federatedSocial1Federation -> federatedSocial4FederationAPI "Sends" + federatedSocial2Federation -> federatedSocial1FederationAPI "Sends" + federatedSocial2Federation -> federatedSocial3FederationAPI "Sends" + federatedSocial2Federation -> federatedSocial4FederationAPI "Sends" + federatedSocial3Federation -> federatedSocial1FederationAPI "Sends" + federatedSocial3Federation -> federatedSocial2FederationAPI "Sends" + federatedSocial3Federation -> federatedSocial4FederationAPI "Sends" + federatedSocial4Federation -> federatedSocial1FederationAPI "Sends" + federatedSocial4Federation -> federatedSocial2FederationAPI "Sends" + federatedSocial4Federation -> federatedSocial3FederationAPI "Sends" + + typicalBlueskyUser1 = person "Bluesky User 1" "A typical user of Bluesky, @user1.bsky.social" typical + typicalBlueskyUser2 = person "Bluesky User 2" "Another typical user of Bluesky, @user2.bsky.social" typical + otherIDBlueskyUser1 = person "Bluesky User at example.com" "A Bluesky user with ID @user.example.com" federation + otherIDBlueskyUser2 = person "Bluesky User at example.me" "A Bluesky user with ID @user.example.me" federation + + blueskyStaffMemberAsAdmin = person "A Bluesky admin" "A member of Bluesky staff operating as an admin" algorithmic + blueskyStaffMemberAsModerator = person "A Bluesky moderator" "A member of Bluesky staff operating as a moderator" moderation + + externalBlueskyModerator1 = person "An external Bluesky moderator" "An external labeller" moderation + + group controlledByBluesky { + centralBluesky = softwareSystem "Central Bluesky" "The original Bluesky implementation" atproto { + group blueskyTypical { + centralBlueskyAppView = container "Central Bluesky App View" "A view into the network for users" "" typical + group Entryway { + centralBlueskyPDS1 = container "Central Bluesky PDS" "A Personal Data Server in the Bluesky-hosted environment." "" "database,typical" + centralBlueskyPDS2 = container "Central Bluesky PDS 2" "Another Personal Data Server in the Bluesky-hosted environment." "" "database,typical" + centralBlueskyPDS3 = container "Central Bluesky PDS 3" "A third Personal Data Server in the Bluesky-hosted environment." "" "database,typical" + } + centralBlueskyIdentityResolver = container "Central Bluesky ID resolver" "Identity resolver for @.bsky.social users" "" typical + } + + group blueskyModeration { + centralBlueskyModeration = container "Central Bluesky moderation" "The network's initial, and non-optional, labelling and moderation service" "" moderation + } + + group blueskyFeeds { + centralBlueskyFeeds = container "Central Bluesky feeds generation" "A service providing subscribable algorithmic feeds" "" algorithmic + } + + centralBlueskyAppViewToCentralBlueskyIdentityResolver = centralBlueskyAppView -> centralBlueskyIdentityResolver "Validates" + + centralBlueskyAppViewToCentralBlueskyPDS1 = centralBlueskyAppView -> centralBlueskyPDS1 "App View reads and writes" + centralBlueskyAppViewToCentralBlueskyPDS2 = centralBlueskyAppView -> centralBlueskyPDS2 "App View reads and writes" + centralBlueskyAppViewToCentralBlueskyPDS3 = centralBlueskyAppView -> centralBlueskyPDS3 "App View reads and writes" + + centralBlueskyAppViewToCentralBlueskyFeeds = centralBlueskyAppView -> centralBlueskyFeeds "App View reads" + centralBlueskyAppViewToCentralBlueskyModeration = centralBlueskyAppView -> centralBlueskyModeration "App View reads" + + centralBlueskyFeedsToCentralBlueskyPDS1 = centralBlueskyFeeds -> centralBlueskyPDS1 "Feeds reads" + centralBlueskyFeedsToCentralBlueskyPDS2 = centralBlueskyFeeds -> centralBlueskyPDS2 "Feeds reads" + centralBlueskyFeedsToCentralBlueskyPDS3 = centralBlueskyFeeds -> centralBlueskyPDS3 "Feeds reads" + centralBlueskyFeedsToCentralBlueskyModeration = centralBlueskyFeeds -> centralBlueskyModeration "Feeds reads" + + centralBlueskyModerationToCentralBlueskyPDS1 = centralBlueskyModeration -> centralBlueskyPDS1 "Moderation reads" + centralBlueskyModerationToCentralBlueskyPDS2 = centralBlueskyModeration -> centralBlueskyPDS2 "Moderation reads" + centralBlueskyModerationToCentralBlueskyPDS3 = centralBlueskyModeration -> centralBlueskyPDS3 "Moderation reads" + + typicalBlueskyUser1ToCentralBlueskyIdentityResolver = typicalBlueskyUser1 -> centralBlueskyIdentityResolver "Registers" + typicalBlueskyUser2ToCentralBlueskyIdentityResolver = typicalBlueskyUser2 -> centralBlueskyIdentityResolver "Registers" + + typicalBlueskyUser1ToCentralBlueskyAppView = typicalBlueskyUser1 -> centralBlueskyAppView "Uses" + typicalBlueskyUser2ToCentralBlueskyAppView = typicalBlueskyUser2 -> centralBlueskyAppView "Uses" + otherIDBlueskyUser1ToCentralBlueskyAppView = otherIDBlueskyUser1 -> centralBlueskyAppView "Uses" + otherIDBlueskyUser2ToCentralBlueskyAppView = otherIDBlueskyUser2 -> centralBlueskyAppView "Uses" + + blueskyStaffMemberAsAdminToCentralBlueskyFeeds = blueskyStaffMemberAsAdmin -> centralBlueskyFeeds "Creates" + blueskyStaffMemberAsModeratorToCentralBlueskyModeration = blueskyStaffMemberAsModerator -> centralBlueskyModeration "Labels" + } + + blueskyAppView = softwareSystem "Bluesky's App View" "Bluesky's App View implementation as a separate application" typical { + blueskyAppViewApp = container "Bluesky's App View Application" "An App View app for the user" "Web Application" typical + blueskyAppViewAPI = container "Bluesky's App View API" "An API, for use by third-party applications and bots" "" typical + blueskyAppViewServices = container "Bluesky's App View Services" "Data retrieval services" "" typical + blueskyAppViewIndex = container "Bluesky's App View Index" "Index of posts and related data" "" typical + + blueskyAppViewApp -> blueskyAppViewAPI "Accesses" + blueskyAppViewAPI -> blueskyAppViewServices "Consumes" + blueskyAppViewServices -> blueskyAppViewIndex "Consults" + } + + blueskyRelay = softwareSystem "A Bluesky Relay" "A service making available all data in the bluesky network" atproto { + blueskyRelayAPI = container "Relay API" "An API for writing to and reading from the Relay" "" atproto + blueskyRelayDB = container "Relay database" "The database holding metadata of all posts" "" "database,atproto" + + blueskyRelayAPI -> blueskyRelayDB "Reads and writes" + } + + blueskyFeedsGenerator = softwareSystem "Bluesky's Feed Generation" "A service building and exposing algorithmic feeds" algorithmic { + blueskyFeedsGeneratorApp = container "Feed generator App" "An application for building algorithmic feeds" "" algorithmic + blueskyFeedsGeneratorAPI = container "Feed generator API" "An API for accessing algorithmic feeds" "" algorithmic + blueskyFeedsGeneratorService = container "Feed generator data capture service" "The database holding details of the algorithmic feeds" "" algorithmic + blueskyFeedsGeneratorDB = container "Feed generator database" "The database holding details of the algorithmic feeds" "" "database,algorithmic" + + blueskyFeedsGeneratorApp -> blueskyFeedsGeneratorAPI "For management" + blueskyFeedsGeneratorAPI -> blueskyFeedsGeneratorService "Consumes" + blueskyFeedsGeneratorService -> blueskyFeedsGeneratorDB "Writes" + } + + blueskyModeration = softwareSystem "Bluesky Moderation" "An independent service building and exposing moderation decisions" moderation { + blueskyModerationApp = container "Moderation labelling app" "An application for labelling items" "" moderation + blueskyModerationAPI = container "Moderation API" "An API for accessing decisions and for applying labels" "" moderation + blueskyModerationService = container "Moderation data capture service" "Service to provide access to posts for moderation actions" "" moderation + blueskyModerationDB = container "Moderation decisions database" "The database holding details of the moderation decisions" "" "database,moderation" + + blueskyModerationApp -> blueskyModerationAPI "For management" + blueskyModerationAPI -> blueskyModerationService "Consumes" + blueskyModerationService -> blueskyModerationDB "Writes" + } + } + + typicalBlueskyUser1ToCentralBluesky = typicalBlueskyUser1 -> centralBluesky "Enjoys" + typicalBlueskyUser2ToCentralBluesky = typicalBlueskyUser2 -> centralBluesky "Enjoys" + otherIDBlueskyUser1ToCentralBluesky = otherIDBlueskyUser1 -> centralBluesky "Enjoys" + otherIDBlueskyUser2ToCentralBluesky = otherIDBlueskyUser2 -> centralBluesky "Enjoys" + blueskyStaffMemberAsAdminToCentralBluesky = blueskyStaffMemberAsAdmin -> centralBluesky "Manages" + blueskyStaffMemberAsModeratorToCentralBluesky = blueskyStaffMemberAsModerator -> centralBluesky "Builds trust" + typicalBlueskyUser1 -> blueskyAppViewApp "Uses" + typicalBlueskyUser2 -> blueskyAppViewApp "Uses" + blueskyAppViewServicesToCentralBlueskyPDS1 = blueskyAppViewServices -> centralBlueskyPDS1 "Reads and writes" + blueskyAppViewServicesToCentralBlueskyPDS2 = blueskyAppViewServices -> centralBlueskyPDS2 "Reads and writes" + blueskyAppViewServicesToCentralBlueskyPDS3 = blueskyAppViewServices -> centralBlueskyPDS3 "Reads and writes" + blueskyAppViewServices -> centralBlueskyFeeds "Reads" + blueskyAppViewServices -> centralBlueskyModeration "Reads" + + group controlledBySelfHosters { + independentExampleComIDSystem = softwareSystem "External Identity Management for example.com users" "An external system for managing user identities in example.com" atproto { + independentExampleComIdentityResolver = container "External ID resolver" "Identity resolver for @.example.com users" ".well-known" typical + + otherIDBlueskyUser1ToIndependentExampleComIdentityResolver = otherIDBlueskyUser1 -> independentExampleComIdentityResolver "Registers" + } + + independentExampleMeIDSystem = softwareSystem "External Identity Management for example.me users" "An external system for managing user identities in example.me" atproto { + independentExampleMeIdentityResolver = container "External ID resolver" "Identity resolver for @.example.me users" "DNS TXT" typical + + otherIDBlueskyUser2ToIndependentExampleMeIdentityResolver = otherIDBlueskyUser2 -> independentExampleMeIdentityResolver "Registers" + } + + independentPDS1 = softwareSystem "A selfhosted PDS" "A Personal Data Server hosted and maintain by the Bluesky user" atproto { + independentPDS1PDSAPI = container "PDS API" "The API to access the Personal Data Server for @.example.social." "" typical + independentPDS1PDSService = container "PDS publish service" "A service to publish activity into the PDS to the Relay" "" typical + independentPDS1PDSDB = container "PDS DB" "The database for the Personal Data Server for @.example.social." "" "database,typical" + + independentPDS1PDSAPI -> independentPDS1PDSDB "API Reads and writes" + independentPDS1PDSService -> independentPDS1PDSDB "Reads" + } + + independentPDS2 = softwareSystem "Another selfhosted PDS" "A Personal Data Server hosted and maintain by the Bluesky user" atproto { + independentPDS2PDSAPI = container "PDS 2 API" "The API to access the Personal Data Server." "" typical + independentPDS2PDSService = container "PDS 2 publish service" "A service to publish activity into the PDS to the Relay" "" typical + independentPDS2PDSDB = container "PDS 2 DB" "The database for the Personal Data Server." "" "database,typical" + + independentPDS2PDSAPI -> independentPDS2PDSDB "API Reads and writes" + independentPDS2PDSService -> independentPDS2PDSDB "Reads" + } + + independentAppView = softwareSystem "An Independent App View" "Bluesky's App View implementation as a separate application" typical { + independentAppViewApp = container "An Independent App View Application" "An App View app for the user" "Web Application" typical + independentAppViewAPI = container "An Independent App View API" "An API, for use by third-party applications and bots" "" typical + independentAppViewServices = container "An Independent App View Services" "Data retrieval services" "" typical + independentAppViewIndex = container "An Independent App View Index" "Index of posts and related data" "" typical + + independentAppViewApp -> independentAppViewAPI "Accesses" + independentAppViewAPI -> independentAppViewServices "Consumes" + independentAppViewServices -> independentAppViewIndex "Consults" + } + + independentFeedGenerator = softwareSystem "Independent Feed Generation" "An independent service building and exposing algorithmic feeds" algorithmic { + independentFeedGeneratorApp = container "Feed generator App" "An application for building algorithmic feeds" "" algorithmic + independentFeedGeneratorAPI = container "Feed generator API" "An API for accessing algorithmic feeds" "" algorithmic + independentFeedGeneratorService = container "Feed generator data capture service" "The database holding details of the algorithmic feeds" "" algorithmic + independentFeedGeneratorDB = container "Feed generator database" "The database holding details of the algorithmic feeds" "" "database,algorithmic" + + independentFeedGeneratorApp -> independentFeedGeneratorAPI "For management" + independentFeedGeneratorAPI -> independentFeedGeneratorService "Consumes" + independentFeedGeneratorService -> independentFeedGeneratorDB "Writes" + } + + independentModeration = softwareSystem "Independent Moderation" "An independent service building and exposing moderation decisions" moderation { + independentModerationApp = container "Moderation labelling app" "An application for labelling items" "" moderation + independentModerationAPI = container "Moderation API" "An API for accessing decisions and for applying labels" "" moderation + independentModerationService = container "Moderation data capture service" "Service to provide access to posts for moderation actions" "" moderation + independentModerationDB = container "Moderation decisions database" "The database holding details of the moderation decisions" "" "database,moderation" + + independentModerationApp -> independentModerationAPI "For management" + independentModerationAPI -> independentModerationService "Consumes" + independentModerationService -> independentModerationDB "Writes" + } + } + + group genericBSkyServices { + genericBSkyIDSystem = softwareSystem "Generic Bluesky Identity Management for users" "A generic system for managing user identities for the AT Protocol" atproto { + genericBSkyIdentityResolver = container "Independent ID resolver" "Identity resolver for" "DNS TXT or .well-known" atproto + } + + genericFeedGenerator = softwareSystem "Generic Feed Generation" "An generic service building and exposing algorithmic feeds" algorithmic { + genericFeedGeneratorApp = container "Feed generator App" "An application for building algorithmic feeds" "" algorithmic + genericFeedGeneratorAPI = container "Feed generator API" "An API for accessing algorithmic feeds" "" algorithmic + genericFeedGeneratorService = container "Feed generator data capture service" "The database holding details of the algorithmic feeds" "" algorithmic + genericFeedGeneratorDB = container "Feed generator database" "The database holding details of the algorithmic feeds" "" "database,algorithmic" + + genericFeedGeneratorApp -> genericFeedGeneratorAPI "For management" + genericFeedGeneratorAPI -> genericFeedGeneratorService "Consumes" + genericFeedGeneratorService -> genericFeedGeneratorDB "Writes" + } + + genericAppView = softwareSystem "A Generic App View" "Bluesky's App View implementation as a separate application" typical { + genericAppViewApp = container "A Generic App View Application" "An App View app for the user" "Web Application" typical + genericAppViewAPI = container "A Generic App View API" "An API, for use by third-party applications and bots" "" typical + genericAppViewServices = container "A Generic App View Services" "Data retrieval services" "" typical + genericAppViewIndex = container "A Generic App View Index" "Index of posts and related data" "" typical + + genericAppViewApp -> genericAppViewAPI "Accesses" + genericAppViewAPI -> genericAppViewServices "Consumes" + genericAppViewServices -> genericAppViewIndex "Consults" + } + + genericPDS = softwareSystem "A generic PDS" "A Personal Data Server hosted and maintain by the Bluesky user" atproto { + genericPDSPDSAPI = container "PDS API" "The API to access the Personal Data Server for @.example.social." "" typical + genericPDSPDSService = container "PDS publish service" "A service to publish activity into the PDS to the Relay" "" typical + genericPDSPDSDB = container "PDS DB" "The database for the Personal Data Server for @.example.social." "" "database,typical" + + genericPDSPDSAPI -> genericPDSPDSDB "API Reads and writes" + genericPDSPDSService -> genericPDSPDSDB "Reads" + } + } + // AppView reads from moderation API + genericAppViewServices -> blueskyModerationAPI "App View reads" + genericAppViewServices -> independentModerationAPI "App View reads" + // Moderatory uses the app + blueskyStaffMemberAsModerator -> blueskyModerationApp "Labels" + externalBlueskyModerator1 -> independentModerationApp "Labels" + // Moderation reads the relay (not the PDS!) + blueskyModerationService -> blueskyRelayAPI "Reads and writes" + independentModerationService -> blueskyRelayAPI "Reads and writes" + + typicalBlueskyUser1 -> independentAppViewApp "Uses" + typicalBlueskyUser2 -> independentAppViewApp "Uses" + independentAppViewServicesToCentralBlueskyPDS1 = independentAppViewServices -> centralBlueskyPDS1 "Reads and writes" + independentAppViewServicesToCentralBlueskyPDS2 = independentAppViewServices -> centralBlueskyPDS2 "Reads and writes" + independentAppViewServicesToCentralBlueskyPDS3 = independentAppViewServices -> centralBlueskyPDS3 "Reads and writes" + independentAppViewServices -> centralBlueskyFeeds "Reads" + independentAppViewServices -> centralBlueskyModeration "Reads" + typicalBlueskyUser1 -> genericAppViewApp "Uses" + typicalBlueskyUser2 -> genericAppViewApp "Uses" + genericAppViewServicesToCentralBlueskyPDS1 = genericAppViewServices -> centralBlueskyPDS1 "Reads and writes" + genericAppViewServicesToCentralBlueskyPDS2 = genericAppViewServices -> centralBlueskyPDS2 "Reads and writes" + genericAppViewServicesToCentralBlueskyPDS3 = genericAppViewServices -> centralBlueskyPDS3 "Reads and writes" + genericAppViewServices -> centralBlueskyFeeds "Reads" + genericAppViewServices -> centralBlueskyModeration "Reads" + centralBlueskyAppViewToIndependentExampleComIdentityResolver = centralBlueskyAppView -> independentExampleComIdentityResolver "Validates" + + centralBlueskyAppViewToIndependentExampleMeIdentityResolver = centralBlueskyAppView -> independentExampleMeIdentityResolver "Validates" + typicalBlueskyUser1ToGenericBSkyIdentityResolver = typicalBlueskyUser1 -> genericBSkyIdentityResolver "Registers" + typicalBlueskyUser2ToGenericBSkyIdentityResolver = typicalBlueskyUser2 -> genericBSkyIdentityResolver "Registers" + centralBlueskyAppViewToGenericBSkyIdentityResolver = centralBlueskyAppView -> genericBSkyIdentityResolver "Validates" + + independentPDS1BlueskyUser1 = person "Own PDS Bluesky user" "A Bluesky user hosting their own PDS" federation + + independentPDS1BlueskyUser1 -> blueskyAppViewApp "Uses" + independentPDS1BlueskyUser1 -> independentAppViewApp "Uses" + independentPDS1BlueskyUser1 -> genericAppViewApp "Uses" + independentPDS1BlueskyUser1 -> independentPDS1 "Manages" + blueskyAppViewServices -> independentPDS1PDSAPI "Writes" + independentAppViewServices -> independentPDS1PDSAPI "Writes" + genericAppViewServices -> independentPDS1PDSAPI "Writes" + centralBlueskyAppView -> independentPDS1PDSAPI "App View writes" + + independentPDS1BlueskyUser1 -> genericPDS "Manages" + blueskyAppViewServices -> genericPDSPDSAPI "Writes" + independentAppViewServices -> genericPDSPDSAPI "Writes" + genericAppViewServices -> genericPDSPDSAPI "Writes" + centralBlueskyAppView -> genericPDSPDSAPI "App View writes" + + independentPDS2BlueskyUser1 = person "Another Own PDS Bluesky user" "A Bluesky user hosting their own PDS" federation + + independentPDS2BlueskyUser1 -> blueskyAppViewApp "Uses" + independentPDS2BlueskyUser1 -> independentAppViewApp "Uses" + independentPDS2BlueskyUser1 -> genericAppViewApp "Uses" + independentPDS2BlueskyUser1 -> independentPDS2 "Manages" + blueskyAppViewServices -> independentPDS2PDSAPI "Writes" + independentAppViewServices -> independentPDS2PDSAPI "Writes" + genericAppViewServices -> independentPDS2PDSAPI "Writes" + centralBlueskyAppView -> independentPDS2PDSAPI "App View writes" + + externalBlueskyAlgorithmBuilder = person "A feed builder" "An external feed/algorithm builder" algorithmic + + independentFeedGeneratorServiceToCentralBlueskyPDS1 = independentFeedGeneratorService -> centralBlueskyPDS1 "Reads" + independentFeedGeneratorServiceToCentralBlueskyPDS2 = independentFeedGeneratorService -> centralBlueskyPDS2 "Reads" + independentFeedGeneratorServiceToCentralBlueskyPDS3 = independentFeedGeneratorService -> centralBlueskyPDS3 "Reads" + genericFeedGeneratorServiceToCentralBlueskyPDS1 = genericFeedGeneratorService -> centralBlueskyPDS1 "Reads" + genericFeedGeneratorServiceToCentralBlueskyPDS2 = genericFeedGeneratorService -> centralBlueskyPDS2 "Reads" + genericFeedGeneratorServiceToCentralBlueskyPDS3 = genericFeedGeneratorService -> centralBlueskyPDS3 "Reads" + blueskyFeedsGeneratorServiceToCentralBlueskyPDS1 = blueskyFeedsGeneratorService -> centralBlueskyPDS1 "Reads" + blueskyFeedsGeneratorServiceToCentralBlueskyPDS2 = blueskyFeedsGeneratorService -> centralBlueskyPDS2 "Reads" + blueskyFeedsGeneratorServiceToCentralBlueskyPDS3 = blueskyFeedsGeneratorService -> centralBlueskyPDS3 "Reads" + centralBlueskyAppViewToIndependentFeedGeneratorAPI = centralBlueskyAppView -> independentFeedGeneratorAPI "App View reads" + blueskyAppViewServices -> independentFeedGeneratorAPI "App View reads" + externalBlueskyAlgorithmBuilder -> independentFeedGeneratorApp "Creates and manages feeds" + centralBlueskyAppViewToGenericFeedGeneratorAPI = centralBlueskyAppView -> genericFeedGeneratorAPI "App View reads" + blueskyAppViewServices -> genericFeedGeneratorAPI "App View reads" + externalBlueskyAlgorithmBuilder -> genericFeedGeneratorApp "Creates and manages feeds" + centralBlueskyAppViewToBlueskyFeedsGeneratorAPI = centralBlueskyAppView -> blueskyFeedsGeneratorAPI "App View reads" + blueskyAppViewServices -> blueskyFeedsGeneratorAPI "App View reads" + independentAppViewServices -> independentFeedGeneratorAPI "App View reads" + independentAppViewServices -> genericFeedGeneratorAPI "App View reads" + independentAppViewServices -> blueskyFeedsGeneratorAPI "App View reads" + genericAppViewServices -> independentFeedGeneratorAPI "App View reads" + genericAppViewServices -> genericFeedGeneratorAPI "App View reads" + genericAppViewServices -> blueskyFeedsGeneratorAPI "App View reads" + blueskyStaffMemberAsAdmin -> blueskyFeedsGeneratorApp "Creates and manages feeds" + blueskyStaffMemberAsAdmin -> genericFeedGeneratorApp "Creates and manages feeds" + + centralBlueskyPDS1 -> blueskyRelayAPI "Writes" + centralBlueskyPDS2 -> blueskyRelayAPI "Writes" + centralBlueskyPDS3 -> blueskyRelayAPI "Writes" + centralBlueskyModeration -> blueskyRelayAPI "Reads" + blueskyAppViewServices -> blueskyRelayAPI "App View reads" + independentAppViewServices -> blueskyRelayAPI "App View reads" + genericAppViewServices -> blueskyRelayAPI "App View reads" + independentFeedGeneratorService -> blueskyRelayAPI "Reads" + genericFeedGeneratorService -> blueskyRelayAPI "Reads" + blueskyFeedsGeneratorService -> blueskyRelayAPI "Reads" + independentPDS1PDSService -> blueskyRelayAPI "Writes" + genericPDSPDSService -> blueskyRelayAPI "Writes" + independentPDS2PDSService -> blueskyRelayAPI "Writes" + + } + + views { + + // Won't be used for presentation + systemLandscape fullSystemLandscape { + autolayout + include * + } + + // 001: Generic social media. An overview of a generic social media service + systemContext genericSocial 001-GenericSocial-01 { + autolayout + include * + // Excluding relationships that make sense only at the next level + exclude socialUserToGenericSocialApp + } + + // 002: Generic social media. A container view of a generic social service + container genericSocial 002-GenericSocial-02 { + autolayout + include * + } + + // 003: Realistic social media. Overview of a more realistic social service + systemContext realisticSocial 003-RealisticSocial-01 { + autolayout + include * + // Excluding relationships that make sense only at the next level + exclude socialUserToRealisticSocialApp socialModeratorToRealisticSocialModeratingApp socialAdminToRealisticSocialFeedDesigner + } + + // 004: Realistic social media. A container view of the more realistic service, showing the basic containers + container realisticSocial 004-RealisticSocial-02 { + autolayout + include * + // Excluding the admin and the algorithm designer and the moderation activities + exclude realisticSocialFeedDesigner socialAdmin realisticSocialModerationAPI realisticSocialModeratingApp socialModerator + } + + // 005: Realistic social media. A container view of the more realistic service, including algorithm works + container realisticSocial 005-RealisticSocial-03 { + autolayout + include * + // Excluding the moderation activities + exclude realisticSocialModerationAPI realisticSocialModeratingApp socialModerator + } + + // 006: Realistic social media. A container view of the full more realistic service (typical, algorithm and moderation) + container realisticSocial 006-RealisticSocial-04 { + autolayout + include * + } + + // 007: Federated social media. Overview of a federated social media service + systemContext federatedSocial1 007-FederatedSocial-01 { + autolayout + include * + // Excluding relationships that make sense only at the next level + exclude federatedSocial1UserToFederatedSocial1App federatedSocial1AdminToFederatedSocial1ModeratingApp + exclude federatedSocial2 federatedSocial3 federatedSocial4 + } + + // 008: Federated social media. Container diagram of a basic federated social service, showing administration/moderation + container federatedSocial1 008-FederatedSocial-02 { + autolayout + include * + exclude federatedSocial1Federation federatedSocial1FederationAPI federatedSocial1FederatedPostsDB + exclude federatedSocial2 federatedSocial3 federatedSocial4 + } + + // 009: Federated social media. Container diagram of a basic federated social service, showing administration/moderation and federation components + container federatedSocial1 009-FederatedSocial-03 { + autolayout + include * + exclude federatedSocial2 federatedSocial3 federatedSocial4 + } + + // 010: Federated social media. Full container diagram of a basic federated social service, showing another service federating with it + container federatedSocial1 010-FederatedSocial-04 { + autolayout + include * federatedSocial2User + exclude federatedSocial3 federatedSocial4 + } + + // 011: Federated social media. Overview of a federated social media service, showing another one federating with it, including its user + systemContext federatedSocial1 011-FederatedSocial-05 { + autolayout + include * federatedSocial2User + // Excluding relationships that make sense only at the next level + exclude federatedSocial1UserToFederatedSocial1App federatedSocial1AdminToFederatedSocial1ModeratingApp + exclude federatedSocial3 federatedSocial4 + } + + // 012: Federated social media. Overview of a federated social media service, showing another one federating with it, including its user and its admin + systemContext federatedSocial1 012-FederatedSocial-06 { + autolayout + include * federatedSocial2User federatedSocial2Admin + // Excluding relationships that make sense only at the next level + exclude federatedSocial1UserToFederatedSocial1App federatedSocial1AdminToFederatedSocial1ModeratingApp + exclude federatedSocial3 federatedSocial4 + } + + // 013: Federated social media. Overview of a federated social media service, showing 2 others federating with it, including their users and admins + systemContext federatedSocial1 013-FederatedSocial-07 { + autolayout + include * federatedSocial2User federatedSocial2Admin federatedSocial3User federatedSocial3Admin + // Excluding relationships that make sense only at the next level + exclude federatedSocial1UserToFederatedSocial1App federatedSocial1AdminToFederatedSocial1ModeratingApp + exclude federatedSocial4 + } + + // 014: Federated social media. Overview of a federated social media service, showing 3 others federating with it, including their users and admins + systemContext federatedSocial1 014-FederatedSocial-08 { + autolayout + include * federatedSocial2User federatedSocial2Admin federatedSocial3User federatedSocial3Admin federatedSocial4User federatedSocial4Admin + // Excluding relationships that make sense only at the next level + exclude federatedSocial1UserToFederatedSocial1App federatedSocial1AdminToFederatedSocial1ModeratingApp + } + + // 015: Bluesky. Basic overview of Bluesky. User, Admin, Moderator. + systemContext centralBluesky 015-BlueskyBasic-01 { + autolayout + include * + // Services to exclude + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericFeedGenerator genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 typicalBlueskyUser2 + exclude otherIDBlueskyUser1 otherIDBlueskyUser2 + // Excluding relationships that make sense only at the next level + exclude typicalBlueskyUser1ToCentralBlueskyAppView typicalBlueskyUser2ToCentralBlueskyAppView + exclude blueskyStaffMemberAsModeratorToCentralBlueskyModeration blueskyStaffMemberAsAdminToCentralBlueskyFeeds + exclude typicalBlueskyUser1ToCentralBlueskyIdentityResolver typicalBlueskyUser2ToCentralBlueskyIdentityResolver + exclude otherIDBlueskyUser1ToCentralBlueskyAppView otherIDBlueskyUser2ToCentralBlueskyAppView + } + + // 016: Bluesky. Container diagram introducing Bluesky + container centralBluesky 016-BlueskyBasic-02 { + autolayout + include * + // Services to exclude + exclude centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericFeedGenerator genericBSkyIDSystem genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 typicalBlueskyUser2 + } + + // 017: Bluesky, independent identity. Overview of Bluesky with externally-identified user + systemContext centralBluesky 017-BlueskyIdentity-01 { + autolayout + include * + // Services to exclude + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericFeedGenerator genericBSkyIDSystem genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 + exclude otherIDBlueskyUser2 + exclude blueskyStaffMemberAsAdmin blueskyStaffMemberAsModerator typicalBlueskyUser2 + // Excluding relationships that make sense only at the next level + exclude typicalBlueskyUser1ToCentralBlueskyAppView typicalBlueskyUser2ToCentralBlueskyAppView + exclude blueskyStaffMemberAsModeratorToCentralBlueskyModeration blueskyStaffMemberAsAdminToCentralBlueskyFeeds + exclude typicalBlueskyUser1ToCentralBlueskyIdentityResolver typicalBlueskyUser2ToCentralBlueskyIdentityResolver + exclude otherIDBlueskyUser1ToCentralBlueskyAppView otherIDBlueskyUser2ToCentralBlueskyAppView + } + + // 018: Bluesky, independent identity. Container diagram showing externally-identified user + container centralBluesky 018-BlueskyIdentity-02 { + autolayout + include * + // Services to exclude + exclude centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericFeedGenerator genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser2 typicalBlueskyUser2 + } + + // 019: Bluesky, independent identity. Container diagram showing 2 externally-identified users + container centralBluesky 019-BlueskyIdentity-03 { + autolayout + include * + // Services to exclude + exclude centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericFeedGenerator genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 typicalBlueskyUser2 + } + + // 020: Bluesky, independent identity. Container diagram showing 2 typical users with identities in the independent ID system + container centralBluesky 020-BlueskyIdentity-04 { + autolayout + include * + // Services to exclude + exclude centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericFeedGenerator genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 021: Bluesky, independent Feed Generation. Container diagram showing the independent Feed Generation service as a separate software system + container centralBluesky 021-BlueskyFeeds-01 { + autolayout + include * externalBlueskyAlgorithmBuilder + // Services to exclude + exclude centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericFeedGenerator genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 022: Bluesky, independent Feed Generation. Container diagram of independent Feed Generation Service + container independentFeedGenerator 022-BlueskyFeeds-02 { + autolayout + include * + // Services to exclude + exclude blueskyAppView blueskyRelay + exclude independentAppView + exclude genericAppView + // Relationships to exclude + // exclude blueskyAppViewServicesToCentralBlueskyPDS1 + } + + // 023: Bluesky, independent Feed Generation. Container + // diagram showing the independent Feed Generation service as + // a separate software system, eliding the internal service + container centralBluesky 023-BlueskyFeeds-03 { + autolayout + include * externalBlueskyAlgorithmBuilder + // Services to exclude + exclude centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericFeedGenerator genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 024: Bluesky, independent Feed Generation. Container + // diagram showing a generic Feed Generation service + container centralBluesky 024-BlueskyFeeds-04 { + autolayout + include * externalBlueskyAlgorithmBuilder + // Services to exclude + exclude centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 025: Bluesky, independent App View. Container diagram + // showing the Bluesky's separate appview as a separate + // software system + container centralBluesky 025-BlueskyAppView-01 { + autolayout + include * externalBlueskyAlgorithmBuilder + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 026: Bluesky, independent App View. Container diagram of independent App View + container blueskyAppView 026-BlueskyAppView-02 { + autolayout + include * + // Services to exclude + exclude blueskyFeedsGenerator blueskyRelay + exclude independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericPDS + // Relationships to exclude + exclude typicalBlueskyUser1ToCentralBlueskyIdentityResolver typicalBlueskyUser2ToCentralBlueskyIdentityResolver + exclude typicalBlueskyUser1ToCentralBluesky typicalBlueskyUser2ToCentralBluesky + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 + } + + // 027: Bluesky, independent App View. Container diagram + // showing the Bluesky's separate appview as a separate + // software system alongside a separate independent AppView + container centralBluesky 027-BlueskyAppView-03 { + autolayout + include * externalBlueskyAlgorithmBuilder + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyFeedsGenerator blueskyRelay + exclude independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericAppView genericBSkyIDSystem genericPDS + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 028: Bluesky, independent App View. Container diagram + // showing the a Generic AppView representing both independent + // AppViews and Bluesky's own AppView + container centralBluesky 028-BlueskyAppView-04 { + autolayout + include * externalBlueskyAlgorithmBuilder + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericPDS genericBSkyIDSystem + // Users to exclude + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 029: Bluesky, Relay. Container diagram showing multiple PDSs in the internal system + container centralBluesky 029-BlueskyRelay-01 { + autolayout + include * + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver + exclude blueskyAppView blueskyFeedsGenerator blueskyRelay + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericBSkyIDSystem genericPDS + // Users to exclude + exclude blueskyStaffMemberAsAdmin independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + // 030: Bluesky, Relay. Container diagram showing multiple PDSs in the internal system, feeding into the Relay + container centralBluesky 030-BlueskyRelay-02 { + autolayout + include * + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericBSkyIDSystem genericPDS + // Users to exclude + exclude blueskyStaffMemberAsAdmin independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + // Relationships to exclude + exclude blueskyAppViewServicesToCentralBlueskyPDS1 blueskyAppViewServicesToCentralBlueskyPDS2 blueskyAppViewServicesToCentralBlueskyPDS3 + exclude independentAppViewServicesToCentralBlueskyPDS1 independentAppViewServicesToCentralBlueskyPDS2 independentAppViewServicesToCentralBlueskyPDS3 + exclude independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS3 + exclude centralBlueskyModerationToCentralBlueskyPDS1 centralBlueskyModerationToCentralBlueskyPDS2 centralBlueskyModerationToCentralBlueskyPDS3 + } + + // 031: Bluesky, Relay. Container diagram of Relay. + container blueskyRelay 031-BlueskyRelay-03 { + autolayout + include * + // Services to exclude + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentFeedGenerator independentPDS1 independentPDS2 + exclude genericPDS + // Relationships to exclude + exclude centralBlueskyAppViewToIndependentFeedGeneratorAPI centralBlueskyAppViewToBlueskyFeedsGeneratorAPI blueskyFeedsGeneratorServiceToCentralBlueskyPDS1 + exclude blueskyFeedsGeneratorServiceToCentralBlueskyPDS2 blueskyFeedsGeneratorServiceToCentralBlueskyPDS3 independentFeedGeneratorServiceToCentralBlueskyPDS1 + exclude independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS3 + } + + // 032: Bluesky, Independent PDS. Container diagram showing independent PDS + container centralBluesky 032-BlueskyPDS-01 { + autolayout + include * independentPDS1BlueskyUser1 + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS2 + exclude genericBSkyIDSystem genericPDS + // Users to exclude + exclude blueskyStaffMemberAsAdmin independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + // Relationships to exclude + exclude blueskyAppViewServicesToCentralBlueskyPDS1 blueskyAppViewServicesToCentralBlueskyPDS2 blueskyAppViewServicesToCentralBlueskyPDS3 + exclude independentFeedGeneratorServiceToCentralBlueskyPDS1 independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS3 + exclude blueskyFeedsGeneratorServiceToCentralBlueskyPDS1 blueskyFeedsGeneratorServiceToCentralBlueskyPDS2 blueskyFeedsGeneratorServiceToCentralBlueskyPDS3 + exclude centralBlueskyModerationToCentralBlueskyPDS1 centralBlueskyModerationToCentralBlueskyPDS2 centralBlueskyModerationToCentralBlueskyPDS3 + } + + // 033: Bluesky, Independent PDS. Container diagram of an independent PDS. + container independentPDS1 033-BlueskyPDS-02 { + autolayout + include * + // Services to exclude + exclude centralBluesky + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentFeedGenerator + } + + // 034: Bluesky, Independent PDS. Container diagram showing 2 independent PDSs + container centralBluesky 034-BlueskyPDS-03 { + autolayout + include * independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator + exclude genericBSkyIDSystem genericPDS + // Users to exclude + exclude blueskyStaffMemberAsAdmin otherIDBlueskyUser1 otherIDBlueskyUser2 + // Relationships to exclude + exclude blueskyAppViewServicesToCentralBlueskyPDS1 blueskyAppViewServicesToCentralBlueskyPDS2 blueskyAppViewServicesToCentralBlueskyPDS3 + exclude independentFeedGeneratorServiceToCentralBlueskyPDS1 independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS3 + exclude blueskyFeedsGeneratorServiceToCentralBlueskyPDS1 blueskyFeedsGeneratorServiceToCentralBlueskyPDS2 blueskyFeedsGeneratorServiceToCentralBlueskyPDS3 + exclude centralBlueskyModerationToCentralBlueskyPDS1 centralBlueskyModerationToCentralBlueskyPDS2 centralBlueskyModerationToCentralBlueskyPDS3 + } + + // 035: Bluesky, Independent PDS. Container diagram showing 2 independent PDSs + container centralBluesky 035-BlueskyPDS-04 { + autolayout + include * independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyPDS1 centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericBSkyIDSystem + // Users to exclude + exclude blueskyStaffMemberAsAdmin independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + // Relationships to exclude + exclude blueskyAppViewServicesToCentralBlueskyPDS1 blueskyAppViewServicesToCentralBlueskyPDS2 blueskyAppViewServicesToCentralBlueskyPDS3 + exclude independentFeedGeneratorServiceToCentralBlueskyPDS1 independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS3 + exclude blueskyFeedsGeneratorServiceToCentralBlueskyPDS1 blueskyFeedsGeneratorServiceToCentralBlueskyPDS2 blueskyFeedsGeneratorServiceToCentralBlueskyPDS3 + exclude centralBlueskyModerationToCentralBlueskyPDS1 centralBlueskyModerationToCentralBlueskyPDS2 centralBlueskyModerationToCentralBlueskyPDS3 + } + + // 036: Bluesky, Independent Moderation. Container diagram showing a separated-out bluesky moderation service + container centralBluesky 036-BlueskyModeration-01 { + autolayout + include * independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 blueskyModeration + // Services to exclude + exclude centralBlueskyAppView centralBlueskyFeeds centralBlueskyIdentityResolver centralBlueskyModeration centralBlueskyPDS1 centralBlueskyPDS2 centralBlueskyPDS3 + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + exclude genericBSkyIDSystem + // Users to exclude + exclude blueskyStaffMemberAsAdmin independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + // Relationships to exclude + exclude blueskyAppViewServicesToCentralBlueskyPDS1 blueskyAppViewServicesToCentralBlueskyPDS2 blueskyAppViewServicesToCentralBlueskyPDS3 + exclude independentFeedGeneratorServiceToCentralBlueskyPDS1 independentFeedGeneratorServiceToCentralBlueskyPDS2 independentFeedGeneratorServiceToCentralBlueskyPDS3 + exclude blueskyFeedsGeneratorServiceToCentralBlueskyPDS1 blueskyFeedsGeneratorServiceToCentralBlueskyPDS2 blueskyFeedsGeneratorServiceToCentralBlueskyPDS3 + exclude centralBlueskyModerationToCentralBlueskyPDS1 centralBlueskyModerationToCentralBlueskyPDS2 centralBlueskyModerationToCentralBlueskyPDS3 + } + + // 037: Bluesky, Independent Moderation. Container diagram of moderation service. + container blueskyModeration 037-BlueskyModeration-02 { + autolayout + include * + } + + // 038: Bluesky, Independent Moderation. System Landscape, including independent moderation. + systemLandscape 038-BlueskyModeration-03 { + autolayout + include * + // Services to exclude + exclude genericSocial realisticSocial federatedSocial1 federatedSocial2 federatedSocial3 federatedSocial4 centralBluesky + exclude blueskyAppView blueskyFeedsGenerator + exclude independentAppView independentExampleComIDSystem independentExampleMeIDSystem independentFeedGenerator independentPDS1 independentPDS2 + // Users to exclude + exclude socialAdmin socialModerator socialUser + exclude federatedSocial1User federatedSocial1Admin federatedSocial2User federatedSocial2Admin + exclude federatedSocial3User federatedSocial3Admin federatedSocial4User federatedSocial4Admin + exclude blueskyStaffMemberAsAdmin + exclude independentPDS1BlueskyUser1 independentPDS2BlueskyUser1 otherIDBlueskyUser1 otherIDBlueskyUser2 + } + + styles { + + element database { + shape Cylinder + } + + element atproto { + colour #213d53 + background #e2b5a7 + } + + element federation { + colour #6de518 + background #5d4d5c + } + + element algorithmic { + colour #7fe495 + background #923821 + } + + element moderation { + colour #2b0743 + background #4092bf + } + + element adminey { + background #582893 + colour #c4dfec + } + + element typical { + colour #110303 + background #e8dd9b + } + + element "Person" { + shape person + background #08427b + colour #ffffff + } + } + } +} diff --git a/BlueskyArchitecture.html b/BlueskyArchitecture.html new file mode 100644 index 0000000..c4e07ef --- /dev/null +++ b/BlueskyArchitecture.html @@ -0,0 +1,220 @@ + + + + +Bluesky Architecture compared to other social media services + + + + + + + + + + + + + +
+
+

Bluesky Architecture compared to other social media services

Printable version

+

Éibhear Ó hAnluain

2024-05-24 Fri 00:00

+
+
+
+ +
+
+

Introduction

+
+

+Boo! +

+
+
+
+
+
+

General social media architectures

+
+
+
+
+

Simplistic view 1/2 – overview

+
+ +
+

structurizr-1-001-GenericSocial-01.png +

+
+
+
+
+

Simplistic view 2/2 – services

+
+ +
+

structurizr-1-002-GenericSocial-02.png +

+
+
+
+
+

More realistic view 1/4 – overview

+
+ +
+

structurizr-1-003-RealisticSocial-01.png +

+
+
+
+
+

More realistic view 2/4 – basic services

+
+ +
+

structurizr-1-004-RealisticSocial-02.png +

+
+
+
+
+

More realistic view 3/4 – the algorithm

+
+ +
+

structurizr-1-005-RealisticSocial-03.png +

+
+
+
+
+

More realistic view 4/4 – content moderation

+
+ +
+

structurizr-1-006-RealisticSocial-04.png +

+
+
+
+
+
+
+

Federated social media services

+
+
+
+
+

Federated services 1/8 – overview

+
+ +
+

structurizr-1-007-FederatedSocial-01.png +

+
+
+
+
+

Federated services 2/8 – internal, administration and content moderation services

+
+ +
+

structurizr-1-008-FederatedSocial-02.png +

+
+
+
+
+

Federated services 3/8 – federation 1

+
+ +
+

structurizr-1-009-FederatedSocial-03.png +

+
+
+
+
+

Federated services 4/8 – federation 2

+
+ +
+

structurizr-1-010-FederatedSocial-04.png +

+
+
+
+
+

Federated services 5/8 – federation 3

+
+ +
+

structurizr-1-011-FederatedSocial-05.png +

+
+
+
+
+

Federated services 6/8 – federation 4

+
+ +
+

structurizr-1-012-FederatedSocial-06.png +

+
+
+
+
+

Federated services 7/8 – federation 5

+
+ +
+

structurizr-1-013-FederatedSocial-07.png +

+
+
+
+
+

Federated services 8/8 – federation 6

+
+ +
+

structurizr-1-014-FederatedSocial-08.png +

+
+
+
+
+
+
+ + + + + + + + + diff --git a/BlueskyArchitecture.org b/BlueskyArchitecture.org new file mode 100644 index 0000000..9de2af8 --- /dev/null +++ b/BlueskyArchitecture.org @@ -0,0 +1,108 @@ + +#+TITLE: Bluesky Architecture compared to other social media services + +#+SUBTITLE: [[file:?print-pdf][Printable version]] + +#+DATE: [2024-05-24 Fri] +#+AUTHOR: Éibhear Ó hAnluain +#+EMAIL: eibhear.geo@gmail.com +#+OPTIONS: ':nil *:t -:t ::t <:t \n:nil ^:{} author:t c:nil creator:nil +#+OPTIONS: d:nil date:t e:t email:t f:t inline:t num:nil p:nil pri:nil +#+OPTIONS: stat:nil tags:nil tasks:t tex:t timestamp:nil toc:1 todo:nil |:t +#+DESCRIPTION: A discussion of Bluesky's architecture as it relates to other social media services +#+LANGUAGE: en + +#+REVEAL_ROOT: ./reveal.js +#+REVEAL_INIT_OPTIONS: transition:'none', margin: 0.1, slideNumber:true + +#+REVEAL_THEME: white + +#+REVEAL_HLEVEL: 1 +#+REVEAL_EXTRA_CSS: ./e-reveal.css +#+REVEAL_EXTRA_CSS: ./gridding.css + +#+REVEAL_DEFAULT_SLIDE_BACKGROUND: ./bCardBackground.png +#+REVEAL_TITLE_SLIDE_BACKGROUND: ./bCardBackground.png +#+REVEAL_TOC_SLIDE_BACKGROUND: ./bCardBackground.png +#+REVEAL_DEFAULT_SLIDE_SIZE: 100% +#+REVEAL_TITLE_SLIDE_SIZE: 100% +#+REVEAL_TOC_SLIDE_SIZE: 100% + +* Notes :noexport: + +* Introduction + #+REVEAL_HTML:
+ Boo! + #+REVEAL_HTML:
+* General social media architectures +** Simplistic view 1/2 -- overview + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 90% + file:structurizr-1-001-GenericSocial-01.png + #+REVEAL_HTML:
+** Simplistic view 2/2 -- services + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 20% + file:structurizr-1-002-GenericSocial-02.png + #+REVEAL_HTML:
+** More realistic view 1/4 -- overview + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 90% + file:structurizr-1-003-RealisticSocial-01.png + #+REVEAL_HTML:
+** More realistic view 2/4 -- basic services + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 40% + file:structurizr-1-004-RealisticSocial-02.png + #+REVEAL_HTML:
+** More realistic view 3/4 -- the algorithm + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 40% + file:structurizr-1-005-RealisticSocial-03.png + #+REVEAL_HTML:
+** More realistic view 4/4 -- content moderation + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 60% + file:structurizr-1-006-RealisticSocial-04.png + #+REVEAL_HTML:
+* Federated social media services +** Federated services 1/8 -- overview + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-007-FederatedSocial-01.png + #+REVEAL_HTML:
+** Federated services 2/8 -- internal, administration and content moderation services + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 40% + file:structurizr-1-008-FederatedSocial-02.png + #+REVEAL_HTML:
+** Federated services 3/8 -- federation 1 + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-009-FederatedSocial-03.png + #+REVEAL_HTML:
+** Federated services 4/8 -- federation 2 + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-010-FederatedSocial-04.png + #+REVEAL_HTML:
+** Federated services 5/8 -- federation 3 + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-011-FederatedSocial-05.png + #+REVEAL_HTML:
+** Federated services 6/8 -- federation 4 + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-012-FederatedSocial-06.png + #+REVEAL_HTML:
+** Federated services 7/8 -- federation 5 + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-013-FederatedSocial-07.png + #+REVEAL_HTML:
+** Federated services 8/8 -- federation 6 + #+REVEAL_HTML:
+ #+ATTR_HTML: :width 75% + file:structurizr-1-014-FederatedSocial-08.png + #+REVEAL_HTML:
diff --git a/e-reveal.css b/e-reveal.css new file mode 100644 index 0000000..7a38ebb --- /dev/null +++ b/e-reveal.css @@ -0,0 +1,35 @@ +.figure { + font-size: 35%; +} + +p.subtitle { + font-size: 50%; +} + +h2.email { + font-size: 70%; +} + +section { + font-size: 80%; +} + +pre, +code { + color: #000000; + background-color: #e0e0e0; + border-style: solid; + border-width: 1px; + border-color: #c0c0c0; +} + +.org-src-container > pre { + padding: 0.5em; + font-size: 100%; +} + +code { + font-size: 80%; + padding-right: 1px; + padding-left: 1px; +} diff --git a/gridding.css b/gridding.css new file mode 100644 index 0000000..dc2b871 --- /dev/null +++ b/gridding.css @@ -0,0 +1,43 @@ + +.bordered { + border: #000000; + border-style: solid; +} + +.e-frame { + font-size: 70%; +} + +.gridded_frame_with_columns { + display: flex; + flex-flow: row; +} + +.one_of_2_columns { + width: 50%; +} + +.one_of_3_columns { + width: 33%; +} + +.column_with_rows { + display: flex; + flex-grow: auto; + flex-flow: column; +} + +.row_with_columns { + display: flex; + flex-flow: row; +} + +.gridded_frame_with_rows { + display: flex; + flex-flow: column; +} + +.one_of_2_rows { + height: 50%; +} + diff --git a/reveal.js b/reveal.js new file mode 120000 index 0000000..da89e5d --- /dev/null +++ b/reveal.js @@ -0,0 +1 @@ +/home/eibhear/development/reveal.js \ No newline at end of file diff --git a/structurizr-1-001-GenericSocial-01.png b/structurizr-1-001-GenericSocial-01.png new file mode 100644 index 0000000..963beba Binary files /dev/null and b/structurizr-1-001-GenericSocial-01.png differ diff --git a/structurizr-1-002-GenericSocial-02.png b/structurizr-1-002-GenericSocial-02.png new file mode 100644 index 0000000..40a1e5d Binary files /dev/null and b/structurizr-1-002-GenericSocial-02.png differ diff --git a/structurizr-1-003-RealisticSocial-01.png b/structurizr-1-003-RealisticSocial-01.png new file mode 100644 index 0000000..0ee472b Binary files /dev/null and b/structurizr-1-003-RealisticSocial-01.png differ diff --git a/structurizr-1-004-RealisticSocial-02.png b/structurizr-1-004-RealisticSocial-02.png new file mode 100644 index 0000000..74f65c8 Binary files /dev/null and b/structurizr-1-004-RealisticSocial-02.png differ diff --git a/structurizr-1-005-RealisticSocial-03.png b/structurizr-1-005-RealisticSocial-03.png new file mode 100644 index 0000000..49314ef Binary files /dev/null and b/structurizr-1-005-RealisticSocial-03.png differ diff --git a/structurizr-1-006-RealisticSocial-04.png b/structurizr-1-006-RealisticSocial-04.png new file mode 100644 index 0000000..f0d8b5d Binary files /dev/null and b/structurizr-1-006-RealisticSocial-04.png differ diff --git a/structurizr-1-007-FederatedSocial-01.png b/structurizr-1-007-FederatedSocial-01.png new file mode 100644 index 0000000..0db05d3 Binary files /dev/null and b/structurizr-1-007-FederatedSocial-01.png differ diff --git a/structurizr-1-008-FederatedSocial-02.png b/structurizr-1-008-FederatedSocial-02.png new file mode 100644 index 0000000..0510b39 Binary files /dev/null and b/structurizr-1-008-FederatedSocial-02.png differ diff --git a/structurizr-1-009-FederatedSocial-03.png b/structurizr-1-009-FederatedSocial-03.png new file mode 100644 index 0000000..d3492cc Binary files /dev/null and b/structurizr-1-009-FederatedSocial-03.png differ diff --git a/structurizr-1-010-FederatedSocial-04.png b/structurizr-1-010-FederatedSocial-04.png new file mode 100644 index 0000000..c6f85e3 Binary files /dev/null and b/structurizr-1-010-FederatedSocial-04.png differ diff --git a/structurizr-1-011-FederatedSocial-05.png b/structurizr-1-011-FederatedSocial-05.png new file mode 100644 index 0000000..5b56196 Binary files /dev/null and b/structurizr-1-011-FederatedSocial-05.png differ diff --git a/structurizr-1-012-FederatedSocial-06.png b/structurizr-1-012-FederatedSocial-06.png new file mode 100644 index 0000000..59bd513 Binary files /dev/null and b/structurizr-1-012-FederatedSocial-06.png differ diff --git a/structurizr-1-013-FederatedSocial-07.png b/structurizr-1-013-FederatedSocial-07.png new file mode 100644 index 0000000..425eb3c Binary files /dev/null and b/structurizr-1-013-FederatedSocial-07.png differ diff --git a/structurizr-1-014-FederatedSocial-08.png b/structurizr-1-014-FederatedSocial-08.png new file mode 100644 index 0000000..275a0ca Binary files /dev/null and b/structurizr-1-014-FederatedSocial-08.png differ diff --git a/structurizr-1-015-BlueskyBasic-01.png b/structurizr-1-015-BlueskyBasic-01.png new file mode 100644 index 0000000..2b68b34 Binary files /dev/null and b/structurizr-1-015-BlueskyBasic-01.png differ diff --git a/structurizr-1-016-BlueskyBasic-02.png b/structurizr-1-016-BlueskyBasic-02.png new file mode 100644 index 0000000..cd5383c Binary files /dev/null and b/structurizr-1-016-BlueskyBasic-02.png differ diff --git a/structurizr-1-017-BlueskyIdentity-01.png b/structurizr-1-017-BlueskyIdentity-01.png new file mode 100644 index 0000000..4f875ec Binary files /dev/null and b/structurizr-1-017-BlueskyIdentity-01.png differ diff --git a/structurizr-1-018-BlueskyIdentity-02.png b/structurizr-1-018-BlueskyIdentity-02.png new file mode 100644 index 0000000..1fa732d Binary files /dev/null and b/structurizr-1-018-BlueskyIdentity-02.png differ diff --git a/structurizr-1-019-BlueskyIdentity-03.png b/structurizr-1-019-BlueskyIdentity-03.png new file mode 100644 index 0000000..e87d866 Binary files /dev/null and b/structurizr-1-019-BlueskyIdentity-03.png differ diff --git a/structurizr-1-020-BlueskyIdentity-04.png b/structurizr-1-020-BlueskyIdentity-04.png new file mode 100644 index 0000000..221b62e Binary files /dev/null and b/structurizr-1-020-BlueskyIdentity-04.png differ diff --git a/structurizr-1-021-BlueskyFeeds-01.png b/structurizr-1-021-BlueskyFeeds-01.png new file mode 100644 index 0000000..4a9012d Binary files /dev/null and b/structurizr-1-021-BlueskyFeeds-01.png differ diff --git a/structurizr-1-022-BlueskyFeeds-02.png b/structurizr-1-022-BlueskyFeeds-02.png new file mode 100644 index 0000000..33e1ec4 Binary files /dev/null and b/structurizr-1-022-BlueskyFeeds-02.png differ diff --git a/structurizr-1-023-BlueskyFeeds-03.png b/structurizr-1-023-BlueskyFeeds-03.png new file mode 100644 index 0000000..8b0968a Binary files /dev/null and b/structurizr-1-023-BlueskyFeeds-03.png differ diff --git a/structurizr-1-024-BlueskyFeeds-04.png b/structurizr-1-024-BlueskyFeeds-04.png new file mode 100644 index 0000000..390458d Binary files /dev/null and b/structurizr-1-024-BlueskyFeeds-04.png differ diff --git a/structurizr-1-025-BlueskyAppView-01.png b/structurizr-1-025-BlueskyAppView-01.png new file mode 100644 index 0000000..face165 Binary files /dev/null and b/structurizr-1-025-BlueskyAppView-01.png differ diff --git a/structurizr-1-026-BlueskyAppView-02.png b/structurizr-1-026-BlueskyAppView-02.png new file mode 100644 index 0000000..13b1ba6 Binary files /dev/null and b/structurizr-1-026-BlueskyAppView-02.png differ diff --git a/structurizr-1-027-BlueskyAppView-03.png b/structurizr-1-027-BlueskyAppView-03.png new file mode 100644 index 0000000..3de0d6a Binary files /dev/null and b/structurizr-1-027-BlueskyAppView-03.png differ diff --git a/structurizr-1-028-BlueskyAppView-04.png b/structurizr-1-028-BlueskyAppView-04.png new file mode 100644 index 0000000..1494b71 Binary files /dev/null and b/structurizr-1-028-BlueskyAppView-04.png differ diff --git a/structurizr-1-029-BlueskyRelay-01.png b/structurizr-1-029-BlueskyRelay-01.png new file mode 100644 index 0000000..30d1c99 Binary files /dev/null and b/structurizr-1-029-BlueskyRelay-01.png differ diff --git a/structurizr-1-030-BlueskyRelay-02.png b/structurizr-1-030-BlueskyRelay-02.png new file mode 100644 index 0000000..bb48436 Binary files /dev/null and b/structurizr-1-030-BlueskyRelay-02.png differ diff --git a/structurizr-1-031-BlueskyRelay-03.png b/structurizr-1-031-BlueskyRelay-03.png new file mode 100644 index 0000000..ebec59b Binary files /dev/null and b/structurizr-1-031-BlueskyRelay-03.png differ diff --git a/structurizr-1-032-BlueskyPDS-01.png b/structurizr-1-032-BlueskyPDS-01.png new file mode 100644 index 0000000..1e7b570 Binary files /dev/null and b/structurizr-1-032-BlueskyPDS-01.png differ diff --git a/structurizr-1-033-BlueskyPDS-02.png b/structurizr-1-033-BlueskyPDS-02.png new file mode 100644 index 0000000..7ef5cac Binary files /dev/null and b/structurizr-1-033-BlueskyPDS-02.png differ diff --git a/structurizr-1-034-BlueskyPDS-03.png b/structurizr-1-034-BlueskyPDS-03.png new file mode 100644 index 0000000..48b4bc6 Binary files /dev/null and b/structurizr-1-034-BlueskyPDS-03.png differ diff --git a/structurizr-1-035-BlueskyPDS-04.png b/structurizr-1-035-BlueskyPDS-04.png new file mode 100644 index 0000000..34a0f97 Binary files /dev/null and b/structurizr-1-035-BlueskyPDS-04.png differ diff --git a/structurizr-1-036-BlueskyModeration-01.png b/structurizr-1-036-BlueskyModeration-01.png new file mode 100644 index 0000000..5570ad6 Binary files /dev/null and b/structurizr-1-036-BlueskyModeration-01.png differ diff --git a/structurizr-1-037-BlueskyModeration-02.png b/structurizr-1-037-BlueskyModeration-02.png new file mode 100644 index 0000000..ca45d40 Binary files /dev/null and b/structurizr-1-037-BlueskyModeration-02.png differ diff --git a/structurizr-1-038-BlueskyModeration-03.png b/structurizr-1-038-BlueskyModeration-03.png new file mode 100644 index 0000000..586abfd Binary files /dev/null and b/structurizr-1-038-BlueskyModeration-03.png differ