···11+/**
22+ * Fetches event titles and descriptions from atmo.rsvp (SvelteKit __data.json)
33+ * and updates src/data/conference.ts for sessions linked via atmosphereRsvpEvent(...).
44+ *
55+ * Usage:
66+ * node --experimental-strip-types ./scripts/sync-atmo-rsvp-events.ts [--dry-run]
77+ */
88+99+import { readFileSync, writeFileSync } from "node:fs";
1010+import path from "node:path";
1111+import process from "node:process";
1212+import { fileURLToPath } from "node:url";
1313+1414+import ts from "typescript";
1515+1616+const __dirname = path.dirname(fileURLToPath(import.meta.url));
1717+const PROJECT_ROOT = path.resolve(__dirname, "..");
1818+const CONFERENCE_PATH = path.join(PROJECT_ROOT, "src", "data", "conference.ts");
1919+2020+const RSVP_DATA_URL = (rkey: string) =>
2121+ `https://atmo.rsvp/p/atmosphereconf.org/e/${rkey}/__data.json`;
2222+2323+type TextEdit = { start: number; end: number; text: string };
2424+2525+function resolveSvelteDataArray(data: unknown[], v: unknown, refPath = new Set<number>()): unknown {
2626+ if (v === null || v === undefined) {
2727+ return v;
2828+ }
2929+ if (
3030+ typeof v === "number" &&
3131+ Number.isInteger(v) &&
3232+ v >= 0 &&
3333+ v < data.length
3434+ ) {
3535+ if (refPath.has(v)) {
3636+ return null;
3737+ }
3838+ refPath.add(v);
3939+ try {
4040+ return resolveSvelteDataArray(data, data[v], refPath);
4141+ } finally {
4242+ refPath.delete(v);
4343+ }
4444+ }
4545+ if (Array.isArray(v)) {
4646+ return v.map((x) => resolveSvelteDataArray(data, x, refPath));
4747+ }
4848+ if (typeof v === "object") {
4949+ const o: Record<string, unknown> = {};
5050+ for (const [k, val] of Object.entries(v)) {
5151+ o[k] = resolveSvelteDataArray(data, val, refPath);
5252+ }
5353+ return o;
5454+ }
5555+ return v;
5656+}
5757+5858+function extractEventRecord(payload: unknown): Record<string, unknown> {
5959+ if (!payload || typeof payload !== "object" || !("nodes" in payload)) {
6060+ throw new Error("Invalid __data.json payload");
6161+ }
6262+ const nodes = (payload as { nodes: unknown[] }).nodes;
6363+ for (const node of nodes) {
6464+ if (
6565+ !node ||
6666+ typeof node !== "object" ||
6767+ !("type" in node) ||
6868+ (node as { type: string }).type !== "data" ||
6969+ !("data" in node)
7070+ ) {
7171+ continue;
7272+ }
7373+ const dataArr = (node as { data: unknown[] }).data;
7474+ if (!Array.isArray(dataArr) || dataArr.length === 0) {
7575+ continue;
7676+ }
7777+ const root = dataArr[0];
7878+ if (
7979+ root &&
8080+ typeof root === "object" &&
8181+ "eventData" in root &&
8282+ typeof (root as { eventData: unknown }).eventData === "number"
8383+ ) {
8484+ const idx = (root as { eventData: number }).eventData;
8585+ const resolved = resolveSvelteDataArray(dataArr, idx);
8686+ if (resolved && typeof resolved === "object") {
8787+ return resolved as Record<string, unknown>;
8888+ }
8989+ }
9090+ }
9191+ throw new Error("eventData not found in __data.json");
9292+}
9393+9494+async function fetchRsvpEvent(rkey: string): Promise<{ title: string; description: string }> {
9595+ const res = await fetch(RSVP_DATA_URL(rkey), {
9696+ headers: { Accept: "application/json", "User-Agent": "atmosphereconf2026-sync-script" },
9797+ });
9898+ if (!res.ok) {
9999+ throw new Error(`HTTP ${res.status} for ${rkey}`);
100100+ }
101101+ const json = (await res.json()) as unknown;
102102+ const event = extractEventRecord(json);
103103+ const name = event.name;
104104+ const description = event.description;
105105+ if (typeof name !== "string") {
106106+ throw new Error(`Missing event name for ${rkey}`);
107107+ }
108108+ const descriptionText = typeof description === "string" ? description : "";
109109+ return { title: name, description: descriptionText };
110110+}
111111+112112+function findSessionsArray(sf: ts.SourceFile): ts.ArrayLiteralExpression | undefined {
113113+ let result: ts.ArrayLiteralExpression | undefined;
114114+ function visit(node: ts.Node) {
115115+ if (ts.isVariableStatement(node)) {
116116+ for (const decl of node.declarationList.declarations) {
117117+ if (
118118+ decl.name.getText() === "sessions" &&
119119+ decl.initializer &&
120120+ ts.isArrayLiteralExpression(decl.initializer)
121121+ ) {
122122+ result = decl.initializer;
123123+ }
124124+ }
125125+ }
126126+ ts.forEachChild(node, visit);
127127+ }
128128+ visit(sf);
129129+ return result;
130130+}
131131+132132+function getPropertyAssignment(
133133+ obj: ts.ObjectLiteralExpression,
134134+ name: string,
135135+): ts.PropertyAssignment | undefined {
136136+ for (const p of obj.properties) {
137137+ if (ts.isPropertyAssignment(p) && p.name.getText() === name) {
138138+ return p;
139139+ }
140140+ }
141141+ return undefined;
142142+}
143143+144144+function getStringProp(obj: ts.ObjectLiteralExpression, name: string): string | undefined {
145145+ const prop = getPropertyAssignment(obj, name);
146146+ if (!prop) {
147147+ return undefined;
148148+ }
149149+ const init = prop.initializer;
150150+ if (ts.isStringLiteral(init)) {
151151+ return init.text;
152152+ }
153153+ return undefined;
154154+}
155155+156156+function getAtmoRsvpRkey(obj: ts.ObjectLiteralExpression): string | undefined {
157157+ const prop = getPropertyAssignment(obj, "atmoRsvpUrl");
158158+ if (!prop) {
159159+ return undefined;
160160+ }
161161+ const init = prop.initializer;
162162+ if (!ts.isCallExpression(init)) {
163163+ return undefined;
164164+ }
165165+ if (init.expression.getText() !== "atmosphereRsvpEvent") {
166166+ return undefined;
167167+ }
168168+ const arg0 = init.arguments[0];
169169+ if (ts.isStringLiteral(arg0)) {
170170+ return arg0.text;
171171+ }
172172+ return undefined;
173173+}
174174+175175+function findSessionObjectBySlug(
176176+ sessionsArray: ts.ArrayLiteralExpression,
177177+ slug: string,
178178+): ts.ObjectLiteralExpression | undefined {
179179+ for (const el of sessionsArray.elements) {
180180+ if (!ts.isObjectLiteralExpression(el)) {
181181+ continue;
182182+ }
183183+ if (getStringProp(el, "slug") === slug) {
184184+ return el;
185185+ }
186186+ }
187187+ return undefined;
188188+}
189189+190190+function positionAfterPropertyComma(source: string, sf: ts.SourceFile, prop: ts.PropertyAssignment): number {
191191+ let pos = prop.getEnd();
192192+ while (pos < source.length && /\s/u.test(source[pos])) {
193193+ pos += 1;
194194+ }
195195+ if (source[pos] !== ",") {
196196+ throw new Error("Expected comma after property");
197197+ }
198198+ pos += 1;
199199+ while (pos < source.length && /\s/u.test(source[pos])) {
200200+ pos += 1;
201201+ }
202202+ return pos;
203203+}
204204+205205+function applyEdits(source: string, edits: TextEdit[]): string {
206206+ const sorted = [...edits].sort((a, b) => b.start - a.start);
207207+ let out = source;
208208+ for (const e of sorted) {
209209+ out = out.slice(0, e.start) + e.text + out.slice(e.end);
210210+ }
211211+ return out;
212212+}
213213+214214+function buildSessionEdits(
215215+ source: string,
216216+ sf: ts.SourceFile,
217217+ el: ts.ObjectLiteralExpression,
218218+ remote: { title: string; description: string },
219219+): TextEdit[] {
220220+ const edits: TextEdit[] = [];
221221+222222+ const titleProp = getPropertyAssignment(el, "title");
223223+ const descProp = getPropertyAssignment(el, "description");
224224+ if (!titleProp) {
225225+ throw new Error("no title property");
226226+ }
227227+228228+ const localTitle = getStringProp(el, "title");
229229+ const localDesc = getStringProp(el, "description");
230230+ if (localTitle === undefined) {
231231+ throw new Error("could not read title");
232232+ }
233233+234234+ if (remote.title !== localTitle) {
235235+ edits.push({
236236+ start: titleProp.getStart(sf),
237237+ end: titleProp.getEnd(sf),
238238+ text: `title: ${JSON.stringify(remote.title)}`,
239239+ });
240240+ }
241241+242242+ if (descProp) {
243243+ if (localDesc === undefined) {
244244+ throw new Error("description property without string literal");
245245+ }
246246+ if (remote.description !== localDesc) {
247247+ edits.push({
248248+ start: descProp.getStart(sf),
249249+ end: descProp.getEnd(sf),
250250+ text: `description: ${JSON.stringify(remote.description)}`,
251251+ });
252252+ }
253253+ } else if (remote.description.trim().length > 0) {
254254+ const insertAt = positionAfterPropertyComma(source, sf, titleProp);
255255+ edits.push({
256256+ start: insertAt,
257257+ end: insertAt,
258258+ text: `description: ${JSON.stringify(remote.description)},\n `,
259259+ });
260260+ }
261261+262262+ return edits;
263263+}
264264+265265+async function main() {
266266+ const dryRun = process.argv.includes("--dry-run");
267267+ let source = readFileSync(CONFERENCE_PATH, "utf8");
268268+269269+ const sf0 = ts.createSourceFile(
270270+ "conference.ts",
271271+ source,
272272+ ts.ScriptTarget.Latest,
273273+ true,
274274+ ts.ScriptKind.TS,
275275+ );
276276+ const sessionsArray0 = findSessionsArray(sf0);
277277+ if (!sessionsArray0) {
278278+ throw new Error("Could not find sessions array");
279279+ }
280280+281281+ type Plan = {
282282+ slug: string;
283283+ rkey: string;
284284+ remote: { title: string; description: string };
285285+ };
286286+287287+ const fetchItems: { slug: string; rkey: string }[] = [];
288288+ for (const el of sessionsArray0.elements) {
289289+ if (!ts.isObjectLiteralExpression(el)) {
290290+ continue;
291291+ }
292292+ const slug = getStringProp(el, "slug");
293293+ const rkey = getAtmoRsvpRkey(el);
294294+ if (!slug || !rkey) {
295295+ continue;
296296+ }
297297+ fetchItems.push({ slug, rkey });
298298+ }
299299+300300+ const plans: Plan[] = [];
301301+ const fetchErrors: { slug: string; rkey: string; message: string }[] = [];
302302+303303+ const concurrency = 10;
304304+ for (let i = 0; i < fetchItems.length; i += concurrency) {
305305+ const batch = fetchItems.slice(i, i + concurrency);
306306+ const settled = await Promise.allSettled(
307307+ batch.map((item) => fetchRsvpEvent(item.rkey)),
308308+ );
309309+ for (let j = 0; j < batch.length; j++) {
310310+ const item = batch[j];
311311+ const result = settled[j];
312312+ if (result.status === "fulfilled") {
313313+ plans.push({ slug: item.slug, rkey: item.rkey, remote: result.value });
314314+ } else {
315315+ const reason = result.reason;
316316+ fetchErrors.push({
317317+ slug: item.slug,
318318+ rkey: item.rkey,
319319+ message: reason instanceof Error ? reason.message : String(reason),
320320+ });
321321+ }
322322+ }
323323+ }
324324+325325+ for (const e of fetchErrors) {
326326+ console.error(`[skip] ${e.slug} (${e.rkey}): ${e.message}`);
327327+ }
328328+329329+ const changes: { slug: string; rkey: string; field: string }[] = [];
330330+331331+ for (const plan of plans) {
332332+ const sf = ts.createSourceFile(
333333+ "conference.ts",
334334+ source,
335335+ ts.ScriptTarget.Latest,
336336+ true,
337337+ ts.ScriptKind.TS,
338338+ );
339339+ const sessionsArray = findSessionsArray(sf);
340340+ if (!sessionsArray) {
341341+ throw new Error("Could not find sessions array");
342342+ }
343343+ const el = findSessionObjectBySlug(sessionsArray, plan.slug);
344344+ if (!el) {
345345+ throw new Error(`Session not found: ${plan.slug}`);
346346+ }
347347+348348+ const localTitle = getStringProp(el, "title");
349349+ const localDesc = getStringProp(el, "description");
350350+ const hasDescProp = getPropertyAssignment(el, "description") !== undefined;
351351+352352+ if (localTitle === undefined) {
353353+ continue;
354354+ }
355355+356356+ const edits = buildSessionEdits(source, sf, el, plan.remote);
357357+ if (edits.length === 0) {
358358+ continue;
359359+ }
360360+361361+ if (plan.remote.title !== localTitle) {
362362+ changes.push({ slug: plan.slug, rkey: plan.rkey, field: "title" });
363363+ }
364364+ if (hasDescProp && localDesc !== undefined && plan.remote.description !== localDesc) {
365365+ changes.push({ slug: plan.slug, rkey: plan.rkey, field: "description" });
366366+ }
367367+ if (!hasDescProp && plan.remote.description.trim().length > 0) {
368368+ changes.push({ slug: plan.slug, rkey: plan.rkey, field: "add-description" });
369369+ }
370370+371371+ if (!dryRun) {
372372+ source = applyEdits(source, edits);
373373+ }
374374+ }
375375+376376+ if (changes.length === 0) {
377377+ console.log("No updates needed (conference data already matches atmo.rsvp).");
378378+ return;
379379+ }
380380+381381+ console.log(
382382+ `Planned ${changes.length} field update(s) across ${new Set(changes.map((c) => c.slug)).size} session(s):`,
383383+ );
384384+ for (const c of changes) {
385385+ console.log(` - ${c.slug} (${c.rkey}): ${c.field}`);
386386+ }
387387+388388+ if (dryRun) {
389389+ console.log("\nDry run: not writing src/data/conference.ts");
390390+ return;
391391+ }
392392+393393+ writeFileSync(CONFERENCE_PATH, source, "utf8");
394394+ console.log(`\nWrote ${CONFERENCE_PATH}. Run pnpm format (or oxfmt) on the file if needed.`);
395395+}
396396+397397+main().catch((err) => {
398398+ console.error(err);
399399+ process.exit(1);
400400+});
+145-120
src/data/conference.ts
···10341034 {
10351035 id: "sat-2301-2",
10361036 slug: "building-future-of-ai-on-atproto",
10371037- title: "Building Future of Artificial Intelligence on AT Protocol",
10371037+ title: "AI is Growing up in the Atmosphere",
10381038 description:
10391039- "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.",
10391039+ "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.",
10401040 speakers: ["Cameron Pfiffer"],
10411041 dayId: "2026-03-28",
10421042 trackSlug: "2301-classroom",
···10971097 slug: "account-logic-tee",
10981098 title: "Account logic in ATProto using Trusted Execution Environments",
10991099 description:
11001100- "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.",
11001100+ "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.",
11011101 speakers: ["Kobi Gurkan"],
11021102 dayId: "2026-03-28",
11031103 trackSlug: "2301-classroom",
···12031203 {
12041204 id: "sun-great-hall-1",
12051205 slug: "npmx-modern-browser-for-npm",
12061206- title: "npmx - a fast, modern browser for the npm registry",
12061206+ title: "npmx: a modern browser for the npm registry",
12071207 description:
12081208 "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.",
12091209 speakers: ["Zeu", "Patak"],
···12511251 slug: "social-components",
12521252 title: "Social Components",
12531253 description:
12541254- '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)',
12541254+ '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)',
12551255 speakers: ["Dan Abramov"],
12561256 dayId: "2026-03-29",
12571257 trackSlug: "great-hall-south",
···13121312 slug: "building-bridgy-not-walls",
13131313 title: "Building Bridgy, Not Walls",
13141314 description:
13151315- "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",
13151315+ "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",
13161316 speakers: ["Anuj Ahooja"],
13171317 dayId: "2026-03-29",
13181318 trackSlug: "great-hall-south",
···13421342 slug: "rewilding-internet-atproto",
13431343 title: "Rewilding the internet with ATProto",
13441344 description:
13451345- "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.",
13451345+ "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.",
13461346 speakers: ["Arushi Bandi"],
13471347 dayId: "2026-03-29",
13481348 trackSlug: "great-hall-south",
···14331433 slug: "bookhive-design-philosophy",
14341434 title: "ATProto design philosophy behind BookHive",
14351435 description:
14361436- "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.",
14361436+ "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",
14371437 speakers: ["Nicholas Perez"],
14381438 dayId: "2026-03-29",
14391439 trackSlug: "performance-theatre",
···14631463 slug: "jacquard-magic-rust",
14641464 title: "Jacquard Magic: how to make atproto actually easy with Rust",
14651465 description:
14661466- "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?",
14661466+ "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?",
14671467 speakers: ["Orual"],
14681468 dayId: "2026-03-29",
14691469 trackSlug: "performance-theatre",
···14791479 title:
14801480 "An artist dreaming in the Atmosphere: visions about community, sustainability and creativity",
14811481 description:
14821482- "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",
14821482+ "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",
14831483 speakers: ["Hilke Ros"],
14841484 dayId: "2026-03-29",
14851485 trackSlug: "performance-theatre",
···15081508 title:
15091509 "Unconf: Build and share personal apps, using an open source tool to help get started",
15101510 description:
15111511- "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",
15111511+ "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",
15121512 speakers: ["Jon"],
15131513 dayId: "2026-03-26",
15141514 trackSlug: "2311-classroom",
···15901590 title: "What futures can we build together?",
15911591 description:
15921592 "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.",
15931593- speakers: ["Arushi Bandi","Ivan Sigal","Christian Jacobs"],
15931593+ speakers: ["Arushi Bandi", "Ivan Sigal", "Christian Jacobs"],
15941594 dayId: "2026-03-26",
15951595 trackSlug: "performance-theatre",
15961596 startsAt: "2026-03-26T14:00:00-07:00",
···16301630 title: "Dive into user research with fellow ATProto builders and users",
16311631 description:
16321632 "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.",
16331633- speakers: ["Tessa Brown","Anna Mistele","Tynan Purdy"],
16331633+ speakers: ["Tessa Brown", "Anna Mistele", "Tynan Purdy"],
16341634 dayId: "2026-03-26",
16351635 trackSlug: "performance-theatre",
16361636 startsAt: "2026-03-26T16:30:00-07:00",
···16581658 title: "Opening Remarks",
16591659 description:
16601660 "Opening remarks from the ATScience conference organizing team",
16611661- speakers: ["Ronen Tamari","Torsten Goerke","Mathew Lowry","Ariel M. Lighty"],
16611661+ speakers: [
16621662+ "Ronen Tamari",
16631663+ "Torsten Goerke",
16641664+ "Mathew Lowry",
16651665+ "Ariel M. Lighty",
16661666+ ],
16621667 dayId: "2026-03-27",
16631668 trackSlug: "performance-theatre",
16641669 startsAt: "2026-03-27T09:00:00-07:00",
···16721677 title: "Keynote: Towards Modular Open Science",
16731678 description:
16741679 "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.",
16751675- speakers: ["Rowan Cockett","Matt Akamatsu"],
16801680+ speakers: ["Rowan Cockett", "Matt Akamatsu"],
16761681 dayId: "2026-03-27",
16771682 trackSlug: "performance-theatre",
16781683 startsAt: "2026-03-27T09:15:00-07:00",
···17401745 {
17411746 id: "rsvp-ats26-commons",
17421747 slug: "can-decentralists-cooperate-rethinking-commons-and-collective-action-in-the-age-of-platforms-and-ai",
17431743- title: "Can decentralists cooperate? Rethinking commons and collective action in the age of platforms and AI",
17481748+ title:
17491749+ "Can decentralists cooperate? Rethinking commons and collective action in the age of platforms and AI",
17441750 description:
17451751 "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.",
17461746- speakers: ["Laure Haak","Ellie DeSota","Nick Vincent"],
17521752+ speakers: ["Laure Haak", "Ellie DeSota", "Nick Vincent"],
17471753 dayId: "2026-03-27",
17481754 trackSlug: "bukhman-lounge",
17491755 startsAt: "2026-03-27T11:00:00-07:00",
17501756 endsAt: "2026-03-27T11:45:00-07:00",
17511757 atmoRsvpUrl: atmosphereRsvpEvent("ats26-commons"),
17521752- recordUri:
17581758+ recordUri:
17531759 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2rtfj5ec2m",
17541760 },
17551761 {
···18071813 startsAt: "2026-03-27T11:55:00-07:00",
18081814 endsAt: "2026-03-27T12:05:00-07:00",
18091815 atmoRsvpUrl: atmosphereRsvpEvent("ats26-skysquare"),
18101810- recordUri:
18161816+ recordUri:
18111817 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2u6pl6ah2z",
18121818 },
18131819 {
···18221828 startsAt: "2026-03-27T12:05:00-07:00",
18231829 endsAt: "2026-03-27T12:15:00-07:00",
18241830 atmoRsvpUrl: atmosphereRsvpEvent("ats26-viewsift"),
18251825- recordUri:
18311831+ recordUri:
18261832 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2son7re62m",
18271833 },
18281834 {
18291835 id: "rsvp-ats26-seams",
18301836 slug: "making-wisdom-together",
18311837 title: "Making wisdom together",
18321832- description:
18331833- "Seams.so demo and live workshop",
18381838+ description: "Seams.so demo and live workshop",
18341839 speakers: ["Anish Lakhwara"],
18351840 dayId: "2026-03-27",
18361841 trackSlug: "performance-theatre",
18371842 startsAt: "2026-03-27T12:15:00-07:00",
18381843 endsAt: "2026-03-27T12:25:00-07:00",
18391844 atmoRsvpUrl: atmosphereRsvpEvent("ats26-seams"),
18401840- recordUri:
18451845+ recordUri:
18411846 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2tdpailb2m",
18421847 },
18431848 {
···18521857 startsAt: "2026-03-27T13:30:00-07:00",
18531858 endsAt: "2026-03-27T13:45:00-07:00",
18541859 atmoRsvpUrl: atmosphereRsvpEvent("ats26-astrosky"),
18551855- recordUri:
18601860+ recordUri:
18561861 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi2wu5u5rs2i",
18571862 },
18581863 {
···18611866 title: "Sensemaking Systems + AI for Science",
18621867 description:
18631868 "Sensemaking systems demos from Seams, ViewSift, Skysquare and AI for science demos from Agentis and Coordination Network",
18641864- speakers: ["Semble","Skysquare","Viewsift"],
18691869+ speakers: ["Semble", "Skysquare", "Viewsift"],
18651870 dayId: "2026-03-27",
18661871 trackSlug: "bukhman-lounge",
18671872 startsAt: "2026-03-27T13:30:00-07:00",
···19161921 slug: "reigniting-the-party-lessons-from-a-stalled-migration-to-bluesky",
19171922 title: "Reigniting the Party: Lessons from a Stalled Migration to Bluesky",
19181923 description:
19191919- "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.",
19241924+ '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.',
19201925 speakers: ["Dr. Scott McGrath"],
19211926 dayId: "2026-03-27",
19221927 trackSlug: "performance-theatre",
···19311936 title: "Future of Science Social Media",
19321937 description:
19331938 "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.",
19341934- speakers: ["Ronen Tamari","Maria Antoniak","Dr. Scott McGrath","Ariel M. Lighty"],
19391939+ speakers: [
19401940+ "Ronen Tamari",
19411941+ "Maria Antoniak",
19421942+ "Dr. Scott McGrath",
19431943+ "Ariel M. Lighty",
19441944+ ],
19351945 dayId: "2026-03-27",
19361946 trackSlug: "performance-theatre",
19371947 startsAt: "2026-03-27T14:05:00-07:00",
19381948 endsAt: "2026-03-27T14:45:00-07:00",
19391949 atmoRsvpUrl: atmosphereRsvpEvent("ats26-our-socialmedia-future"),
19401940- recordUri:
19501950+ recordUri:
19411951 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi33ycoo5d2a",
19421952 },
19431953 {
···19461956 title: "Your Research Institution in the Atmosphere",
19471957 description:
19481958 "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.",
19491949- speakers: ["Mathew Lowry","Sill Social","Leaflet","Paul Fuxjäger"],
19591959+ speakers: ["Mathew Lowry", "Sill Social", "Leaflet", "Paul Fuxjäger"],
19501960 dayId: "2026-03-27",
19511961 trackSlug: "bukhman-lounge",
19521962 startsAt: "2026-03-27T14:45:00-07:00",
···19571967 {
19581968 id: "rsvp-ats26-research-synthesis",
19591969 slug: "crowdsourced-research-synthesis-on-atproto-envisioning-an-inclusive-future",
19601960- title: "Crowdsourced Research Synthesis on ATProto: Envisioning an Inclusive Future",
19701970+ title:
19711971+ "Crowdsourced Research Synthesis on ATProto: Envisioning an Inclusive Future",
19611972 description:
19621973 "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.",
19631974 speakers: ["Jay Patel"],
···19661977 startsAt: "2026-03-27T15:00:00-07:00",
19671978 endsAt: "2026-03-27T15:10:00-07:00",
19681979 atmoRsvpUrl: atmosphereRsvpEvent("ats26-research-synthesis"),
19691969- recordUri:
19801980+ recordUri:
19701981 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi34ps3oym2i",
19711982 },
19721983 {
···19811992 startsAt: "2026-03-27T15:10:00-07:00",
19821993 endsAt: "2026-03-27T15:25:00-07:00",
19831994 atmoRsvpUrl: atmosphereRsvpEvent("ats26-paperskygest"),
19841984- recordUri:
19951995+ recordUri:
19851996 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi35eplsua23",
19861997 },
19871998 {
19881999 id: "rsvp-ats26-comm-archive",
19892000 slug: "narrative-strands-and-memetic-lineages-in-community-social-data-using-community-archive",
19901990- title: "Narrative strands & memetic lineages in community social data using Community Archive",
20012001+ title:
20022002+ "Narrative strands & memetic lineages in community social data using Community Archive",
19912003 description:
19921992- "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.",
20042004+ '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.',
19932005 speakers: ["Francisco Carvalho"],
19942006 dayId: "2026-03-27",
19952007 trackSlug: "performance-theatre",
19962008 startsAt: "2026-03-27T15:25:00-07:00",
19972009 endsAt: "2026-03-27T15:40:00-07:00",
19982010 atmoRsvpUrl: atmosphereRsvpEvent("ats26-comm-archive"),
19991999- recordUri:
20112011+ recordUri:
20002012 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi36lcxgce2b",
20012013 },
20022014 {
···20112023 startsAt: "2026-03-27T15:40:00-07:00",
20122024 endsAt: "2026-03-27T15:55:00-07:00",
20132025 atmoRsvpUrl: atmosphereRsvpEvent("ats26-decentralize"),
20142014- recordUri:
20262026+ recordUri:
20152027 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi37ha3edb23",
20162028 },
20172029 {
20182030 id: "rsvp-000NewDirections",
20192031 slug: "new-directions",
20202032 title: "New Directions",
20212021- description:
20222022- "New Directions",
20232023- speakers: ["Blaine Cook","Aaron Steven White"],
20332033+ description: "New Directions",
20342034+ speakers: ["Blaine Cook", "Aaron Steven White"],
20242035 dayId: "2026-03-27",
20252036 trackSlug: "performance-theatre",
20262037 startsAt: "2026-03-27T16:00:00-07:00",
···20622073 title: "at://advent, an atproto adventure",
20632074 description:
20642075 "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.",
20652065- speakers: ["fig","bailey"],
20762076+ speakers: ["fig", "bailey"],
20662077 dayId: "2026-03-27",
20672078 trackSlug: "2311-classroom",
20682079 startsAt: "2026-03-27T16:30:00-07:00",
···20742085 id: "rsvp-opening-remarks-day-3",
20752086 slug: "opening-remarks-day-3",
20762087 title: "Opening Remarks Day 3",
20772077- description:
20782078- "Opening Remarks Day 3",
20882088+ description: "Opening Remarks Day 3",
20792089 speakers: [],
20802090 dayId: "2026-03-28",
20812091 trackSlug: "great-hall-south",
···20962106 startsAt: "2026-03-28T09:15:00-07:00",
20972107 endsAt: "2026-03-28T10:00:00-07:00",
20982108 atmoRsvpUrl: atmosphereRsvpEvent("gDELD0M"),
20992099- recordUri:
21092109+ recordUri:
21002110 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54jqrm372z",
21012111 },
21022112 {
21032113 id: "rsvp-J9yOpYz",
21042114 slug: "the-aggregation-era-burned-journalism-institutions-to-the-ground-the-federated-era-is-emerging-from-those-embers",
21052105- title: "The Aggregation Era burned journalism institutions to the ground. The federated era is emerging from those embers",
21152115+ title:
21162116+ "The Aggregation Era burned journalism institutions to the ground. The federated era is emerging from those embers",
21062117 description:
21072118 "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.",
21082119 speakers: ["Justin Bank"],
···21112122 startsAt: "2026-03-28T10:00:00-07:00",
21122123 endsAt: "2026-03-28T10:30:00-07:00",
21132124 atmoRsvpUrl: atmosphereRsvpEvent("J9yOpYz"),
21142114- recordUri:
21252125+ recordUri:
21152126 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54lyc5ts25",
21162127 },
21172128 {
21182129 id: "rsvp-BzrpDQK",
21192130 slug: "feature-product-business-a-framework-for-sustainable-atproto-projects",
21202120- title: "Feature / Product / Business: A Framework for Sustainable ATProto Projects",
21312131+ title:
21322132+ "Feature / Product / Business: A Framework for Sustainable ATProto Projects",
21212133 description:
21222134 "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)",
21232135 speakers: ["Mosh Lee"],
···21262138 startsAt: "2026-03-28T10:00:00-07:00",
21272139 endsAt: "2026-03-28T10:30:00-07:00",
21282140 atmoRsvpUrl: atmosphereRsvpEvent("BzrpDQK"),
21292129- recordUri:
21412141+ recordUri:
21302142 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54nec66s2w",
21312143 },
21322144 {
21332145 id: "rsvp-QK9Ae6Y",
21342146 slug: "groundings-with-my-siblings-lessons-learned-building-for-community",
21352135- title: "Groundings with my Siblings: Lessons Learned Building for Community",
21472147+ title:
21482148+ "Groundings with my Siblings: Lessons Learned Building for Community",
21362149 description:
21372150 "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.",
21382151 speakers: ["Rudy Fraser"],
···21412154 startsAt: "2026-03-28T10:00:00-07:00",
21422155 endsAt: "2026-03-28T10:30:00-07:00",
21432156 atmoRsvpUrl: atmosphereRsvpEvent("QK9Ae6Y"),
21442144- recordUri:
21572157+ recordUri:
21452158 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi54oonum62b",
21462159 },
21472160 {
···21562169 startsAt: "2026-03-28T10:30:00-07:00",
21572170 endsAt: "2026-03-28T11:00:00-07:00",
21582171 atmoRsvpUrl: atmosphereRsvpEvent("obLbvQV"),
21592159- recordUri:
21722172+ recordUri:
21602173 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi56m3hnrq2z",
21612174 },
21622175 {
···21712184 startsAt: "2026-03-28T10:30:00-07:00",
21722185 endsAt: "2026-03-28T11:00:00-07:00",
21732186 atmoRsvpUrl: atmosphereRsvpEvent("obaP26x"),
21742174- recordUri:
21872187+ recordUri:
21752188 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi56n6j2g22d",
21762189 },
21772190 {
···21862199 startsAt: "2026-03-28T11:00:00-07:00",
21872200 endsAt: "2026-03-28T11:30:00-07:00",
21882201 atmoRsvpUrl: atmosphereRsvpEvent("ODxNLMM"),
21892189- recordUri:
22022202+ recordUri:
21902203 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5a2y3tej2z",
21912204 },
21922205 {
21932206 id: "rsvp-81VNEBO",
21942207 slug: "creators-first-video-and-media-as-the-foundation-of-a-thriving-creator-economy-on-atproto",
21952195- title: "Creators First: Video & Media as the Foundation of a Thriving Creator Economy on ATProto",
22082208+ title:
22092209+ "Creators First: Video & Media as the Foundation of a Thriving Creator Economy on ATProto",
21962210 description:
21972211 "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.",
21982212 speakers: ["Joe Basser"],
···22012215 startsAt: "2026-03-28T11:00:00-07:00",
22022216 endsAt: "2026-03-28T11:30:00-07:00",
22032217 atmoRsvpUrl: atmosphereRsvpEvent("81VNEBO"),
22042204- recordUri:
22182218+ recordUri:
22052219 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5aarspma27",
22062220 },
22072221 {
···22102224 title: "A discussion with news creators",
22112225 description:
22122226 "Publishing changes as the internet has changed. We'll discuss the work of being news creators in this moment.",
22132213- speakers: ["Ted Han","Justin Bank","Lauren Saks"],
22272227+ speakers: ["Ted Han", "Justin Bank", "Lauren Saks"],
22142228 dayId: "2026-03-28",
22152229 trackSlug: "performance-theatre",
22162230 startsAt: "2026-03-28T11:30:00-07:00",
22172231 endsAt: "2026-03-28T12:00:00-07:00",
22182232 atmoRsvpUrl: atmosphereRsvpEvent("VLa69bl"),
22192219- recordUri:
22332233+ recordUri:
22202234 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5bya72ub2d",
22212235 },
22222236 {
···22312245 startsAt: "2026-03-28T11:30:00-07:00",
22322246 endsAt: "2026-03-28T12:00:00-07:00",
22332247 atmoRsvpUrl: atmosphereRsvpEvent("7Rrv0E0"),
22342234- recordUri:
22482248+ recordUri:
22352249 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5bcpyqg32a",
22362250 },
22372251 {
···22602274 startsAt: "2026-03-28T13:30:00-07:00",
22612275 endsAt: "2026-03-28T13:40:00-07:00",
22622276 atmoRsvpUrl: atmosphereRsvpEvent("000Syverson"),
22632263- recordUri:
22772277+ recordUri:
22642278 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5hza73vs2z",
22652279 },
22662280 {
22672281 id: "rsvp-QKlrLXG",
22682282 slug: "advocating-for-digital-sovereignty-european-experiences-and-global-lessons",
22692269- title: "Advocating for Digital Sovereignty: European Experiences and Global Lessons",
22832283+ title:
22842284+ "Advocating for Digital Sovereignty: European Experiences and Global Lessons",
22702285 description:
22712286 "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.",
22722287 speakers: ["Sandra Barthel"],
···22752290 startsAt: "2026-03-28T13:30:00-07:00",
22762291 endsAt: "2026-03-28T14:00:00-07:00",
22772292 atmoRsvpUrl: atmosphereRsvpEvent("QKlrLXG"),
22782278- recordUri:
22932293+ recordUri:
22792294 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5hx4v6cr26",
22802295 },
22812296 {
···22902305 startsAt: "2026-03-28T13:40:00-07:00",
22912306 endsAt: "2026-03-28T13:50:00-07:00",
22922307 atmoRsvpUrl: atmosphereRsvpEvent("81Xovjr"),
22932293- recordUri:
23082308+ recordUri:
22942309 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5itmi65s2z",
22952310 },
22962311 {
···23052320 startsAt: "2026-03-28T14:00:00-07:00",
23062321 endsAt: "2026-03-28T14:30:00-07:00",
23072322 atmoRsvpUrl: atmosphereRsvpEvent("LZxV6dv"),
23082308- recordUri:
23232323+ recordUri:
23092324 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5jmsg6kn2m",
23102325 },
23112326 {
···23202335 startsAt: "2026-03-28T14:00:00-07:00",
23212336 endsAt: "2026-03-28T14:30:00-07:00",
23222337 atmoRsvpUrl: atmosphereRsvpEvent("OD2PpYA"),
23232323- recordUri:
23382338+ recordUri:
23242339 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5jrjmk6y2n",
23252340 },
23262341 {
···23352350 startsAt: "2026-03-28T14:30:00-07:00",
23362351 endsAt: "2026-03-28T15:00:00-07:00",
23372352 atmoRsvpUrl: atmosphereRsvpEvent("ja4ooAa"),
23382338- recordUri:
23532353+ recordUri:
23392354 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5lexqbqf2z",
23402355 },
23412356 {
23422357 id: "rsvp-Y561Qv6",
23432358 slug: "from-protocol-to-product-how-expo-powers-the-next-wave-of-at-proto-applications",
23442344- title: "From protocol to product: How Expo powers the next wave of AT Proto applications",
23592359+ title:
23602360+ "From protocol to product: How Expo powers the next wave of AT Proto applications",
23452361 description:
23462362 "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.",
23472347- speakers: ["Eliot Hertenstein","Paul Frazee","Eli Mallon","Reed Harmeyer"],
23632363+ speakers: [
23642364+ "Eliot Hertenstein",
23652365+ "Paul Frazee",
23662366+ "Eli Mallon",
23672367+ "Reed Harmeyer",
23682368+ ],
23482369 dayId: "2026-03-28",
23492370 trackSlug: "great-hall-south",
23502371 startsAt: "2026-03-28T14:30:00-07:00",
23512372 endsAt: "2026-03-28T15:00:00-07:00",
23522373 atmoRsvpUrl: atmosphereRsvpEvent("Y561Qv6"),
23532353- recordUri:
23742374+ recordUri:
23542375 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5ldvd46r2i",
23552376 },
23562377 {
···23592380 title: "2026 Atmosphere Report",
23602381 description:
23612382 "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",
23622362- speakers: ["Paul Frazee","Jay Graber"],
23832383+ speakers: ["Paul Frazee", "Jay Graber"],
23632384 dayId: "2026-03-28",
23642385 trackSlug: "great-hall-south",
23652386 startsAt: "2026-03-28T15:00:00-07:00",
···23802401 startsAt: "2026-03-28T16:00:00-07:00",
23812402 endsAt: "2026-03-28T16:10:00-07:00",
23822403 atmoRsvpUrl: atmosphereRsvpEvent("Bzr448Q"),
23832383- recordUri:
24042404+ recordUri:
23842405 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5q3oibtu2i",
23852406 },
23862407 {
···23952416 startsAt: "2026-03-28T16:00:00-07:00",
23962417 endsAt: "2026-03-28T16:10:00-07:00",
23972418 atmoRsvpUrl: atmosphereRsvpEvent("OD6Gd0A"),
23982398- recordUri:
24192419+ recordUri:
23992420 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5q57diht27",
24002421 },
24012422 {
···24102431 startsAt: "2026-03-28T16:10:00-07:00",
24112432 endsAt: "2026-03-28T16:20:00-07:00",
24122433 atmoRsvpUrl: atmosphereRsvpEvent("000WSocial"),
24132413- recordUri:
24342434+ recordUri:
24142435 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5qzkwfe42z",
24152436 },
24162437 {
···24252446 startsAt: "2026-03-28T16:10:00-07:00",
24262447 endsAt: "2026-03-28T16:20:00-07:00",
24272448 atmoRsvpUrl: atmosphereRsvpEvent("2EG4YMj"),
24282428- recordUri:
24492449+ recordUri:
24292450 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5qywid6z25",
24302451 },
24312452 {
24322453 id: "rsvp-000Ryo",
24332454 slug: "bridging-social-graphs-how-sky-follower-bridge-helps-people-move-to-bluesky",
24342434- title: "Bridging Social Graphs: How Sky Follower Bridge helps people move to Bluesky",
24552455+ title:
24562456+ "Bridging Social Graphs: How Sky Follower Bridge helps people move to Bluesky",
24352457 description:
24362458 "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.",
24372459 speakers: ["Ryo Kawamata"],
···24402462 startsAt: "2026-03-28T16:20:00-07:00",
24412463 endsAt: "2026-03-28T16:30:00-07:00",
24422464 atmoRsvpUrl: atmosphereRsvpEvent("000Ryo"),
24432443- recordUri:
24652465+ recordUri:
24442466 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5rl4r4a725",
24452467 },
24462468 {
···24552477 startsAt: "2026-03-28T16:20:00-07:00",
24562478 endsAt: "2026-03-28T16:30:00-07:00",
24572479 atmoRsvpUrl: atmosphereRsvpEvent("000Jer"),
24582458- recordUri:
24802480+ recordUri:
24592481 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5rm4y7ts2b",
24602482 },
24612483 {
···24702492 startsAt: "2026-03-28T16:30:00-07:00",
24712493 endsAt: "2026-03-28T16:40:00-07:00",
24722494 atmoRsvpUrl: atmosphereRsvpEvent("2EGLPML"),
24732473- recordUri:
24952495+ recordUri:
24742496 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5s2x6tkd2d",
24752497 },
24762498 {
···24852507 startsAt: "2026-03-28T16:30:00-07:00",
24862508 endsAt: "2026-03-28T16:40:00-07:00",
24872509 atmoRsvpUrl: atmosphereRsvpEvent("lbkWPeN"),
24882488- recordUri:
25102510+ recordUri:
24892511 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5s4foj7h2a",
24902512 },
24912513 {
···24942516 title: "A Free Press needs Free Protocols",
24952517 description:
24962518 "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!)",
24972497- speakers: ["Joe Germuska","Ben Werdmuller"],
25192519+ speakers: ["Joe Germuska", "Ben Werdmuller"],
24982520 dayId: "2026-03-28",
24992521 trackSlug: "performance-theatre",
25002522 startsAt: "2026-03-28T16:45:00-07:00",
25012523 endsAt: "2026-03-28T17:15:00-07:00",
25022524 atmoRsvpUrl: atmosphereRsvpEvent("EkGROKB"),
25032503- recordUri:
25252525+ recordUri:
25042526 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5sn7zmfy23",
25052527 },
25062528 {
···25152537 startsAt: "2026-03-28T16:45:00-07:00",
25162538 endsAt: "2026-03-28T17:15:00-07:00",
25172539 atmoRsvpUrl: atmosphereRsvpEvent("OD2G9j8"),
25182518- recordUri:
25402540+ recordUri:
25192541 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5spj6izy2a",
25202542 },
25212543 {
···25302552 startsAt: "2026-03-28T17:15:00-07:00",
25312553 endsAt: "2026-03-28T17:45:00-07:00",
25322554 atmoRsvpUrl: atmosphereRsvpEvent("PdJ6Q8d"),
25332533- recordUri:
25552555+ recordUri:
25342556 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5unzkbat27",
25352557 },
25362558 {
25372559 id: "rsvp-rj8Xv62",
25382560 slug: "this-title-left-intentionally-blank",
25392561 title: "This Title Left Intentionally Blank",
25402540- description:
25412541- "From Software Engineering to Software Ecologies",
25622562+ description: "From Software Engineering to Software Ecologies",
25422563 speakers: ["Blaine Cook"],
25432564 dayId: "2026-03-28",
25442565 trackSlug: "great-hall-south",
25452566 startsAt: "2026-03-28T17:15:00-07:00",
25462567 endsAt: "2026-03-28T17:45:00-07:00",
25472568 atmoRsvpUrl: atmosphereRsvpEvent("rj8Xv62"),
25482548- recordUri:
25692569+ recordUri:
25492570 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5unhqisv22",
25502571 },
25512572 {
···25582579 startsAt: "2026-03-28T17:45:00-07:00",
25592580 endsAt: "2026-03-28T18:00:00-07:00",
25602581 atmoRsvpUrl: atmosphereRsvpEvent("day-3-closing-remarks"),
25612561- recordUri:
25822582+ recordUri:
25622583 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi5wqocga62h",
25632584 },
25642585 {
25652586 id: "rsvp-opening-remarks-day-4",
25662587 slug: "opening-remarks-day-4",
25672588 title: "Opening Remarks Day 4",
25682568- description:
25692569- "Opening Remarks Day 4",
25892589+ description: "Opening Remarks Day 4",
25702590 speakers: [],
25712591 dayId: "2026-03-29",
25722592 trackSlug: "great-hall-south",
25732593 startsAt: "2026-03-29T09:00:00-07:00",
25742594 endsAt: "2026-03-29T09:15:00-07:00",
25752595 atmoRsvpUrl: atmosphereRsvpEvent("opening-remarks-day-4"),
25762576- recordUri:
25962596+ recordUri:
25772597 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7jhwzagl2n",
25782598 },
25792599 {
···25882608 startsAt: "2026-03-29T10:00:00-07:00",
25892609 endsAt: "2026-03-29T10:30:00-07:00",
25902610 atmoRsvpUrl: atmosphereRsvpEvent("Mej2N5X"),
25912591- recordUri:
26112611+ recordUri:
25922612 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7lapdbjc2t",
25932613 },
25942614 {
···26032623 startsAt: "2026-03-29T10:30:00-07:00",
26042624 endsAt: "2026-03-29T11:00:00-07:00",
26052625 atmoRsvpUrl: atmosphereRsvpEvent("WOkL11Q"),
26062606- recordUri:
26262626+ recordUri:
26072627 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7ok5zmuk2k",
26082628 },
26092629 {
26102630 id: "rsvp-jaAWVRY",
26112631 slug: "bringing-self-sovereign-identities-to-the-masses-via-atproto-and-how-to-maximize-coherence-between-upcoming-did-plc-forks",
26122612- title: "Bringing Self Sovereign Identities to the Masses via ATproto (and how to maximize coherence between upcoming DID:PLC forks)",
26322632+ title:
26332633+ "Bringing Self Sovereign Identities to the Masses via ATproto (and how to maximize coherence between upcoming DID:PLC forks)",
26132634 description:
26142635 "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/",
26152636 speakers: ["Paul Fuxjäger"],
···26182639 startsAt: "2026-03-29T10:30:00-07:00",
26192640 endsAt: "2026-03-29T11:00:00-07:00",
26202641 atmoRsvpUrl: atmosphereRsvpEvent("jaAWVRY"),
26212621- recordUri:
26422642+ recordUri:
26222643 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7o5amqqx2d",
26232644 },
26242645 {
···26332654 startsAt: "2026-03-29T11:00:00-07:00",
26342655 endsAt: "2026-03-29T11:30:00-07:00",
26352656 atmoRsvpUrl: atmosphereRsvpEvent("ODqQQJA"),
26362636- recordUri:
26572657+ recordUri:
26372658 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7pjfdkhv2b",
26382659 },
26392660 {
26402661 id: "rsvp-zxRkxk8",
26412662 slug: "blousques-case-study-on-the-challenges-in-translating-bluesky-s-ui",
26422642- title: "Blousques: Case Study on the Challenges in Translating Bluesky's UI",
26632663+ title:
26642664+ "Blousques: Case Study on the Challenges in Translating Bluesky's UI",
26432665 description:
26442666 "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.",
26452667 speakers: ["Stanislas Signoud (Signez)"],
···26482670 startsAt: "2026-03-29T11:00:00-07:00",
26492671 endsAt: "2026-03-29T11:30:00-07:00",
26502672 atmoRsvpUrl: atmosphereRsvpEvent("zxRkxk8"),
26512651- recordUri:
26732673+ recordUri:
26522674 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7q5mjlbe2c",
26532675 },
26542676 {
···26682690 {
26692691 id: "rsvp-kdobWjj",
26702692 slug: "a-fireside-chat-on-resonant-computing-why-we-wrote-the-manifesto-and-where-we-go-from-here",
26712671- title: "A Fireside Chat on Resonant Computing: Why we wrote the manifesto and where we go from here",
26932693+ title:
26942694+ "A Fireside Chat on Resonant Computing: Why we wrote the manifesto and where we go from here",
26722695 description:
26732696 "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.",
26742674- speakers: ["Alex Komoroske","Mike Masnick"],
26972697+ speakers: ["Alex Komoroske", "Mike Masnick"],
26752698 dayId: "2026-03-29",
26762699 trackSlug: "great-hall-south",
26772700 startsAt: "2026-03-29T11:30:00-07:00",
26782701 endsAt: "2026-03-29T12:00:00-07:00",
26792702 atmoRsvpUrl: atmosphereRsvpEvent("kdobWjj"),
26802680- recordUri:
27032703+ recordUri:
26812704 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7rvqdpj722",
26822705 },
26832706 {
···26922715 startsAt: "2026-03-29T13:30:00-07:00",
26932716 endsAt: "2026-03-29T14:00:00-07:00",
26942717 atmoRsvpUrl: atmosphereRsvpEvent("2E9XG1b"),
26952695- recordUri:
27182718+ recordUri:
26962719 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7tcodsqu2t",
26972720 },
26982721 {
···27072730 startsAt: "2026-03-29T13:30:00-07:00",
27082731 endsAt: "2026-03-29T14:00:00-07:00",
27092732 atmoRsvpUrl: atmosphereRsvpEvent("EkexvrN"),
27102710- recordUri:
27332733+ recordUri:
27112734 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mi7tbwgymp25",
27122735 },
27132736 {
···27222745 startsAt: "2026-03-29T14:00:00-07:00",
27232746 endsAt: "2026-03-29T14:30:00-07:00",
27242747 atmoRsvpUrl: atmosphereRsvpEvent("LZ4oWrj"),
27252725- recordUri:
27482748+ recordUri:
27262749 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia26ffz2j2c",
27272750 },
27282751 {
···27372760 startsAt: "2026-03-29T14:30:00-07:00",
27382761 endsAt: "2026-03-29T15:00:00-07:00",
27392762 atmoRsvpUrl: atmosphereRsvpEvent("0Qq9NlZ"),
27402740- recordUri:
27632763+ recordUri:
27412764 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia3vm5oyd2u",
27422765 },
27432766 {
27442767 id: "rsvp-WObY04Q",
27452768 slug: "furryli-st-building-communities-without-landlords-from-the-protocol-up",
27462746- title: "furryli.st — Building Communities Without Landlords From the Protocol Up",
27692769+ title:
27702770+ "furryli.st — Building Communities Without Landlords From the Protocol Up",
27472771 description:
27482748- "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.",
27722772+ '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.',
27492773 speakers: ["Baldemar Motomochi"],
27502774 dayId: "2026-03-29",
27512775 trackSlug: "performance-theatre",
27522776 startsAt: "2026-03-29T14:30:00-07:00",
27532777 endsAt: "2026-03-29T15:00:00-07:00",
27542778 atmoRsvpUrl: atmosphereRsvpEvent("WObY04Q"),
27552755- recordUri:
27792779+ recordUri:
27562780 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia3svkvjw22",
27572781 },
27582782 {
27592783 id: "rsvp-000WebTiles",
27602784 slug: "webtiles-showcase",
27612785 title: "WebTiles Showcase",
27622762- description:
27632763- "WebTiles Showcase",
27642764- speakers: ["Ted Han","Robin Berjon"],
27862786+ description: "WebTiles Showcase",
27872787+ speakers: ["Ted Han", "Robin Berjon"],
27652788 dayId: "2026-03-29",
27662789 trackSlug: "2301-classroom",
27672790 startsAt: "2026-03-29T15:00:00-07:00",
27682791 endsAt: "2026-03-29T15:30:00-07:00",
27692792 atmoRsvpUrl: atmosphereRsvpEvent("000WebTiles"),
27702770- recordUri:
27932793+ recordUri:
27712794 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia5q5vu4q2h",
27722795 },
27732796 {
···27822805 startsAt: "2026-03-29T16:00:00-07:00",
27832806 endsAt: "2026-03-29T16:10:00-07:00",
27842807 atmoRsvpUrl: atmosphereRsvpEvent("5B02jaM"),
27852785- recordUri:
28082808+ recordUri:
27862809 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3mia7iun75l2x",
27872810 },
27882811 {
···27972820 startsAt: "2026-03-29T16:10:00-07:00",
27982821 endsAt: "2026-03-29T16:20:00-07:00",
27992822 atmoRsvpUrl: atmosphereRsvpEvent("QKNkKMX"),
28002800- recordUri:
28232823+ recordUri:
28012824 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miabh2g67c2c",
28022825 },
28032826 {
28042827 id: "rsvp-ob8N65V",
28052828 slug: "how-to-use-bluesky-to-easily-and-securely-preview-a-software-product-to-users",
28062806- title: "How to use Bluesky to easily and securely preview a software product to users.",
28292829+ title:
28302830+ "How to use Bluesky to easily and securely preview a software product to users.",
28072831 description:
28082832 "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.",
28092833 speakers: ["Tim Burks"],
···28122836 startsAt: "2026-03-29T16:20:00-07:00",
28132837 endsAt: "2026-03-29T16:30:00-07:00",
28142838 atmoRsvpUrl: atmosphereRsvpEvent("ob8N65V"),
28152815- recordUri:
28392839+ recordUri:
28162840 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miacmdq4sm2a",
28172841 },
28182842 {
28192843 id: "rsvp-xX5yRJr",
28202844 slug: "skylimit-a-curating-web-client-with-fine-grained-controls-to-mimic-the-newspaper-experience",
28212821- title: "Skylimit: A curating web client with fine-grained controls to mimic the newspaper experience",
28452845+ title:
28462846+ "Skylimit: A curating web client with fine-grained controls to mimic the newspaper experience",
28222847 description:
28232848 "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.",
28242849 speakers: ["Ramalingam Saravanan"],
···28272852 startsAt: "2026-03-29T16:20:00-07:00",
28282853 endsAt: "2026-03-29T16:30:00-07:00",
28292854 atmoRsvpUrl: atmosphereRsvpEvent("xX5yRJr"),
28302830- recordUri:
28552855+ recordUri:
28312856 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miac5ez6a22r",
28322857 },
28332858 {
···28422867 startsAt: "2026-03-29T16:20:00-07:00",
28432868 endsAt: "2026-03-29T16:30:00-07:00",
28442869 atmoRsvpUrl: atmosphereRsvpEvent("686gZde"),
28452845- recordUri:
28702870+ recordUri:
28462871 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miac3urhgt23",
28472872 },
28482873 {
···28572882 startsAt: "2026-03-29T16:30:00-07:00",
28582883 endsAt: "2026-03-29T17:00:00-07:00",
28592884 atmoRsvpUrl: atmosphereRsvpEvent("RG6Nepp"),
28602860- recordUri:
28852885+ recordUri:
28612886 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miadb23fme2a",
28622887 },
28632888 {
···28722897 startsAt: "2026-03-29T16:30:00-07:00",
28732898 endsAt: "2026-03-29T16:40:00-07:00",
28742899 atmoRsvpUrl: atmosphereRsvpEvent("000TLog"),
28752875- recordUri:
29002900+ recordUri:
28762901 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miacona6fc2e",
28772902 },
28782903 {
···28872912 startsAt: "2026-03-29T16:40:00-07:00",
28882913 endsAt: "2026-03-29T16:50:00-07:00",
28892914 atmoRsvpUrl: atmosphereRsvpEvent("ZjMOl7o"),
28902890- recordUri:
29152915+ recordUri:
28912916 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miadd43al32c",
28922917 },
28932918 {
···29022927 startsAt: "2026-03-29T17:00:00-07:00",
29032928 endsAt: "2026-03-29T17:30:00-07:00",
29042929 atmoRsvpUrl: atmosphereRsvpEvent("QKqWDrG"),
29052905- recordUri:
29302930+ recordUri:
29062931 "at://did:plc:rbvrr34edl5ddpuwcubjiost/place.stream.video/3miadvkvhfv2h",
29072932 },
29082933];