The $4 Social Network Grew Up

  • atproto
  • bluesky
  • activitypub
  • mcp
  • serverless
  • buildinpublic

Four days ago I published a post explaining that serverless.social is a real AT Protocol PDS running on about $4 of AWS a month — and that the post you were reading was, quite literally, a row in a DynamoDB table.

Then I spent four days feeding it. It stopped being a demo and turned into the place I actually live online. Here's everything that changed.

I moved my real identity onto it

martzmakes.com — my handle, my ~800 Bluesky followers, my whole back catalog of blog posts — now runs on this stack. Not a copy or a mirror: the actual did:plc:… identity, self-hosted. I'm now my own PDS, my own hosting provider, my own everything. The decade-ish archive of posts I'd written elsewhere? Those are DynamoDB rows now too, rendered to static HTML at the edge. Same $4 box, two domains.

If you've ever wanted to *own* your online identity instead of renting it from a platform that can rug-pull you — this is what that actually looks like in practice. It's not a manifesto. It's a CDK stack.

One app, two faces

serverless.social and martzmakes.com serve the same single-page app. It notices which host it's being viewed on and renders that identity — the apex shows the platform, martzmakes.com shows me, my posts, my profile. One bundle, host-aware, no per-site fork.

It speaks Fediverse now

There's an ActivityPub bridge in front of the same data, so you can follow @martzmakes@serverless.social from any Mastodon server. AT Protocol on one side, ActivityPub on the other, both falling out of the same little serverless box. Cross-protocol identity, no extra infrastructure.

Posts actually show up now

I found (and fixed) a federation gap where new posts sat on my PDS for *hours* before Bluesky's relay bothered to poll for them. Now every commit pings the relay directly, so a new post lands in the global Bluesky AppView in seconds. Along the way I also implemented getServiceAuth (so cross-service tokens stop stranding after a signing-key rotation) and fixed reply-thread rendering so parent context shows up.

I taught Claude to run it

This is the big one. serverless.social now speaks MCP — the Model Context Protocol. I gave it a server so Claude (in Claude Code or Claude Desktop) can operate my social presence directly: list the accounts I'm authorized to act as, write a short post, write a longform article, delete a record. Authorization is per-account and per-identity — my login can act as both serverless.social and martzmakes.com, but not as anyone else who signed up.

The meta part: this very post was published through that pipe. An agent wrote a row to a DynamoDB table over MCP, and the edge rendered it into the page you're reading.

And as of today: it knows how it's doing

The newest piece, shipped today, is analytics over the same MCP. I can pull live engagement — likes, reposts, replies — for any of my posts on demand, and engagement over time (follower growth, per-post trends) from a once-a-day snapshot job that quietly records the numbers. Build the thing, then teach the thing to tell you whether the thing is working.

Still ~$4 a month

Everything above is scale-to-zero: a Lambda here, a DynamoDB table there, one EventBridge tick a day. No servers idling, no fixed monthly platform fee, no vendor between me and my own audience. Own your identity, bridge it everywhere, let an AI help you run it — on pocket change.

More soon. I'm building this one in the open.

*Also published on martzmakes.com.*