feat: new post and pds c4925f04
Steve · 2026-01-21 20:02 7 file(s) · +79 −7
packages/client/public/blog-images/other/atprotocol.png (added) +0 −0

Binary file — no preview.

packages/client/scripts/publish-to-atproto.ts +6 −2
5 5
import * as path from "path";
6 6
7 7
const CONTENT_DIR = path.join(import.meta.dir, "../src/content/post");
8 -
const PDS_URL = process.env.PDS_URL || "https://polybius.social";
8 +
const PDS_URL = process.env.PDS_URL || "https://andromeda.social";
9 9
const PUBLICATION_URI =
10 10
	"at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.publication/3mbykzswhqc2x";
11 11
const SITE_URL = "https://stevedylan.dev";
201 201
	const filename = path.basename(ogImage);
202 202
203 203
	// All blog images are stored in packages/client/public/blog-images/other
204 -
	const imagePath = path.join(import.meta.dir, "../public/blog-images/other", filename);
204 +
	const imagePath = path.join(
205 +
		import.meta.dir,
206 +
		"../public/blog-images/other",
207 +
		filename,
208 +
	);
205 209
206 210
	if (!fs.existsSync(imagePath)) {
207 211
		throw new Error(`Image not found: ${imagePath}`);
packages/client/src/content/post/atproto-starter.mdx (added) +67 −0
1 +
---
2 +
title: "AT Protocol Primer"
3 +
publishDate: "21 Jan 2026"
4 +
description: "What is the AT Protocol and why does it matter in the grand scheme of the web"
5 +
tags: ["atproto", "open web"]
6 +
ogImage: "/blog-images/other/atprotocol.png"
7 +
atUri: "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mcxxqjgspk26"
8 +
---
9 +
10 +
![cover](https://files.stevedylan.dev/atprotocol.png)
11 +
12 +
If you've been on the internet for the last 10-20 years then you probably have a good sense of how bad the internet has become. We experience it every day when we pick up our phones and scroll through apps that used to mean something to us. Take Instagram for example. About 10-12 years ago it was a refreshing way to create and share moments in our lives. Resurrecting the square 1:1 aspect ratio that resembled a medium format camera viewfinder, filters that gave a "I mustache you a question" while wearing a short brimmed fedora, and a new wave of photographers making their mark. I even met my wife on Instagram. It was fun. Fast forward to the present and it's a mindless feed of videos from people you don't know, making you emotionally angry or trying to convince you to buy something. We lost control over our data, what massive companies did with it, and what actually mattered to us in the end. I don't think that era of the web is coming back, but I do think there is hope for a better web that is more open. 
13 +
14 +
## The Problem With the Web
15 +
16 +
There's a lot that could fill in the blank here in regards to what is wrong with the web right now, but I personally think there are two major pain points. 
17 +
18 +
### Fragmented Data
19 +
20 +
Right now the majority of the data you create on the internet is stored on servers owned by platforms. If you make a post on Facebook, it lives on Meta's servers. If you make a post on X, it's stored on their servers, and so on and so forth.
21 +
22 +
![old data model](https://files.stevedylan.dev/old-data-model.png)
23 +
24 +
What you end up with is a fragmented spread of data across multiple platforms that you have no control over. If X decides to nuke your account or if LinkedIn goes out of business, that data is probably gone. Perhaps you can do what my wife and I did when we deleted all our Meta accounts and download archives of that data, but it ends up being pretty useless. Trying to resurrect it and use it on a new platform would be next to impossible. It's dead. 
25 +
26 +
### Fragmented Identity
27 +
28 +
Another problem with the current web model is that your online identity is composed of a bunch of small profiles spread across multiple platforms. We all love that existential dread that comes over us when we have to sign up for yet another service and we have to pick a username that may or may not be available, and then somehow keep up with the 15 different usernames across all of our stuff. 
29 +
30 +
![fragmented identity](https://files.stevedylan.dev/fragmented-identity.png)
31 +
32 +
What an absolute mess. Our identity situation is so bad that we end up creating a link tree page with our huge list of fragmented platforms to help push people in the right direction. Who is Steve online? Hard to say, you have to visit maybe five different sites to figure that out. Perhaps even more frustrating is that we have a solution for this that no platform uses: domains. You're reading from `stevedylan.dev`, a domain I've used for years now that I have control over. What if you could use a single domain for everything? 
33 +
34 +
## The AT Protocol 
35 +
36 +
Thus enters the [AT Protocol](https://atproto.com) (aka ATProto for short), a new model of how our data and our identity can live on the internet. Imagine this: you pick one username, `stevedylan.dev` for example, you can use it for any app, and your data travels with it.
37 +
38 +
![pds model](https://files.stevedylan.dev/pds-model.png)
39 +
40 +
With the AT Protocol model for data, everything lives on a single server called a PDS (personal data server). Your content is organized into neat folders that are used by each app. Let's imagine that we were rebuilding Instagram with this model and we called it `at-gram.com` (horrible I know but stay with me). You login to this website, the app will ask for permission to write files to your server, and once you've approved it then you can start posting. You post an image of a cat, and in that moment the app will create a new "folder" for this post called `com.at-gram.post.image`. When you look inside your personal data server you can look at that data, see how it's put together, and where it comes from: `at-gram.com`. That content you just created doesn't get stored on some server owned by `at-gram.com`; it's owned by __you__. 
41 +
42 +
Everything is tied to your identity that can also be moved from server to server. Let's say you created an account on a PDS owned by an organization and you want to move it somewhere else. The tools exist where you can make that happen, all your data sticks with your identity, and everything keeps working as normal. My ATProto identity lives on my own PDS called `andromeda.social`, but I could just as easily move it to an organization like `selfhosted.social`. That is the true beauty and freedom of the AT Protocol: unified identity, unified data, both portable and interoperable. 
43 +
44 +
I'm glazing over a lot of technical pieces that make up the AT Protocol, so if you're a nerd like me and want to dive deeper, I would highly recommend [this video](https://www.youtube.com/watch?v=F1sJW6nTP6E) and check out the official [website](https://atproto.com).
45 +
46 +
## How to Get Started
47 +
48 +
There's a few ways you could start using ATProto. Probably the easiest one is to sign up through [Blue Sky](https://bsky.app). It's a social media platform that allows you to create custom feeds and have way more control over your experience than other platforms. You can also check out [some other servers out there](https://blog.vicwalker.dev.br/3lz4g6zxeic2p) or join mine if you [ask nicely](mailto:contact@stevedylan.dev?subject=Request%20to%20Join%20andromeda.social) :). When you sign up you'll generally get an alias like `steve.andromeda.social` which is your handle that you can use everywhere, but if you have a custom domain like `stevedylan.dev` that you want to use you can follow [this guide](https://www.bskyinfo.com/guides/advanced-features/custom-domains/). 
49 +
50 +
Once you have an ATProto account here are a few things you can check out!
51 +
52 +
- [Leaflet](https://leaflet.pub) - Tiny interconnected social documents
53 +
- [pckt.blog](https://pckt.blog) - Blogging made easy
54 +
- [offprint](https://offprint.app/) - Publishing for the open web
55 +
- [Smoke Signal](https://smokesignal.events/) - Events built on ATProto
56 +
- [Flashes](https://apps.apple.com/us/app/flashes-for-bluesky/id6741443033) - Instagram alternative
57 +
- [Margin](https://margin.at/) - Write on the margins of the internet
58 +
- [Blento](https://blento.app/) - Create your own website stored on your PDS
59 +
- [Semble](https://semble.so/) - A social knowledge network for researchers
60 +
- [Skyreader](https://skyreader.app/) - RSS Reader built on ATProto
61 +
- [Tangled](https://tangled.org/) - Tightly knit social coding
62 +
63 +
There's a lot out there and I'll try to update this list over time as I find more apps that use ATProto, so save this post and revisit if that sounds interesting to you. If you're trying to get started with ATProto and get stuck, [my inbox is always open](mailto:contact@stevedylan.dev)!
64 +
65 +
## Wrapping Up
66 +
67 +
The web is in a rough place, but what encourages me is the number of people trying to fight for a more open web through technology like ATProto. Plenty of talented developers are trying to improve the protocol as well as build apps that people can use, but the ultimate deciding factor is us and our time. We can choose to keep using walled garden platforms and sending our data to massive companies, or we can choose a smaller web that actually puts the power back in our hands. With enough people making the same decisions to support protocols like this, we can change the course of the web for good.
packages/client/src/content/post/standard-site-the-publishing-gateway.mdx +1 −1
44 44
45 45
The presentation is brilliant. There is a clear order and hierarchy to how ATProto and data works: 
46 46
47 -
- `polybius.social` - This is my PDS, the core where my data is stored
47 +
- `andromeda.social` - This is my PDS, the core where my data is stored
48 48
- `stevedylan.dev (did:plc:ia2zdnhjaokf5lazhxrmj6eu)` - My "account" or "DID" that is hosted on my PDS
49 49
- `site.standard.document` - The collection where my post is, kinda like a folder
50 50
- `3mc4myqaca22x` - The record itself that has all the data
packages/client/src/data/constants.ts +1 −1
1 1
// ATProto configuration
2 2
export const OWNER_DID = "did:plc:ia2zdnhjaokf5lazhxrmj6eu";
3 -
export const PDS_URL = "https://polybius.social";
3 +
export const PDS_URL = "https://andromeda.social";
4 4
5 5
export const MENU_LINKS = [
6 6
	{
packages/server/src/routes/now.ts +3 −2
20 20
21 21
const now = new Hono<{ Bindings: Env }>();
22 22
23 -
const PDS_URL = "https://polybius.social";
23 +
const PDS_URL = "https://andromeda.social";
24 24
25 25
// Helper function to get session for both admin and guest users
26 26
async function getAnySession(c: any, sessionId: string) {
154 154
				coverImage: {
155 155
					$type: "blob",
156 156
					ref: {
157 -
						$link: "bafkreibuxyp2gth3igqik7fxu4cm4nducetgp67hhlx36bwahgnuw4xmoa",
157 +
						$link:
158 +
							"bafkreibuxyp2gth3igqik7fxu4cm4nducetgp67hhlx36bwahgnuw4xmoa",
158 159
					},
159 160
					mimeType: "image/png",
160 161
					size: 2522,
packages/server/wrangler.jsonc +1 −1
6 6
	"compatibility_flags": ["nodejs_compat"],
7 7
	"vars": {
8 8
		"ALLOWED_DID": "did:plc:ia2zdnhjaokf5lazhxrmj6eu",
9 -
		"PDS_URL": "https://polybius.social",
9 +
		"PDS_URL": "https://andromeda.social",
10 10
		"CLIENT_URL": "https://stevedylan.dev",
11 11
		"API_URL": "https://api.stevedylan.dev"
12 12
	},