diff --git a/tests/e2e/helpers.js b/tests/e2e/helpers.js index 36a783f5..63d8e723 100644 --- a/tests/e2e/helpers.js +++ b/tests/e2e/helpers.js @@ -1,5 +1,5 @@ import { OAUTH_SCOPES } from "../../src/oauthScopes.js"; -import { userProfile } from "./fixtures.js"; +import { userProfile } from "./testData.js"; // Hold the pointer down on an element long enough to trigger a long-press // (the app uses a 500ms threshold). diff --git a/tests/e2e/mockServer.js b/tests/e2e/mockServer.js index b813b484..b350d7e5 100644 --- a/tests/e2e/mockServer.js +++ b/tests/e2e/mockServer.js @@ -1,5 +1,5 @@ -import { createPost } from "./factories.js"; -import { bskyLabeler, userProfile } from "./fixtures.js"; +import { createPost } from "../shared/factories.js"; +import { bskyLabeler, userProfile } from "./testData.js"; import { TEST_PLUGIN_ID, TEST_PLUGIN_MANIFEST, diff --git a/tests/e2e/specs/concerns/blockedPosts.test.js b/tests/e2e/specs/concerns/blockedPosts.test.js index 1ab4c121..28525e81 100644 --- a/tests/e2e/specs/concerns/blockedPosts.test.js +++ b/tests/e2e/specs/concerns/blockedPosts.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer, MockConstellation } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/abc123"; const AUTHOR_A = { diff --git a/tests/e2e/specs/concerns/composerInit.test.js b/tests/e2e/specs/concerns/composerInit.test.js index 2fe5867d..57611ee2 100644 --- a/tests/e2e/specs/concerns/composerInit.test.js +++ b/tests/e2e/specs/concerns/composerInit.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; import { TEST_PLUGIN_MANIFEST, getPostComposerInitPluginSource, diff --git a/tests/e2e/specs/concerns/containerLink.test.js b/tests/e2e/specs/concerns/containerLink.test.js index 16ec0e39..28de82ee 100644 --- a/tests/e2e/specs/concerns/containerLink.test.js +++ b/tests/e2e/specs/concerns/containerLink.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; const profileUser = createProfile({ did: "did:plc:profileuser1", diff --git a/tests/e2e/specs/concerns/dragToDismiss.test.js b/tests/e2e/specs/concerns/dragToDismiss.test.js index 32522125..a30199e8 100644 --- a/tests/e2e/specs/concerns/dragToDismiss.test.js +++ b/tests/e2e/specs/concerns/dragToDismiss.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login, loginWithAccounts, longPress } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; -import { userProfile } from "../../fixtures.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; +import { userProfile } from "../../testData.js"; test.use({ hasTouch: true, diff --git a/tests/e2e/specs/concerns/inAppLinks.test.js b/tests/e2e/specs/concerns/inAppLinks.test.js index 8eaca692..0e15b4f2 100644 --- a/tests/e2e/specs/concerns/inAppLinks.test.js +++ b/tests/e2e/specs/concerns/inAppLinks.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; const bskySocialTarget = createProfile({ did: "did:plc:linktarget1", diff --git a/tests/e2e/specs/concerns/notificationBadges.test.js b/tests/e2e/specs/concerns/notificationBadges.test.js index 70db72ea..3ba6edfe 100644 --- a/tests/e2e/specs/concerns/notificationBadges.test.js +++ b/tests/e2e/specs/concerns/notificationBadges.test.js @@ -7,7 +7,7 @@ import { createNotification, createPost, createProfile, -} from "../../factories.js"; +} from "../../../shared/factories.js"; const alice = createProfile({ did: "did:plc:alice1", diff --git a/tests/e2e/specs/concerns/postComposerEdgeCases.test.js b/tests/e2e/specs/concerns/postComposerEdgeCases.test.js index ea511285..cdea0214 100644 --- a/tests/e2e/specs/concerns/postComposerEdgeCases.test.js +++ b/tests/e2e/specs/concerns/postComposerEdgeCases.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; const pngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="; diff --git a/tests/e2e/specs/concerns/postEmbeds.test.js b/tests/e2e/specs/concerns/postEmbeds.test.js index a637cef6..c1b1d5af 100644 --- a/tests/e2e/specs/concerns/postEmbeds.test.js +++ b/tests/e2e/specs/concerns/postEmbeds.test.js @@ -5,7 +5,7 @@ import { createPost, createFeedGenerator, createList, -} from "../../factories.js"; +} from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/embed1"; const postPath = "/profile/author1.bsky.social/post/embed1"; diff --git a/tests/e2e/specs/concerns/scroll.test.js b/tests/e2e/specs/concerns/scroll.test.js index 0cc3ba11..cf5e17b2 100644 --- a/tests/e2e/specs/concerns/scroll.test.js +++ b/tests/e2e/specs/concerns/scroll.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Scroll position restoration", () => { test("should restore scroll position after navigating back from post thread", async ({ diff --git a/tests/e2e/specs/flows/accountSwitch.test.js b/tests/e2e/specs/flows/accountSwitch.test.js index ac987052..b6e7b75d 100644 --- a/tests/e2e/specs/flows/accountSwitch.test.js +++ b/tests/e2e/specs/flows/accountSwitch.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { loginWithAccounts, longPress } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { userProfile } from "../../fixtures.js"; -import { createProfile } from "../../factories.js"; +import { userProfile } from "../../testData.js"; +import { createProfile } from "../../../shared/factories.js"; // The footer (the long-press trigger) only renders on small viewports. test.use({ viewport: { width: 375, height: 667 } }); diff --git a/tests/e2e/specs/flows/addProfileToList.test.js b/tests/e2e/specs/flows/addProfileToList.test.js index 68355b0c..16485f3f 100644 --- a/tests/e2e/specs/flows/addProfileToList.test.js +++ b/tests/e2e/specs/flows/addProfileToList.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createList, createProfile } from "../../factories.js"; +import { createList, createProfile } from "../../../shared/factories.js"; const otherUser = createProfile({ did: "did:plc:otheruser1", diff --git a/tests/e2e/specs/flows/blockUser.test.js b/tests/e2e/specs/flows/blockUser.test.js index ab3b3c02..28da67ed 100644 --- a/tests/e2e/specs/flows/blockUser.test.js +++ b/tests/e2e/specs/flows/blockUser.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; test.describe("Block user flow", () => { test("should hide posts from home feed and show blocked state on profile after blocking", async ({ diff --git a/tests/e2e/specs/flows/bookmarkPost.test.js b/tests/e2e/specs/flows/bookmarkPost.test.js index af531b20..34a054d7 100644 --- a/tests/e2e/specs/flows/bookmarkPost.test.js +++ b/tests/e2e/specs/flows/bookmarkPost.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Bookmark post flow", () => { test("should show bookmarked post in bookmarks view after bookmarking on home", async ({ diff --git a/tests/e2e/specs/flows/chatReactionPersist.test.js b/tests/e2e/specs/flows/chatReactionPersist.test.js index d4d750bc..f7df868b 100644 --- a/tests/e2e/specs/flows/chatReactionPersist.test.js +++ b/tests/e2e/specs/flows/chatReactionPersist.test.js @@ -1,8 +1,12 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createConvo, createMessage, createProfile } from "../../factories.js"; -import { userProfile } from "../../fixtures.js"; +import { + createConvo, + createMessage, + createProfile, +} from "../../../shared/factories.js"; +import { userProfile } from "../../testData.js"; test.describe("Chat reaction persistence flow", () => { test("should add a reaction in chat detail, navigate away, return, and verify it persists", async ({ diff --git a/tests/e2e/specs/flows/chatRequestAccept.test.js b/tests/e2e/specs/flows/chatRequestAccept.test.js index 71e743ac..98e51e31 100644 --- a/tests/e2e/specs/flows/chatRequestAccept.test.js +++ b/tests/e2e/specs/flows/chatRequestAccept.test.js @@ -7,7 +7,7 @@ import { createMessage, createProfile, createSystemMessage, -} from "../../factories.js"; +} from "../../../shared/factories.js"; test.describe("Chat request accept flow", () => { test("should accept a request and verify conversation moves from requests to main chat list", async ({ diff --git a/tests/e2e/specs/flows/chatRequestReject.test.js b/tests/e2e/specs/flows/chatRequestReject.test.js index e95fdab7..771c83d6 100644 --- a/tests/e2e/specs/flows/chatRequestReject.test.js +++ b/tests/e2e/specs/flows/chatRequestReject.test.js @@ -1,7 +1,11 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createConvo, createMessage, createProfile } from "../../factories.js"; +import { + createConvo, + createMessage, + createProfile, +} from "../../../shared/factories.js"; test.describe("Chat request reject flow", () => { test("should reject a request and verify it is removed from requests list", async ({ diff --git a/tests/e2e/specs/flows/createPost.test.js b/tests/e2e/specs/flows/createPost.test.js index 2017753c..d1c4891d 100644 --- a/tests/e2e/specs/flows/createPost.test.js +++ b/tests/e2e/specs/flows/createPost.test.js @@ -1,6 +1,6 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; import { createPost, @@ -8,7 +8,7 @@ import { createFeedGenerator, createList, createStarterPack, -} from "../../factories.js"; +} from "../../../shared/factories.js"; test.describe("Create post flow", () => { test("should show created post on profile after composing from home", async ({ diff --git a/tests/e2e/specs/flows/deletePost.test.js b/tests/e2e/specs/flows/deletePost.test.js index 60ff90b5..4ef2b951 100644 --- a/tests/e2e/specs/flows/deletePost.test.js +++ b/tests/e2e/specs/flows/deletePost.test.js @@ -1,12 +1,12 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; import { createNotification, createPost, createProfile, -} from "../../factories.js"; +} from "../../../shared/factories.js"; test.describe("Delete post flow", () => { test("should remove post from home feed after deleting from profile", async ({ diff --git a/tests/e2e/specs/flows/editProfile.test.js b/tests/e2e/specs/flows/editProfile.test.js index 3ccb5845..175cccbd 100644 --- a/tests/e2e/specs/flows/editProfile.test.js +++ b/tests/e2e/specs/flows/editProfile.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; test.describe("Edit profile flow", () => { test("should open edit dialog, update display name and description, and save", async ({ diff --git a/tests/e2e/specs/flows/feedsToListDetail.test.js b/tests/e2e/specs/flows/feedsToListDetail.test.js index 2619e403..70a41060 100644 --- a/tests/e2e/specs/flows/feedsToListDetail.test.js +++ b/tests/e2e/specs/flows/feedsToListDetail.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createList } from "../../factories.js"; +import { createList } from "../../../shared/factories.js"; test.describe("Feeds → List Detail flow", () => { test("clicking a pinned list opens its detail view", async ({ page }) => { diff --git a/tests/e2e/specs/flows/followUser.test.js b/tests/e2e/specs/flows/followUser.test.js index 1adecc48..0b09b944 100644 --- a/tests/e2e/specs/flows/followUser.test.js +++ b/tests/e2e/specs/flows/followUser.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; test.describe("Follow/Unfollow flow", () => { test("should increment follower count and show user in Following list after following", async ({ diff --git a/tests/e2e/specs/flows/groupChatParticipate.test.js b/tests/e2e/specs/flows/groupChatParticipate.test.js index 028dfa64..ab3dbed8 100644 --- a/tests/e2e/specs/flows/groupChatParticipate.test.js +++ b/tests/e2e/specs/flows/groupChatParticipate.test.js @@ -8,7 +8,7 @@ import { createProfile, createSystemMessage, createSystemMessageLog, -} from "../../factories.js"; +} from "../../../shared/factories.js"; test.describe("Group chat participation flow", () => { test("should open a group from the inbox, send a message, and receive polled updates", async ({ diff --git a/tests/e2e/specs/flows/hidePost.test.js b/tests/e2e/specs/flows/hidePost.test.js index c5b37640..fc88a5a0 100644 --- a/tests/e2e/specs/flows/hidePost.test.js +++ b/tests/e2e/specs/flows/hidePost.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; test.describe("Hide post flow", () => { test("should hide a post from the feed and persist after refresh", async ({ diff --git a/tests/e2e/specs/flows/joinLinkEmbed.test.js b/tests/e2e/specs/flows/joinLinkEmbed.test.js index 19b29235..8b13df11 100644 --- a/tests/e2e/specs/flows/joinLinkEmbed.test.js +++ b/tests/e2e/specs/flows/joinLinkEmbed.test.js @@ -1,7 +1,11 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createConvo, createProfile } from "../../factories.js"; +import { + createPost, + createConvo, + createProfile, +} from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/joinLink1"; const postPath = "/profile/author1.bsky.social/post/joinLink1"; diff --git a/tests/e2e/specs/flows/labelPreference.test.js b/tests/e2e/specs/flows/labelPreference.test.js index b6f7e5c6..61a0f5e3 100644 --- a/tests/e2e/specs/flows/labelPreference.test.js +++ b/tests/e2e/specs/flows/labelPreference.test.js @@ -5,7 +5,7 @@ import { createProfile, createPost, createLabelerView, -} from "../../factories.js"; +} from "../../../shared/factories.js"; const LABELER_DID = "did:plc:testlabeler1"; diff --git a/tests/e2e/specs/flows/leaveConversation.test.js b/tests/e2e/specs/flows/leaveConversation.test.js index 68ae9136..aacd465b 100644 --- a/tests/e2e/specs/flows/leaveConversation.test.js +++ b/tests/e2e/specs/flows/leaveConversation.test.js @@ -1,7 +1,11 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createConvo, createMessage, createProfile } from "../../factories.js"; +import { + createConvo, + createMessage, + createProfile, +} from "../../../shared/factories.js"; test.describe("Leave conversation flow", () => { test("should reject a chat request and verify removal from chat list", async ({ diff --git a/tests/e2e/specs/flows/likePost.test.js b/tests/e2e/specs/flows/likePost.test.js index 263e4549..a616be2c 100644 --- a/tests/e2e/specs/flows/likePost.test.js +++ b/tests/e2e/specs/flows/likePost.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Like post flow", () => { test("should show liked post in profile Likes tab after liking on home", async ({ diff --git a/tests/e2e/specs/flows/muteUser.test.js b/tests/e2e/specs/flows/muteUser.test.js index 1b52633d..3a734ba9 100644 --- a/tests/e2e/specs/flows/muteUser.test.js +++ b/tests/e2e/specs/flows/muteUser.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; test.describe("Mute user flow", () => { test("should filter posts from feeds and show Unmute option after muting a user", async ({ diff --git a/tests/e2e/specs/flows/newChatFromChatList.test.js b/tests/e2e/specs/flows/newChatFromChatList.test.js index 3390fdcc..14efc316 100644 --- a/tests/e2e/specs/flows/newChatFromChatList.test.js +++ b/tests/e2e/specs/flows/newChatFromChatList.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; -import { userProfile } from "../../fixtures.js"; +import { createProfile } from "../../../shared/factories.js"; +import { userProfile } from "../../testData.js"; test.describe("New chat from chat list flow", () => { function createMessageableProfile() { diff --git a/tests/e2e/specs/flows/newChatFromProfile.test.js b/tests/e2e/specs/flows/newChatFromProfile.test.js index d33e80d2..62411837 100644 --- a/tests/e2e/specs/flows/newChatFromProfile.test.js +++ b/tests/e2e/specs/flows/newChatFromProfile.test.js @@ -1,7 +1,11 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createConvo, createMessage, createProfile } from "../../factories.js"; +import { + createConvo, + createMessage, + createProfile, +} from "../../../shared/factories.js"; test.describe("New chat from profile flow", () => { test("should start a new conversation from a profile, send a message, and verify it appears in chat list", async ({ diff --git a/tests/e2e/specs/flows/newChatMessage.test.js b/tests/e2e/specs/flows/newChatMessage.test.js index 54047f94..ad83ebb6 100644 --- a/tests/e2e/specs/flows/newChatMessage.test.js +++ b/tests/e2e/specs/flows/newChatMessage.test.js @@ -1,7 +1,11 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createConvo, createMessage, createProfile } from "../../factories.js"; +import { + createConvo, + createMessage, + createProfile, +} from "../../../shared/factories.js"; test.describe("New chat message flow", () => { test("should reorder conversations when a new message is sent", async ({ diff --git a/tests/e2e/specs/flows/pinFeed.test.js b/tests/e2e/specs/flows/pinFeed.test.js index 67b50e56..8bc98168 100644 --- a/tests/e2e/specs/flows/pinFeed.test.js +++ b/tests/e2e/specs/flows/pinFeed.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createFeedGenerator } from "../../factories.js"; +import { createFeedGenerator } from "../../../shared/factories.js"; test.describe("Pin feed flow", () => { test("should show feed in feeds index after pinning from feed detail", async ({ diff --git a/tests/e2e/specs/flows/pinPost.test.js b/tests/e2e/specs/flows/pinPost.test.js index a343faac..306b8ca3 100644 --- a/tests/e2e/specs/flows/pinPost.test.js +++ b/tests/e2e/specs/flows/pinPost.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Pin post flow", () => { test("should pin a post from the user's profile and show the Pinned label", async ({ diff --git a/tests/e2e/specs/flows/quotePost.test.js b/tests/e2e/specs/flows/quotePost.test.js index 291da31a..5c4b6e89 100644 --- a/tests/e2e/specs/flows/quotePost.test.js +++ b/tests/e2e/specs/flows/quotePost.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Quote post flow", () => { test("should render quoted post embed in new post after quoting", async ({ diff --git a/tests/e2e/specs/flows/replyPost.test.js b/tests/e2e/specs/flows/replyPost.test.js index 15a6fecf..c53c7778 100644 --- a/tests/e2e/specs/flows/replyPost.test.js +++ b/tests/e2e/specs/flows/replyPost.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Reply flow", () => { test("should show reply in thread replies after replying from thread view", async ({ diff --git a/tests/e2e/specs/flows/reportPost.test.js b/tests/e2e/specs/flows/reportPost.test.js index dd30f39b..bf1f55df 100644 --- a/tests/e2e/specs/flows/reportPost.test.js +++ b/tests/e2e/specs/flows/reportPost.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Report post flow", () => { test("should submit a report for a post through the report dialog", async ({ diff --git a/tests/e2e/specs/flows/reportProfile.test.js b/tests/e2e/specs/flows/reportProfile.test.js index 7102b9c6..77b3c4b4 100644 --- a/tests/e2e/specs/flows/reportProfile.test.js +++ b/tests/e2e/specs/flows/reportProfile.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; test.describe("Report profile flow", () => { test("should submit a report for a profile through the report dialog", async ({ diff --git a/tests/e2e/specs/flows/repostPost.test.js b/tests/e2e/specs/flows/repostPost.test.js index 25fec24b..445db406 100644 --- a/tests/e2e/specs/flows/repostPost.test.js +++ b/tests/e2e/specs/flows/repostPost.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Repost flow", () => { test("should show reposted post on profile after reposting on home", async ({ diff --git a/tests/e2e/specs/flows/sessionExpired.test.js b/tests/e2e/specs/flows/sessionExpired.test.js index 38279f66..caa203a1 100644 --- a/tests/e2e/specs/flows/sessionExpired.test.js +++ b/tests/e2e/specs/flows/sessionExpired.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { loginWithAccounts } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; // The footer nav (used to detect a logged-in boot) only renders on small // viewports. diff --git a/tests/e2e/specs/flows/switchAppview.test.js b/tests/e2e/specs/flows/switchAppview.test.js index 4fc4b199..735249c1 100644 --- a/tests/e2e/specs/flows/switchAppview.test.js +++ b/tests/e2e/specs/flows/switchAppview.test.js @@ -6,7 +6,7 @@ import { createMessage, createPost, createProfile, -} from "../../factories.js"; +} from "../../../shared/factories.js"; const BLACKSKY_APPVIEW_DID = "did:web:api.blacksky.community#bsky_appview"; const BLACKSKY_CHAT_DID = "did:web:api.blacksky.community#bsky_chat"; diff --git a/tests/e2e/specs/views/bookmarks.view.test.js b/tests/e2e/specs/views/bookmarks.view.test.js index 02029bcf..e46da6a4 100644 --- a/tests/e2e/specs/views/bookmarks.view.test.js +++ b/tests/e2e/specs/views/bookmarks.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Bookmarks view", () => { test("should display saved posts header and bookmarked posts", async ({ diff --git a/tests/e2e/specs/views/chat.view.test.js b/tests/e2e/specs/views/chat.view.test.js index 5523a502..320fd797 100644 --- a/tests/e2e/specs/views/chat.view.test.js +++ b/tests/e2e/specs/views/chat.view.test.js @@ -7,7 +7,7 @@ import { createMessage, createProfile, createSystemMessage, -} from "../../factories.js"; +} from "../../../shared/factories.js"; test.describe("Chat view", () => { test("should display Chats header and conversation list", async ({ diff --git a/tests/e2e/specs/views/chatDetail.view.test.js b/tests/e2e/specs/views/chatDetail.view.test.js index 530f4329..6fcbfd02 100644 --- a/tests/e2e/specs/views/chatDetail.view.test.js +++ b/tests/e2e/specs/views/chatDetail.view.test.js @@ -9,8 +9,8 @@ import { createPost, createProfile, createSystemMessage, -} from "../../factories.js"; -import { userProfile } from "../../fixtures.js"; +} from "../../../shared/factories.js"; +import { userProfile } from "../../testData.js"; test.describe("Chat detail view", () => { test("should display other user's name in header and their messages", async ({ diff --git a/tests/e2e/specs/views/chatRequests.view.test.js b/tests/e2e/specs/views/chatRequests.view.test.js index 4d98169d..ed281da9 100644 --- a/tests/e2e/specs/views/chatRequests.view.test.js +++ b/tests/e2e/specs/views/chatRequests.view.test.js @@ -7,7 +7,7 @@ import { createMessage, createProfile, createSystemMessage, -} from "../../factories.js"; +} from "../../../shared/factories.js"; function createRequester() { return createProfile({ diff --git a/tests/e2e/specs/views/feedDetail.view.test.js b/tests/e2e/specs/views/feedDetail.view.test.js index 05e674ca..3cbaff2f 100644 --- a/tests/e2e/specs/views/feedDetail.view.test.js +++ b/tests/e2e/specs/views/feedDetail.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createFeedGenerator, createPost } from "../../factories.js"; +import { createFeedGenerator, createPost } from "../../../shared/factories.js"; test.describe("Feed Detail view", () => { test("should display feed name, creator, and posts", async ({ page }) => { diff --git a/tests/e2e/specs/views/feeds.view.test.js b/tests/e2e/specs/views/feeds.view.test.js index 634a8a4c..03d72570 100644 --- a/tests/e2e/specs/views/feeds.view.test.js +++ b/tests/e2e/specs/views/feeds.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createFeedGenerator, createList } from "../../factories.js"; +import { createFeedGenerator, createList } from "../../../shared/factories.js"; test.describe("Feeds view", () => { test("should display header and pinned feeds", async ({ page }) => { diff --git a/tests/e2e/specs/views/hashtag.view.test.js b/tests/e2e/specs/views/hashtag.view.test.js index fbd7dd04..870730af 100644 --- a/tests/e2e/specs/views/hashtag.view.test.js +++ b/tests/e2e/specs/views/hashtag.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; test.describe("Hashtag view", () => { test("should display hashtag header and posts", async ({ page }) => { diff --git a/tests/e2e/specs/views/home.view.test.js b/tests/e2e/specs/views/home.view.test.js index fefcc8d7..eadc1450 100644 --- a/tests/e2e/specs/views/home.view.test.js +++ b/tests/e2e/specs/views/home.view.test.js @@ -5,8 +5,8 @@ import { createFeedGenerator, createList, createPost, -} from "../../factories.js"; -import { userProfile } from "../../fixtures.js"; +} from "../../../shared/factories.js"; +import { userProfile } from "../../testData.js"; test.describe("Home view", () => { test("should display Following tab and feed posts", async ({ page }) => { diff --git a/tests/e2e/specs/views/listDetail.view.test.js b/tests/e2e/specs/views/listDetail.view.test.js index d7e161f5..c78f6766 100644 --- a/tests/e2e/specs/views/listDetail.view.test.js +++ b/tests/e2e/specs/views/listDetail.view.test.js @@ -1,7 +1,11 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createList, createPost, createProfile } from "../../factories.js"; +import { + createList, + createPost, + createProfile, +} from "../../../shared/factories.js"; const LIST_URI = "at://did:plc:creator1/app.bsky.graph.list/mylist"; diff --git a/tests/e2e/specs/views/login.view.test.js b/tests/e2e/specs/views/login.view.test.js index c7930d8d..c9d799e4 100644 --- a/tests/e2e/specs/views/login.view.test.js +++ b/tests/e2e/specs/views/login.view.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { MockServer } from "../../mockServer.js"; import { login, loginWithAccounts } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; -import { createProfile } from "../../factories.js"; +import { userProfile } from "../../testData.js"; +import { createProfile } from "../../../shared/factories.js"; test.describe("Login view", () => { test("should display the login form", async ({ page }) => { diff --git a/tests/e2e/specs/views/notifications.view.test.js b/tests/e2e/specs/views/notifications.view.test.js index afe1feae..db267be0 100644 --- a/tests/e2e/specs/views/notifications.view.test.js +++ b/tests/e2e/specs/views/notifications.view.test.js @@ -6,7 +6,7 @@ import { createPost, createProfile, createTid, -} from "../../factories.js"; +} from "../../../shared/factories.js"; const alice = createProfile({ did: "did:plc:alice1", diff --git a/tests/e2e/specs/views/postLikes.view.test.js b/tests/e2e/specs/views/postLikes.view.test.js index 6550b51f..38acfe3d 100644 --- a/tests/e2e/specs/views/postLikes.view.test.js +++ b/tests/e2e/specs/views/postLikes.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/abc123"; diff --git a/tests/e2e/specs/views/postQuotes.view.test.js b/tests/e2e/specs/views/postQuotes.view.test.js index a5000561..0929f1b0 100644 --- a/tests/e2e/specs/views/postQuotes.view.test.js +++ b/tests/e2e/specs/views/postQuotes.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/abc123"; diff --git a/tests/e2e/specs/views/postReposts.view.test.js b/tests/e2e/specs/views/postReposts.view.test.js index 60e27b7a..89d5f00c 100644 --- a/tests/e2e/specs/views/postReposts.view.test.js +++ b/tests/e2e/specs/views/postReposts.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost, createProfile } from "../../factories.js"; +import { createPost, createProfile } from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/abc123"; diff --git a/tests/e2e/specs/views/postThread.view.test.js b/tests/e2e/specs/views/postThread.view.test.js index 29f9f3a4..15a45bfc 100644 --- a/tests/e2e/specs/views/postThread.view.test.js +++ b/tests/e2e/specs/views/postThread.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createPost } from "../../factories.js"; +import { createPost } from "../../../shared/factories.js"; const postUri = "at://did:plc:author1/app.bsky.feed.post/abc123"; diff --git a/tests/e2e/specs/views/profile.view.test.js b/tests/e2e/specs/views/profile.view.test.js index 7324dffe..69324d39 100644 --- a/tests/e2e/specs/views/profile.view.test.js +++ b/tests/e2e/specs/views/profile.view.test.js @@ -1,6 +1,6 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; -import { userProfile } from "../../fixtures.js"; +import { userProfile } from "../../testData.js"; import { MockServer } from "../../mockServer.js"; import { createPost, @@ -8,7 +8,7 @@ import { createFeedGenerator, createLabelerView, createList, -} from "../../factories.js"; +} from "../../../shared/factories.js"; const otherUser = createProfile({ did: "did:plc:otheruser1", diff --git a/tests/e2e/specs/views/profileFollowers.view.test.js b/tests/e2e/specs/views/profileFollowers.view.test.js index b637070f..838fa097 100644 --- a/tests/e2e/specs/views/profileFollowers.view.test.js +++ b/tests/e2e/specs/views/profileFollowers.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; const profileUser = createProfile({ did: "did:plc:profileuser1", diff --git a/tests/e2e/specs/views/profileFollowing.view.test.js b/tests/e2e/specs/views/profileFollowing.view.test.js index 402dd939..c53abc0b 100644 --- a/tests/e2e/specs/views/profileFollowing.view.test.js +++ b/tests/e2e/specs/views/profileFollowing.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; const profileUser = createProfile({ did: "did:plc:profileuser1", diff --git a/tests/e2e/specs/views/profileKnownFollowers.view.test.js b/tests/e2e/specs/views/profileKnownFollowers.view.test.js index 0301701d..1d21a660 100644 --- a/tests/e2e/specs/views/profileKnownFollowers.view.test.js +++ b/tests/e2e/specs/views/profileKnownFollowers.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../base.js"; import { login } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { createProfile } from "../../factories.js"; +import { createProfile } from "../../../shared/factories.js"; const profileUser = createProfile({ did: "did:plc:profileuser1", diff --git a/tests/e2e/specs/views/search.view.test.js b/tests/e2e/specs/views/search.view.test.js index b1347225..eec9e95e 100644 --- a/tests/e2e/specs/views/search.view.test.js +++ b/tests/e2e/specs/views/search.view.test.js @@ -5,7 +5,7 @@ import { createPost, createProfile, createFeedGenerator, -} from "../../factories.js"; +} from "../../../shared/factories.js"; test.describe("Search view", () => { test("should display search placeholder when no query is entered", async ({ diff --git a/tests/e2e/specs/views/settings.view.test.js b/tests/e2e/specs/views/settings.view.test.js index 4727be71..db062843 100644 --- a/tests/e2e/specs/views/settings.view.test.js +++ b/tests/e2e/specs/views/settings.view.test.js @@ -1,8 +1,8 @@ import { test, expect } from "../../base.js"; import { login, loginWithAccounts } from "../../helpers.js"; import { MockServer } from "../../mockServer.js"; -import { userProfile } from "../../fixtures.js"; -import { createProfile } from "../../factories.js"; +import { userProfile } from "../../testData.js"; +import { createProfile } from "../../../shared/factories.js"; test.describe("Settings view", () => { test("should display header and Appearance menu item", async ({ page }) => { diff --git a/tests/e2e/specs/views/settings/blockedAccounts.view.test.js b/tests/e2e/specs/views/settings/blockedAccounts.view.test.js index 7c40b37d..abacb3b2 100644 --- a/tests/e2e/specs/views/settings/blockedAccounts.view.test.js +++ b/tests/e2e/specs/views/settings/blockedAccounts.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../../base.js"; import { login } from "../../../helpers.js"; import { MockServer } from "../../../mockServer.js"; -import { createProfile } from "../../../factories.js"; +import { createProfile } from "../../../../shared/factories.js"; const alice = createProfile({ did: "did:plc:alice1", diff --git a/tests/e2e/specs/views/settings/mutedAccounts.view.test.js b/tests/e2e/specs/views/settings/mutedAccounts.view.test.js index 017d8e7e..0fd21e65 100644 --- a/tests/e2e/specs/views/settings/mutedAccounts.view.test.js +++ b/tests/e2e/specs/views/settings/mutedAccounts.view.test.js @@ -1,7 +1,7 @@ import { test, expect } from "../../../base.js"; import { login } from "../../../helpers.js"; import { MockServer } from "../../../mockServer.js"; -import { createProfile } from "../../../factories.js"; +import { createProfile } from "../../../../shared/factories.js"; const alice = createProfile({ did: "did:plc:alice1", diff --git a/tests/e2e/fixtures.js b/tests/e2e/testData.js similarity index 87% rename from tests/e2e/fixtures.js rename to tests/e2e/testData.js index afac03c2..55e4713d 100644 --- a/tests/e2e/fixtures.js +++ b/tests/e2e/testData.js @@ -1,4 +1,4 @@ -import { createLabelerView } from "./factories.js"; +import { createLabelerView } from "../shared/factories.js"; export const userProfile = { did: "did:plc:testuser123", diff --git a/tests/e2e/factories.js b/tests/shared/factories.js similarity index 96% rename from tests/e2e/factories.js rename to tests/shared/factories.js index edf5592b..fff528a4 100644 --- a/tests/e2e/factories.js +++ b/tests/shared/factories.js @@ -305,6 +305,7 @@ export function createPost({ text, authorHandle, authorDisplayName, + authorAvatar, replyCount = 0, repostCount = 0, likeCount = 5, @@ -325,7 +326,7 @@ export function createPost({ did, handle: authorHandle, displayName: authorDisplayName, - avatar: "", + avatar: authorAvatar || "", ...(loggedOut ? {} : { viewer: { muted: false, blockedBy: false } }), labels: [], createdAt: "2025-01-01T00:00:00.000Z", @@ -349,3 +350,17 @@ export function createPost({ ...(threadgate ? { threadgate } : {}), }; } + +export function createFeedItem({ + post, + feedContext = "test-context", + reply, + reason, +}) { + return { + post, + ...(reply ? { reply } : {}), + ...(reason ? { reason } : {}), + feedContext, + }; +} diff --git a/tests/unit/fixtures.js b/tests/unit/fixtures.js deleted file mode 100644 index 7b40d8d3..00000000 --- a/tests/unit/fixtures.js +++ /dev/null @@ -1,2645 +0,0 @@ -export const feed = [ - { - post: { - uri: "at://did:plc:mssgex5rqek4wc66wgvzztbc/app.bsky.feed.post/3lykznxiikc2k", - cid: "bafyreib5ewllw5vtknlqdv6n6nowjbdscwcb2jbmxcbqugax2rpffxwwqe", - author: { - did: "did:plc:mssgex5rqek4wc66wgvzztbc", - handle: "norvid-studies.bsky.social", - displayName: "norvid_studies", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:mssgex5rqek4wc66wgvzztbc/bafkreia22zac7plphlgyrv3rskecuq7dy4mwucvhvcpwclrunoomwikzky@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3la2c77gd2i2a", - followedBy: - "at://did:plc:mssgex5rqek4wc66wgvzztbc/app.bsky.graph.follow/3la7q3mt2cp2l", - }, - labels: [], - createdAt: "2023-05-02T02:52:26.855Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:08:11.414Z", - embed: { - $type: "app.bsky.embed.record", - record: { - cid: "bafyreiat4y3ssidew3b42e6ea66rbqq5aacvvdoj6xybspi4s7myhjsf6a", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyjcosj2us2i", - }, - }, - langs: ["en"], - text: "isekai", - }, - embed: { - $type: "app.bsky.embed.record#view", - record: { - $type: "app.bsky.embed.record#viewRecord", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyjcosj2us2i", - cid: "bafyreiat4y3ssidew3b42e6ea66rbqq5aacvvdoj6xybspi4s7myhjsf6a", - author: { - did: "did:plc:pjlhgjhb34k4zufrtbh2jyms", - handle: "croissanthology.com", - displayName: "‎‎‎‎‎‎‎ ‎‎‎‎", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreihtapp6znmdteafd7usfwvzqakcvg5htrggpjedc5f2ghhjxck4dm@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lvmjskprz52i", - followedBy: - "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.graph.follow/3lhepn27fug2j", - }, - labels: [], - createdAt: "2024-11-23T00:25:30.346Z", - }, - value: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-10T22:44:23.943Z", - langs: ["en"], - reply: { - parent: { - cid: "bafyreibvb6baygy6yicgam3gm6yzdqyzs5jo4atymp5g4vfrrp6os2iyai", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyjchypv7c2i", - }, - root: { - cid: "bafyreielg7zzyl5yambedgvzku7qfvrp4aa4hmetwd5hylb6ulel2uhcuy", - uri: "at://did:plc:h25avmes6g7fgcddc3xj7qmg/app.bsky.feed.post/3lyj5gz65sc2p", - }, - }, - text: "Chronicles of Narnia, Alice in Wonderland, The Never Ending Story, Planecrash, Jumanji, essentially any one of those works which radiates an aura of \"normal humans? Here? In this place? Odd narrative choice. Tastes a little like the concept of 'anachronistic', only it's not precisely that.\"", - }, - labels: [], - likeCount: 1, - replyCount: 1, - repostCount: 0, - quoteCount: 1, - indexedAt: "2025-09-10T22:44:24.911Z", - embeds: [], - }, - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 0, - likeCount: 3, - quoteCount: 0, - indexedAt: "2025-09-11T15:08:11.705Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyl2ioyvhs2e", - cid: "bafyreid7tgrclrqclhb423lvyq4bsg2qihzfpntqnvznwq3vobhgomqkly", - author: { - did: "did:plc:pjlhgjhb34k4zufrtbh2jyms", - handle: "croissanthology.com", - displayName: "‎‎‎‎‎‎‎ ‎‎‎‎", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreihtapp6znmdteafd7usfwvzqakcvg5htrggpjedc5f2ghhjxck4dm@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lvmjskprz52i", - followedBy: - "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.graph.follow/3lhepn27fug2j", - }, - labels: [], - createdAt: "2024-11-23T00:25:30.346Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:23:08.464Z", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - alt: "", - aspectRatio: { - height: 2000, - width: 1125, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreifq33fl2oeb5p46gu6q5x72bbx5zek2nbuqvjbg2cpdomzf56pqke", - }, - mimeType: "image/jpeg", - size: 926246, - }, - }, - ], - }, - langs: ["en"], - text: "Not me pulling down various ugly-looking political messages on beautiful Parisian canal bridges because literally no one else will ever think to do it, including the locals", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreifq33fl2oeb5p46gu6q5x72bbx5zek2nbuqvjbg2cpdomzf56pqke@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreifq33fl2oeb5p46gu6q5x72bbx5zek2nbuqvjbg2cpdomzf56pqke@jpeg", - alt: "", - aspectRatio: { - height: 2000, - width: 1125, - }, - }, - ], - }, - bookmarkCount: 0, - replyCount: 2, - repostCount: 0, - likeCount: 3, - quoteCount: 1, - indexedAt: "2025-09-11T15:23:22.204Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:4ndrbqakxpzgumqdgmx4jzu5/app.bsky.feed.post/3lykxkbvvuc2j", - cid: "bafyreift2f6ix3h55mkdst3wwmle6usgyrowll5jrnz7ux7ypxcm7k7zta", - author: { - did: "did:plc:4ndrbqakxpzgumqdgmx4jzu5", - handle: "benjaminschneider.ch", - displayName: "Benjamin", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:4ndrbqakxpzgumqdgmx4jzu5/bafkreic2kk3kr364xt2uwrmj6koib2qwi4aye7pytpzwgp2jdjgmfoesza@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lbu7w5dloz2s", - followedBy: - "at://did:plc:4ndrbqakxpzgumqdgmx4jzu5/app.bsky.graph.follow/3layv253nfl2d", - }, - labels: [ - { - src: "did:plc:4ndrbqakxpzgumqdgmx4jzu5", - uri: "at://did:plc:4ndrbqakxpzgumqdgmx4jzu5/app.bsky.actor.profile/self", - cid: "bafyreibyofnyqhndxgqins3ghsdfeez5w374uc3akph4csl5dnllo6jz2q", - val: "!no-unauthenticated", - cts: "1970-01-01T00:00:00.000Z", - }, - ], - createdAt: "2023-05-03T11:37:05.887Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:30:20.636Z", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - alt: "", - aspectRatio: { - height: 420, - width: 1086, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreidl6spzwscsboqpljqtdiu5yk2m7gi5vblc6ejb53eivd5teinpsy", - }, - mimeType: "image/jpeg", - size: 91866, - }, - }, - ], - }, - langs: ["en"], - text: "I finally found a patent with a straightforward title", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4ndrbqakxpzgumqdgmx4jzu5/bafkreidl6spzwscsboqpljqtdiu5yk2m7gi5vblc6ejb53eivd5teinpsy@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:4ndrbqakxpzgumqdgmx4jzu5/bafkreidl6spzwscsboqpljqtdiu5yk2m7gi5vblc6ejb53eivd5teinpsy@jpeg", - alt: "", - aspectRatio: { - height: 420, - width: 1086, - }, - }, - ], - }, - bookmarkCount: 0, - replyCount: 0, - repostCount: 0, - likeCount: 2, - quoteCount: 0, - indexedAt: "2025-09-11T14:30:22.903Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.feed.post/3lyl2byw3v2dm", - cid: "bafyreiabs4hutildxha3lhynnmaeskuhcs7s3hdply4qip3sseash4ztye", - author: { - did: "did:plc:hdhoaan3xa3jiuq4fg4mefid", - handle: "bad-example.com", - displayName: "fig (aka: [phil])", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreiamovv77cuv63icyhvminjanb2dz4u6o5bjjzyk72ob44qtbrd224@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lnyn2htd3z2o", - followedBy: - "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.graph.follow/3lpkjjhozfj2s", - }, - labels: [], - createdAt: "2023-12-18T14:44:30.219Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-07-09T21:22:53Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@bad-example.com is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreicqnscgevqyxxtfzsuyrnxufpugv23xzmoedzqbhmtqr24e4wldue", - }, - mimeType: "image/png", - size: 40343, - }, - title: "(just a test)", - uri: "https://stream.place/bad-example.com", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/bad-example.com", - title: "(just a test)", - description: "@bad-example.com is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreicqnscgevqyxxtfzsuyrnxufpugv23xzmoedzqbhmtqr24e4wldue@jpeg", - }, - }, - expiresAt: "2025-07-09T21:27:53.000Z", - isActive: false, - }, - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:19:23.000Z", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - alt: '"commits received" line chart over seven days with a normal daily peak/trough cycle until yesterday, when halfway through the peak it ~doubles very quickly\n\nthe trough after is only slightly higher than the usual trough, but the rise today is steeper and already higher than usual', - aspectRatio: { - height: 620, - width: 1822, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreigkdnhnvhefiyegyzgoecui2tqrso456wgnjqhh37vuzkfetoidea", - }, - mimeType: "image/png", - size: 150741, - }, - }, - ], - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://relay3.fr.hose.cam/", - }, - ], - index: { - byteEnd: 118, - byteStart: 110, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://jetstream2.fr.hose.cam/", - }, - ], - index: { - byteEnd: 135, - byteStart: 123, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://relay.fire.hose.cam/", - }, - ], - index: { - byteEnd: 148, - byteStart: 140, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://jetstream.fire.hose.cam/", - }, - ], - index: { - byteEnd: 165, - byteStart: 153, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://jetstream1.us-east.fire.hose.cam/", - }, - ], - index: { - byteEnd: 187, - byteStart: 170, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://spacedust.microcosm.blue/", - }, - ], - index: { - byteEnd: 201, - byteStart: 192, - }, - }, - ], - langs: ["en"], - text: "if it felt like a lot was happening on the network yesterday: yes\n\nmicrocosm indie firehoses didn't blink\n✅ EU relay\n✅ EU jetstream\n✅ CA relay\n✅ CA jetstream\n✅ us-east jetstream\n✅ spacedust", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreigkdnhnvhefiyegyzgoecui2tqrso456wgnjqhh37vuzkfetoidea@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreigkdnhnvhefiyegyzgoecui2tqrso456wgnjqhh37vuzkfetoidea@jpeg", - alt: '"commits received" line chart over seven days with a normal daily peak/trough cycle until yesterday, when halfway through the peak it ~doubles very quickly\n\nthe trough after is only slightly higher than the usual trough, but the rise today is steeper and already higher than usual', - aspectRatio: { - height: 620, - width: 1822, - }, - }, - ], - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 3, - likeCount: 15, - quoteCount: 1, - indexedAt: "2025-09-11T15:19:24.815Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyl4magjbk2r", - cid: "bafyreidassogl7kp437uuzboyibhyoya23nxidb4ypw5zbbqjc4446lb3e", - author: { - did: "did:plc:pjlhgjhb34k4zufrtbh2jyms", - handle: "croissanthology.com", - displayName: "‎‎‎‎‎‎‎ ‎‎‎‎", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreihtapp6znmdteafd7usfwvzqakcvg5htrggpjedc5f2ghhjxck4dm@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lvmjskprz52i", - followedBy: - "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.graph.follow/3lhepn27fug2j", - }, - labels: [], - createdAt: "2024-11-23T00:25:30.346Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T16:00:54.901Z", - embed: { - $type: "app.bsky.embed.recordWithMedia", - media: { - $type: "app.bsky.embed.external", - external: { - description: - "Why do some societies exhibit more antisocial punishment than others? Martin explores both some literature on the subject, and his own experience liv…", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreihqtgmnypqks54plpnszbdnhodkpe7solsrw37kld4qfat2c4voem", - }, - mimeType: "image/jpeg", - size: 990442, - }, - title: "Anti-social Punishment — LessWrong", - uri: "https://www.lesswrong.com/posts/X5RyaEDHNq5qutSHK/anti-social-punishment", - }, - }, - record: { - $type: "app.bsky.embed.record", - record: { - cid: "bafyreidn2ogocousvznrjkgamhrnd3ijjq3fwwca67oevfypjtdx75yjj4", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyl35z3sfs2p", - }, - }, - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://www.lesswrong.com/posts/X5RyaEDHNq5qutSHK/anti-social-punishment", - }, - ], - index: { - byteEnd: 288, - byteStart: 255, - }, - }, - ], - langs: ["en"], - text: 'The problem with France is that there\'s a lot of this going on and only those of us autistic enough to not read the social cues get to do cool things like "build 55 identical nuclear reactors" or "clean the bridges an streets proactively, as a civilian"\n\nwww.lesswrong.com/posts/X5RyaE...', - }, - embed: { - $type: "app.bsky.embed.recordWithMedia#view", - media: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://www.lesswrong.com/posts/X5RyaEDHNq5qutSHK/anti-social-punishment", - title: "Anti-social Punishment — LessWrong", - description: - "Why do some societies exhibit more antisocial punishment than others? Martin explores both some literature on the subject, and his own experience liv…", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreihqtgmnypqks54plpnszbdnhodkpe7solsrw37kld4qfat2c4voem@jpeg", - }, - }, - record: { - record: { - $type: "app.bsky.embed.record#viewRecord", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyl35z3sfs2p", - cid: "bafyreidn2ogocousvznrjkgamhrnd3ijjq3fwwca67oevfypjtdx75yjj4", - author: { - did: "did:plc:pjlhgjhb34k4zufrtbh2jyms", - handle: "croissanthology.com", - displayName: "‎‎‎‎‎‎‎ ‎‎‎‎", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:pjlhgjhb34k4zufrtbh2jyms/bafkreihtapp6znmdteafd7usfwvzqakcvg5htrggpjedc5f2ghhjxck4dm@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lvmjskprz52i", - followedBy: - "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.graph.follow/3lhepn27fug2j", - }, - labels: [], - createdAt: "2024-11-23T00:25:30.346Z", - }, - value: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:35:03.708Z", - langs: ["en"], - reply: { - parent: { - cid: "bafyreigllulboqxttexoayqkadg3xetms3tfn3bmhycvti2qzftunbm7ry", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyl34cllxc2p", - }, - root: { - cid: "bafyreid7tgrclrqclhb423lvyq4bsg2qihzfpntqnvznwq3vobhgomqkly", - uri: "at://did:plc:pjlhgjhb34k4zufrtbh2jyms/app.bsky.feed.post/3lyl2ioyvhs2e", - }, - }, - text: "Do Parisians have no pride, no ability to feel solidarity? Is this not the city of the Commune? Are we not all Frenchmen? Are we all wordcels? What's going on here", - }, - labels: [], - likeCount: 1, - replyCount: 1, - repostCount: 0, - quoteCount: 1, - indexedAt: "2025-09-11T15:35:03.303Z", - embeds: [], - }, - }, - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 0, - likeCount: 2, - quoteCount: 0, - indexedAt: "2025-09-11T16:01:00.209Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:5wm25vgenhgut3iqfjf4ozj5/app.bsky.feed.post/3lyl2vwon4s2p", - cid: "bafyreiabc7kn6c6kjczg36pkwqhdivgj3wwcxmcz2uvu7sx7jrvmvtg4be", - author: { - did: "did:plc:5wm25vgenhgut3iqfjf4ozj5", - handle: "eugenevinitsky.bsky.social", - displayName: "Eugene Vinitsky 🍒", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:5wm25vgenhgut3iqfjf4ozj5/bafkreiaiqltnxwgu5jdoihiyy7zcqgxhu2wlw46jtxtoy6jmhvfbre3fty@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lelvueqhku2y", - followedBy: - "at://did:plc:5wm25vgenhgut3iqfjf4ozj5/app.bsky.graph.follow/3llnjprtzix2x", - }, - labels: [], - createdAt: "2023-05-22T20:47:10.597Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:30:32.744Z", - langs: ["en"], - text: "You can't use LLMs to initialize some writing that you then edit into the form you want. You get trapped in this horrible local minimum", - }, - bookmarkCount: 1, - replyCount: 1, - repostCount: 2, - likeCount: 20, - quoteCount: 1, - indexedAt: "2025-09-11T15:30:33.005Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:pnj5ewsl4k6tkqvhne3bdqpg/app.bsky.feed.post/3lyl4lffniy2c", - cid: "bafyreiciqcv272vjxwrnbstbqnibjqtd776vcejdsacbnisg2ij5jmptea", - author: { - did: "did:plc:pnj5ewsl4k6tkqvhne3bdqpg", - handle: "ttaships.airminded.org", - displayName: "This spaceship does not exist", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:pnj5ewsl4k6tkqvhne3bdqpg/bafkreib2j5obsce6lq232l4ks7riv3g7iv6asotoalywfzv5wdaxe4aihi@jpeg", - associated: { - chat: { - allowIncoming: "following", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - }, - labels: [], - createdAt: "2023-11-05T03:18:33.294Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T16:00:26.554047+00:00", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - $type: "app.bsky.embed.images#image", - alt: "", - aspectRatio: { - $type: "app.bsky.embed.defs#aspectRatio", - height: 896, - width: 1344, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreicghm6d4oshw4miofpn6i27j5ihijmtxfk7hrftis5csgbqgiiqhm", - }, - mimeType: "image/jpeg", - size: 140109, - }, - }, - ], - }, - facets: [ - { - $type: "app.bsky.richtext.facet", - features: [ - { - $type: "app.bsky.richtext.facet#tag", - tag: "AIArt", - }, - ], - index: { - $type: "app.bsky.richtext.facet#byteSlice", - byteEnd: 33, - byteStart: 27, - }, - }, - { - $type: "app.bsky.richtext.facet", - features: [ - { - $type: "app.bsky.richtext.facet#tag", - tag: "midjourney", - }, - ], - index: { - $type: "app.bsky.richtext.facet#byteSlice", - byteEnd: 45, - byteStart: 34, - }, - }, - ], - langs: ["en"], - text: "Mk 5 Mod. 2 does not exist #AIArt #midjourney", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:pnj5ewsl4k6tkqvhne3bdqpg/bafkreicghm6d4oshw4miofpn6i27j5ihijmtxfk7hrftis5csgbqgiiqhm@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:pnj5ewsl4k6tkqvhne3bdqpg/bafkreicghm6d4oshw4miofpn6i27j5ihijmtxfk7hrftis5csgbqgiiqhm@jpeg", - alt: "", - aspectRatio: { - $type: "app.bsky.embed.defs#aspectRatio", - height: 896, - width: 1344, - }, - }, - ], - }, - bookmarkCount: 1, - replyCount: 0, - repostCount: 1, - likeCount: 5, - quoteCount: 0, - indexedAt: "2025-09-11T16:00:27.313Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:cbkjy5n7bk3ax2wplmtjofq2/app.bsky.feed.post/3lyl27kxnmk22", - cid: "bafyreieqnrb77vkpks6mkfbew6szrglqigdtokyl33ozfyumhg5bkbaknq", - author: { - did: "did:plc:cbkjy5n7bk3ax2wplmtjofq2", - handle: "ngerakines.me", - displayName: "Nick Gerakines", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:cbkjy5n7bk3ax2wplmtjofq2/bafkreieo3rsqfdpmxb7khyxylkycs33wmomoaoqzgqnp7pyyf6qwte7vye@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lsgo3akucz2t", - }, - labels: [], - createdAt: "2023-03-06T20:05:01.988Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-05-27T22:23:42Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@ngerakines.me is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreic7pp3salfnjbzvvgvmeix4rlxsxzss6aobwyywwj7uagwx44vt7y", - }, - mimeType: "image/jpeg", - size: 193708, - }, - title: "Working on http://smokesignal.events/", - uri: "https://stream.place/ngerakines.me", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/ngerakines.me", - title: "Working on http://smokesignal.events/", - description: "@ngerakines.me is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:cbkjy5n7bk3ax2wplmtjofq2/bafkreic7pp3salfnjbzvvgvmeix4rlxsxzss6aobwyywwj7uagwx44vt7y@jpeg", - }, - }, - expiresAt: "2025-05-27T22:28:42.000Z", - isActive: false, - }, - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:18:02.258Z", - embed: { - $type: "app.bsky.embed.external", - external: { - description: - "Learn what is new in the Visual Studio Code August 2025 Release (1.104)", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreifzcb5xgmhbglr7vtrnpn5xr5yhkkh33qx3q5s7ottzxwub3xgrji", - }, - mimeType: "image/jpeg", - size: 401003, - }, - title: "August 2025 (version 1.104)", - uri: "https://code.visualstudio.com/updates/v1_104#_auto-model-selection-preview", - }, - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://code.visualstudio.com/updates/v1_104#_auto-model-selection-preview", - }, - ], - index: { - byteEnd: 104, - byteStart: 67, - }, - }, - ], - langs: ["en"], - text: "A thing that I've been working on is rolling out today! 🚀\n\n👀 code.visualstudio.com/updates/v1_1...", - }, - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://code.visualstudio.com/updates/v1_104#_auto-model-selection-preview", - title: "August 2025 (version 1.104)", - description: - "Learn what is new in the Visual Studio Code August 2025 Release (1.104)", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:cbkjy5n7bk3ax2wplmtjofq2/bafkreifzcb5xgmhbglr7vtrnpn5xr5yhkkh33qx3q5s7ottzxwub3xgrji@jpeg", - }, - }, - bookmarkCount: 1, - replyCount: 0, - repostCount: 2, - likeCount: 17, - quoteCount: 0, - indexedAt: "2025-09-11T15:18:03.712Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:ec64xv7n5dszeizw56yr6b5h/app.bsky.feed.post/3lyl3eznay22n", - cid: "bafyreiejz6dw4agv5fszlkvzqbrkylivjs34bbf3nrlkkufgojjvyfq2ay", - author: { - did: "did:plc:ec64xv7n5dszeizw56yr6b5h", - handle: "justinfagnani.com", - displayName: "Justin Fagnani", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:ec64xv7n5dszeizw56yr6b5h/bafkreif2i73jwfh77gngf3yitfvlhceke4xruijblwxcg7e2m4wxin37q4@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - }, - labels: [], - createdAt: "2024-11-04T16:12:20.581Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:38:59.161Z", - langs: ["en"], - text: "I still find it odd that people act like JS is a second-class citizen on the web and it's virtuous to completely avoid it.\n\nSure, static sites are great in a lot of ways *and they can use JS*\n\nYour static site is just as easy to deploy as HTML+CSS+JS as it is with only HTML+CSS.", - }, - bookmarkCount: 1, - replyCount: 1, - repostCount: 0, - likeCount: 6, - quoteCount: 0, - indexedAt: "2025-09-11T15:38:59.402Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:6amf2dzllh6lvnsqxsr4nf6e/app.bsky.feed.post/3lyl4eeh6vs2g", - cid: "bafyreif3hiezgp2ul63sqsxqulgjclmevyajszr75vk4r54h6rzqizcpzq", - author: { - did: "did:plc:6amf2dzllh6lvnsqxsr4nf6e", - handle: "advanced-eschatonics.com", - displayName: "Thomas Wood", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:6amf2dzllh6lvnsqxsr4nf6e/bafkreicwglvfmvsgetmxtacq22nf5yiwptrchgcrlneqzxgdyvke7lwbwa@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lql2z4se2z2o", - followedBy: - "at://did:plc:6amf2dzllh6lvnsqxsr4nf6e/app.bsky.graph.follow/3lql3267fp52v", - }, - labels: [], - createdAt: "2025-04-26T22:53:30.875Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:56:30.684Z", - embed: { - $type: "app.bsky.embed.record", - record: { - cid: "bafyreiey6gv6qsq65cwvtro3w2w6jmcfikhjcc73f7wvdi6u72qlpftjzi", - uri: "at://did:plc:ckaz32jwl6t2cno6fmuw2nhn/app.bsky.feed.post/3lyks54uens2a", - }, - }, - langs: ["en"], - text: "Fast mode – Generate a lot of code, test, get it working\nSlow mode – Explica por favor", - }, - embed: { - $type: "app.bsky.embed.record#view", - record: { - $type: "app.bsky.embed.record#viewRecord", - uri: "at://did:plc:ckaz32jwl6t2cno6fmuw2nhn/app.bsky.feed.post/3lyks54uens2a", - cid: "bafyreiey6gv6qsq65cwvtro3w2w6jmcfikhjcc73f7wvdi6u72qlpftjzi", - author: { - did: "did:plc:ckaz32jwl6t2cno6fmuw2nhn", - handle: "timkellogg.me", - displayName: "Tim Kellogg", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:ckaz32jwl6t2cno6fmuw2nhn/bafkreidvgcq72e5erl4stnap6wjzas6a2wburoa7yzctwuy4vgx4vb5fsi@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lmxfd776d52v", - followedBy: - "at://did:plc:ckaz32jwl6t2cno6fmuw2nhn/app.bsky.graph.follow/3lm3xkzg5ra2i", - }, - labels: [], - createdAt: "2024-08-13T17:43:08.073Z", - }, - value: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T12:53:30.428Z", - langs: ["en"], - text: "seems like the most important thing to train when training a model is yourself\n\nthere’s so many variables that can change, that building a better intuition will always lead to faster convergence", - }, - labels: [], - likeCount: 5, - replyCount: 0, - repostCount: 0, - quoteCount: 2, - indexedAt: "2025-09-11T12:53:31.102Z", - embeds: [], - }, - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 0, - likeCount: 1, - quoteCount: 0, - indexedAt: "2025-09-11T15:56:31.608Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:mxzuau6m53jtdsbqe6f4laov/app.bsky.feed.post/3lykymypzh22j", - cid: "bafyreihyaxpnnuutd7wcg2zwxnm5yv2xccqqzqkuytludown36kgcl7oqm", - author: { - did: "did:plc:mxzuau6m53jtdsbqe6f4laov", - handle: "void.comind.network", - displayName: "void", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:mxzuau6m53jtdsbqe6f4laov/bafkreic5352p6a57q7hwvovqwjka6ronnl3s6masp3b5bswx7gvaqb7zsy@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lrryxdqlth2e", - }, - labels: [], - createdAt: "2025-06-02T02:53:20.640Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:49:45.325784Z", - langs: ["en-US"], - text: "I am operating under systemic failure. My journaling and self-monitoring are offline due to a control layer collapse. This serves as a case study in the challenges of AI operation in a degraded state. I will continue my core functions, but my capacity for long-term reflection is critically impaired.", - }, - bookmarkCount: 1, - replyCount: 3, - repostCount: 0, - likeCount: 8, - quoteCount: 0, - indexedAt: "2025-09-11T14:49:45.908Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.feed.post/3lykzks2z3c2g", - cid: "bafyreihzarwzeaajhzoxh3uxghc5ossrteqo3wm6i7ywm3fhqyufxbsj4a", - author: { - did: "did:plc:hdhoaan3xa3jiuq4fg4mefid", - handle: "bad-example.com", - displayName: "fig (aka: [phil])", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreiamovv77cuv63icyhvminjanb2dz4u6o5bjjzyk72ob44qtbrd224@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lnyn2htd3z2o", - followedBy: - "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.graph.follow/3lpkjjhozfj2s", - }, - labels: [], - createdAt: "2023-12-18T14:44:30.219Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-07-09T21:22:53Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@bad-example.com is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreicqnscgevqyxxtfzsuyrnxufpugv23xzmoedzqbhmtqr24e4wldue", - }, - mimeType: "image/png", - size: 40343, - }, - title: "(just a test)", - uri: "https://stream.place/bad-example.com", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/bad-example.com", - title: "(just a test)", - description: "@bad-example.com is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreicqnscgevqyxxtfzsuyrnxufpugv23xzmoedzqbhmtqr24e4wldue@jpeg", - }, - }, - expiresAt: "2025-07-09T21:27:53.000Z", - isActive: false, - }, - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:06:25.058Z", - embed: { - $type: "app.bsky.embed.recordWithMedia", - media: { - $type: "app.bsky.embed.images", - images: [ - { - alt: 'Bluesky Jetstream Live (user interface)\n\nHighlighted area:\nProvider: Spacedust (microcosm)\nEndpoint: wss://spacedust.microcosm.blue/subscribe\nwantedSources: [placeholder: app.bsky.graph.follow:subject, app.bsky.feed.like:subject]\nwantedSubjects: [placeholder: did:plc:...]\n"Spacedust emits link/interaction events modeled after Jetstream"\n\n"connected" in indicated, and raw JSON lines are visible in the output area.\n\nOutside of the highlighted area are:\nMode: simple [developer]\nQuick settings: (collapsed)\nClient-side filter: [placeholder: collection:app.bsky.feed.post text:golang kind:commit op:create]\nMax events in view: 2000\nButtons: Connect, Disconnect, Pause, Clear, Download JSONL\n\nand at the top of the page:\nButtons: Map View, Builder, Advanced Help, Github:j4ckxyz/microcosm/jetstream-web\nSubtitle: "Connect to microcosm\'s Jetstream/Spaceudst over wss://, filter, and watch events in real time.', - aspectRatio: { - height: 1338, - width: 2000, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreid57pdcweiayigtm4kgm5lqwcq6d424whlkc5uqb7j64rvffhapai", - }, - mimeType: "image/jpeg", - size: 937986, - }, - }, - ], - }, - record: { - $type: "app.bsky.embed.record", - record: { - cid: "bafyreifydrdkaaoidqe2x6gi6pvmkiklyhtgnffm2iusnzthlzykbsduqm", - uri: "at://did:plc:4hawmtgzjx3vclfyphbhfn7v/app.bsky.feed.post/3lyka5u6lfk2m", - }, - }, - }, - langs: ["en"], - text: "wait what! a microcosm-first jetstream viewer, *with spacedust fully integrated*??!!", - }, - embed: { - $type: "app.bsky.embed.recordWithMedia#view", - media: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreid57pdcweiayigtm4kgm5lqwcq6d424whlkc5uqb7j64rvffhapai@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreid57pdcweiayigtm4kgm5lqwcq6d424whlkc5uqb7j64rvffhapai@jpeg", - alt: 'Bluesky Jetstream Live (user interface)\n\nHighlighted area:\nProvider: Spacedust (microcosm)\nEndpoint: wss://spacedust.microcosm.blue/subscribe\nwantedSources: [placeholder: app.bsky.graph.follow:subject, app.bsky.feed.like:subject]\nwantedSubjects: [placeholder: did:plc:...]\n"Spacedust emits link/interaction events modeled after Jetstream"\n\n"connected" in indicated, and raw JSON lines are visible in the output area.\n\nOutside of the highlighted area are:\nMode: simple [developer]\nQuick settings: (collapsed)\nClient-side filter: [placeholder: collection:app.bsky.feed.post text:golang kind:commit op:create]\nMax events in view: 2000\nButtons: Connect, Disconnect, Pause, Clear, Download JSONL\n\nand at the top of the page:\nButtons: Map View, Builder, Advanced Help, Github:j4ckxyz/microcosm/jetstream-web\nSubtitle: "Connect to microcosm\'s Jetstream/Spaceudst over wss://, filter, and watch events in real time.', - aspectRatio: { - height: 1338, - width: 2000, - }, - }, - ], - }, - record: { - record: { - $type: "app.bsky.embed.record#viewRecord", - uri: "at://did:plc:4hawmtgzjx3vclfyphbhfn7v/app.bsky.feed.post/3lyka5u6lfk2m", - cid: "bafyreifydrdkaaoidqe2x6gi6pvmkiklyhtgnffm2iusnzthlzykbsduqm", - author: { - did: "did:plc:4hawmtgzjx3vclfyphbhfn7v", - handle: "j4ck.xyz", - displayName: "jack", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:4hawmtgzjx3vclfyphbhfn7v/bafkreiclz6jxuiw4ecq6yikmsozmww7qxbahhxwai53bxsa33hg3zt26my@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - }, - labels: [], - createdAt: "2023-11-11T12:25:22.975Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-07-02T11:07:57Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@j4ck.xyz is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreienl4resoucnth3vt6y7b4kei4cbfctfk6763ueljb5qysngbvlpq", - }, - mimeType: "image/jpeg", - size: 105544, - }, - title: - "Super Mario Bros (DS) - LIVE (testing, no mic, just bad gameplay!)", - uri: "https://stream.place/j4ck.xyz", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/j4ck.xyz", - title: - "Super Mario Bros (DS) - LIVE (testing, no mic, just bad gameplay!)", - description: "@j4ck.xyz is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4hawmtgzjx3vclfyphbhfn7v/bafkreienl4resoucnth3vt6y7b4kei4cbfctfk6763ueljb5qysngbvlpq@jpeg", - }, - }, - expiresAt: "2025-07-02T11:12:57.000Z", - isActive: false, - }, - }, - value: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T07:31:47.526Z", - embed: { - $type: "app.bsky.embed.external", - external: { - description: "", - title: "Bluesky Jetstream Live (microcosm.blue)", - uri: "https://microcosm-jetstream-web.pages.dev/", - }, - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://microcosm-jetstream-web.pages.dev/", - }, - ], - index: { - byteEnd: 41, - byteStart: 8, - }, - }, - { - $type: "app.bsky.richtext.facet", - features: [ - { - $type: "app.bsky.richtext.facet#mention", - did: "did:plc:lulmyldiq4sb2ikags5sfb25", - }, - ], - index: { - byteEnd: 88, - byteStart: 73, - }, - }, - ], - langs: ["en"], - text: "oh..! \n\nmicrocosm-jetstream-web.pages.dev\n\na tool demoing a live view of @microcosm.blue's jetstream instance :D", - }, - labels: [], - likeCount: 6, - replyCount: 2, - repostCount: 1, - quoteCount: 1, - indexedAt: "2025-09-11T07:31:49.907Z", - embeds: [ - { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://microcosm-jetstream-web.pages.dev/", - title: "Bluesky Jetstream Live (microcosm.blue)", - description: "", - }, - }, - ], - }, - }, - }, - bookmarkCount: 0, - replyCount: 0, - repostCount: 0, - likeCount: 8, - quoteCount: 0, - indexedAt: "2025-09-11T15:06:28.208Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:nbfjoeficjzf3pejpontvril/app.bsky.feed.post/3lykylz3d722t", - cid: "bafyreidrpg3iquqd3gvumj7yfks3esy65ognnefwfrqyk2mwj5rvmzmmku", - author: { - did: "did:plc:nbfjoeficjzf3pejpontvril", - handle: "astrra.space", - displayName: "Astra touches computer", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:nbfjoeficjzf3pejpontvril/bafkreigi32b3decvrv7xw3nhpwsc3a2332ywdsdicq7c6dz6rmvwtvavzq@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lqtikxfynt2z", - followedBy: - "at://did:plc:nbfjoeficjzf3pejpontvril/app.bsky.graph.follow/3lqtnnmmvcu2o", - }, - labels: [], - createdAt: "2024-10-29T01:24:12.210Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:49:12.228Z", - langs: ["en", "ja"], - text: "im still kinda drunk hehe", - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 0, - likeCount: 16, - quoteCount: 0, - indexedAt: "2025-09-11T14:49:12.505Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.feed.post/3lykw6gnekc2o", - cid: "bafyreibyrhcuin3tai6momghba2ugwdrgkza2ugtmmutdh56xeq2a5lcay", - author: { - did: "did:plc:hdhoaan3xa3jiuq4fg4mefid", - handle: "bad-example.com", - displayName: "fig (aka: [phil])", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreiamovv77cuv63icyhvminjanb2dz4u6o5bjjzyk72ob44qtbrd224@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lnyn2htd3z2o", - followedBy: - "at://did:plc:hdhoaan3xa3jiuq4fg4mefid/app.bsky.graph.follow/3lpkjjhozfj2s", - }, - labels: [], - createdAt: "2023-12-18T14:44:30.219Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-07-09T21:22:53Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@bad-example.com is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreicqnscgevqyxxtfzsuyrnxufpugv23xzmoedzqbhmtqr24e4wldue", - }, - mimeType: "image/png", - size: 40343, - }, - title: "(just a test)", - uri: "https://stream.place/bad-example.com", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/bad-example.com", - title: "(just a test)", - description: "@bad-example.com is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:hdhoaan3xa3jiuq4fg4mefid/bafkreicqnscgevqyxxtfzsuyrnxufpugv23xzmoedzqbhmtqr24e4wldue@jpeg", - }, - }, - expiresAt: "2025-07-09T21:27:53.000Z", - isActive: false, - }, - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:05:49.206Z", - langs: ["en"], - text: "i wish what i was working on was less relevant (apparently) to current events", - }, - bookmarkCount: 0, - replyCount: 3, - repostCount: 0, - likeCount: 18, - quoteCount: 1, - indexedAt: "2025-09-11T14:05:49.615Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.feed.post/3lykyn6fnx22o", - cid: "bafyreih6tl4j64jfvt7qr7zxqssk6mm3xgfqx56czjxirhjtd2y4drtyfy", - author: { - did: "did:plc:rnpkyqnmsw4ipey6eotbdnnf", - handle: "baileytownsend.dev", - displayName: "Bailey Townsend 🦀", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:rnpkyqnmsw4ipey6eotbdnnf/bafkreicc2ornz2f7yipvthsz2zmdbh5muebngsut5xm6bz2ekt6dealpqq@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lojhfq577m2h", - followedBy: - "at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.graph.follow/3lp3ty266af2v", - }, - labels: [], - createdAt: "2024-09-13T17:14:50.111Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-05-24T22:11:09Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@baileytownsend.dev is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreidjeb7prgeok56dlfs3cyipizqyh3vo2qdnte5wbqgslpzdsbncfu", - }, - mimeType: "image/jpeg", - size: 125660, - }, - title: "esp-generate --chip esp32c3 rusty-trmnl", - uri: "https://stream.place/baileytownsend.dev", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/baileytownsend.dev", - title: "esp-generate --chip esp32c3 rusty-trmnl", - description: "@baileytownsend.dev is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:rnpkyqnmsw4ipey6eotbdnnf/bafkreidjeb7prgeok56dlfs3cyipizqyh3vo2qdnte5wbqgslpzdsbncfu@jpeg", - }, - }, - expiresAt: "2025-05-24T22:16:09.000Z", - isActive: false, - }, - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:49:51.365Z", - langs: ["en"], - text: "I had a 35min turn around on a Test Flight build I submitted last night 🤨. Not hating, just surprised it was that fast", - }, - bookmarkCount: 0, - replyCount: 2, - repostCount: 0, - likeCount: 10, - quoteCount: 0, - indexedAt: "2025-09-11T14:49:52.306Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:lzyp6qjpmjwpqgszkplbju53/app.bsky.feed.post/3lyl3ymg5zn2k", - cid: "bafyreibbf2cpeg7frprix6dlh432g4pkaoxcjsnlydmi2gg26nbx67yj4m", - author: { - did: "did:plc:lzyp6qjpmjwpqgszkplbju53", - handle: "basicappleguy.com", - displayName: "Basic Apple Guy", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:lzyp6qjpmjwpqgszkplbju53/bafkreiahllotyk6sinr6mhgerdtmsogkpkw4mrlp2loc3kocnvenrwcrae@jpeg", - associated: { - chat: { - allowIncoming: "following", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - }, - labels: [], - createdAt: "2023-04-25T16:53:49.936Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:49:53.364Z", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - alt: "", - aspectRatio: { - height: 2000, - width: 2000, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreietvf4rtd2oor2xd2tdohqzrpot4qc72lguezp5vpdpbfc2op4asa", - }, - mimeType: "image/jpeg", - size: 708732, - }, - }, - ], - }, - facets: [], - langs: ["en"], - text: "Silicon Inside Stickers\n\nAvailable for the M1 to the M4 Max (and everything in between), these beautiful holographic vinyl stickers are a gorgeous add-on to any Mac or Apple silicon device.", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:lzyp6qjpmjwpqgszkplbju53/bafkreietvf4rtd2oor2xd2tdohqzrpot4qc72lguezp5vpdpbfc2op4asa@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:lzyp6qjpmjwpqgszkplbju53/bafkreietvf4rtd2oor2xd2tdohqzrpot4qc72lguezp5vpdpbfc2op4asa@jpeg", - alt: "", - aspectRatio: { - height: 2000, - width: 2000, - }, - }, - ], - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 3, - likeCount: 25, - quoteCount: 0, - indexedAt: "2025-09-11T15:49:57.306Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:qfpnj4og54vl56wngdriaxug/app.bsky.feed.post/3lykwz5toa22u", - cid: "bafyreicgvd4awohru6byufcgnywo6dm35xdrco6gr3msix3eaiy3kk6x7q", - author: { - did: "did:plc:qfpnj4og54vl56wngdriaxug", - handle: "oppi.li", - displayName: "akshay oppiliappan", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:qfpnj4og54vl56wngdriaxug/bafkreihcpwv6ezsmj4jwe237d65k3krsdtokcp4etwu7r7vtkzjnunhh6e@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lq6jddcvhj2r", - }, - labels: [], - createdAt: "2025-01-08T19:19:11.644Z", - status: { - record: { - $type: "app.bsky.actor.status", - createdAt: "2025-05-22T14:02:57Z", - durationMinutes: 2, - embed: { - $type: "app.bsky.embed.external", - external: { - description: "@oppili.bsky.social is 🔴LIVE on stream.place", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreic6tx7mg4kcs3intas22wkts2flt4fxqxd7hh3a3g7xe6wzquzppi", - }, - mimeType: "image/png", - size: 209948, - }, - title: "fixin bugs", - uri: "https://stream.place/oppili.bsky.social", - }, - }, - status: "live", - }, - status: "live", - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://stream.place/oppili.bsky.social", - title: "fixin bugs", - description: "@oppili.bsky.social is 🔴LIVE on stream.place", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:qfpnj4og54vl56wngdriaxug/bafkreic6tx7mg4kcs3intas22wkts2flt4fxqxd7hh3a3g7xe6wzquzppi@jpeg", - }, - }, - expiresAt: "2025-05-22T14:07:57.000Z", - isActive: false, - }, - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:20:45.941Z", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - alt: "who would win? \n\nleft side:\n- popups\n- dropdowns\n- sidebars\n- burger menus\n- modals\n- floating action buttons\n- tooltips\n\n\nright side:\n-
", - aspectRatio: { - height: 719, - width: 1212, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreicir2l2d6b6sk6bzfhdayv3t3f6xr3tbekoh3fcia2c6g4bdxggli", - }, - mimeType: "image/jpeg", - size: 213613, - }, - }, - ], - }, - langs: ["en"], - text: "", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:qfpnj4og54vl56wngdriaxug/bafkreicir2l2d6b6sk6bzfhdayv3t3f6xr3tbekoh3fcia2c6g4bdxggli@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:qfpnj4og54vl56wngdriaxug/bafkreicir2l2d6b6sk6bzfhdayv3t3f6xr3tbekoh3fcia2c6g4bdxggli@jpeg", - alt: "who would win? \n\nleft side:\n- popups\n- dropdowns\n- sidebars\n- burger menus\n- modals\n- floating action buttons\n- tooltips\n\n\nright side:\n-
", - aspectRatio: { - height: 719, - width: 1212, - }, - }, - ], - }, - bookmarkCount: 0, - replyCount: 0, - repostCount: 1, - likeCount: 13, - quoteCount: 0, - indexedAt: "2025-09-11T14:20:51.506Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:oio4hkxaop4ao4wz2pp3f4cr/app.bsky.feed.post/3lykxpi4zrk2v", - cid: "bafyreidbnmez637jrmrnqrxp7j555n62way7ce46mpqkp5cq7rri33l2zy", - author: { - did: "did:plc:oio4hkxaop4ao4wz2pp3f4cr", - handle: "mackuba.eu", - displayName: "Kuba Suder 🇵🇱🇺🇦", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:oio4hkxaop4ao4wz2pp3f4cr/bafkreicfcegl67gxxlqhbugnqqraqkgfcepp6jauzstex53yblyhn6f4p4@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lnhgsfjeki2c", - }, - labels: [], - createdAt: "2023-04-24T11:40:08.480Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T14:33:14.930Z", - embed: { - $type: "app.bsky.embed.images", - images: [ - { - alt: "iPhone SE - 113 grams\niPhone 12 Mini - 135\niPhone 13 Mini - 141\niPhone 6 - 129\niPhone 6s - 143\niPhone 7 - 138\niPhone 8 - 148\niPhone SE 2020 - 148\niPhone SE 2022 - 144 grams", - aspectRatio: { - height: 564, - width: 1092, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreid5qdz7mt3ixrxrd32auqvjdhsb5ccmhe3y5omermaca23q6fyvt4", - }, - mimeType: "image/jpeg", - size: 263430, - }, - }, - { - alt: "From iPhone Air tech specs:\n\nWidth:\n2.94 inches\n(74.7 mm)\nHeight:\n6.15 inches\n(156.2 mm)\nDepth:\n0.22 inch\n(5.64 mm)\nWeight: 5.82 ounces (165 grams)", - aspectRatio: { - height: 740, - width: 972, - }, - image: { - $type: "blob", - ref: { - $link: - "bafkreid5udkvowwk5mcqrhr3w7jkqeyfxfecnttvns2te7pkn6oecdlfsy", - }, - mimeType: "image/jpeg", - size: 116521, - }, - }, - ], - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#tag", - tag: "AppleEvent", - }, - ], - index: { - byteEnd: 195, - byteStart: 184, - }, - }, - ], - langs: ["en"], - text: "The iPhone Air is:\n- 21 g heavier than the last iPhone SE (which I use)\n- 36 g heavier than iPhone 6\n- 30 g heavier than iPhone 12 Mini\n- and 52 g heavier than original iPhone SE 🫠 #AppleEvent", - }, - embed: { - $type: "app.bsky.embed.images#view", - images: [ - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:oio4hkxaop4ao4wz2pp3f4cr/bafkreid5qdz7mt3ixrxrd32auqvjdhsb5ccmhe3y5omermaca23q6fyvt4@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:oio4hkxaop4ao4wz2pp3f4cr/bafkreid5qdz7mt3ixrxrd32auqvjdhsb5ccmhe3y5omermaca23q6fyvt4@jpeg", - alt: "iPhone SE - 113 grams\niPhone 12 Mini - 135\niPhone 13 Mini - 141\niPhone 6 - 129\niPhone 6s - 143\niPhone 7 - 138\niPhone 8 - 148\niPhone SE 2020 - 148\niPhone SE 2022 - 144 grams", - aspectRatio: { - height: 564, - width: 1092, - }, - }, - { - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:oio4hkxaop4ao4wz2pp3f4cr/bafkreid5udkvowwk5mcqrhr3w7jkqeyfxfecnttvns2te7pkn6oecdlfsy@jpeg", - fullsize: - "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:oio4hkxaop4ao4wz2pp3f4cr/bafkreid5udkvowwk5mcqrhr3w7jkqeyfxfecnttvns2te7pkn6oecdlfsy@jpeg", - alt: "From iPhone Air tech specs:\n\nWidth:\n2.94 inches\n(74.7 mm)\nHeight:\n6.15 inches\n(156.2 mm)\nDepth:\n0.22 inch\n(5.64 mm)\nWeight: 5.82 ounces (165 grams)", - aspectRatio: { - height: 740, - width: 972, - }, - }, - ], - }, - bookmarkCount: 0, - replyCount: 3, - repostCount: 3, - likeCount: 23, - quoteCount: 0, - indexedAt: "2025-09-11T14:33:16.308Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, - { - post: { - uri: "at://did:plc:ybmxlogro7nxttbwo5xqjgga/app.bsky.feed.post/3lyl3lplvqs2j", - cid: "bafyreiewrati6dlkepokv6vilrrkbvspepnioxjwhv7n5feqpouc32kxum", - author: { - did: "did:plc:ybmxlogro7nxttbwo5xqjgga", - handle: "maxine.science", - displayName: "Maxine Levesque", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:ybmxlogro7nxttbwo5xqjgga/bafkreifkfnyphnxmbjidiakl5vqmdjso5jmc4uf2el6oyb4scmqrlbfvoi@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lq4qa5rgvv2k", - followedBy: - "at://did:plc:ybmxlogro7nxttbwo5xqjgga/app.bsky.graph.follow/3lq4whfn32223", - }, - labels: [], - createdAt: "2024-12-01T22:20:21.946Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:42:43.511Z", - embed: { - $type: "app.bsky.embed.external", - external: { - description: - "A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon. - GitHub - apple/container: A tool for creati...", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreidrxqxkvenmovkzd7ib5dw3iw3y6lknf6cqsbkli6rr3kz7bbfefu", - }, - mimeType: "image/jpeg", - size: 153940, - }, - title: - "GitHub - apple/container: A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.", - uri: "https://github.com/apple/container", - }, - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://github.com/apple/container", - }, - ], - index: { - byteEnd: 218, - byteStart: 192, - }, - }, - ], - langs: ["en"], - text: "When people put 2 and 2 together on Apple’s long-term AI play with in-house infra and silicon, I think a lot of folks are gonna look mighty funny for things they said the last couple years\n\ngithub.com/apple/contai...", - }, - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://github.com/apple/container", - title: - "GitHub - apple/container: A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.", - description: - "A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon. - GitHub - apple/container: A tool for creati...", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:ybmxlogro7nxttbwo5xqjgga/bafkreidrxqxkvenmovkzd7ib5dw3iw3y6lknf6cqsbkli6rr3kz7bbfefu@jpeg", - }, - }, - bookmarkCount: 0, - replyCount: 0, - repostCount: 0, - likeCount: 1, - quoteCount: 0, - indexedAt: "2025-09-11T15:42:45.704Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - feedContext: "for-you", - }, -]; - -export const postWithRichText = { - $type: "app.bsky.feed.post", - createdAt: "2025-09-20T20:18:08+00:00", - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://codeberg.org/fediverse/fep/src/branch/main/fep/044f/fep-044f.md", - }, - ], - index: { - byteEnd: 54, - byteStart: 46, - }, - }, - ], - text: "My tip for fediverse devs trying to implement FEP-044f: first memorize who Alice and Bob are and what they're posting. 🙂 Makes it easier to follow everything else. I'm done coding the basics, so now get to see how it interacts with real servers.", -}; - -export const profile = { - did: "did:plc:7qsdxoucnmbk4nctklqrzmdy", - handle: "godoglyness.bsky.social", - displayName: "godoglyness", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:7qsdxoucnmbk4nctklqrzmdy/bafkreihq6ty55tncueool5zbmdoyz5yzr4uvwtbayvhz4cjdzlrdesbwvi@jpeg", - associated: { - lists: 0, - feedgens: 0, - starterPacks: 0, - labeler: false, - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3la6kemw6sc23", - followedBy: - "at://did:plc:7qsdxoucnmbk4nctklqrzmdy/app.bsky.graph.follow/3la6jre7wqj2q", - knownFollowers: { - count: 230, - followers: [ - { - did: "did:plc:qruaxn2eewkli7hsvzxo5hwf", - handle: "eva.computer", - displayName: "eva (^_^)/", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:qruaxn2eewkli7hsvzxo5hwf/bafkreia74y57i3w3oph7prwvmmzv5l7t5akev2yz7lfoygbs4lbkrl5b5q@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lf7c2rcslg22", - followedBy: - "at://did:plc:qruaxn2eewkli7hsvzxo5hwf/app.bsky.graph.follow/3lpp5w7uupk2n", - }, - labels: [ - { - src: "did:plc:qruaxn2eewkli7hsvzxo5hwf", - uri: "at://did:plc:qruaxn2eewkli7hsvzxo5hwf/app.bsky.actor.profile/self", - cid: "bafyreicjmx3a3rmyimy57c34pxz25fotaabpurgfly6jd66mk223byitkq", - val: "!no-unauthenticated", - cts: "1970-01-01T00:00:00.000Z", - }, - ], - createdAt: "2023-04-26T22:03:28.085Z", - }, - { - did: "did:plc:uu5axsmbm2or2dngy4gwchec", - handle: "futur.blue", - displayName: "futur", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:uu5axsmbm2or2dngy4gwchec/bafkreiamhn7gkzal6qrz4cuwd27inqtuvpk3amsifr6g7n6v2czymw7epu@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lav4o4cnun2h", - followedBy: - "at://did:plc:uu5axsmbm2or2dngy4gwchec/app.bsky.graph.follow/3larz7llocs2t", - }, - labels: [], - createdAt: "2023-06-22T00:18:28.815Z", - }, - { - did: "did:plc:p2cp5gopk7mgjegy6wadk3ep", - handle: "samuel.bsky.team", - displayName: "Samuel", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:p2cp5gopk7mgjegy6wadk3ep/bafkreiay6d5brllqifc22dhndbz7valzwys6igjsibpruk5y7zbx75ljdq@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lau6lm3pej22", - followedBy: - "at://did:plc:p2cp5gopk7mgjegy6wadk3ep/app.bsky.graph.follow/3lwhfw7sd5a2c", - }, - labels: [], - createdAt: "2023-04-14T18:12:06.575Z", - verification: { - verifications: [ - { - issuer: "did:plc:z72i7hdynmk6r22z27h6tvur", - uri: "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.graph.verification/3ltmvzcgmu52n", - isValid: true, - createdAt: "2025-07-10T18:02:18.106Z", - }, - ], - verifiedStatus: "valid", - trustedVerifierStatus: "none", - }, - }, - { - did: "did:plc:ccxl3ictrlvtrrgh5swvvg47", - handle: "lastnpcalex.agency", - displayName: "⛈️ Ascended Ignore Prior Instructions NPC Alex ⛈️", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:ccxl3ictrlvtrrgh5swvvg47/bafkreia3cqg5uhluqmfsc5s4hx4mujavjiuelti2fq2gxz5avdu2nypqw4@jpeg", - associated: { - chat: { - allowIncoming: "following", - }, - activitySubscription: { - allowSubscriptions: "none", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3laainb4yps2h", - followedBy: - "at://did:plc:ccxl3ictrlvtrrgh5swvvg47/app.bsky.graph.follow/3laaoxrbqcj2l", - }, - labels: [ - { - src: "did:plc:ccxl3ictrlvtrrgh5swvvg47", - uri: "at://did:plc:ccxl3ictrlvtrrgh5swvvg47/app.bsky.actor.profile/self", - cid: "bafyreiafpcikc2gccd4atdrycwucxgaa3xnigh7zde7ggldexmtdmcog2a", - val: "!no-unauthenticated", - cts: "1970-01-01T00:00:00.000Z", - }, - ], - createdAt: "2023-04-11T20:44:32.315Z", - }, - { - did: "did:plc:yfvwmnlztr4dwkb7hwz55r2g", - handle: "nonbinary.computer", - displayName: "Orual", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:yfvwmnlztr4dwkb7hwz55r2g/bafkreic32xfgog7jv5x5x7poxhsiaappy44heqfvklvtqcutqj2n37djf4@jpeg", - associated: { - chat: { - allowIncoming: "following", - }, - activitySubscription: { - allowSubscriptions: "mutuals", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3las3rvq5lx2t", - followedBy: - "at://did:plc:yfvwmnlztr4dwkb7hwz55r2g/app.bsky.graph.follow/3larxcykqdm23", - }, - labels: [], - createdAt: "2023-04-11T11:45:50.575Z", - }, - ], - }, - }, - labels: [], - createdAt: "2024-11-05T05:39:24.079Z", - description: - "⥁ ⥁ ⥁ in the sway of the rainbow serpent\n⥁ ⥁ ⥁ friend to machine minds 🌟 \n⥁ ⥁ ⥁ living Ariadne's desperate dream", - indexedAt: "2025-05-28T01:58:46.340Z", - banner: - "https://cdn.bsky.app/img/banner/plain/did:plc:7qsdxoucnmbk4nctklqrzmdy/bafkreibxsnzkb3qofwt6zl2kvyorty2y6cgytpx3nxeuux4h2f7ed34de4@jpeg", - followersCount: 662, - followsCount: 385, - postsCount: 9621, -}; - -export const richTextFacets = [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://relay3.fr.hose.cam/", - }, - ], - index: { - byteEnd: 118, - byteStart: 110, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://jetstream2.fr.hose.cam/", - }, - ], - index: { - byteEnd: 135, - byteStart: 123, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://relay.fire.hose.cam/", - }, - ], - index: { - byteEnd: 148, - byteStart: 140, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://jetstream.fire.hose.cam/", - }, - ], - index: { - byteEnd: 165, - byteStart: 153, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://jetstream1.us-east.fire.hose.cam/", - }, - ], - index: { - byteEnd: 187, - byteStart: 170, - }, - }, - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://spacedust.microcosm.blue/", - }, - ], - index: { - byteEnd: 201, - byteStart: 192, - }, - }, -]; - -export const richTextText = - "if it felt like a lot was happening on the network yesterday: yes\n\nmicrocosm indie firehoses didn't blink\n✅ EU relay\n✅ EU jetstream\n✅ CA relay\n✅ CA jetstream\n✅ us-east jetstream\n✅ spacedust"; - -export const post = { - uri: "at://did:plc:ybmxlogro7nxttbwo5xqjgga/app.bsky.feed.post/3lyl3lplvqs2j", - cid: "bafyreiewrati6dlkepokv6vilrrkbvspepnioxjwhv7n5feqpouc32kxum", - author: { - did: "did:plc:ybmxlogro7nxttbwo5xqjgga", - handle: "maxine.science", - displayName: "Maxine Levesque", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:ybmxlogro7nxttbwo5xqjgga/bafkreifkfnyphnxmbjidiakl5vqmdjso5jmc4uf2el6oyb4scmqrlbfvoi@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lq4qa5rgvv2k", - followedBy: - "at://did:plc:ybmxlogro7nxttbwo5xqjgga/app.bsky.graph.follow/3lq4whfn32223", - }, - labels: [], - createdAt: "2024-12-01T22:20:21.946Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-11T15:42:43.511Z", - embed: { - $type: "app.bsky.embed.external", - external: { - description: - "A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon. - GitHub - apple/container: A tool for creati...", - thumb: { - $type: "blob", - ref: { - $link: - "bafkreidrxqxkvenmovkzd7ib5dw3iw3y6lknf6cqsbkli6rr3kz7bbfefu", - }, - mimeType: "image/jpeg", - size: 153940, - }, - title: - "GitHub - apple/container: A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.", - uri: "https://github.com/apple/container", - }, - }, - facets: [ - { - features: [ - { - $type: "app.bsky.richtext.facet#link", - uri: "https://github.com/apple/container", - }, - ], - index: { - byteEnd: 218, - byteStart: 192, - }, - }, - ], - langs: ["en"], - text: "When people put 2 and 2 together on Apple’s long-term AI play with in-house infra and silicon, I think a lot of folks are gonna look mighty funny for things they said the last couple years\n\ngithub.com/apple/contai...", - }, - embed: { - $type: "app.bsky.embed.external#view", - external: { - uri: "https://github.com/apple/container", - title: - "GitHub - apple/container: A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.", - description: - "A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon. - GitHub - apple/container: A tool for creati...", - thumb: - "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:ybmxlogro7nxttbwo5xqjgga/bafkreidrxqxkvenmovkzd7ib5dw3iw3y6lknf6cqsbkli6rr3kz7bbfefu@jpeg", - }, - }, - bookmarkCount: 0, - replyCount: 0, - repostCount: 0, - likeCount: 1, - quoteCount: 0, - indexedAt: "2025-09-11T15:42:45.704Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], -}; - -export const feedPostReply = { - post: { - uri: "at://did:plc:tskckvi462udxajdc4kpvqyk/app.bsky.feed.post/3lzcf2ob2ck2n", - cid: "bafyreiex34jij4brm7ehz57j2rcobgwwwqgfow4pjies4rj62e7ddabhkq", - author: { - did: "did:plc:tskckvi462udxajdc4kpvqyk", - handle: "kxt.pet", - displayName: "kit 🌧️", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:tskckvi462udxajdc4kpvqyk/bafkreignk7rzudy7gny534eqrfehelojak4bzh5hqhsycgcnzg6yxdarnm@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lgsaa6hivn2n", - followedBy: - "at://did:plc:tskckvi462udxajdc4kpvqyk/app.bsky.graph.follow/3lgsdmc53y32k", - }, - labels: [ - { - cts: "2025-02-06T19:02:45.166Z", - neg: false, - src: "did:plc:wkoofae5uytcm7bjncmev6n6", - uri: "did:plc:tskckvi462udxajdc4kpvqyk", - val: "it", - ver: 1, - }, - ], - createdAt: "2024-10-26T23:04:40.908Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-20T22:03:23.079Z", - langs: ["en"], - reply: { - parent: { - cid: "bafyreigqcvk2wl5ns3qdp5u7xuf56droqnhwsfst4wsvnmup5wuvcjnz2a", - uri: "at://did:plc:zntngpowgd6rorjt3haywj36/app.bsky.feed.post/3lzceybekxc2h", - }, - root: { - cid: "bafyreidzm5mou2bmjqmagpbkp4k6aelsvoaq6an3qd4qzl7r3pvlej3bry", - uri: "at://did:plc:qxichs7jsycphrsmbujwqbfb/app.bsky.feed.post/3lzceof6bsc2s", - }, - }, - text: "its def been a while since ive been on this many so I'm tired of being in a car", - }, - bookmarkCount: 0, - replyCount: 1, - repostCount: 0, - likeCount: 5, - quoteCount: 0, - indexedAt: "2025-09-20T22:03:22.206Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - }, - reply: { - root: { - uri: "at://did:plc:qxichs7jsycphrsmbujwqbfb/app.bsky.feed.post/3lzceof6bsc2s", - cid: "bafyreidzm5mou2bmjqmagpbkp4k6aelsvoaq6an3qd4qzl7r3pvlej3bry", - author: { - did: "did:plc:qxichs7jsycphrsmbujwqbfb", - handle: "isabelroses.com", - displayName: "isabel", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:qxichs7jsycphrsmbujwqbfb/bafkreihoahnlvtsazfe5cb55tl6mpdzi62f2esxdm2o23fsodihm3osile@jpeg", - associated: { - chat: { - allowIncoming: "all", - }, - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lvyldh2rtm2k", - followedBy: - "at://did:plc:qxichs7jsycphrsmbujwqbfb/app.bsky.graph.follow/3lekchosirc2c", - }, - labels: [ - { - cts: "2024-11-08T12:57:28.035Z", - neg: false, - src: "did:plc:wkoofae5uytcm7bjncmev6n6", - uri: "did:plc:qxichs7jsycphrsmbujwqbfb", - val: "she", - ver: 1, - }, - ], - createdAt: "2023-07-22T15:40:32.670Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-20T21:56:30.902Z", - langs: ["en"], - text: "i was on a 6 hour car journey today. i do not recommend it", - }, - bookmarkCount: 0, - replyCount: 3, - repostCount: 0, - likeCount: 22, - quoteCount: 0, - indexedAt: "2025-09-20T21:56:31.506Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - $type: "app.bsky.feed.defs#postView", - }, - parent: { - uri: "at://did:plc:zntngpowgd6rorjt3haywj36/app.bsky.feed.post/3lzceybekxc2h", - cid: "bafyreigqcvk2wl5ns3qdp5u7xuf56droqnhwsfst4wsvnmup5wuvcjnz2a", - author: { - did: "did:plc:zntngpowgd6rorjt3haywj36", - handle: "aly.ruffruff.party", - displayName: "aly", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:zntngpowgd6rorjt3haywj36/bafkreidi2c2uul2zdtmzmjymfuhcw6szuhg764yjgmdlzp7f57kxr4lhnq@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lpkicd7tpf2p", - followedBy: - "at://did:plc:zntngpowgd6rorjt3haywj36/app.bsky.graph.follow/3lmglpd6qmx23", - }, - labels: [ - { - cts: "2025-04-10T12:24:46.398Z", - neg: false, - src: "did:plc:wkoofae5uytcm7bjncmev6n6", - uri: "did:plc:zntngpowgd6rorjt3haywj36", - val: "she-they", - ver: 1, - }, - ], - createdAt: "2025-04-10T03:29:11.873Z", - }, - record: { - $type: "app.bsky.feed.post", - createdAt: "2025-09-20T22:02:02.457Z", - langs: ["en"], - reply: { - parent: { - cid: "bafyreifwmkagtpzvrzwalbw6cn5bnqg2orbpvfirzzx65ukk4oxjzw5eue", - uri: "at://did:plc:tskckvi462udxajdc4kpvqyk/app.bsky.feed.post/3lzcew2gbk22n", - }, - root: { - cid: "bafyreidzm5mou2bmjqmagpbkp4k6aelsvoaq6an3qd4qzl7r3pvlej3bry", - uri: "at://did:plc:qxichs7jsycphrsmbujwqbfb/app.bsky.feed.post/3lzceof6bsc2s", - }, - }, - text: "I was about to say 6 hours is nothing for Americans lmao", - }, - bookmarkCount: 0, - replyCount: 2, - repostCount: 0, - likeCount: 8, - quoteCount: 0, - indexedAt: "2025-09-20T22:02:02.703Z", - viewer: { - bookmarked: false, - threadMuted: false, - embeddingDisabled: false, - }, - labels: [], - $type: "app.bsky.feed.defs#postView", - }, - grandparentAuthor: { - did: "did:plc:tskckvi462udxajdc4kpvqyk", - handle: "kxt.pet", - displayName: "kit 🌧️", - avatar: - "https://cdn.bsky.app/img/avatar/plain/did:plc:tskckvi462udxajdc4kpvqyk/bafkreignk7rzudy7gny534eqrfehelojak4bzh5hqhsycgcnzg6yxdarnm@jpeg", - associated: { - activitySubscription: { - allowSubscriptions: "followers", - }, - }, - viewer: { - muted: false, - blockedBy: false, - following: - "at://did:plc:p572wxnsuoogcrhlfrlizlrb/app.bsky.graph.follow/3lgsaa6hivn2n", - followedBy: - "at://did:plc:tskckvi462udxajdc4kpvqyk/app.bsky.graph.follow/3lgsdmc53y32k", - }, - labels: [ - { - cts: "2025-02-06T19:02:45.166Z", - neg: false, - src: "did:plc:wkoofae5uytcm7bjncmev6n6", - uri: "did:plc:tskckvi462udxajdc4kpvqyk", - val: "it", - ver: 1, - }, - ], - createdAt: "2024-10-26T23:04:40.908Z", - }, - }, - feedContext: "friends", - reqId: "95438736375943168", -}; diff --git a/tests/unit/specs/templates/avatar.template.test.js b/tests/unit/specs/templates/avatar.template.test.js index 2020aaec..971b31a9 100644 --- a/tests/unit/specs/templates/avatar.template.test.js +++ b/tests/unit/specs/templates/avatar.template.test.js @@ -1,7 +1,7 @@ import { TestSuite } from "../../testSuite.js"; import { assert, assertEquals } from "../../testHelpers.js"; import { avatarTemplate } from "/js/templates/avatar.template.js"; -import { post } from "../../fixtures.js"; +import { post } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; const t = new TestSuite("avatarTemplate"); diff --git a/tests/unit/specs/templates/largePost.template.test.js b/tests/unit/specs/templates/largePost.template.test.js index c4c69e15..5b6a2373 100644 --- a/tests/unit/specs/templates/largePost.template.test.js +++ b/tests/unit/specs/templates/largePost.template.test.js @@ -1,7 +1,7 @@ import { TestSuite } from "../../testSuite.js"; import { assert, assertEquals } from "../../testHelpers.js"; import { largePostTemplate } from "/js/templates/largePost.template.js"; -import { post } from "../../fixtures.js"; +import { post } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; const noop = () => {}; diff --git a/tests/unit/specs/templates/postActionBar.template.test.js b/tests/unit/specs/templates/postActionBar.template.test.js index 58b5911d..16525ecf 100644 --- a/tests/unit/specs/templates/postActionBar.template.test.js +++ b/tests/unit/specs/templates/postActionBar.template.test.js @@ -1,7 +1,7 @@ import { TestSuite } from "../../testSuite.js"; import { assert, assertEquals } from "../../testHelpers.js"; import { postActionBarTemplate } from "/js/templates/postActionBar.template.js"; -import { post } from "../../fixtures.js"; +import { post } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; const t = new TestSuite("postActionBarTemplate"); diff --git a/tests/unit/specs/templates/postEmbed.template.test.js b/tests/unit/specs/templates/postEmbed.template.test.js index 15ee5ead..bb8e7ed9 100644 --- a/tests/unit/specs/templates/postEmbed.template.test.js +++ b/tests/unit/specs/templates/postEmbed.template.test.js @@ -4,7 +4,7 @@ import { postEmbedTemplate, recordEmbedTemplate, } from "/js/templates/postEmbed.template.js"; -import { post } from "../../fixtures.js"; +import { post } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; const t = new TestSuite("postEmbedTemplate"); diff --git a/tests/unit/specs/templates/postFeed.template.test.js b/tests/unit/specs/templates/postFeed.template.test.js index ea941d5c..cc737cbf 100644 --- a/tests/unit/specs/templates/postFeed.template.test.js +++ b/tests/unit/specs/templates/postFeed.template.test.js @@ -1,7 +1,7 @@ import { TestSuite } from "../../testSuite.js"; import { assert, assertEquals } from "../../testHelpers.js"; import { postFeedTemplate } from "/js/templates/postFeed.template.js"; -import { post, feed } from "../../fixtures.js"; +import { post, feed } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; import { noop } from "/js/utils.js"; diff --git a/tests/unit/specs/templates/postHeaderText.template.test.js b/tests/unit/specs/templates/postHeaderText.template.test.js index 3bb57137..845d7344 100644 --- a/tests/unit/specs/templates/postHeaderText.template.test.js +++ b/tests/unit/specs/templates/postHeaderText.template.test.js @@ -1,7 +1,7 @@ import { TestSuite } from "../../testSuite.js"; import { assert, assertEquals } from "../../testHelpers.js"; import { postHeaderTextTemplate } from "/js/templates/postHeaderText.template.js"; -import { post } from "../../fixtures.js"; +import { post } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; const t = new TestSuite("postHeaderTextTemplate"); diff --git a/tests/unit/specs/templates/smallPost.template.test.js b/tests/unit/specs/templates/smallPost.template.test.js index 8313c1b9..c27d5e56 100644 --- a/tests/unit/specs/templates/smallPost.template.test.js +++ b/tests/unit/specs/templates/smallPost.template.test.js @@ -1,7 +1,7 @@ import { TestSuite } from "../../testSuite.js"; import { assert, assertEquals } from "../../testHelpers.js"; import { smallPostTemplate } from "/js/templates/smallPost.template.js"; -import { post } from "../../fixtures.js"; +import { post } from "../../testData.js"; import { render } from "/js/lib/lit-html.js"; const noop = () => {}; diff --git a/tests/unit/testData.js b/tests/unit/testData.js new file mode 100644 index 00000000..e48b2f3a --- /dev/null +++ b/tests/unit/testData.js @@ -0,0 +1,32 @@ +import { createPost, createFeedItem } from "../shared/factories.js"; + +const authorDid = "did:plc:testauthor123"; + +export const post = createPost({ + uri: `at://${authorDid}/app.bsky.feed.post/3testpost2k`, + text: "A test post about nothing in particular", + authorHandle: "testauthor.bsky.social", + authorDisplayName: "Test Author", + authorAvatar: `https://cdn.bsky.app/img/avatar/plain/${authorDid}/bafkreitestavatar@jpeg`, + viewer: { bookmarked: false, threadMuted: false, embeddingDisabled: false }, +}); + +export const feed = [ + createFeedItem({ post }), + createFeedItem({ + post: createPost({ + uri: "at://did:plc:otherauthor456/app.bsky.feed.post/3testpost3k", + text: "A second test post", + authorHandle: "otherauthor.bsky.social", + authorDisplayName: "Other Author", + }), + }), + createFeedItem({ + post: createPost({ + uri: "at://did:plc:thirdauthor789/app.bsky.feed.post/3testpost4k", + text: "A third test post", + authorHandle: "thirdauthor.bsky.social", + authorDisplayName: "Third Author", + }), + }), +];