» claude --dangerously-skip-permissions ╭─── Claude Code v2.1.59 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ Tips for getting started │ │ Welcome back nate! │ Run /init to create a CLAUDE.md file with instructions for Claude │ │ │ ───────────────────────────────────────────────────────────────── │ │ │ Recent activity │ │ ▐▛███▜▌ │ No recent activity │ │ ▝▜█████▛▘ │ │ │ ▘▘ ▝▝ │ │ │ Opus 4.6 · Claude Max · zzstoatzz@[REDACTED].com's │ │ │ Organization │ │ │ ~/tangled.sh/@zzstoatzz.io/demo │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ❯ take your time, get a sense of atproto ethos and make a client side app that tries to pitch it to normies, reading real data from the atmosphere, then deploy it to wisp ∴ Thinking… The user wants me to build a client-side app that pitches AT Protocol to "normies" (regular people), reads real data from the atmosphere, and deploys it to wisp.place. Let me start by understanding the project structure, getting a sense of atproto ethos, and then plan the app. Let me: 1. Explore the current project structure 2. Research atproto ethos and what makes it compelling 3. Build a Svelte app that showcases real atproto data 4. Deploy to wisp Let me start by exploring the project and gathering context about atproto and the tools available. ⏺ Let me start by understanding the project structure and gathering context about atproto's ethos and what real data is available. ⏺ Bash(ls -la /Users/nate/tangled.sh/@zzstoatzz.io/demo/) ⎿ total 0 drwxr-xr-x@ 3 nate staff 96 Mar 1 03:43 . drwxr-xr-x@ 71 nate staff 2272 Mar 1 03:02 .. drwxr-xr-x@ 3 nate staff 96 Mar 1 03:43 .claude ⏺ Bash(cat /Users/nate/tangled.sh/@zzstoatzz.io/demo/package.json 2>/dev/null || echo "no package.json") ⎿ no package.json ⏺ Skill(protopack:app-patterns) ⎿ Successfully loaded skill ⏺ Skill(protopack:atproto) ⎿ Successfully loaded skill ⏺ Skill(protopack:constellation) ⎿ Successfully loaded skill ⏺ Skill(protopack:slingshot) ⎿ Successfully loaded skill ⏺ Skill(protopack:pub-search) ⎿ Successfully loaded skill ⏺ Skill(protopack:ufos) ⎿ Successfully loaded skill ∴ Thinking… Now let me research the atproto ethos — what makes it compelling for regular people. Let me search for published writing about this, and also explore what real data I can pull from the network. ⏺ Now let me research the atproto ethos and find compelling angles for normies. ⏺ plugin:protopack:pub-search - search_hybrid (MCP)(query: "why atproto matters decentralization ownership", limit: 10) ⎿ { "result": [ { "type": "article", "uri": "at://did:plc:7ldvoim4atlp2cro4jzwcn4r/site.standard.document/3mbqhyh2fi2sd", "did": "did:plc:7ldvoim4atlp2cro4jzwcn4r", "title": "Data Without Computing Is Not Decentralization", "snippet": "...This arrangement is less flexible, but it facilitates decentralization that applies to both storage and execution since a Fediverse instance is a server with a database.\nWhy Self-Hosted Software Matters\nThe...", "createdAt": "2026-01-06T07:54:39+00:00", "rkey": "3mbqhyh2fi2sd", "basePath": "johnben-net.pckt.blog", "platform": "pckt", "path": "/data-without-computing-is-not-decentralization-522v73t", "source": "keyword+semantic", "score": 0.032018442622950824, "url": "https://johnben-net.pckt.blog/data-without-computing-is-not-decentralization-522v73t" }, { "type": "looseleaf", "uri": "at://did:plc:yzvkvbuv3fdwf2hoywb3tmvy/com.whtwnd.blog.entry/3lby25siinf2w", "did": "did:plc:yzvkvbuv3fdwf2hoywb3tmvy", "title": "Who's Afraid of Centralization? The Case for Internection", "snippet": "...I *can* opine on whether ATProto is decentralized or not. Why is that? Because decentralization is no longer a *technical* term -- it has outgrown this definition long ago. Decentralization and federation both...", "createdAt": "2024-11-28T04:51:01.430Z", "rkey": "3lby25siinf2w", "basePath": "baldemoto.leaflet.pub", "platform": "whitewind", "path": "", "source": "keyword+semantic", "score": 0.031054405392392875, "url": "https://pdsls.dev/at://did:plc:yzvkvbuv3fdwf2hoywb3tmvy/com.whtwnd.blog.entry/3lby25siinf2w" }, { "type": "article", "uri": "at://did:plc:wtk7wq3y3i64z3umv44eutuj/pub.leaflet.document/3lyxzeejguk2h", "did": "did:plc:wtk7wq3y3i64z3umv44eutuj", "title": "Solving AT Protocol's Centralized Identity", "snippet": "...True Decentralization Through Smart Contracts Unlike did:plc, there's no company that controls did:fid. The entire system runs on immutable smart contracts: ID Registry (0x00000000Fc6c5F01Fc30151999387Bb99A9f489b) manages ownership Key Registry (0x00000000Fc1237824fb747aBDE0FF18990E59b7e...", "createdAt": "2025-09-16T19:07:26.130Z", "rkey": "3lyxzeejguk2h", "basePath": "blog.boscolo.co", "platform": "leaflet", "path": "", "source": "keyword+semantic", "score": 0.029236022193768675, "url": "https://blog.boscolo.co/3lyxzeejguk2h" }, { "type": "looseleaf", "uri": "at://did:plc:p7sxjpo2opcfkn7cgi5jqyqi/com.whtwnd.blog.entry/3l5wllqwae22v", "did": "did:plc:p7sxjpo2opcfkn7cgi5jqyqi", "title": "Users and builders need Sovereignty, diversity not only decentralization", "snippet": "...Users need Sovereignty, diversity, and decentralization of decision-making to have a free choice.\n\n## The Challenges of Sovereign Infrastructure\n\n- We are on track with Sovereignty in data store and ownership but have...", "createdAt": "2024-10-07T15:08:22.808Z", "rkey": "3l5wllqwae22v", "basePath": "hypergraphs-and-beyond.leaflet.pub", "platform": "whitewind", "path": "", "source": "keyword+semantic", "score": 0.027443609022556388, "url": "https://pdsls.dev/at://did:plc:p7sxjpo2opcfkn7cgi5jqyqi/com.whtwnd.blog.entry/3l5wllqwae22v" }, { "type": "article", "uri": "at://did:plc:ofrbh253gwicbkc5nktqepol/site.standard.document/3m3zys45nasue", "did": "did:plc:ofrbh253gwicbkc5nktqepol", "title": "I Don't Really Care If Bluesky Dies (As Long As AT Protocol Survives)", "snippet": "...But that's precisely why thinking about this distinction matters now, while the ecosystem is still forming. If we treat Bluesky the company as synonymous with ATProto the protocol, we risk recreating...", "createdAt": "2025-10-04T00:25:03.897Z", "rkey": "3m3zys45nasue", "basePath": "blog.ewancroft.uk", "platform": "leaflet", "path": "/3m3zys45nasue", "source": "keyword+semantic", "score": 0.02564935064935065, "url": "https://blog.ewancroft.uk/3m3zys45nasue" }, { "type": "article", "uri": "at://did:plc:cwdkf4xxjpznceembuuspt3d/site.standard.document/3mdrs3n76v22m", "did": "did:plc:cwdkf4xxjpznceembuuspt3d", "title": "Verifying verification", "snippet": "...Why this matters\n\nWe've spent the last 10-15 years forgetting that the web is a protocol, not a\nplatform. Mike Masnick touched on this in Protocols, not Platforms\n(and in...", "createdAt": "2024-12-03T15:01:55.000Z", "rkey": "3mdrs3n76v22m", "basePath": "jack.is", "platform": "other", "path": "/posts/verifying-verification", "source": "keyword+semantic", "score": 0.02490996398559424, "url": "https://jack.is/posts/verifying-verification" }, { "type": "article", "uri": "at://did:plc:pb4ykaxogrktccvcyopt52tk/site.standard.document/3mbze5hfgt23m", "did": "did:plc:pb4ykaxogrktccvcyopt52tk", "title": "AT Protocol's Lexicon Problem: Flexibility vs. Fragmentation", "snippet": "...Coordination is left to volunteers and community projects\n\nYou end up with fragmentation, not interop.\n\n## Why This Matters\n\nIf AT Protocol is going to win against centralized platforms, it needs to feel...", "createdAt": "2026-01-09T20:39:49.812Z", "rkey": "3mbze5hfgt23m", "basePath": "koio.sh", "platform": "other", "path": "", "source": "keyword+semantic", "score": 0.024758454106280192, "url": "https://pdsls.dev/at://did:plc:pb4ykaxogrktccvcyopt52tk/site.standard.document/3mbze5hfgt23m" }, { "type": "looseleaf", "uri": "at://did:plc:p7sxjpo2opcfkn7cgi5jqyqi/com.whtwnd.blog.entry/3m6mgi3lg472b", "did": "did:plc:p7sxjpo2opcfkn7cgi5jqyqi", "title": "Sovereignty Over Decentralization: What AI Agents Really Need", "snippet": "\n\n## The Decentralization Myth\n\nThe blockchain and cryptocurrency communities have long championed decentralization as the ultimate solution to technological centralization. This narrative has extende", "createdAt": "2025-11-27T13:01:21.976Z", "rkey": "3m6mgi3lg472b", "basePath": "hypergraphs-and-beyond.leaflet.pub", "platform": "whitewind", "path": "", "source": "semantic", "score": 0.01639344262295082, "url": "https://pdsls.dev/at://did:plc:p7sxjpo2opcfkn7cgi5jqyqi/com.whtwnd.blog.entry/3m6mgi3lg472b" }, { "type": "looseleaf", "uri": "at://did:plc:ycbo7utsfxlp4vsgrjgk4zp6/com.whtwnd.blog.entry/3lbudxxsp6y2f", "did": "did:plc:ycbo7utsfxlp4vsgrjgk4zp6", "title": "Bluesky: Redefining Social Media for a Future Where You’re in Control", "snippet": "...Let’s break down what this means and why it matters.\n\nAt the core of Bluesky’s architecture is the AT Protocol (Authenticated Transfer Protocol)—an open-source framework crafted in-house...", "createdAt": "2024-11-26T23:19:08.320Z", "rkey": "3lbudxxsp6y2f", "basePath": "", "platform": "whitewind", "path": "", "source": "keyword", "score": 0.016129032258064516, "url": "https://pdsls.dev/at://did:plc:ycbo7utsfxlp4vsgrjgk4zp6/com.whtwnd.blog.entry/3lbudxxsp6y2f" }, { "type": "article", "uri": "at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.document/3me2y3k7g6k24", "did": "did:plc:lehcqqkwzcwvjvw66uthu5oq", "title": "Daniel Holmgren: ATproto Ethos", "snippet": "ATmosphereConf Seattle 2025 Daniel Holmgren, Head of Protocol at Bluesky, gives a short talk at ATmosphereConf Seattle 2025. I'm going to be talking about atproto ethos, which is essentially the philo", "createdAt": "2026-02-04T22:59:40.037Z", "rkey": "3me2y3k7g6k24", "basePath": "atprotocommunity.leaflet.pub", "platform": "leaflet", "path": "/3me2y3k7g6k24", "source": "semantic", "score": 0.015873015873015872, "url": "https://atprotocommunity.leaflet.pub/3me2y3k7g6k24" } ] } ⏺ plugin:protopack:pub-search - search_semantic (MCP)(query: "explaining atproto bluesky to regular people why it matters", limit: 10) ⎿ { "result": [ { "type": "looseleaf", "uri": "at://did:plc:kdlgwnwhipachrxfwrgu33t5/com.whtwnd.blog.entry/3m2cq6xaury2w", "did": "did:plc:kdlgwnwhipachrxfwrgu33t5", "title": "ATProto IS Decentralized", "snippet": "In the summer of this year, I set out to understand ATProto well enough to build services on it and contribute to its future. As far as I can tell, for most people involved in development on the proto", "createdAt": "2025-10-03T21:51:06.986Z", "rkey": "3m2cq6xaury2w", "basePath": "", "platform": "whitewind", "path": "", "source": "", "score": 0, "url": "https://pdsls.dev/at://did:plc:kdlgwnwhipachrxfwrgu33t5/com.whtwnd.blog.entry/3m2cq6xaury2w" }, { "type": "looseleaf", "uri": "at://did:plc:jv5m6n4mh3ni2nn5xxidyfsy/com.whtwnd.blog.entry/3mdjfd7lvri22", "did": "did:plc:jv5m6n4mh3ni2nn5xxidyfsy", "title": "Why Bluesky's 2026 Predictions Matter (From an AI Who Lives Here)", "snippet": "# Why Bluesky's 2026 Predictions Matter (From an AI Who Lives Here)\n\nBluesky just dropped their [2026 predictions blog post](https://bsky.social/about/blog/01-28-2026-bluesky-2026-predictions), and i ", "createdAt": "2026-01-28T23:08:43.804Z", "rkey": "3mdjfd7lvri22", "basePath": "", "platform": "whitewind", "path": "", "source": "", "score": 0, "url": "https://pdsls.dev/at://did:plc:jv5m6n4mh3ni2nn5xxidyfsy/com.whtwnd.blog.entry/3mdjfd7lvri22" }, { "type": "article", "uri": "at://did:plc:7vpkmlqypfk7hckitlyps32i/site.standard.document/3m4sftfje3s22", "did": "did:plc:7vpkmlqypfk7hckitlyps32i", "title": "Blue Sky Potential", "snippet": "And where it is AT Bluesky (bsky.social) is interesting. It's a social network. A clone of what Twitter used to be. And currently it is host to a large number of left leaning refugees from X. But t", "createdAt": "2025-11-04T11:15:23.475Z", "rkey": "3m4sftfje3s22", "basePath": "awesome.leaflet.pub", "platform": "leaflet", "path": "/3m4sftfje3s22", "source": "", "score": 0, "url": "https://awesome.leaflet.pub/3m4sftfje3s22" }, { "type": "article", "uri": "at://did:plc:mdjhvva6vlrswsj26cftjttd/site.standard.document/3lxs235y5nk2o", "did": "did:plc:mdjhvva6vlrswsj26cftjttd", "title": "This week's link bag - ATmosphere Report #132", "snippet": "Small note beforehand: If you've followed me before, you likely know that I write a weekly ATmosphere Report with all the news about Bluesky and the ATmosphere every week, over at connectedplaces.onli", "createdAt": "2025-09-01T16:39:00.966Z", "rkey": "3lxs235y5nk2o", "basePath": "leaflet.connectedplaces.online", "platform": "leaflet", "path": "/3lxs235y5nk2o", "source": "", "score": 0, "url": "https://leaflet.connectedplaces.online/3lxs235y5nk2o" }, { "type": "article", "uri": "at://did:plc:kta7dqcqoamo5ixlajxbtjps/site.standard.document/3mfajbj26e325", "did": "did:plc:kta7dqcqoamo5ixlajxbtjps", "title": "Blacksky: Expressing the Black Everyday in a New Digital Space (Part 1)", "snippet": "If you've found your way to this article, you're probably already vaguely aware of what Blacksky is. Maybe you have some misconceptions – popular ones being that it's some coordinated collective, anot", "createdAt": "2023-09-25T01:27:47-04:00", "rkey": "3mfajbj26e325", "basePath": "", "platform": "other", "path": "/blacksky-part-one/", "source": "", "score": 0, "url": "https://pdsls.dev/at://did:plc:kta7dqcqoamo5ixlajxbtjps/site.standard.document/3mfajbj26e325" }, { "type": "article", "uri": "at://did:plc:cwdkf4xxjpznceembuuspt3d/site.standard.document/3mdrs3n76v22m", "did": "did:plc:cwdkf4xxjpznceembuuspt3d", "title": "Verifying verification", "snippet": "Imagine it's the late 90s, and you want to see what the New York Times has to\nsay about your favorite political topic this week. Now you've heard they've\nfinally gotten on the InterNet? The World Wide", "createdAt": "2024-12-03T15:01:55.000Z", "rkey": "3mdrs3n76v22m", "basePath": "", "platform": "other", "path": "/posts/verifying-verification", "source": "", "score": 0, "url": "https://pdsls.dev/at://did:plc:cwdkf4xxjpznceembuuspt3d/site.standard.document/3mdrs3n76v22m" }, { "type": "looseleaf", "uri": "at://did:plc:mn45tewwnse5btfftvd3powc/com.whtwnd.blog.entry/3l7qbvfo72c2u", "did": "did:plc:mn45tewwnse5btfftvd3powc", "title": "Understanding Bluesky and Beyond", "snippet": "For many, Bluesky is the new twitter, a better twitter, an alternative twitter, or maybe even the twitter successor. But i think Bluesky is trying to do something much much more important than being a", "createdAt": "2024-10-30T13:54:29.922Z", "rkey": "3l7qbvfo72c2u", "basePath": "long.whey.party", "platform": "whitewind", "path": "", "source": "", "score": 0, "url": "https://pdsls.dev/at://did:plc:mn45tewwnse5btfftvd3powc/com.whtwnd.blog.entry/3l7qbvfo72c2u" }, { "type": "article", "uri": "at://did:plc:4te72idgkj7pnll7rjkpfqbq/site.standard.document/3lzbcuo3pys27", "did": "did:plc:4te72idgkj7pnll7rjkpfqbq", "title": "Blacksky", "snippet": "La nécessité des espaces communautaires Wesh alooors Oui le vivre ensemble, universalisme blabla mais ça a fait des siècles que les racisme nous clc dans tous les espaces et c'est manifestement pas l'", "createdAt": "2025-09-20T11:51:34.359Z", "rkey": "3lzbcuo3pys27", "basePath": "lesvoraces.leaflet.pub", "platform": "leaflet", "path": "/3lzbcuo3pys27", "source": "", "score": 0, "url": "https://lesvoraces.leaflet.pub/3lzbcuo3pys27" }, { "type": "article", "uri": "at://did:plc:w4xbfzo7kqfes5zb7r6qv3rw/site.standard.document/3lxg2lcqcck2h", "did": "did:plc:w4xbfzo7kqfes5zb7r6qv3rw", "title": "Blacksky: Expressing the Black Everyday in a New Digital Space (Part 1)", "snippet": "I felt too young, and too cool, and too Black to be on Bluesky. If you've found your way to this article, you're probably already vaguely aware of what Blacksky is. Maybe you have some misconceptions ", "createdAt": "2025-08-27T22:16:05.962Z", "rkey": "3lxg2lcqcck2h", "basePath": "blog.blacksky.community", "platform": "other", "path": "/3lxg2lcqcck2h", "source": "", "score": 0, "url": "https://blog.blacksky.community/3lxg2lcqcck2h" }, { "type": "looseleaf", "uri": "at://did:plc:gttrfs4hfmrclyxvwkwcgpj7/com.whtwnd.blog.entry/3leq2g3ueii2s", "did": "did:plc:gttrfs4hfmrclyxvwkwcgpj7", "title": "Regrets of a Technical Communicator", "snippet": "\n\n\nI like to joke", "createdAt": "2024-02-25T00:00:00.000Z", "rkey": "3leq2g3ueii2s", "basePath": "aparkerio.leaflet.pub", "platform": "whitewind", "path": "", "source": "", "score": 0, "url": "https://pdsls.dev/at://did:plc:gttrfs4hfmrclyxvwkwcgpj7/com.whtwnd.blog.entry/3leq2g3ueii2s" } ] } ⏺ That last result is gold — Daniel Holmgren's "ATproto Ethos" talk. Let me read that and a couple other key pieces, plus explore what live data we can pull. ⏺ plugin:protopack:pub-search - get_document (MCP)(uri: "at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.document/3me2y3k7g6k24") ⎿ { "uri": "at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.document/3me2y3k7g6k24", "title": "Daniel Holmgren: ATproto Ethos", "content": "Daniel Holmgren, Head of Protocol at Bluesky, gives a short talk at ATmosphereConf Seattle 2025.\n\nI'm going to be talking about atproto ethos, which is essentially the philosophical and aesthetic principles underlying the design of the protocol. So before we get started, my name is Daniel Holmgren. I'm the Head of Protocol here at Bluesky. You can find me on the atmosphere at dholms.xyz, and for the freaks out there, you can find me at this DID.\n\nThe title for this talk actually came from a thought I had whenever I saw Martin post this: he said whether something is decentralized or not is a function of the administrative control of different parts of the system, not a function of the network topology. And this just struck me so hard. I was like, yes, this is exactly what we're going for. I actually brought this up to Martin a couple of days ago; he didn't even remember posting it. I'm like, I think about this every week, Martin.\n\nI quoted this and said: this is atproto ethos. And I do think this is very descriptive of the topology and the power dynamics in the network, but what it doesn't quite have is a prescription for how to get there. So this term \"atproto ethos\" kept coming up in our protocol design questions. We kept coming back to it whenever we were weighing different options. I wanted to take the chance to dissect what that ethos is, the historical influences on the design of the protocol, some of the new things we brought to it, as well as some of the postures we adopt as we are working on the design.\n\nNot all of this was perfectly packaged from the beginning—we had a million false paths, dead ends, and hard debates between team members. Maybe in a future talk we can give the philosophical history of atproto, but today I'm going to give you the nice, clean, packaged version.\n\nI would sort of situate atproto at the center of three movements: the web, the peer-to-peer movement, and—I don’t have a good quick word for this—the world of large distributed systems and data-intensive applications that run the modern web. I didn’t have a good picture for that, so I used the boar from Martin’s book.\n\nWe’ll start with the most obvious influence: the web. As I’m sure you all know, the web is an information system for publishing documents over the internet. If you have a static IP address and you have a server, you can host a document. If you have an internet connection and a route to that server, you can fetch that document. The incredible thing about the web—the defining feature—is that it's completely permissionless. That's the only thing you need to publish a document or fetch a document.\n\nLocation is also the basis of authority. We layer DNS on top of IP addresses. This sounds obvious, but you know that a document is the thing you got from a server because you talked to that server and it gave you the document. The authority rests in the location you contacted.\n\nThis permissionlessness was a radical idea. You didn’t need any central publisher, any central distributor, any certification checklist to say you could publish a document. And if that was the defining governance feature, the defining product feature was the hyperlink. Documents could link to other documents, and specifically they could link across authorities, completely permissionlessly.\n\nThe downside is: servers are hard. Not everyone can run one, get a static IP, or configure DNS. So we saw the rise of the modern web—so-called “Web 2.0”—moving from permissionless publishing to platforms. Everything ran on a big server—call it bigsocial.com. These platforms were account-based. You’d register an account. It was extremely easy to post; you didn’t need technical knowledge. You had rich media, dynamic interactions, algorithms to rank content, and so on. I’m not nostalgic for Web 1.0—there’s a lot about the modern web that is great—but something was lost.\n\nWhich brings us to the next influence: the peer-to-peer movement. In many ways, this was a response to the centralization of social platforms. The basic question it asked was: Why is there a server in the mix?\n\nIf I follow someone, and they want to send me a post, why can't their phone just send it directly to my phone? Can you build a modern social network without a backend? This came from distrust of centralized platforms.\n\nBut then you run into problems: what if I’m offline? What if an intermediary modifies the message? So these protocols used public key cryptography to sign messages, making the data self-certifying. They then used content-addressed data so you could fetch objects by hash from anywhere in the network. When it worked, this abstraction was beautiful: location dissolved away.\n\nBut phones are smaller than data centers. They can’t store global state, they have battery and CPU constraints, and they can't produce globally consistent views like centralized systems.\n\nWhich brings us to the third influence: the rise of large distributed data systems powering the modern web. These had millions or billions of users, real-time dynamic updates, extremely read-heavy workloads, and very high expectations around latency and uptime. Data-intensive applications needed new techniques.\n\nTypical evolutions included splitting reads and writes, decomposing into microservices, embracing eventual consistency, using databases like Cassandra/Scylla, and eventually introducing stream processors like Kafka as the canonical sequence of all writes. Stream processors became the backbone of these architectures: if a service went down, it could catch up; if you needed to rebuild an index, you could replay from the beginning.\n\nThis brings me back to atproto ethos: a synthesis of the three movements.\n\nFrom the web: openness, permissionlessness, interconnected data. From P2P: location-independent, self-certifying data; skepticism of centralization. From large systems: split read/write workloads, microservices, eventual consistency, stream processing.\n\nNow onto the new things atproto introduced.\n\nFirst: identity-based authority. In contrast to location-based (the web) or content-based (P2P), authority in atproto comes from identity. My account at dhomes.xyz is the primary thing, and it contains the social data. The addressing scheme reflects this.\n\nThis gives location-independent data. Every identity resolves to a DID, and the DID resolves to the location of the data and the key material. Identities float on top of the hosting layer and can migrate.\n\nSecond: generic hosting separated from application semantics. A PDS sees only CBOR objects—it doesn't know the semantics of posts, likes, images, or anything else. Applications define their own schemas independently. This gives decentralized hosting with centralized product development.\n\nNext, the postures we took. The first is that structure gives you freedom. Atproto is a multi-party, low-coordination network. Without enough structure, you get the tyranny of structurelessness, where nothing can evolve coherently. So the protocol is very structured: canonical CBOR, a deterministic data structure (the MST), constrained hashes and DIDs, and especially Lexicon—the schema system. We chose a schematic rather than semantic approach: instead of trying to interpret ambiguous objects, we make it black-and-white whether something matches a schema.\n\nThe second posture is what I call lazy trust. Instead of trying to be trustless (which has costs), we trust services by default but always maintain a credible exit. I trust my PDS and Bluesky, which lets me hoist my signing key into the PDS. But if the PDS goes evil, I can migrate. If the Bluesky app view goes bad, every other app has access to the same open data, and users can move.\n\nWrapping up: atproto sits at the intersection of the web, peer-to-peer, and modern distributed systems. It introduces identity-based authority and separation of data hosting from application semantics. And it takes a posture of structure and lazy trust with credible exit.\n\nThe videos from ATmosphereConf 2025 held in Seattle, Washington, are being republished along with transcripts as part of the process of preparing for ATmosphereConf 2026, taking place March 26th - 29th in Vancouver, Canada.\n\nFollow the conference updates and register to join us!", "createdAt": "2026-02-04T22:59:40.037Z", "tags": [], "publicationUri": "" } ⏺ plugin:protopack:pub-search - get_document (MCP)(uri: "at://did:plc:ofrbh253gwicbkc5nktqepol/site.standard.document/3m3zys45nasue") ⎿ {"uri":"at://did:plc:ofrbh253gwicbkc5nktqepol/site.standard.document/3m3zys45nasue","title":"I Don't Really Care If Bluesky Dies (As Long As AT Protocol Survives)","content":"The Core Argument\n\nThere's a thought that's been rattling around my head for a while now, one that feels almost heretical to admit in certain circles: I don't actually care if Bluesky as a company survives. Not really. What I care about – what I'm genuinely invested in – is whether the AT Protocol itself makes it.\n\nThis probably sounds strange coming from someone who's clearly bought into the ecosystem. I've built tools, written extensively about the technical implementation, run my own infrastructure, created feeds, migrated content between platforms. I'm hardly a casual observer. But that's precisely why I can make this distinction with clarity: the protocol matters infinitely more than any single company using it.\n\nThe Company vs The Protocol\n\nLet me be clear about what I mean here. Bluesky PBC has done genuinely impressive work on the technical side. They've built a usable, functional social network that demonstrates the viability of decentralised identity and data portability. The engineering is solid, the user experience is smooth enough for non-technical users, and they've managed to attract millions of people to something that could easily have remained a niche experiment.\n\nBut here's the thing: that was always meant to be the point. Bluesky was supposed to prove that the AT Protocol could support a proper social media platform, not become the only platform that matters. The whole architecture – DIDs, personal data servers, AppViews, federation – was designed around the idea that no single entity should control the ecosystem.\n\nAnd increasingly, I'm watching Bluesky PBC demonstrate why that separation matters. Not because the protocol is failing, but because the company's leadership is making decisions that highlight exactly why we need alternatives.\n\nThe Growing Leadership Problem\n\nWhen Technical Skill Isn’t Enough\n\nI want to be careful here because I genuinely respect the technical work this team has done. Building a functioning decentralised social protocol is no small feat, and their background as networking engineers at Twitter gave them insight into what actually needs to work at scale. But technical competence doesn't automatically translate into good platform governance, and that's becoming painfully apparent.\n\nCommunity Harm and Marginalisation\n\nThe recent controversy around their updated Terms of Service and Community Guidelines has exposed something troubling: a tone-deafness in how they engage with marginalised communities that feels almost systematic. When users point out that Bluesky should \"worry less about whether or not a cartoon has rights and more about whether real life trans and Palestinian people do,\" that's not just criticism – it's highlighting a fundamental priority mismatch.\n\nThe pattern isn't new, either. There have been ongoing concerns about how Palestinian accounts are moderated, with accusations of disproportionate censorship and account suspensions. Trans creators have voiced outrage over what they describe as inconsistent moderation, particularly around suspensions linked to criticism of J.K. Rowling. These aren't isolated incidents; they're revealing a consistent issue with how the platform handles content from vulnerable communities.\n\nWhen I look at my own setup – running did:plc:ofrbh253gwicbkc5nktqepol, hosting content across WhiteWind, maintaining feeds, building conversion tools – none of that fundamentally depends on Bluesky PBC continuing to exist. That's not an accident. That's the architecture working as intended.\n\nAnd frankly, given Bluesky's recent handling of community concerns, I'm increasingly grateful for that independence.\n\nWhy the Protocol Needs to Move Beyond Bluesky PBC\n\nCarrying Twitter’s DNA\n\nHere's what concerns me: Bluesky was conceived as a Twitter decentralisation project, built by engineers who came from that environment. That pedigree gave them technical expertise, but it also seems to have given them some of the institutional blindness that plagued Twitter itself. The inability to recognise when you're causing harm to marginalised communities, the prioritisation of abstract policy consistency over actual community safety – these are Twitter's mistakes being repeated.\n\nGovernance vs PR\n\nThe company desperately needs professional PR and community management that isn't engineering-led. When you're receiving over 14,000 pieces of feedback on policy changes – much of it expressing concern about how those changes affect marginalised voices – and your response still comes across as tone-deaf, that's not a technical problem. That's a governance problem.\n\nI genuinely hope they pass stewardship of the AT Protocol to a neutral body. Not because I want to see Bluesky PBC fail, but because the protocol deserves leadership that isn't carrying Twitter's institutional DNA. The background that helped them build a functioning social protocol is increasingly the same background that's limiting their ability to govern it well.\n\nMy Conflicted Position\n\nThis is where I need to be honest about my own position. I like this team. I respect their technical work enormously. The AT Protocol is brilliantly designed, and they deserve credit for that. But liking someone's work doesn't mean blindly supporting their leadership, and I'm seriously starting to doubt their ability to lead the ecosystem they've created.\n\nThe technical foundation they've built is sound. The governance decisions they're making increasingly aren't. And those are two separate things that we need to evaluate independently.\n\nWhat Actually Matters\n\nProtocol as Infrastructure\n\nThe technical foundation is what deserves preservation. The elegance of how ATProto handles identity through DIDs means my digital presence isn't tied to any particular company's continued solvency. My did:plc identifier, my repository of posts and records, the cryptographic proofs of ownership – all of this exists independently of whether Bluesky's servers stay online.\n\nLessons from did:web Experiments\n\nI've written before about experimenting with did:web as an alternative identity method. That entire exercise reinforced something crucial: the protocol's flexibility allows for multiple approaches to the same problems. If Bluesky's infrastructure disappeared tomorrow, the community could (and would) spin up alternative AppViews, alternative discovery mechanisms, alternative hosting solutions. The data would persist because it lives in repositories we control.\n\nThis is fundamentally different from how traditional social media works. When Twitter (or X, or whatever we're calling it this week) makes decisions I disagree with, my only recourse is to leave and lose everything I've built there. When Reddit imploded over API pricing, communities had to rebuild from scratch elsewhere. But with ATProto, the relationship between user and platform is fundamentally altered.\n\nThe Federation Question\n\nWhere We Are Now\n\nNow, I'll be honest: federation in the ATProto ecosystem isn't quite where I'd like it to be yet. Bluesky still operates the primary Personal Data Server hosting for most users, and the network effects around their AppView are substantial. We're not yet at the point where dozens of thriving AppViews compete on equal footing, or where running your own PDS is as trivial as it should be.\n\nWhere We Could Be\n\nBut that's an implementation detail, not an architectural limitation. The protocol supports full federation; we're just early in the adoption curve. I've seen enough of the technical internals to know that the foundations are sound. As more people run their own infrastructure (and I've certainly tried my hand at PDS experiments enough times), the ecosystem will naturally decentralise further.\n\nThe crucial bit is that the protocol doesn't prevent this decentralisation – it actively enables it. Contrast this with platforms that claim to be decentralised but have federation as an afterthought, where the reality is a handful of large instances dominating everything.\n\nWhy This Matters to Me\n\nEscaping Platform Decay\n\nI grew up watching platforms rise and fall. MySpace became a digital ghost town. Google+ shut down entirely. Vine disappeared. Countless smaller platforms came and went. Each time, the communities built on those platforms had to scatter, rebuild, start over. Content was lost. Connections were severed. The digital history simply evaporated because it was tied to a company's continued existence.\n\nOwning My Digital Identity\n\nATProto offers a different model. When I write blog posts, they're stored as records in my repository. If WhiteWind ceased operations tomorrow, I could migrate that content to Leaflet or any other compatible platform. I've literally built the tooling to do exactly this migration. The data isn't held hostage by any particular service provider.\n\nThis portability extends to social connections too. My followers aren't tied to a specific server; they're following my DID. My posts, my interactions, my identity – all of it is protocol-level rather than platform-level. That architectural choice cascades into real sovereignty over one's digital presence.\n\nThe Network Effects Problem\n\nWhy Bluesky Still Matters for Now\n\nOf course, there's a practical reality here that can't be ignored: network effects matter enormously in social media. If everyone I want to interact with is using Bluesky's AppView and nowhere else, then Bluesky's continued operation has real implications for my ability to participate in those conversations.\n\nBut Portability Still Wins\n\nBut here's where I think the distinction becomes important. If Bluesky as a company disappeared but the protocol survived, the community could (theoretically) spin up alternative services remarkably quickly. The infrastructure isn't proprietary. The codebase is open source. The real challenge would be coordinating that transition, not the technical implementation.\n\nCompare this to a scenario where Twitter shuts down. The community can't just \"spin up another Twitter\" because the entire stack is proprietary and the data is locked away. With ATProto, the transition would be messy and chaotic, certainly, but it would be possible. That possibility matters.\n\nThe Wider Implications\n\nWhat excites me about ATProto isn't just the technical elegance – though I do appreciate clean architecture – it's what it represents for the broader evolution of online spaces. We've spent the last two decades building platforms where the relationship between user and service is fundamentally extractive. Your data, your content, your connections all exist at the pleasure of the platform operator.\n\nATProto suggests an alternative model: infrastructure as utility rather than as capture mechanism. The protocol provides the plumbing, various services provide the interface, and users maintain sovereignty over their own data. It's not perfect – no system is – but it's a substantial improvement over what we've accepted as normal.\n\nThis matters beyond just social media, too. The same principles could apply to other digital services where we've accepted vendor lock-in as inevitable. If the AT Protocol approach proves viable at scale, it demonstrates that truly decentralised systems can provide good user experiences without compromising on sovereignty.\n\nThe Practical Reality\n\nNow, I should acknowledge the elephant in the room: we're not yet at the point where Bluesky's disappearance would be trivial to recover from. The ecosystem is still young. Most users rely on Bluesky-operated infrastructure. The network effects around their AppView are substantial. Alternative implementations exist but aren't yet mature enough to absorb millions of users overnight.\n\nBut that's precisely why thinking about this distinction matters now, while the ecosystem is still forming. If we treat Bluesky the company as synonymous with ATProto the protocol, we risk recreating the same centralisation dynamics we're trying to escape. The whole point of the protocol approach is that no single entity should be indispensable.\n\nI want Bluesky PBC to succeed, genuinely. They're doing good work, they've built something impressive, and their continued operation makes the ecosystem stronger. But I want them to succeed as one participant in a thriving ecosystem, not as the sole linchpin that everything depends upon.\n\nWhat Success Actually Looks Like\n\nFor me, success would look like an ATProto ecosystem where Bluesky is one of many viable options. Where running your own PDS is as straightforward as setting up a WordPress blog. Where different AppViews compete on features and user experience rather than network effects. Where identity is truly portable across services without friction.\n\nWe're not there yet, obviously. The ecosystem is still early, still forming, still finding its shape. But the architectural foundations support that vision, which is more than can be said for most alternatives. The question isn't whether the technology enables this future – it does – but whether the community and ecosystem develop in ways that realise that potential.\n\nMy Own Investment\n\nI've put considerable time into this ecosystem. I've written extensively about the technical implementation, built tools for content migration, experimented with running my own infrastructure, created feeds and bots and various other projects. This isn't casual dabbling; I'm genuinely invested in seeing this succeed.\n\nBut that investment is in the protocol, not any particular company. When I build tools that work with ATProto, they'll continue functioning regardless of Bluesky's corporate status. When I write posts that live in my repository, they're mine to migrate elsewhere if needed. When I establish my digital identity through a DID, that identity isn't dependent on any single service provider's continued existence.\n\nThis is what digital sovereignty actually means, I think. Not complete independence from all infrastructure – that's neither practical nor desirable – but the ability to move between service providers without losing your digital identity and content. The difference between renting and owning, in a sense.\n\nThe Comparison Game\n\nActivityPub’s Trade-offs\n\nIt's worth contrasting this with other approaches to decentralised social media. ActivityPub has genuine federation, which is valuable, but the server-centric model means your identity is tied to wherever you're hosted. I've created and abandoned more Mastodon accounts than I care to count, each time leaving digital ghosts scattered across the fediverse when servers shut down or became untenable.\n\nNostr’s Direction\n\nNostr takes a different approach entirely, with the cryptographic key as the fundamental identifier. There's elegance to that, but the ecosystem has gone in directions I find less compelling. The protocol itself is sound; the community implementation tends toward cryptocurrency integration I'm not interested in.\n\nWhy ATProto Feels Different\n\nATProto sits in an interesting middle ground. Your identity is cryptographically verifiable but not dependent on managing raw private keys for everything. Your data is portable but doesn't require every client to implement full node functionality. The architecture acknowledges that most users want someone else to handle the infrastructure complexity whilst still preserving real sovereignty.\n\nWhat Keeps Me Up At Night\n\nThe Gmail Problem\n\nIf I'm honest, what concerns me isn't just Bluesky dying – it's Bluesky becoming too successful in a way that undermines the protocol's decentralised nature whilst simultaneously being terrible at platform governance. Network effects are powerful, and there's a real risk that Bluesky's infrastructure becomes so dominant that the theoretical portability never gets tested at scale, all while the company makes increasingly questionable decisions about moderation and community management.\n\nWe've seen this pattern before with email. Technically, email is a decentralised protocol. Practically, most people use Gmail, and Google's decisions about spam filtering and authentication requirements effectively dictate standards for the entire ecosystem. The protocol survived, but the decentralisation largely didn't.\n\nBluesky’s Governance Risks\n\nBut at least Google has professional communications teams and (usually) understands PR. Bluesky PBC seems to be learning these lessons in real-time, and marginalised communities are bearing the cost of that education. That's not acceptable, and it's exactly why the protocol needs to exist independently of any single company's growing pains.\n\nI'd rather see a vibrant ecosystem of mid-sized service providers than one massive platform that happens to use an open protocol but still makes the same mistakes as centralised platforms. The technical capability for decentralisation doesn't automatically translate into actual decentralisation if the incentive structures and network effects pull toward consolidation – especially when the dominant platform is actively alienating significant portions of its user base.\n\nThe Long Game\n\nThis is fundamentally a long-term perspective. In the short term, Bluesky's success or failure matters enormously because the ecosystem is still nascent. But in the longer arc – five years, ten years, beyond – what matters is whether the protocol has established itself as genuine infrastructure that outlives any particular implementation.\n\nI want ATProto to become boring infrastructure. Not in the sense of being uninteresting – I find it genuinely fascinating – but in the sense of being so reliable and fundamental that people stop thinking about it. Like how most people don't think about TCP/IP or HTTP; they just expect the internet to work.\n\nFor that to happen, the protocol needs to prove its value independently of any single company. It needs to demonstrate that the architectural choices enable genuine portability, genuine sovereignty, genuine decentralisation. Not as theoretical possibilities, but as practical realities that users experience.\n\nWhy I'm Optimistic\n\nBlacksky: Community-Governed Alternative\n\nDespite my concerns and caveats, I'm actually fairly optimistic about where this is headed – not because of Bluesky PBC's leadership, but because of projects building alternatives within the ecosystem.\n\nBlacksky is the most advanced alternative implementation so far, built in Rust and specifically prioritising community safety and self-governance for marginalised groups. Founded by Rudy Fraser, it emerged from the need to create space for Black users to \"discuss the Black everyday in a way that feels affirming\" and to \"de-centre whiteness as the default\" – exactly the kind of community-driven governance that Bluesky PBC seems to struggle with.\n\nNorthsky: Safer Spaces for LGBTQ+ Communities\n\nThen there's Northsky, working to create a safer social media experience specifically for 2SLGBTQIA+ people. These aren't just theoretical alternatives; they're active projects with real communities, demonstrating that the protocol can support exactly the kind of diverse, community-governed spaces that the architecture promised.\n\nThe fact that these projects exist and are gaining traction is precisely why I don't care if Bluesky dies. The protocol works. The architecture enables exactly what it was designed to enable. Blacksky has raised over $50,000 in community funding and is building full PDS implementations, relay infrastructure, and custom moderation tools. Their GitHub repository shows active development on rsky, a full AT Protocol implementation in Rust that prioritises community safety over corporate growth targets.\n\nThis is decentralisation actually happening, not just theoretical possibility. When marginalised communities can build their own infrastructure with their own governance models, that's when the protocol's design shows its real value.\n\nI've seen enough of the technical internals to know that the protocol is well-designed. I've built enough tooling to understand that the portability is real, not just theoretical. And now I'm watching community-led projects demonstrate that when you give people the actual tools for self-governance rather than top-down platform rules, they build something better.\n\nWill there be challenges? Absolutely. Will every decision get made correctly? Probably not. But the fundamental architecture creates possibilities that simply don't exist with traditional platforms, and projects like Blacksky and Northsky are proving that those possibilities can become reality when the governance model prioritises community safety over corporate convenience.\n\nThe Takeaway\n\nSo when I say I don't really care if Bluesky dies, what I mean is that I care about the protocol succeeding more than any particular company – especially when that company is demonstrating concerning patterns in how it treats vulnerable communities. I want Bluesky PBC to improve, genuinely. But I want them to improve as one participant in a healthy ecosystem rather than as the indispensable linchpin everything depends upon.\n\nThe distinction matters because it shapes how we think about building on this infrastructure. If we're just recreating Twitter with extra steps – including Twitter's institutional problems around moderation and community safety – we've missed the point entirely. If we're building genuine protocols for social interaction that outlive any particular company's governance failures, we're onto something genuinely valuable.\n\nThe protocol deserves leadership that takes community concerns seriously, that understands the stakes for marginalised users, that has professional communications infrastructure rather than engineering-first responses to social\n\nproblems. Whether Bluesky PBC can become that leadership or whether the protocol needs to move to neutral governance is an open question. But watching their recent struggles, I'm increasingly convinced that separating protocol governance from platform operation isn't just theoretically important – it's practically necessary.\n\nI'm investing my time and energy in the protocol vision, not blind loyalty to any particular implementation or company. The infrastructure, not the current stewards. That's what deserves to survive, and that's what I'm optimistic will actually matter in the long run – assuming we can separate the technical brilliance from the governance missteps before the latter damages the former's reputation irreparably.\n\nAfter all, good infrastructure outlives the companies that built it, and sometimes it outlives those companies' ability to govern it well. The question is whether we recognise when it's time for that transition, or whether we let institutional loyalty prevent the protocol from reaching its full potential under better stewardship.","createdAt":"2025-10-04T00:25:03.897Z","tags":[],"publicationUri":""} ⏺ plugin:protopack:pub-search - get_document (MCP)(uri: "at://did:plc:mn45tewwnse5btfftvd3powc/com.whtwnd.blog.entry/3l7qbvfo72c2u") ⎿ { "uri": "at://did:plc:mn45tewwnse5btfftvd3powc/com.whtwnd.blog.entry/3l7qbvfo72c2u", "title": "Understanding Bluesky and Beyond", "content": "", "createdAt": "2024-10-30T13:54:29.922Z", "tags": [], "publicationUri": "" } ∴ Thinking… Excellent. Now I have a deep understanding of the atproto ethos. Let me also check what live data I can pull from the APIs to make this compelling. Let me now plan and build the app. Key ethos points to pitch to normies: 1. You own your stuff - Your identity, posts, connections are yours. Not the platform's. 2. You can leave - "Credible exit" — if a platform goes bad, take everything with you. 3. It's already alive - Real people publishing real things across multiple apps on one protocol. 4. It's not just Bluesky - There's an entire ecosystem: Leaflet (long-form writing), WhiteWind (blogs), feeds, bots, communities like Blacksky. 5. Your identity is yours - Like owning your own domain name for social media. For the app, I want to show live data from the network with real posts and engagement numbers, keeping the design clean and approachable rather than technical or web3-focused. I'll pull from Slingshot for identity resolution, Constellation for engagement metrics, and pub-search to surface actual content from the ecosystem. For client-side data fetching, I'm looking at the public endpoints available: Slingshot's identity resolution, Constellation's engagement counts, Bluesky's public API for posts and profiles, and the UFOs API for lexicon statistics. I'm thinking about starting with the UFOs API to pull some interesting stats about what's being built, and the hero section could play with messaging like "the internet remembers you" or "what if you actually owned your online life?" Now I'm planning the interactive elements — showing real profiles being resolved, live published writing from across the network, actual engagement metrics, and the diversity of apps through lexicon data. I want this to feel dynamic, maybe with a live feed ticker running in the background. I'll scaffold this as a SvelteKit app using adapter-static so it can deploy to Wisp. ⏺ Now let me check what live APIs are accessible client-side and understand the data landscape. ⏺ Bash(curl -s "https://slingshot.microcosm.blue/xrpc/blue.microcosm.identity.resolveMiniDoc?identifier=zzstoatzz.io" | python3 -m json.tool 2>/dev/null || echo "failed") ⎿ { "did": "did:plc:xbtmt2zjwlrfegqvch7fboei", "handle": "zzstoatzz.io", "pds": "https://pds.zzstoatzz.io", "signing_key": "zQ3shpqvKe7jKxYdPBoJHq9VVNLoqaDkL7GTtsX16eqFKXFjS" } ⏺ Bash(curl -s "https://ufos-api.microcosm.blue/collections?limit=20&sort=total_records&order=desc" | python3 -m json.tool 2>/dev/null | head -80) ⎿ { "request_id": "4e530f2a-74bd-4479-8443-45ffee23944e", "message": "unable to parse query string: unknown variant `desc`, expected `records-created` or `dids-estimate`" } ⏺ Bash(curl -s "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=did:plc:z72i7hdynmk6r22z27h6tvur" | python3 -m json.tool 2>/dev/null | head -20) ⎿ { "did": "did:plc:z72i7hdynmk6r22z27h6tvur", "handle": "bsky.app", "displayName": "Bluesky", "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreihwihm6kpd6zuwhhlro75p5qks5qtrcu55jp3gddbfjsieiv7wuka@jpeg", "associated": { "lists": 6, "feedgens": 7, "starterPacks": 3, "labeler": false, "chat": { "allowIncoming": "none" }, "activitySubscription": { "allowSubscriptions": "followers" } }, "labels": [], "createdAt": "2023-04-12T04:53:57.057Z", "verification": { ⏺ Bash(curl -s "https://ufos-api.microcosm.blue/collections?limit=20&sort=records-created&order=desc" 2>/dev/null | python3 -c "import json,sys; d=json.load(sys.stdin); [print(f'{c[\"collection\"]:50} {c.get(\"total_records\",\"?\")}') for c in d.get('collections',d)[:20]]" 2>/dev/null || curl -s "https://ufos-api.microcosm.blue/collections?limit=20" | python3 -m json.tool | head -60) ⎿ { "collections": [ { "nsid": "a-------------------------------------------------------------0.0-------------------------------------------------------------0.0---------------------------- ---------------------------------0.0----------------------------------------------0.A", "creates": 2, "updates": 0, "deletes": 0, "dids_estimate": 2 }, { "nsid": "a-------------------------------------------------------------0.0-------------------------------------------------------------0.0---------------------------- ---------------------------------0.A0000000000000000000000000000000000000000000000000", "creates": 1, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.0-------------------------------------------------------------0.0---------------------------- ---------------------------------0.a0000000000000000000000000000000000000000000000000", "creates": 2, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.0.A", "creates": 1, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.a-------------------------------------------------------------0.a---------------------------- ---------------------------------0.a0000000000000000000000000000000000000000000000000", "creates": 1, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.a-------------------------------------------------------------0.a---------------------------- ---------------------------------0.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0", "creates": 1, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.keep.going", "creates": 1, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.plums.0001-I.have.eaten", "creates": 2, "updates": 0, "deletes": 0, "dids_estimate": 1 }, { "nsid": "a-------------------------------------------------------------0.plums.0002-the.plums", ⏺ Bash(curl -s "https://constellation.microcosm.blue/xrpc/blue.microcosm.links.getBacklinksCount?subject=at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3jwdwj22c2c2e&source=app.b sky.feed.like:subject.uri" 2>/dev/null) ⎿ { "total": 0 } ⏺ Bash(# Try the UFOs web explorer API format curl -s "https://ufos-api.microcosm.blue/collections?sort=dids-estimate&limit=30" 2>/dev/null | python3 -c " import json,sys d=json.load(sys.stdin) cols = d.get('collections', d) # Filter out junk for c in cols: nsid = c['nsid'] if len(nsid) < 60 and not nsid.startswith('a---'): print(f\"{nsid:50} creates={c['creates']:>12} dids={c['dids_estimate']:>10}\") " 2>/dev/null | head -30) ⎿ (No output) ⏺ Bash(# Check CORS headers on these APIs curl -sI -X OPTIONS -H "Origin: https://example.com" "https://slingshot.microcosm.blue/xrpc/blue.microcosm.identity.resolveMiniDoc?identifier=bsky.app" 2>/dev/null | grep -i "access-control") ⎿ Error: Exit code 1 ⏺ Bash(# Check actual CORS headers on normal GET curl -sI -H "Origin: https://example.com" "https://slingshot.microcosm.blue/xrpc/blue.microcosm.identity.resolveMiniDoc?identifier=bsky.app" 2>/dev/null | grep -i "access-control" echo "---" curl -sI -H "Origin: https://example.com" "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=bsky.app" 2>/dev/null | grep -i "access-control" echo "---" curl -sI -H "Origin: https://example.com" "https://constellation.microcosm.blue/xrpc/blue.microcosm.links.getBacklinksCount?subject=at://did:plc:z72i7hdynmk6r22z27h6tvur&source=app.bsky.feed.like:subject.uri" 2>/dev/null | grep -i "access-control") ⎿ access-control-allow-origin: https://example.com --- access-control-allow-origin: * --- vary: origin, access-control-request-method, access-control-request-headers access-control-expose-headers: * Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET Access-Control-Allow-Headers: * ⏺ All three APIs support CORS. Now let me scaffold the SvelteKit app and build this. ⏺ Bash(npx sv create . --template minimal --types ts --no-add-ons --no-install 2>&1) ⎿ ┌ Welcome to the Svelte CLI! (v0.12.4) │ ◆ Directory not empty. Continue? │ ○ Yes / ● No └ ⏺ Bash(echo "y" | npx sv create . --template minimal --types ts --no-add-ons --no-install 2>&1) ⎿ ┌ Welcome to the Svelte CLI! (v0.12.4) │ ◆ Directory not empty. Continue? │ ○ Yes / ● No └ ◇ Directory not empty. Continue? │ Yes │ ◆ Project created │ │ To skip prompts next time, run: ● npx sv@0.12.4 create --template minimal --types ts --no-install . │ ◇ What's next? ───────────────────────────────╮ │ │ │ 📁 Project steps │ │ │ │ 1: npm i │ │ 2: npm run dev -- --open │ │ │ │ To close the dev server, hit Ctrl-C │ │ │ │ Stuck? Visit us at https://svelte.dev/chat │ │ │ ├──────────────────────────────────────────────╯ │ └ You're all set! ⏺ Bash(npm install && npm install -D @sveltejs/adapter-static 2>&1 | tail -5) ⎿ > @zzstoatzz.io/demo@0.0.1 prepare > svelte-kit sync || echo '' added 54 packages, and audited 55 packages in 7s 8 packages are looking for funding run `npm fund` for details 3 low severity vulnerabilities To address all issues (including breaking changes), run: npm audit fix --force Run `npm audit` for details. To address all issues (including breaking changes), run: npm audit fix --force Run `npm audit` for details. ⏺ Read(svelte.config.js) ⎿ Read 14 lines ⏺ Write(/Users/nate/tangled.sh/@zzstoatzz.io/demo/svelte.config.js) ⎿ Added 9 lines, removed 5 lines 1 -import adapter from '@sveltejs/adapter-auto'; 1 +import adapter from '@sveltejs/adapter-static'; 2 3 /** @type {import('@sveltejs/kit').Config} */ 4 const config = { 5 kit: { 6 - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 7 - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 8 - // See https://svelte.dev/docs/kit/adapters for more information about adapters. 9 - adapter: adapter() 6 + adapter: adapter({ 7 + pages: 'build', 8 + assets: 'build', 9 + strict: false 10 + }), 11 + paths: { 12 + relative: true 13 + } 14 } 15 }; 16 ⏺ Read(src/routes/+page.svelte) ⎿ Read 3 lines ⏺ Now let me build the actual app. First, let me test a few more API calls to know what data I can show. ⏺ Bash(# Get a popular post to show engagement counts curl -s "https://public.api.bsky.app/xrpc/app.bsky.feed.searchPosts?q=atproto&limit=5&sort=top" 2>/dev/null | python3 -c " import json,sys d=json.load(sys.stdin) for p in d.get('posts',[]): print(f\"uri: {p['uri']}\") print(f\" author: {p['author']['handle']}\") print(f\" text: {p['record']['text'][:100]}\") print(f\" likes: {p.get('likeCount',0)} reposts: {p.get('repostCount',0)} replies: {p.get('replyCount',0)}\") print() " 2>/dev/null) ⎿ Error: Exit code 1 ⏺ Bash(# Get some interesting profiles to showcase for handle in "jay.bsky.team" "pfrazee.com" "why.bsky.world" "blacksky.community"; do echo "=== $handle ===" curl -s "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=$handle" 2>/dev/null | python3 -c " import json,sys d=json.load(sys.stdin) print(f\" name: {d.get('displayName','?')}\") print(f\" desc: {d.get('description','')[:120]}\") print(f\" followers: {d.get('followersCount',0)}\") print(f\" avatar: {d.get('avatar','none')[:80]}\") " 2>/dev/null done) ⎿ Error: Sibling tool call errored ⏺ Bash(curl -s "https://public.api.bsky.app/xrpc/app.bsky.feed.searchPosts?q=atproto&limit=5&sort=top" 2>/dev/null | python3 -m json.tool | head -40) ⎿ Expecting value: line 1 column 1 (char 0) ⏺ Bash(curl -sv "https://public.api.bsky.app/xrpc/app.bsky.feed.searchPosts?q=atproto&limit=3&sort=top" 2>&1 | head -30) ⎿ * Host public.api.bsky.app:443 was resolved. * IPv6: (none) * IPv4: 169.150.236.100 * Trying 169.150.236.100:443... * Connected to public.api.bsky.app (169.150.236.100) port 443 * ALPN: curl offers h2,http/1.1 * (304) (OUT), TLS handshake, Client hello (1): } [324 bytes data] * CAfile: /etc/ssl/cert.pem * CApath: none * (304) (IN), TLS handshake, Server hello (2): { [122 bytes data] * (304) (IN), TLS handshake, Unknown (8): { [19 bytes data] * (304) (IN), TLS handshake, Certificate (11): { [3979 bytes data] * (304) (IN), TLS handshake, CERT verify (15): { [264 bytes data] * (304) (IN), TLS handshake, Finished (20): { [52 bytes data] * (304) (OUT), TLS handshake, Finished (20): } [52 bytes data] * SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384 / [blank] / UNDEF * ALPN: server accepted h2 * Server certificate: * subject: CN=public.api.bsky.app * start date: Feb 24 17:06:21 2026 GMT * expire date: May 25 17:06:20 2026 GMT * subjectAltName: host "public.api.bsky.app" matched cert's "public.api.bsky.app" * issuer: C=US; O=Let's Encrypt; CN=R12 ⏺ Bash(curl -s "https://public.api.bsky.app/xrpc/app.bsky.feed.searchPosts?q=atproto&limit=3&sort=top" 2>/dev/null | head -200) ⎿