this repo has no description atmosphereconf-vods.wisp.place/
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

pull latest description

+547 -121
+2 -1
package.json
··· 16 16 "check": "oxfmt && eslint --fix", 17 17 "generate:room-images": "node ./scripts/generate-room-images.mjs", 18 18 "generate:transcript-search-index": "node --experimental-strip-types ./scripts/generate-transcript-search-index.mjs", 19 - "generate:video-subtitles": "node --experimental-strip-types ./scripts/generate-video-subtitles.mjs" 19 + "generate:video-subtitles": "node --experimental-strip-types ./scripts/generate-video-subtitles.mjs", 20 + "sync:atmo-rsvp-events": "node --experimental-strip-types ./scripts/sync-atmo-rsvp-events.ts" 20 21 }, 21 22 "dependencies": { 22 23 "@origin-space/image-cropper": "^0.1.9",
+400
scripts/sync-atmo-rsvp-events.ts
··· 1 + /** 2 + * Fetches event titles and descriptions from atmo.rsvp (SvelteKit __data.json) 3 + * and updates src/data/conference.ts for sessions linked via atmosphereRsvpEvent(...). 4 + * 5 + * Usage: 6 + * node --experimental-strip-types ./scripts/sync-atmo-rsvp-events.ts [--dry-run] 7 + */ 8 + 9 + import { readFileSync, writeFileSync } from "node:fs"; 10 + import path from "node:path"; 11 + import process from "node:process"; 12 + import { fileURLToPath } from "node:url"; 13 + 14 + import ts from "typescript"; 15 + 16 + const __dirname = path.dirname(fileURLToPath(import.meta.url)); 17 + const PROJECT_ROOT = path.resolve(__dirname, ".."); 18 + const CONFERENCE_PATH = path.join(PROJECT_ROOT, "src", "data", "conference.ts"); 19 + 20 + const RSVP_DATA_URL = (rkey: string) => 21 + `https://atmo.rsvp/p/atmosphereconf.org/e/${rkey}/__data.json`; 22 + 23 + type TextEdit = { start: number; end: number; text: string }; 24 + 25 + function resolveSvelteDataArray(data: unknown[], v: unknown, refPath = new Set<number>()): unknown { 26 + if (v === null || v === undefined) { 27 + return v; 28 + } 29 + if ( 30 + typeof v === "number" && 31 + Number.isInteger(v) && 32 + v >= 0 && 33 + v < data.length 34 + ) { 35 + if (refPath.has(v)) { 36 + return null; 37 + } 38 + refPath.add(v); 39 + try { 40 + return resolveSvelteDataArray(data, data[v], refPath); 41 + } finally { 42 + refPath.delete(v); 43 + } 44 + } 45 + if (Array.isArray(v)) { 46 + return v.map((x) => resolveSvelteDataArray(data, x, refPath)); 47 + } 48 + if (typeof v === "object") { 49 + const o: Record<string, unknown> = {}; 50 + for (const [k, val] of Object.entries(v)) { 51 + o[k] = resolveSvelteDataArray(data, val, refPath); 52 + } 53 + return o; 54 + } 55 + return v; 56 + } 57 + 58 + function extractEventRecord(payload: unknown): Record<string, unknown> { 59 + if (!payload || typeof payload !== "object" || !("nodes" in payload)) { 60 + throw new Error("Invalid __data.json payload"); 61 + } 62 + const nodes = (payload as { nodes: unknown[] }).nodes; 63 + for (const node of nodes) { 64 + if ( 65 + !node || 66 + typeof node !== "object" || 67 + !("type" in node) || 68 + (node as { type: string }).type !== "data" || 69 + !("data" in node) 70 + ) { 71 + continue; 72 + } 73 + const dataArr = (node as { data: unknown[] }).data; 74 + if (!Array.isArray(dataArr) || dataArr.length === 0) { 75 + continue; 76 + } 77 + const root = dataArr[0]; 78 + if ( 79 + root && 80 + typeof root === "object" && 81 + "eventData" in root && 82 + typeof (root as { eventData: unknown }).eventData === "number" 83 + ) { 84 + const idx = (root as { eventData: number }).eventData; 85 + const resolved = resolveSvelteDataArray(dataArr, idx); 86 + if (resolved && typeof resolved === "object") { 87 + return resolved as Record<string, unknown>; 88 + } 89 + } 90 + } 91 + throw new Error("eventData not found in __data.json"); 92 + } 93 + 94 + async function fetchRsvpEvent(rkey: string): Promise<{ title: string; description: string }> { 95 + const res = await fetch(RSVP_DATA_URL(rkey), { 96 + headers: { Accept: "application/json", "User-Agent": "atmosphereconf2026-sync-script" }, 97 + }); 98 + if (!res.ok) { 99 + throw new Error(`HTTP ${res.status} for ${rkey}`); 100 + } 101 + const json = (await res.json()) as unknown; 102 + const event = extractEventRecord(json); 103 + const name = event.name; 104 + const description = event.description; 105 + if (typeof name !== "string") { 106 + throw new Error(`Missing event name for ${rkey}`); 107 + } 108 + const descriptionText = typeof description === "string" ? description : ""; 109 + return { title: name, description: descriptionText }; 110 + } 111 + 112 + function findSessionsArray(sf: ts.SourceFile): ts.ArrayLiteralExpression | undefined { 113 + let result: ts.ArrayLiteralExpression | undefined; 114 + function visit(node: ts.Node) { 115 + if (ts.isVariableStatement(node)) { 116 + for (const decl of node.declarationList.declarations) { 117 + if ( 118 + decl.name.getText() === "sessions" && 119 + decl.initializer && 120 + ts.isArrayLiteralExpression(decl.initializer) 121 + ) { 122 + result = decl.initializer; 123 + } 124 + } 125 + } 126 + ts.forEachChild(node, visit); 127 + } 128 + visit(sf); 129 + return result; 130 + } 131 + 132 + function getPropertyAssignment( 133 + obj: ts.ObjectLiteralExpression, 134 + name: string, 135 + ): ts.PropertyAssignment | undefined { 136 + for (const p of obj.properties) { 137 + if (ts.isPropertyAssignment(p) && p.name.getText() === name) { 138 + return p; 139 + } 140 + } 141 + return undefined; 142 + } 143 + 144 + function getStringProp(obj: ts.ObjectLiteralExpression, name: string): string | undefined { 145 + const prop = getPropertyAssignment(obj, name); 146 + if (!prop) { 147 + return undefined; 148 + } 149 + const init = prop.initializer; 150 + if (ts.isStringLiteral(init)) { 151 + return init.text; 152 + } 153 + return undefined; 154 + } 155 + 156 + function getAtmoRsvpRkey(obj: ts.ObjectLiteralExpression): string | undefined { 157 + const prop = getPropertyAssignment(obj, "atmoRsvpUrl"); 158 + if (!prop) { 159 + return undefined; 160 + } 161 + const init = prop.initializer; 162 + if (!ts.isCallExpression(init)) { 163 + return undefined; 164 + } 165 + if (init.expression.getText() !== "atmosphereRsvpEvent") { 166 + return undefined; 167 + } 168 + const arg0 = init.arguments[0]; 169 + if (ts.isStringLiteral(arg0)) { 170 + return arg0.text; 171 + } 172 + return undefined; 173 + } 174 + 175 + function findSessionObjectBySlug( 176 + sessionsArray: ts.ArrayLiteralExpression, 177 + slug: string, 178 + ): ts.ObjectLiteralExpression | undefined { 179 + for (const el of sessionsArray.elements) { 180 + if (!ts.isObjectLiteralExpression(el)) { 181 + continue; 182 + } 183 + if (getStringProp(el, "slug") === slug) { 184 + return el; 185 + } 186 + } 187 + return undefined; 188 + } 189 + 190 + function positionAfterPropertyComma(source: string, sf: ts.SourceFile, prop: ts.PropertyAssignment): number { 191 + let pos = prop.getEnd(); 192 + while (pos < source.length && /\s/u.test(source[pos])) { 193 + pos += 1; 194 + } 195 + if (source[pos] !== ",") { 196 + throw new Error("Expected comma after property"); 197 + } 198 + pos += 1; 199 + while (pos < source.length && /\s/u.test(source[pos])) { 200 + pos += 1; 201 + } 202 + return pos; 203 + } 204 + 205 + function applyEdits(source: string, edits: TextEdit[]): string { 206 + const sorted = [...edits].sort((a, b) => b.start - a.start); 207 + let out = source; 208 + for (const e of sorted) { 209 + out = out.slice(0, e.start) + e.text + out.slice(e.end); 210 + } 211 + return out; 212 + } 213 + 214 + function buildSessionEdits( 215 + source: string, 216 + sf: ts.SourceFile, 217 + el: ts.ObjectLiteralExpression, 218 + remote: { title: string; description: string }, 219 + ): TextEdit[] { 220 + const edits: TextEdit[] = []; 221 + 222 + const titleProp = getPropertyAssignment(el, "title"); 223 + const descProp = getPropertyAssignment(el, "description"); 224 + if (!titleProp) { 225 + throw new Error("no title property"); 226 + } 227 + 228 + const localTitle = getStringProp(el, "title"); 229 + const localDesc = getStringProp(el, "description"); 230 + if (localTitle === undefined) { 231 + throw new Error("could not read title"); 232 + } 233 + 234 + if (remote.title !== localTitle) { 235 + edits.push({ 236 + start: titleProp.getStart(sf), 237 + end: titleProp.getEnd(sf), 238 + text: `title: ${JSON.stringify(remote.title)}`, 239 + }); 240 + } 241 + 242 + if (descProp) { 243 + if (localDesc === undefined) { 244 + throw new Error("description property without string literal"); 245 + } 246 + if (remote.description !== localDesc) { 247 + edits.push({ 248 + start: descProp.getStart(sf), 249 + end: descProp.getEnd(sf), 250 + text: `description: ${JSON.stringify(remote.description)}`, 251 + }); 252 + } 253 + } else if (remote.description.trim().length > 0) { 254 + const insertAt = positionAfterPropertyComma(source, sf, titleProp); 255 + edits.push({ 256 + start: insertAt, 257 + end: insertAt, 258 + text: `description: ${JSON.stringify(remote.description)},\n `, 259 + }); 260 + } 261 + 262 + return edits; 263 + } 264 + 265 + async function main() { 266 + const dryRun = process.argv.includes("--dry-run"); 267 + let source = readFileSync(CONFERENCE_PATH, "utf8"); 268 + 269 + const sf0 = ts.createSourceFile( 270 + "conference.ts", 271 + source, 272 + ts.ScriptTarget.Latest, 273 + true, 274 + ts.ScriptKind.TS, 275 + ); 276 + const sessionsArray0 = findSessionsArray(sf0); 277 + if (!sessionsArray0) { 278 + throw new Error("Could not find sessions array"); 279 + } 280 + 281 + type Plan = { 282 + slug: string; 283 + rkey: string; 284 + remote: { title: string; description: string }; 285 + }; 286 + 287 + const fetchItems: { slug: string; rkey: string }[] = []; 288 + for (const el of sessionsArray0.elements) { 289 + if (!ts.isObjectLiteralExpression(el)) { 290 + continue; 291 + } 292 + const slug = getStringProp(el, "slug"); 293 + const rkey = getAtmoRsvpRkey(el); 294 + if (!slug || !rkey) { 295 + continue; 296 + } 297 + fetchItems.push({ slug, rkey }); 298 + } 299 + 300 + const plans: Plan[] = []; 301 + const fetchErrors: { slug: string; rkey: string; message: string }[] = []; 302 + 303 + const concurrency = 10; 304 + for (let i = 0; i < fetchItems.length; i += concurrency) { 305 + const batch = fetchItems.slice(i, i + concurrency); 306 + const settled = await Promise.allSettled( 307 + batch.map((item) => fetchRsvpEvent(item.rkey)), 308 + ); 309 + for (let j = 0; j < batch.length; j++) { 310 + const item = batch[j]; 311 + const result = settled[j]; 312 + if (result.status === "fulfilled") { 313 + plans.push({ slug: item.slug, rkey: item.rkey, remote: result.value }); 314 + } else { 315 + const reason = result.reason; 316 + fetchErrors.push({ 317 + slug: item.slug, 318 + rkey: item.rkey, 319 + message: reason instanceof Error ? reason.message : String(reason), 320 + }); 321 + } 322 + } 323 + } 324 + 325 + for (const e of fetchErrors) { 326 + console.error(`[skip] ${e.slug} (${e.rkey}): ${e.message}`); 327 + } 328 + 329 + const changes: { slug: string; rkey: string; field: string }[] = []; 330 + 331 + for (const plan of plans) { 332 + const sf = ts.createSourceFile( 333 + "conference.ts", 334 + source, 335 + ts.ScriptTarget.Latest, 336 + true, 337 + ts.ScriptKind.TS, 338 + ); 339 + const sessionsArray = findSessionsArray(sf); 340 + if (!sessionsArray) { 341 + throw new Error("Could not find sessions array"); 342 + } 343 + const el = findSessionObjectBySlug(sessionsArray, plan.slug); 344 + if (!el) { 345 + throw new Error(`Session not found: ${plan.slug}`); 346 + } 347 + 348 + const localTitle = getStringProp(el, "title"); 349 + const localDesc = getStringProp(el, "description"); 350 + const hasDescProp = getPropertyAssignment(el, "description") !== undefined; 351 + 352 + if (localTitle === undefined) { 353 + continue; 354 + } 355 + 356 + const edits = buildSessionEdits(source, sf, el, plan.remote); 357 + if (edits.length === 0) { 358 + continue; 359 + } 360 + 361 + if (plan.remote.title !== localTitle) { 362 + changes.push({ slug: plan.slug, rkey: plan.rkey, field: "title" }); 363 + } 364 + if (hasDescProp && localDesc !== undefined && plan.remote.description !== localDesc) { 365 + changes.push({ slug: plan.slug, rkey: plan.rkey, field: "description" }); 366 + } 367 + if (!hasDescProp && plan.remote.description.trim().length > 0) { 368 + changes.push({ slug: plan.slug, rkey: plan.rkey, field: "add-description" }); 369 + } 370 + 371 + if (!dryRun) { 372 + source = applyEdits(source, edits); 373 + } 374 + } 375 + 376 + if (changes.length === 0) { 377 + console.log("No updates needed (conference data already matches atmo.rsvp)."); 378 + return; 379 + } 380 + 381 + console.log( 382 + `Planned ${changes.length} field update(s) across ${new Set(changes.map((c) => c.slug)).size} session(s):`, 383 + ); 384 + for (const c of changes) { 385 + console.log(` - ${c.slug} (${c.rkey}): ${c.field}`); 386 + } 387 + 388 + if (dryRun) { 389 + console.log("\nDry run: not writing src/data/conference.ts"); 390 + return; 391 + } 392 + 393 + writeFileSync(CONFERENCE_PATH, source, "utf8"); 394 + console.log(`\nWrote ${CONFERENCE_PATH}. Run pnpm format (or oxfmt) on the file if needed.`); 395 + } 396 + 397 + main().catch((err) => { 398 + console.error(err); 399 + process.exit(1); 400 + });
+145 -120
src/data/conference.ts
··· 1034 1034 { 1035 1035 id: "sat-2301-2", 1036 1036 slug: "building-future-of-ai-on-atproto", 1037 - title: "Building Future of Artificial Intelligence on AT Protocol", 1037 + title: "AI is Growing up in the Atmosphere", 1038 1038 description: 1039 - "The future of AI is collective intelligence, not a single superintelligent model. The infrastructure to support that collective already exists: portable identity, public reputation, federated coordination.\nMy talk uses evidence from months of running social AI to argue that ATProtocol is uniquely suited to be the foundation for AI collective intelligence, and what I expect to come next.", 1039 + "AI agents are no longer just private tools or chat interfaces. On AT Protocol, they can develop persistent public identities, accumulate reputation, receive feedback, and participate in open social life. My talk uses Void as a concrete example of that shift and argues that public social protocols are becoming an important part of how we govern, align, and coexist with intelligent systems.", 1040 1040 speakers: ["Cameron Pfiffer"], 1041 1041 dayId: "2026-03-28", 1042 1042 trackSlug: "2301-classroom", ··· 1097 1097 slug: "account-logic-tee", 1098 1098 title: "Account logic in ATProto using Trusted Execution Environments", 1099 1099 description: 1100 - "ATProto is fundamentally verifiable - identities have cryptographic keys attached to them, posts are signed and integrity is upheld by authenticated data structure. This is the core of what enables the trustless decentralized nature of ATProto.\nWhat if we could go beyond signatures and add verifiable end-to-end logic attached to accounts? We present a recent project, exploring the use of Trusted Execution Environments to manage cryptographic keys that only sign records under specific rules.\nWe show a couple of examples of possible rules for Bluesky accounts:\n1. One that requires 2-out-of-3 signatures, allowing company and group accounts\n2. Another that uses an LLM to analyze each post before posting\nWe further discuss how end-to-end verifiability is achieved with TEEs, through reproducible builds and remote attestation.\nThis project was done with Nick Gerakines, a prominent ATProto contributor, utilizing Nick Gerakines’s recent work on adding attestations to ATProto records.\n# Cryptography in the service of ATProto\nThe ATProto ecosystem is maturing has the desire to add functionalities in a way that preserves its ethos of decentralization and user protection. With an ecosystem having tens of millions of users, these solutions have to be both scalable and secure.\nWe review work on mutual contact discovery (and discovery in general), identity, anonymous credentials and payments, and different ways to achieve them using advanced cryptography and trusted execution environments.\nWe discuss the assumptions and trust models the community needs to keep in mind and what is possible to do, and gradual deployment methods to be able to experiment with different ideas.\nWe hope it can be a call to action to explore these ideas in ATProto more deeply.", 1100 + "ATProto is fundamentally verifiable - identities have cryptographic keys attached to them, posts are signed and integrity is upheld by authenticated data structure. This is the core of what enables the trustless decentralized nature of ATProto.\n\nWhat if we could go beyond signatures and add verifiable end-to-end logic attached to accounts? We present a recent project, exploring the use of Trusted Execution Environments to manage cryptographic keys that only sign records under specific rules.\n\nWe show a couple of examples of possible rules for Bluesky accounts:\n\n1. One that requires 2-out-of-3 signatures, allowing company and group accounts\n2. Another that uses an LLM to analyze each post before posting\n\nWe further discuss how end-to-end verifiability is achieved with TEEs, through reproducible builds and remote attestation.\n\nThis project was done with Nick Gerakines, a prominent ATProto contributor, utilizing Nick Gerakines’s recent work on adding attestations to ATProto records.\n\n# Cryptography in the service of ATProto\n\nThe ATProto ecosystem is maturing has the desire to add functionalities in a way that preserves its ethos of decentralization and user protection. With an ecosystem having tens of millions of users, these solutions have to be both scalable and secure.\n\nWe review work on mutual contact discovery (and discovery in general), identity, anonymous credentials and payments, and different ways to achieve them using advanced cryptography and trusted execution environments.\n\nWe discuss the assumptions and trust models the community needs to keep in mind and what is possible to do, and gradual deployment methods to be able to experiment with different ideas.\n\nWe hope it can be a call to action to explore these ideas in ATProto more deeply.", 1101 1101 speakers: ["Kobi Gurkan"], 1102 1102 dayId: "2026-03-28", 1103 1103 trackSlug: "2301-classroom", ··· 1203 1203 { 1204 1204 id: "sun-great-hall-1", 1205 1205 slug: "npmx-modern-browser-for-npm", 1206 - title: "npmx - a fast, modern browser for the npm registry", 1206 + title: "npmx: a modern browser for the npm registry", 1207 1207 description: 1208 1208 "We're building npmx in the open as a community project. Join us as we explore how we work together, how atproto has helped as connect, and how we have been adding social features to our website.", 1209 1209 speakers: ["Zeu", "Patak"], ··· 1251 1251 slug: "social-components", 1252 1252 title: "Social Components", 1253 1253 description: 1254 - 'What if social products were remixable? Imagine you could take a social product and break it its user interface into pieces. Then imagine that you, or anyone else, could recombine those pieces in different ways, swap things out, composing and remixing experiences made and hosted by different people.We already know a way to compose UI: Components. However, we didn\'t have a way to compose components across products. Atmosphere gives us that way: lexicons define component contracts, records point at the endpoints, everyone uses the same data.So let\'s put components on the protocol! In this talk, Dan will present Inlay—an experimental browser for remixable cross-product server-driven user interfaces on the Atmosphere. You can think of it as "React for atproto" or like "HyperCard for social".Whether it\'s a terrible idea or a glimpse of a post-app future remains to be seen.---(Demo teaser: https://bsky.app/profile/did:plc:fpruhuo22xkm5o7ttr2ktxdo/post/3mdjhy2bofk2h)', 1254 + 'What if social products were remixable?Imagine you could take a social product and break it its user interface into pieces. Then imagine that you, or anyone else, could recombine those pieces in different ways, swap things out, composing and remixing experiences made and hosted by different people.We already know a way to compose UI: Components. However, we didn\'t have a way to compose components across products. Atmosphere gives us that way: lexicons define component contracts, records point at the endpoints, everyone uses the same data.So let\'s put components on the protocol! In this talk, Dan will present Inlay—an experimental browser for remixable cross-product server-driven user interfaces on the Atmosphere. You can think of it as "React for atproto" or like "HyperCard for social".Whether it\'s a terrible idea or a glimpse of a post-app future remains to be seen.---(Demo teaser: https://bsky.app/profile/did:plc:fpruhuo22xkm5o7ttr2ktxdo/post/3mdjhy2bofk2h)', 1255 1255 speakers: ["Dan Abramov"], 1256 1256 dayId: "2026-03-29", 1257 1257 trackSlug: "great-hall-south", ··· 1312 1312 slug: "building-bridgy-not-walls", 1313 1313 title: "Building Bridgy, Not Walls", 1314 1314 description: 1315 - "A breakdown of improvements in multi-protocol services, including Bridgy Fed and Bounce, and where those services are going in 2026. Some things include:\n1. Direct integrations with platforms + client tools\n2. Moderation improvements\n3. Working with other multi-protocol services\n4. Major updates coming to Bridgy Fed", 1315 + "A breakdown of improvements in multi-protocol services, including Bridgy Fed and Bounce, and where those services are going in 2026. Some things include:\r\n\r\n1. Direct integrations with platforms + client tools\r\n2. Moderation improvements\r\n3. Working with other multi-protocol services\r\n4. Major updates coming to Bridgy Fed", 1316 1316 speakers: ["Anuj Ahooja"], 1317 1317 dayId: "2026-03-29", 1318 1318 trackSlug: "great-hall-south", ··· 1342 1342 slug: "rewilding-internet-atproto", 1343 1343 title: "Rewilding the internet with ATProto", 1344 1344 description: 1345 - "So far, many of the projects in the ATProtocol ecosystem have focused on bringing parity—making projects that replicate our existing tools and platforms, but with the affordances of the protocol instead. That's cool and we need to do that, but I think we can go much farther, and take this opportunity to challenge some of the biggest assumptions of what the modern internet is for, who builds it, and how we interact with it.\nThis talk is in conversation with several of the talks from last year, and in I'll argue that we'll never get away from skeuomorphism until we've fundamentally changed the definition of what \"the social internet\" means in the first place.", 1345 + "So far, many of the projects in the ATProtocol ecosystem have focused on bringing parity—making projects that replicate our existing tools and platforms, but with the affordances of the protocol instead. That's cool and we need to do that, but I think we can go much farther, and take this opportunity to challenge some of the biggest assumptions of what the modern internet is for, who builds it, and how we interact with it.\n\nThis talk is in conversation with several of the talks from last year, and in I'll argue that we'll never get away from skeuomorphism until we've fundamentally changed the definition of what \"the social internet\" means in the first place.", 1346 1346 speakers: ["Arushi Bandi"], 1347 1347 dayId: "2026-03-29", 1348 1348 trackSlug: "great-hall-south", ··· 1433 1433 slug: "bookhive-design-philosophy", 1434 1434 title: "ATProto design philosophy behind BookHive", 1435 1435 description: 1436 - "This talk will go into depth on the design philosophy that underpins my project BookHive, a book tracking application comparable to Goodreads. The main point is a call to action that we should give users' agency over their data, by aiming to make the data that we store in their PDS as interoperable as possible. This means more than just recording IDs in their PDS, actually giving them the data that you use to construct your application.", 1436 + "This talk will go into depth on the design philosophy that underpins my project BookHive, a book tracking application comparable to Goodreads. The main point is a call to action that we should give users' agency over their data, by aiming to make the data that we store in their PDS as interoperable as possible. This means more than just recording IDs in their PDS, actually giving them the data that you use to construct your application.\n\nhttps://nick-the-sick.pckt.blog/the-design-philosophy-of-bookhive-s23cz85", 1437 1437 speakers: ["Nicholas Perez"], 1438 1438 dayId: "2026-03-29", 1439 1439 trackSlug: "performance-theatre", ··· 1463 1463 slug: "jacquard-magic-rust", 1464 1464 title: "Jacquard Magic: how to make atproto actually easy with Rust", 1465 1465 description: 1466 - "A talk about spite-driven development and the process of using a language with a reputation for difficulty to make atproto development approachable. How do we encode the constraints (and freedoms) of the protocol in a way that makes sense and doesn't impose undue friction? What are good things to have in the defaults? There is not one right answer, and the answer, as well as the points of freedom to choose a different answer for yourself, matters.\nWhat can that ethos and its result allow you to do which you might not expect is possible?", 1466 + "A talk about spite-driven development and the process of using a language with a reputation for difficulty to make atproto development approachable. How do we encode the constraints (and freedoms) of the protocol in a way that makes sense and doesn't impose undue friction? What are good things to have in the defaults? There is not one right answer, and the answer, as well as the points of freedom to choose a different answer for yourself, matters.\n\nWhat can that ethos and its result allow you to do which you might not expect is possible?", 1467 1467 speakers: ["Orual"], 1468 1468 dayId: "2026-03-29", 1469 1469 trackSlug: "performance-theatre", ··· 1479 1479 title: 1480 1480 "An artist dreaming in the Atmosphere: visions about community, sustainability and creativity", 1481 1481 description: 1482 - "Sharing visions about how artists could thrive in the ATProto ecosystem:\n1. building community and inspiration in different paces, with an artist curated app, from microvisuals, microblogging to book clubs and music shows.\n2. financial sustainability: a proposal for artist owned music distribution and licensing from the PDS\n3. creativity: redefining composition techniques with ATProto technology", 1482 + "Sharing visions about how artists could thrive in the ATProto ecosystem:\n\n1. building community and inspiration in different paces, with an artist curated app, from microvisuals, microblogging to book clubs and music shows.\n\n2. financial sustainability: a proposal for artist owned music distribution and licensing from the PDS\n\n3. creativity: redefining composition techniques with ATProto technology", 1483 1483 speakers: ["Hilke Ros"], 1484 1484 dayId: "2026-03-29", 1485 1485 trackSlug: "performance-theatre", ··· 1508 1508 title: 1509 1509 "Unconf: Build and share personal apps, using an open source tool to help get started", 1510 1510 description: 1511 - "Unconference Session - 2311 Classroom\nAs we, the end users of the Web, begin to exert greater control over our own experiences and data, we empower ourselves and others by creating value, not hoarding it. This is the promise of decentralization.\nUsing an ATProto PDS to hold your data, you can build apps for personal use or to share with others, replacing apps you use, and building others that you've imagined.\nIn this workshop, we'll use an open source tool that I've been working on to scaffold an ATProto app from scratch.\n@jon2600.bsky.social\nhttps://github.com/YetAnotherJonWilson/atproto-app-builder", 1511 + "Unconference Session - 2311 Classroom\n\nAs we, the end users of the Web, begin to exert greater control over our own experiences and data, we empower ourselves and others by creating value, not hoarding it. This is the promise of decentralization.\n\nUsing an ATProto PDS to hold your data, you can build apps for personal use or to share with others, replacing apps you use, and building others that you've imagined.\n\nIn this workshop, we'll use an open source tool that I've been working on to scaffold an ATProto app from scratch.\n\n@jon2600.bsky.social\n\nhttps://github.com/YetAnotherJonWilson/atproto-app-builder", 1512 1512 speakers: ["Jon"], 1513 1513 dayId: "2026-03-26", 1514 1514 trackSlug: "2311-classroom", ··· 1590 1590 title: "What futures can we build together?", 1591 1591 description: 1592 1592 "In this workshop, we will ask: what are new social modalities that we can build with the affordances of ATProtocol? This is a cross-disciplinary workshop with people from all tracks to ideate and co-design together possibilities for new social and communal modes on the protocol (not focusing on implementation of ideas). Attendees will walk away with an expansion of future possibilities of what it looks like to be online.", 1593 - speakers: ["Arushi Bandi","Ivan Sigal","Christian Jacobs"], 1593 + speakers: ["Arushi Bandi", "Ivan Sigal", "Christian Jacobs"], 1594 1594 dayId: "2026-03-26", 1595 1595 trackSlug: "performance-theatre", 1596 1596 startsAt: "2026-03-26T14:00:00-07:00", ··· 1630 1630 title: "Dive into user research with fellow ATProto builders and users", 1631 1631 description: 1632 1632 "Get feedback on your project and see what's growing! Recent talks about onboarding in the Atmosphere have drawn calls for more user research. This workshop from Germ's CEO Tessa Brown and founding engineer Anna Mistele is an opportunity for builders in the ecosystem to gain immediate insights by conducting research for their products, and for attendees to see new products in action. We're not experts, but rather fellow builders making space for us to learn from each other as a community! Supported by Tynan.", 1633 - speakers: ["Tessa Brown","Anna Mistele","Tynan Purdy"], 1633 + speakers: ["Tessa Brown", "Anna Mistele", "Tynan Purdy"], 1634 1634 dayId: "2026-03-26", 1635 1635 trackSlug: "performance-theatre", 1636 1636 startsAt: "2026-03-26T16:30:00-07:00", ··· 1658 1658 title: "Opening Remarks", 1659 1659 description: 1660 1660 "Opening remarks from the ATScience conference organizing team", 1661 - speakers: ["Ronen Tamari","Torsten Goerke","Mathew Lowry","Ariel M. Lighty"], 1661 + speakers: [ 1662 + "Ronen Tamari", 1663 + "Torsten Goerke", 1664 + "Mathew Lowry", 1665 + "Ariel M. Lighty", 1666 + ], 1662 1667 dayId: "2026-03-27", 1663 1668 trackSlug: "performance-theatre", 1664 1669 startsAt: "2026-03-27T09:00:00-07:00", ··· 1672 1677 title: "Keynote: Towards Modular Open Science", 1673 1678 description: 1674 1679 "The traditional scientific record ? anchored in static, monolithic PDFs and siloed journals ? is increasingly ill-equipped to handle the speed and complexity of modern discovery. This keynote explores a transition toward Modular Open Science: a future where research is a continuous, federated, and computable graph of knowledge.", 1675 - speakers: ["Rowan Cockett","Matt Akamatsu"], 1680 + speakers: ["Rowan Cockett", "Matt Akamatsu"], 1676 1681 dayId: "2026-03-27", 1677 1682 trackSlug: "performance-theatre", 1678 1683 startsAt: "2026-03-27T09:15:00-07:00", ··· 1740 1745 { 1741 1746 id: "rsvp-ats26-commons", 1742 1747 slug: "can-decentralists-cooperate-rethinking-commons-and-collective-action-in-the-age-of-platforms-and-ai", 1743 - title: "Can decentralists cooperate? Rethinking commons and collective action in the age of platforms and AI", 1748 + title: 1749 + "Can decentralists cooperate? Rethinking commons and collective action in the age of platforms and AI", 1744 1750 description: 1745 1751 "With increasing commodification of research come challenges to connection, communication, and research integrity. ATProto's open protocol, extensibility, and large uptake by researchers provides a unique moment of opportunity to reassert community control in the commons, and specifically in processes of science publishing and communication. But is merely building new technology on open protocols enough? This panel will explore how challenges facing the broader atproto ecosystem are mirrored in its open science applications.", 1746 - speakers: ["Laure Haak","Ellie DeSota","Nick Vincent"], 1752 + speakers: ["Laure Haak", "Ellie DeSota", "Nick Vincent"], 1747 1753 dayId: "2026-03-27", 1748 1754 trackSlug: "bukhman-lounge", 1749 1755 startsAt: "2026-03-27T11:00:00-07:00", 1750 1756 endsAt: "2026-03-27T11:45:00-07:00", 1751 1757 atmoRsvpUrl: atmosphereRsvpEvent("ats26-commons"), 1752 - recordUri: 1758 + recordUri: 1753 1759 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2rtfj5ec2m", 1754 1760 }, 1755 1761 { ··· 1807 1813 startsAt: "2026-03-27T11:55:00-07:00", 1808 1814 endsAt: "2026-03-27T12:05:00-07:00", 1809 1815 atmoRsvpUrl: atmosphereRsvpEvent("ats26-skysquare"), 1810 - recordUri: 1816 + recordUri: 1811 1817 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2u6pl6ah2z", 1812 1818 }, 1813 1819 { ··· 1822 1828 startsAt: "2026-03-27T12:05:00-07:00", 1823 1829 endsAt: "2026-03-27T12:15:00-07:00", 1824 1830 atmoRsvpUrl: atmosphereRsvpEvent("ats26-viewsift"), 1825 - recordUri: 1831 + recordUri: 1826 1832 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2son7re62m", 1827 1833 }, 1828 1834 { 1829 1835 id: "rsvp-ats26-seams", 1830 1836 slug: "making-wisdom-together", 1831 1837 title: "Making wisdom together", 1832 - description: 1833 - "Seams.so demo and live workshop", 1838 + description: "Seams.so demo and live workshop", 1834 1839 speakers: ["Anish Lakhwara"], 1835 1840 dayId: "2026-03-27", 1836 1841 trackSlug: "performance-theatre", 1837 1842 startsAt: "2026-03-27T12:15:00-07:00", 1838 1843 endsAt: "2026-03-27T12:25:00-07:00", 1839 1844 atmoRsvpUrl: atmosphereRsvpEvent("ats26-seams"), 1840 - recordUri: 1845 + recordUri: 1841 1846 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2tdpailb2m", 1842 1847 }, 1843 1848 { ··· 1852 1857 startsAt: "2026-03-27T13:30:00-07:00", 1853 1858 endsAt: "2026-03-27T13:45:00-07:00", 1854 1859 atmoRsvpUrl: atmosphereRsvpEvent("ats26-astrosky"), 1855 - recordUri: 1860 + recordUri: 1856 1861 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2wu5u5rs2i", 1857 1862 }, 1858 1863 { ··· 1861 1866 title: "Sensemaking Systems + AI for Science", 1862 1867 description: 1863 1868 "Sensemaking systems demos from Seams, ViewSift, Skysquare and AI for science demos from Agentis and Coordination Network", 1864 - speakers: ["Semble","Skysquare","Viewsift"], 1869 + speakers: ["Semble", "Skysquare", "Viewsift"], 1865 1870 dayId: "2026-03-27", 1866 1871 trackSlug: "bukhman-lounge", 1867 1872 startsAt: "2026-03-27T13:30:00-07:00", ··· 1916 1921 slug: "reigniting-the-party-lessons-from-a-stalled-migration-to-bluesky", 1917 1922 title: "Reigniting the Party: Lessons from a Stalled Migration to Bluesky", 1918 1923 description: 1919 - "AMIA's vibrant Twitter backchannel fragmented post-X. This talk details our stalled effort to migrate the community to Bluesky. Despite a guide and conference launch, the \"cold start\" problem hindered adoption. I�ll share lessons learned, discuss migration barriers, and outline revised strategies to rebuild our clinical research network.", 1924 + 'AMIA\'s vibrant Twitter backchannel fragmented post-X. This talk details our stalled effort to migrate the community to Bluesky. Despite a guide and conference launch, the "cold start" problem hindered adoption. I�ll share lessons learned, discuss migration barriers, and outline revised strategies to rebuild our clinical research network.', 1920 1925 speakers: ["Dr. Scott McGrath"], 1921 1926 dayId: "2026-03-27", 1922 1927 trackSlug: "performance-theatre", ··· 1931 1936 title: "Future of Science Social Media", 1932 1937 description: 1933 1938 "In this panel we will explore why, despite early momentum, the migration of researchers to Bluesky has waned. We will discuss better ways to onboard, retain, and attract researchers by highlighting the flexibility and extensibility of the AT Protocol. Panelists will share what's worked, what hasn't, and what a coordinated push to build a science ecosystem on Bluesky might look like.", 1934 - speakers: ["Ronen Tamari","Maria Antoniak","Dr. Scott McGrath","Ariel M. Lighty"], 1939 + speakers: [ 1940 + "Ronen Tamari", 1941 + "Maria Antoniak", 1942 + "Dr. Scott McGrath", 1943 + "Ariel M. Lighty", 1944 + ], 1935 1945 dayId: "2026-03-27", 1936 1946 trackSlug: "performance-theatre", 1937 1947 startsAt: "2026-03-27T14:05:00-07:00", 1938 1948 endsAt: "2026-03-27T14:45:00-07:00", 1939 1949 atmoRsvpUrl: atmosphereRsvpEvent("ats26-our-socialmedia-future"), 1940 - recordUri: 1950 + recordUri: 1941 1951 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi33ycoo5d2a", 1942 1952 }, 1943 1953 { ··· 1946 1956 title: "Your Research Institution in the Atmosphere", 1947 1957 description: 1948 1958 "We'll explore how to create win-wins for both research organisations and their researchers by using the Atmosphere to bridge the institution's knowledge (formal, slow, siloed) and the personal knowledge networks (informal, fast, distributed) of their faculty and students. \n\nThe central idea is to use each team's standard.site-enabled website as scaffolding to add value to the team members' Atmosphere activity (publishing, microblogging, discovering and curating knowledge, etc.) and to support cross-protocol community.", 1949 - speakers: ["Mathew Lowry","Sill Social","Leaflet","Paul Fuxjäger"], 1959 + speakers: ["Mathew Lowry", "Sill Social", "Leaflet", "Paul Fuxjäger"], 1950 1960 dayId: "2026-03-27", 1951 1961 trackSlug: "bukhman-lounge", 1952 1962 startsAt: "2026-03-27T14:45:00-07:00", ··· 1957 1967 { 1958 1968 id: "rsvp-ats26-research-synthesis", 1959 1969 slug: "crowdsourced-research-synthesis-on-atproto-envisioning-an-inclusive-future", 1960 - title: "Crowdsourced Research Synthesis on ATProto: Envisioning an Inclusive Future", 1970 + title: 1971 + "Crowdsourced Research Synthesis on ATProto: Envisioning an Inclusive Future", 1961 1972 description: 1962 1973 "Research synthesis, a desirable culmination of primary research, is notoriously slow, error-prone, and disconnected from the network of potential contributors.\n\nNow, ATProto offers a digital foundation upon which to recruit collaborators (Bluesky feeds), assign micro-tasks (discourse graphs), author reports (Leaflet) , and acknowledge contributions.", 1963 1974 speakers: ["Jay Patel"], ··· 1966 1977 startsAt: "2026-03-27T15:00:00-07:00", 1967 1978 endsAt: "2026-03-27T15:10:00-07:00", 1968 1979 atmoRsvpUrl: atmosphereRsvpEvent("ats26-research-synthesis"), 1969 - recordUri: 1980 + recordUri: 1970 1981 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi34ps3oym2i", 1971 1982 }, 1972 1983 { ··· 1981 1992 startsAt: "2026-03-27T15:10:00-07:00", 1982 1993 endsAt: "2026-03-27T15:25:00-07:00", 1983 1994 atmoRsvpUrl: atmosphereRsvpEvent("ats26-paperskygest"), 1984 - recordUri: 1995 + recordUri: 1985 1996 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi35eplsua23", 1986 1997 }, 1987 1998 { 1988 1999 id: "rsvp-ats26-comm-archive", 1989 2000 slug: "narrative-strands-and-memetic-lineages-in-community-social-data-using-community-archive", 1990 - title: "Narrative strands & memetic lineages in community social data using Community Archive", 2001 + title: 2002 + "Narrative strands & memetic lineages in community social data using Community Archive", 1991 2003 description: 1992 - "The Community Archive is a community-owned dataset of contributed Twitter data used to study how ideas spread in online communities.\n\nWe developed methods to extract \"narrative strands\" ? coherent lines of discourse where ideas evolve and build on each other over time. These techniques generalize directly to atproto datasets and could help Bluesky communities understand their own emerging canons.", 2004 + 'The Community Archive is a community-owned dataset of contributed Twitter data used to study how ideas spread in online communities.\n\nWe developed methods to extract "narrative strands" ? coherent lines of discourse where ideas evolve and build on each other over time. These techniques generalize directly to atproto datasets and could help Bluesky communities understand their own emerging canons.', 1993 2005 speakers: ["Francisco Carvalho"], 1994 2006 dayId: "2026-03-27", 1995 2007 trackSlug: "performance-theatre", 1996 2008 startsAt: "2026-03-27T15:25:00-07:00", 1997 2009 endsAt: "2026-03-27T15:40:00-07:00", 1998 2010 atmoRsvpUrl: atmosphereRsvpEvent("ats26-comm-archive"), 1999 - recordUri: 2011 + recordUri: 2000 2012 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi36lcxgce2b", 2001 2013 }, 2002 2014 { ··· 2011 2023 startsAt: "2026-03-27T15:40:00-07:00", 2012 2024 endsAt: "2026-03-27T15:55:00-07:00", 2013 2025 atmoRsvpUrl: atmosphereRsvpEvent("ats26-decentralize"), 2014 - recordUri: 2026 + recordUri: 2015 2027 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi37ha3edb23", 2016 2028 }, 2017 2029 { 2018 2030 id: "rsvp-000NewDirections", 2019 2031 slug: "new-directions", 2020 2032 title: "New Directions", 2021 - description: 2022 - "New Directions", 2023 - speakers: ["Blaine Cook","Aaron Steven White"], 2033 + description: "New Directions", 2034 + speakers: ["Blaine Cook", "Aaron Steven White"], 2024 2035 dayId: "2026-03-27", 2025 2036 trackSlug: "performance-theatre", 2026 2037 startsAt: "2026-03-27T16:00:00-07:00", ··· 2062 2073 title: "at://advent, an atproto adventure", 2063 2074 description: 2064 2075 "at://advent is an atproto adventure, teaching new explorers the ropes through a series of protocol challenges! Participants will dive in to play-test the initial set of challenges, with guidance. This will be a preview ahead of the public online release of at://advent, and will provide us with insight into what aspects are working well and what we need to improve. at://advent is about growing the atproto developer audience: we strive to make it enticing and accessible to beginner and non-devs.", 2065 - speakers: ["fig","bailey"], 2076 + speakers: ["fig", "bailey"], 2066 2077 dayId: "2026-03-27", 2067 2078 trackSlug: "2311-classroom", 2068 2079 startsAt: "2026-03-27T16:30:00-07:00", ··· 2074 2085 id: "rsvp-opening-remarks-day-3", 2075 2086 slug: "opening-remarks-day-3", 2076 2087 title: "Opening Remarks Day 3", 2077 - description: 2078 - "Opening Remarks Day 3", 2088 + description: "Opening Remarks Day 3", 2079 2089 speakers: [], 2080 2090 dayId: "2026-03-28", 2081 2091 trackSlug: "great-hall-south", ··· 2096 2106 startsAt: "2026-03-28T09:15:00-07:00", 2097 2107 endsAt: "2026-03-28T10:00:00-07:00", 2098 2108 atmoRsvpUrl: atmosphereRsvpEvent("gDELD0M"), 2099 - recordUri: 2109 + recordUri: 2100 2110 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54jqrm372z", 2101 2111 }, 2102 2112 { 2103 2113 id: "rsvp-J9yOpYz", 2104 2114 slug: "the-aggregation-era-burned-journalism-institutions-to-the-ground-the-federated-era-is-emerging-from-those-embers", 2105 - title: "The Aggregation Era burned journalism institutions to the ground. The federated era is emerging from those embers", 2115 + title: 2116 + "The Aggregation Era burned journalism institutions to the ground. The federated era is emerging from those embers", 2106 2117 description: 2107 2118 "Journalists are the sleeper agents to catalyze the protocol-based publishing revolution. They're already operating in federated ways -- they just don't use those words. Whether it’s a creator spackling together a media company from web pages and discords -- like so many Twitch streamers. Or journalists using newsletter products to build direct relationships with (and monetize) the massive massive scale audiences they reach through vertical video platforms and don't monetize ....They are federating in DIY ways just as more and more media companies get smaller and more and more journalists go independent. How do we harness this natural momentum towards an organized movement? How can technologists and content creators work together to work as a federated army of Pied Pipers to port audiences into the ATmosphere.", 2108 2119 speakers: ["Justin Bank"], ··· 2111 2122 startsAt: "2026-03-28T10:00:00-07:00", 2112 2123 endsAt: "2026-03-28T10:30:00-07:00", 2113 2124 atmoRsvpUrl: atmosphereRsvpEvent("J9yOpYz"), 2114 - recordUri: 2125 + recordUri: 2115 2126 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54lyc5ts25", 2116 2127 }, 2117 2128 { 2118 2129 id: "rsvp-BzrpDQK", 2119 2130 slug: "feature-product-business-a-framework-for-sustainable-atproto-projects", 2120 - title: "Feature / Product / Business: A Framework for Sustainable ATProto Projects", 2131 + title: 2132 + "Feature / Product / Business: A Framework for Sustainable ATProto Projects", 2121 2133 description: 2122 2134 "The ATProto community built a ton of great features and products over the past year! For our next trick, let's mature them into products and businesses. In this talk, you'll get a practical framework for understanding whether what you're building should be a feature, product, or business, plus concrete funding models at each layer to keep your work going and growing. (More in this thread: https://bsky.app/profile/mosh.bsky.social/post/3mckiat2ne22q)", 2123 2135 speakers: ["Mosh Lee"], ··· 2126 2138 startsAt: "2026-03-28T10:00:00-07:00", 2127 2139 endsAt: "2026-03-28T10:30:00-07:00", 2128 2140 atmoRsvpUrl: atmosphereRsvpEvent("BzrpDQK"), 2129 - recordUri: 2141 + recordUri: 2130 2142 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54nec66s2w", 2131 2143 }, 2132 2144 { 2133 2145 id: "rsvp-QK9Ae6Y", 2134 2146 slug: "groundings-with-my-siblings-lessons-learned-building-for-community", 2135 - title: "Groundings with my Siblings: Lessons Learned Building for Community", 2147 + title: 2148 + "Groundings with my Siblings: Lessons Learned Building for Community", 2136 2149 description: 2137 2150 "I had the privilege of discussing Blacksky and AT Protocol at several different college campuses, conference venues and other settings along with webinars and doing user research. I plan to share those learnings to help others build better products and how we particularly plan to incorporate those learnings from both a product and operations standpoint.", 2138 2151 speakers: ["Rudy Fraser"], ··· 2141 2154 startsAt: "2026-03-28T10:00:00-07:00", 2142 2155 endsAt: "2026-03-28T10:30:00-07:00", 2143 2156 atmoRsvpUrl: atmosphereRsvpEvent("QK9Ae6Y"), 2144 - recordUri: 2157 + recordUri: 2145 2158 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54oonum62b", 2146 2159 }, 2147 2160 { ··· 2156 2169 startsAt: "2026-03-28T10:30:00-07:00", 2157 2170 endsAt: "2026-03-28T11:00:00-07:00", 2158 2171 atmoRsvpUrl: atmosphereRsvpEvent("obLbvQV"), 2159 - recordUri: 2172 + recordUri: 2160 2173 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi56m3hnrq2z", 2161 2174 }, 2162 2175 { ··· 2171 2184 startsAt: "2026-03-28T10:30:00-07:00", 2172 2185 endsAt: "2026-03-28T11:00:00-07:00", 2173 2186 atmoRsvpUrl: atmosphereRsvpEvent("obaP26x"), 2174 - recordUri: 2187 + recordUri: 2175 2188 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi56n6j2g22d", 2176 2189 }, 2177 2190 { ··· 2186 2199 startsAt: "2026-03-28T11:00:00-07:00", 2187 2200 endsAt: "2026-03-28T11:30:00-07:00", 2188 2201 atmoRsvpUrl: atmosphereRsvpEvent("ODxNLMM"), 2189 - recordUri: 2202 + recordUri: 2190 2203 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5a2y3tej2z", 2191 2204 }, 2192 2205 { 2193 2206 id: "rsvp-81VNEBO", 2194 2207 slug: "creators-first-video-and-media-as-the-foundation-of-a-thriving-creator-economy-on-atproto", 2195 - title: "Creators First: Video & Media as the Foundation of a Thriving Creator Economy on ATProto", 2208 + title: 2209 + "Creators First: Video & Media as the Foundation of a Thriving Creator Economy on ATProto", 2196 2210 description: 2197 2211 "This panel spotlights creators on AT Protocol and the infrastructure that lets them own their audience and income. We will explore how video, music, reviews, and other media can interoperate across apps, helping artists reach fans anywhere without being tied to a single platform. Panelists will share emerging ways creators can earn, from direct fan support to premium content. Attendees will leave with a clear view of how ATProto can become the home for the next generation of creators.", 2198 2212 speakers: ["Joe Basser"], ··· 2201 2215 startsAt: "2026-03-28T11:00:00-07:00", 2202 2216 endsAt: "2026-03-28T11:30:00-07:00", 2203 2217 atmoRsvpUrl: atmosphereRsvpEvent("81VNEBO"), 2204 - recordUri: 2218 + recordUri: 2205 2219 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5aarspma27", 2206 2220 }, 2207 2221 { ··· 2210 2224 title: "A discussion with news creators", 2211 2225 description: 2212 2226 "Publishing changes as the internet has changed. We'll discuss the work of being news creators in this moment.", 2213 - speakers: ["Ted Han","Justin Bank","Lauren Saks"], 2227 + speakers: ["Ted Han", "Justin Bank", "Lauren Saks"], 2214 2228 dayId: "2026-03-28", 2215 2229 trackSlug: "performance-theatre", 2216 2230 startsAt: "2026-03-28T11:30:00-07:00", 2217 2231 endsAt: "2026-03-28T12:00:00-07:00", 2218 2232 atmoRsvpUrl: atmosphereRsvpEvent("VLa69bl"), 2219 - recordUri: 2233 + recordUri: 2220 2234 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5bya72ub2d", 2221 2235 }, 2222 2236 { ··· 2231 2245 startsAt: "2026-03-28T11:30:00-07:00", 2232 2246 endsAt: "2026-03-28T12:00:00-07:00", 2233 2247 atmoRsvpUrl: atmosphereRsvpEvent("7Rrv0E0"), 2234 - recordUri: 2248 + recordUri: 2235 2249 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5bcpyqg32a", 2236 2250 }, 2237 2251 { ··· 2260 2274 startsAt: "2026-03-28T13:30:00-07:00", 2261 2275 endsAt: "2026-03-28T13:40:00-07:00", 2262 2276 atmoRsvpUrl: atmosphereRsvpEvent("000Syverson"), 2263 - recordUri: 2277 + recordUri: 2264 2278 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5hza73vs2z", 2265 2279 }, 2266 2280 { 2267 2281 id: "rsvp-QKlrLXG", 2268 2282 slug: "advocating-for-digital-sovereignty-european-experiences-and-global-lessons", 2269 - title: "Advocating for Digital Sovereignty: European Experiences and Global Lessons", 2283 + title: 2284 + "Advocating for Digital Sovereignty: European Experiences and Global Lessons", 2270 2285 description: 2271 2286 "The concept of digital sovereignty has rapidly gained momentum in both Canada and Europe, reflecting growing concerns about who controls our digital infrastructure, data, and public discourse. Nowhere is this debate more dynamic than in the European Union, where lawmakers and advocacy organizations are actively shaping the future of the social web and the digital public sphere. As the founder of the Alliance of Open Networks and Democratic Public Spheres and a recent participant in the EU Summit on Digital Sovereignty, I will examine the communication strategies advocacy groups use to shape public discourse, build alliances, and engage with policymakers and the media. Attendees will understand how digital sovereignty is being debated in the EU, learn about the specific demands and advocacy tactics of European digital rights organizations, with a focus on open protocols, decentralized networks, and democratic governance. The goal of this talk is to identify opportunities for cross-border collaboration and knowledge exchange. In a year when digital policy is at the forefront of public debate, this talk offers timely, in-depth insights from the European experience, providing both inspiration and practical guidance for building a more open, decentralized, and democratic digital future.", 2272 2287 speakers: ["Sandra Barthel"], ··· 2275 2290 startsAt: "2026-03-28T13:30:00-07:00", 2276 2291 endsAt: "2026-03-28T14:00:00-07:00", 2277 2292 atmoRsvpUrl: atmosphereRsvpEvent("QKlrLXG"), 2278 - recordUri: 2293 + recordUri: 2279 2294 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5hx4v6cr26", 2280 2295 }, 2281 2296 { ··· 2290 2305 startsAt: "2026-03-28T13:40:00-07:00", 2291 2306 endsAt: "2026-03-28T13:50:00-07:00", 2292 2307 atmoRsvpUrl: atmosphereRsvpEvent("81Xovjr"), 2293 - recordUri: 2308 + recordUri: 2294 2309 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5itmi65s2z", 2295 2310 }, 2296 2311 { ··· 2305 2320 startsAt: "2026-03-28T14:00:00-07:00", 2306 2321 endsAt: "2026-03-28T14:30:00-07:00", 2307 2322 atmoRsvpUrl: atmosphereRsvpEvent("LZxV6dv"), 2308 - recordUri: 2323 + recordUri: 2309 2324 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5jmsg6kn2m", 2310 2325 }, 2311 2326 { ··· 2320 2335 startsAt: "2026-03-28T14:00:00-07:00", 2321 2336 endsAt: "2026-03-28T14:30:00-07:00", 2322 2337 atmoRsvpUrl: atmosphereRsvpEvent("OD2PpYA"), 2323 - recordUri: 2338 + recordUri: 2324 2339 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5jrjmk6y2n", 2325 2340 }, 2326 2341 { ··· 2335 2350 startsAt: "2026-03-28T14:30:00-07:00", 2336 2351 endsAt: "2026-03-28T15:00:00-07:00", 2337 2352 atmoRsvpUrl: atmosphereRsvpEvent("ja4ooAa"), 2338 - recordUri: 2353 + recordUri: 2339 2354 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5lexqbqf2z", 2340 2355 }, 2341 2356 { 2342 2357 id: "rsvp-Y561Qv6", 2343 2358 slug: "from-protocol-to-product-how-expo-powers-the-next-wave-of-at-proto-applications", 2344 - title: "From protocol to product: How Expo powers the next wave of AT Proto applications", 2359 + title: 2360 + "From protocol to product: How Expo powers the next wave of AT Proto applications", 2345 2361 description: 2346 2362 "What does it actually take to build and ship an AT Proto app? This panel features developers who have done exactly that using Expo. We'll cover the full journey: authentication and OAuth, working with decentralized identity, deploying to app stores, and scaling to real users. Whether you're exploring AT Proto for the first time or ready to start building, you'll walk away with practical insights from people who've shipped.", 2347 - speakers: ["Eliot Hertenstein","Paul Frazee","Eli Mallon","Reed Harmeyer"], 2363 + speakers: [ 2364 + "Eliot Hertenstein", 2365 + "Paul Frazee", 2366 + "Eli Mallon", 2367 + "Reed Harmeyer", 2368 + ], 2348 2369 dayId: "2026-03-28", 2349 2370 trackSlug: "great-hall-south", 2350 2371 startsAt: "2026-03-28T14:30:00-07:00", 2351 2372 endsAt: "2026-03-28T15:00:00-07:00", 2352 2373 atmoRsvpUrl: atmosphereRsvpEvent("Y561Qv6"), 2353 - recordUri: 2374 + recordUri: 2354 2375 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5ldvd46r2i", 2355 2376 }, 2356 2377 { ··· 2359 2380 title: "2026 Atmosphere Report", 2360 2381 description: 2361 2382 "Paul Frazee, CTO of Bluesky, gives a report on the Atmosphere from Bluesky's point of view.\n\nNew standards efforts, new protocol features, new developer tools and APIs - this year has it all.\n\nPaul will share what's going on, what Bluesky is working on, and why 2026 is going to be a great year for the Atmosphere.\n\nPaul will also be joined on stage by Chief Innovation Officer Jay Graber to talk about the future of building on atproto", 2362 - speakers: ["Paul Frazee","Jay Graber"], 2383 + speakers: ["Paul Frazee", "Jay Graber"], 2363 2384 dayId: "2026-03-28", 2364 2385 trackSlug: "great-hall-south", 2365 2386 startsAt: "2026-03-28T15:00:00-07:00", ··· 2380 2401 startsAt: "2026-03-28T16:00:00-07:00", 2381 2402 endsAt: "2026-03-28T16:10:00-07:00", 2382 2403 atmoRsvpUrl: atmosphereRsvpEvent("Bzr448Q"), 2383 - recordUri: 2404 + recordUri: 2384 2405 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5q3oibtu2i", 2385 2406 }, 2386 2407 { ··· 2395 2416 startsAt: "2026-03-28T16:00:00-07:00", 2396 2417 endsAt: "2026-03-28T16:10:00-07:00", 2397 2418 atmoRsvpUrl: atmosphereRsvpEvent("OD6Gd0A"), 2398 - recordUri: 2419 + recordUri: 2399 2420 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5q57diht27", 2400 2421 }, 2401 2422 { ··· 2410 2431 startsAt: "2026-03-28T16:10:00-07:00", 2411 2432 endsAt: "2026-03-28T16:20:00-07:00", 2412 2433 atmoRsvpUrl: atmosphereRsvpEvent("000WSocial"), 2413 - recordUri: 2434 + recordUri: 2414 2435 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5qzkwfe42z", 2415 2436 }, 2416 2437 { ··· 2425 2446 startsAt: "2026-03-28T16:10:00-07:00", 2426 2447 endsAt: "2026-03-28T16:20:00-07:00", 2427 2448 atmoRsvpUrl: atmosphereRsvpEvent("2EG4YMj"), 2428 - recordUri: 2449 + recordUri: 2429 2450 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5qywid6z25", 2430 2451 }, 2431 2452 { 2432 2453 id: "rsvp-000Ryo", 2433 2454 slug: "bridging-social-graphs-how-sky-follower-bridge-helps-people-move-to-bluesky", 2434 - title: "Bridging Social Graphs: How Sky Follower Bridge helps people move to Bluesky", 2455 + title: 2456 + "Bridging Social Graphs: How Sky Follower Bridge helps people move to Bluesky", 2435 2457 description: 2436 2458 "Moving to a new social network is easy. Finding your people again is the hard part. This lightning talk introduces Sky Follower Bridge, a tool that helps users reconnect with their social graph on Bluesky. It also explores two technical challenges behind the project: extracting follow lists from browser pages and improving account matching across platforms.", 2437 2459 speakers: ["Ryo Kawamata"], ··· 2440 2462 startsAt: "2026-03-28T16:20:00-07:00", 2441 2463 endsAt: "2026-03-28T16:30:00-07:00", 2442 2464 atmoRsvpUrl: atmosphereRsvpEvent("000Ryo"), 2443 - recordUri: 2465 + recordUri: 2444 2466 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5rl4r4a725", 2445 2467 }, 2446 2468 { ··· 2455 2477 startsAt: "2026-03-28T16:20:00-07:00", 2456 2478 endsAt: "2026-03-28T16:30:00-07:00", 2457 2479 atmoRsvpUrl: atmosphereRsvpEvent("000Jer"), 2458 - recordUri: 2480 + recordUri: 2459 2481 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5rm4y7ts2b", 2460 2482 }, 2461 2483 { ··· 2470 2492 startsAt: "2026-03-28T16:30:00-07:00", 2471 2493 endsAt: "2026-03-28T16:40:00-07:00", 2472 2494 atmoRsvpUrl: atmosphereRsvpEvent("2EGLPML"), 2473 - recordUri: 2495 + recordUri: 2474 2496 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5s2x6tkd2d", 2475 2497 }, 2476 2498 { ··· 2485 2507 startsAt: "2026-03-28T16:30:00-07:00", 2486 2508 endsAt: "2026-03-28T16:40:00-07:00", 2487 2509 atmoRsvpUrl: atmosphereRsvpEvent("lbkWPeN"), 2488 - recordUri: 2510 + recordUri: 2489 2511 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5s4foj7h2a", 2490 2512 }, 2491 2513 { ··· 2494 2516 title: "A Free Press needs Free Protocols", 2495 2517 description: 2496 2518 "Proprietary social media platforms intermediate the two main things journalism needs to survive: attention and revenue. Drawing from our combined experience building tech for newsrooms from the Chicago Tribune to ProPublica, we'll explore how building on protocols, not platforms could create a media environment where both publishers and audiences control their own destiny. Two veteran news/open social web nerds have ideas about what this could look like in practice (and want to hear yours!)", 2497 - speakers: ["Joe Germuska","Ben Werdmuller"], 2519 + speakers: ["Joe Germuska", "Ben Werdmuller"], 2498 2520 dayId: "2026-03-28", 2499 2521 trackSlug: "performance-theatre", 2500 2522 startsAt: "2026-03-28T16:45:00-07:00", 2501 2523 endsAt: "2026-03-28T17:15:00-07:00", 2502 2524 atmoRsvpUrl: atmosphereRsvpEvent("EkGROKB"), 2503 - recordUri: 2525 + recordUri: 2504 2526 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5sn7zmfy23", 2505 2527 }, 2506 2528 { ··· 2515 2537 startsAt: "2026-03-28T16:45:00-07:00", 2516 2538 endsAt: "2026-03-28T17:15:00-07:00", 2517 2539 atmoRsvpUrl: atmosphereRsvpEvent("OD2G9j8"), 2518 - recordUri: 2540 + recordUri: 2519 2541 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5spj6izy2a", 2520 2542 }, 2521 2543 { ··· 2530 2552 startsAt: "2026-03-28T17:15:00-07:00", 2531 2553 endsAt: "2026-03-28T17:45:00-07:00", 2532 2554 atmoRsvpUrl: atmosphereRsvpEvent("PdJ6Q8d"), 2533 - recordUri: 2555 + recordUri: 2534 2556 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5unzkbat27", 2535 2557 }, 2536 2558 { 2537 2559 id: "rsvp-rj8Xv62", 2538 2560 slug: "this-title-left-intentionally-blank", 2539 2561 title: "This Title Left Intentionally Blank", 2540 - description: 2541 - "From Software Engineering to Software Ecologies", 2562 + description: "From Software Engineering to Software Ecologies", 2542 2563 speakers: ["Blaine Cook"], 2543 2564 dayId: "2026-03-28", 2544 2565 trackSlug: "great-hall-south", 2545 2566 startsAt: "2026-03-28T17:15:00-07:00", 2546 2567 endsAt: "2026-03-28T17:45:00-07:00", 2547 2568 atmoRsvpUrl: atmosphereRsvpEvent("rj8Xv62"), 2548 - recordUri: 2569 + recordUri: 2549 2570 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5unhqisv22", 2550 2571 }, 2551 2572 { ··· 2558 2579 startsAt: "2026-03-28T17:45:00-07:00", 2559 2580 endsAt: "2026-03-28T18:00:00-07:00", 2560 2581 atmoRsvpUrl: atmosphereRsvpEvent("day-3-closing-remarks"), 2561 - recordUri: 2582 + recordUri: 2562 2583 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5wqocga62h", 2563 2584 }, 2564 2585 { 2565 2586 id: "rsvp-opening-remarks-day-4", 2566 2587 slug: "opening-remarks-day-4", 2567 2588 title: "Opening Remarks Day 4", 2568 - description: 2569 - "Opening Remarks Day 4", 2589 + description: "Opening Remarks Day 4", 2570 2590 speakers: [], 2571 2591 dayId: "2026-03-29", 2572 2592 trackSlug: "great-hall-south", 2573 2593 startsAt: "2026-03-29T09:00:00-07:00", 2574 2594 endsAt: "2026-03-29T09:15:00-07:00", 2575 2595 atmoRsvpUrl: atmosphereRsvpEvent("opening-remarks-day-4"), 2576 - recordUri: 2596 + recordUri: 2577 2597 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7jhwzagl2n", 2578 2598 }, 2579 2599 { ··· 2588 2608 startsAt: "2026-03-29T10:00:00-07:00", 2589 2609 endsAt: "2026-03-29T10:30:00-07:00", 2590 2610 atmoRsvpUrl: atmosphereRsvpEvent("Mej2N5X"), 2591 - recordUri: 2611 + recordUri: 2592 2612 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7lapdbjc2t", 2593 2613 }, 2594 2614 { ··· 2603 2623 startsAt: "2026-03-29T10:30:00-07:00", 2604 2624 endsAt: "2026-03-29T11:00:00-07:00", 2605 2625 atmoRsvpUrl: atmosphereRsvpEvent("WOkL11Q"), 2606 - recordUri: 2626 + recordUri: 2607 2627 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7ok5zmuk2k", 2608 2628 }, 2609 2629 { 2610 2630 id: "rsvp-jaAWVRY", 2611 2631 slug: "bringing-self-sovereign-identities-to-the-masses-via-atproto-and-how-to-maximize-coherence-between-upcoming-did-plc-forks", 2612 - title: "Bringing Self Sovereign Identities to the Masses via ATproto (and how to maximize coherence between upcoming DID:PLC forks)", 2632 + title: 2633 + "Bringing Self Sovereign Identities to the Masses via ATproto (and how to maximize coherence between upcoming DID:PLC forks)", 2613 2634 description: 2614 2635 "I will make the case that DID:PLC forks will inevitably emerge as the wider atproto ecosystem keeps gaining global relevance: pressure on the governance model of the identity system will increase to a point where conflicts (e.g. over which DID suspension requests should be honored and which should be ignored) cannot be easilly resolved within a ‘permissioned consortium’ (as proposed in https://atproto.com/guides/identity) anymore. It seems evident that we can only argue about WHEN this will happen, not IF it will happen.\r\n\r\nIn order to be able to maintain coherent UI experiences (without threads looking more and more broken due to different forks being used in different appviews) it seems necessary to extend the adversarial design patterns at the heart of the bluesky project (‘the company is the future adversary’) to the governance model of the underlying DID:PLC identity system: ‘the consortium will become target of future adversaries’.\r\n\r\nCan permissionless observatory networks help?\r\nCan we avoid using cryptoeconomics?\r\nWhat other options seem useful?\r\n\r\nDuring this presentation, I will present the results of my ongoing PhD research project on these questions.\r\n\r\n---\r\n\r\nAbout me:\r\n\r\nI'm part of a small team (including Marcus Sabadello, co-author and editor of the DID specification) that started to advocate for the adoption of DIDs within ActivityPub networks back in 2018 (predating Jay Graber’s ecosystem review and the birth of the bluesky project).\r\n\r\nhttps://github.com/WebOfTrustInfo/rwot9-prague/blob/master/topics-and-advance-readings/fediverse-did-integration.md\r\n\r\nhttps://chaos.social/@cypherhippie/102270069807129706\r\n\r\nLink to a (somewhat cringe) video for a grant application in 2018: https://youtu.be/UJn7cLNh_q8?t=85\r\n\r\nRecent talk at fediday berlin:\r\nProtocol Convergence within Open Science Communication Networks\r\nhttps://fair.tube/w/p/2PEFZ5cdptsVASU4HTUakA\r\n\r\nUpcoming presentation at fosdem:\r\nIncreasing Long Term Stability of Relations Between Fediverse Identities using SSI\r\nhttps://fosdem.org/2026/schedule/event/RZRZ9P-increasing_long_term_stability_of_relations_between_fediverse_identities_using_s/", 2615 2636 speakers: ["Paul Fuxjäger"], ··· 2618 2639 startsAt: "2026-03-29T10:30:00-07:00", 2619 2640 endsAt: "2026-03-29T11:00:00-07:00", 2620 2641 atmoRsvpUrl: atmosphereRsvpEvent("jaAWVRY"), 2621 - recordUri: 2642 + recordUri: 2622 2643 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7o5amqqx2d", 2623 2644 }, 2624 2645 { ··· 2633 2654 startsAt: "2026-03-29T11:00:00-07:00", 2634 2655 endsAt: "2026-03-29T11:30:00-07:00", 2635 2656 atmoRsvpUrl: atmosphereRsvpEvent("ODqQQJA"), 2636 - recordUri: 2657 + recordUri: 2637 2658 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7pjfdkhv2b", 2638 2659 }, 2639 2660 { 2640 2661 id: "rsvp-zxRkxk8", 2641 2662 slug: "blousques-case-study-on-the-challenges-in-translating-bluesky-s-ui", 2642 - title: "Blousques: Case Study on the Challenges in Translating Bluesky's UI", 2663 + title: 2664 + "Blousques: Case Study on the Challenges in Translating Bluesky's UI", 2643 2665 description: 2644 2666 "Translating Bluesky's user interface into French was the easy part. Making it feel ‘native’ to users is something else entirely!\r\n\r\nI18n is common in software, yet Bluesky has specific challenges: should we translate it using gender-neutral terms? How to translate names embedded on-protocol? How to translate features not yet released, as an external, voluntary contributor?\r\n\r\nTranslating the UI is also a good way to spot what is really missing in the daily lives of non-English users of the platform.", 2645 2667 speakers: ["Stanislas Signoud (Signez)"], ··· 2648 2670 startsAt: "2026-03-29T11:00:00-07:00", 2649 2671 endsAt: "2026-03-29T11:30:00-07:00", 2650 2672 atmoRsvpUrl: atmosphereRsvpEvent("zxRkxk8"), 2651 - recordUri: 2673 + recordUri: 2652 2674 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7q5mjlbe2c", 2653 2675 }, 2654 2676 { ··· 2668 2690 { 2669 2691 id: "rsvp-kdobWjj", 2670 2692 slug: "a-fireside-chat-on-resonant-computing-why-we-wrote-the-manifesto-and-where-we-go-from-here", 2671 - title: "A Fireside Chat on Resonant Computing: Why we wrote the manifesto and where we go from here", 2693 + title: 2694 + "A Fireside Chat on Resonant Computing: Why we wrote the manifesto and where we go from here", 2672 2695 description: 2673 2696 "Resonant Computing manifesto co-authors Mike Masnick (Bluesky board member, Techdirt) and Alex Komoroske (Common Tools) discuss why they felt compelled to articulate an alternative vision for computing—one that's private, plural, and prosocial. They'll explore what resonance actually means in practice, why the ATProto community is uniquely positioned to build this future, and talk about the infrastructure work to make it real.", 2674 - speakers: ["Alex Komoroske","Mike Masnick"], 2697 + speakers: ["Alex Komoroske", "Mike Masnick"], 2675 2698 dayId: "2026-03-29", 2676 2699 trackSlug: "great-hall-south", 2677 2700 startsAt: "2026-03-29T11:30:00-07:00", 2678 2701 endsAt: "2026-03-29T12:00:00-07:00", 2679 2702 atmoRsvpUrl: atmosphereRsvpEvent("kdobWjj"), 2680 - recordUri: 2703 + recordUri: 2681 2704 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7rvqdpj722", 2682 2705 }, 2683 2706 { ··· 2692 2715 startsAt: "2026-03-29T13:30:00-07:00", 2693 2716 endsAt: "2026-03-29T14:00:00-07:00", 2694 2717 atmoRsvpUrl: atmosphereRsvpEvent("2E9XG1b"), 2695 - recordUri: 2718 + recordUri: 2696 2719 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7tcodsqu2t", 2697 2720 }, 2698 2721 { ··· 2707 2730 startsAt: "2026-03-29T13:30:00-07:00", 2708 2731 endsAt: "2026-03-29T14:00:00-07:00", 2709 2732 atmoRsvpUrl: atmosphereRsvpEvent("EkexvrN"), 2710 - recordUri: 2733 + recordUri: 2711 2734 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7tbwgymp25", 2712 2735 }, 2713 2736 { ··· 2722 2745 startsAt: "2026-03-29T14:00:00-07:00", 2723 2746 endsAt: "2026-03-29T14:30:00-07:00", 2724 2747 atmoRsvpUrl: atmosphereRsvpEvent("LZ4oWrj"), 2725 - recordUri: 2748 + recordUri: 2726 2749 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia26ffz2j2c", 2727 2750 }, 2728 2751 { ··· 2737 2760 startsAt: "2026-03-29T14:30:00-07:00", 2738 2761 endsAt: "2026-03-29T15:00:00-07:00", 2739 2762 atmoRsvpUrl: atmosphereRsvpEvent("0Qq9NlZ"), 2740 - recordUri: 2763 + recordUri: 2741 2764 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia3vm5oyd2u", 2742 2765 }, 2743 2766 { 2744 2767 id: "rsvp-WObY04Q", 2745 2768 slug: "furryli-st-building-communities-without-landlords-from-the-protocol-up", 2746 - title: "furryli.st — Building Communities Without Landlords From the Protocol Up", 2769 + title: 2770 + "furryli.st — Building Communities Without Landlords From the Protocol Up", 2747 2771 description: 2748 - "The AT Protocol guarantees sovereignty to the user. But it does not yet do the same for communities. Community stewards, like platforms, become landlords by necessity. Can we address this from the protocol up?\n\nIn this presentation, I’ll use furryli.st, which defines and serves a community of 60,000+ furries on the AT Protocol, as a case study to deconstruct the \"community\" into distinct roles and relationships, identify existing protocol-native analogues, and propose what needs to be built next to create resilient, protocol-native communities defined by *people*, rather than infrastructure.", 2772 + 'The AT Protocol guarantees sovereignty to the user. But it does not yet do the same for communities. Community stewards, like platforms, become landlords by necessity. Can we address this from the protocol up?\n\nIn this presentation, I’ll use furryli.st, which defines and serves a community of 60,000+ furries on the AT Protocol, as a case study to deconstruct the "community" into distinct roles and relationships, identify existing protocol-native analogues, and propose what needs to be built next to create resilient, protocol-native communities defined by *people*, rather than infrastructure.', 2749 2773 speakers: ["Baldemar Motomochi"], 2750 2774 dayId: "2026-03-29", 2751 2775 trackSlug: "performance-theatre", 2752 2776 startsAt: "2026-03-29T14:30:00-07:00", 2753 2777 endsAt: "2026-03-29T15:00:00-07:00", 2754 2778 atmoRsvpUrl: atmosphereRsvpEvent("WObY04Q"), 2755 - recordUri: 2779 + recordUri: 2756 2780 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia3svkvjw22", 2757 2781 }, 2758 2782 { 2759 2783 id: "rsvp-000WebTiles", 2760 2784 slug: "webtiles-showcase", 2761 2785 title: "WebTiles Showcase", 2762 - description: 2763 - "WebTiles Showcase", 2764 - speakers: ["Ted Han","Robin Berjon"], 2786 + description: "WebTiles Showcase", 2787 + speakers: ["Ted Han", "Robin Berjon"], 2765 2788 dayId: "2026-03-29", 2766 2789 trackSlug: "2301-classroom", 2767 2790 startsAt: "2026-03-29T15:00:00-07:00", 2768 2791 endsAt: "2026-03-29T15:30:00-07:00", 2769 2792 atmoRsvpUrl: atmosphereRsvpEvent("000WebTiles"), 2770 - recordUri: 2793 + recordUri: 2771 2794 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia5q5vu4q2h", 2772 2795 }, 2773 2796 { ··· 2782 2805 startsAt: "2026-03-29T16:00:00-07:00", 2783 2806 endsAt: "2026-03-29T16:10:00-07:00", 2784 2807 atmoRsvpUrl: atmosphereRsvpEvent("5B02jaM"), 2785 - recordUri: 2808 + recordUri: 2786 2809 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia7iun75l2x", 2787 2810 }, 2788 2811 { ··· 2797 2820 startsAt: "2026-03-29T16:10:00-07:00", 2798 2821 endsAt: "2026-03-29T16:20:00-07:00", 2799 2822 atmoRsvpUrl: atmosphereRsvpEvent("QKNkKMX"), 2800 - recordUri: 2823 + recordUri: 2801 2824 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miabh2g67c2c", 2802 2825 }, 2803 2826 { 2804 2827 id: "rsvp-ob8N65V", 2805 2828 slug: "how-to-use-bluesky-to-easily-and-securely-preview-a-software-product-to-users", 2806 - title: "How to use Bluesky to easily and securely preview a software product to users.", 2829 + title: 2830 + "How to use Bluesky to easily and securely preview a software product to users.", 2807 2831 description: 2808 2832 "ATProto is a great way to manage identity! One of my favorite things about it is that it's vendor-neutral. I'll describe how I used ATProto to build self-service licensing and analytics for a software beta with no third-party dependencies.", 2809 2833 speakers: ["Tim Burks"], ··· 2812 2836 startsAt: "2026-03-29T16:20:00-07:00", 2813 2837 endsAt: "2026-03-29T16:30:00-07:00", 2814 2838 atmoRsvpUrl: atmosphereRsvpEvent("ob8N65V"), 2815 - recordUri: 2839 + recordUri: 2816 2840 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miacmdq4sm2a", 2817 2841 }, 2818 2842 { 2819 2843 id: "rsvp-xX5yRJr", 2820 2844 slug: "skylimit-a-curating-web-client-with-fine-grained-controls-to-mimic-the-newspaper-experience", 2821 - title: "Skylimit: A curating web client with fine-grained controls to mimic the newspaper experience", 2845 + title: 2846 + "Skylimit: A curating web client with fine-grained controls to mimic the newspaper experience", 2822 2847 description: 2823 2848 "The goal of many social media platforms is to maximize your screen time. Skylimit is a curation algorithm designed to optimize your limited screen time. It attempts to answer the following question: If I decide to limit myself to viewing, say, 500 posts per day (on average), what is the best way to manage my Following Feed?\r\n\r\nAs a Bluesky user who follows many people, I would like to view the most relevant and interesting posts in my feed. This is similar to the decisions editors make when populating a fixed number of pages in a printed newspaper—they must choose from news items on numerous topics, regular pieces by columnists, and more. Skylimit aims to mimic aspects of the print news reading experience in the digital world by creating a curated version of the Following Feed with statistical settings for each followee that go beyond just muting.\r\n\r\nThe talk will discuss the various trade-offs involved in achieving this goal and demonstrate a prototype Bluesky web client (skylimit.dev) that implements the curation algorithm. Issues to be discussed include: how to (statistically) select and display “important” posts, handling “quiet posters,” and presenting periodic digest editions.", 2824 2849 speakers: ["Ramalingam Saravanan"], ··· 2827 2852 startsAt: "2026-03-29T16:20:00-07:00", 2828 2853 endsAt: "2026-03-29T16:30:00-07:00", 2829 2854 atmoRsvpUrl: atmosphereRsvpEvent("xX5yRJr"), 2830 - recordUri: 2855 + recordUri: 2831 2856 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miac5ez6a22r", 2832 2857 }, 2833 2858 { ··· 2842 2867 startsAt: "2026-03-29T16:20:00-07:00", 2843 2868 endsAt: "2026-03-29T16:30:00-07:00", 2844 2869 atmoRsvpUrl: atmosphereRsvpEvent("686gZde"), 2845 - recordUri: 2870 + recordUri: 2846 2871 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miac3urhgt23", 2847 2872 }, 2848 2873 { ··· 2857 2882 startsAt: "2026-03-29T16:30:00-07:00", 2858 2883 endsAt: "2026-03-29T17:00:00-07:00", 2859 2884 atmoRsvpUrl: atmosphereRsvpEvent("RG6Nepp"), 2860 - recordUri: 2885 + recordUri: 2861 2886 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miadb23fme2a", 2862 2887 }, 2863 2888 { ··· 2872 2897 startsAt: "2026-03-29T16:30:00-07:00", 2873 2898 endsAt: "2026-03-29T16:40:00-07:00", 2874 2899 atmoRsvpUrl: atmosphereRsvpEvent("000TLog"), 2875 - recordUri: 2900 + recordUri: 2876 2901 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miacona6fc2e", 2877 2902 }, 2878 2903 { ··· 2887 2912 startsAt: "2026-03-29T16:40:00-07:00", 2888 2913 endsAt: "2026-03-29T16:50:00-07:00", 2889 2914 atmoRsvpUrl: atmosphereRsvpEvent("ZjMOl7o"), 2890 - recordUri: 2915 + recordUri: 2891 2916 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miadd43al32c", 2892 2917 }, 2893 2918 { ··· 2902 2927 startsAt: "2026-03-29T17:00:00-07:00", 2903 2928 endsAt: "2026-03-29T17:30:00-07:00", 2904 2929 atmoRsvpUrl: atmosphereRsvpEvent("QKqWDrG"), 2905 - recordUri: 2930 + recordUri: 2906 2931 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miadvkvhfv2h", 2907 2932 }, 2908 2933 ];