---
title: "Pure Internet: Bluesky"
section: posts
description: "Static-site hosting on Bluesky's AT Protocol using content-addressed blob storage."
tags: ["web-development", "alternative-hosting", "at-protocol", "bluesky", "decentralization", "ipfs", "web-hosting"]
created: 2024-11-25T17:46:00Z
updated: 2026-07-16T14:56:30Z
cid: bafkreiey22nlo3yw74csliw5pgi5kj7v4cw4oo6arz5mafpqisqydglvwy
html: https://iammatthias.com/posts/1732585567703-pure-internet-bluesky
---

# Pure Internet: Bluesky

After [NFC cards with data URLs and ENS+IPFS](https://pureinternet.eth.limo/#UHVyZSBJbnRlcm5ldC4gQWxsIHRoZSBjb250ZW50IHlvdSBzZWUgaXMgZW5jb2RlZCBhcyBiYXNlNjQgYW5kIHN0b3JlZCBvbiBhbiBORkMgY2FyZC4gVGhlcmUncyBubyB0cmFkaXRpb25hbCBzZXJ2ZXIsIGp1c3QgYSBzaW5nbGUgcGllY2Ugb2YgSFRNTCBwaW5uZWQgdG8gSVBGUy4gUHVyZSBJbnRlcm5ldC4=), I [got a static site running on Bluesky's AT Protocol](https://amanita.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did:plc:p5xem22ammiafn5kxonaksfa&cid=bafkreih2pbifus4ed6p7kfuqjbjbqmzewlnyaz7f7ykmk5bvchkj7w3eb4). This experiment was inspired by [Daniel Mangum's exploration of atproto's storage capabilities](https://danielmangum.com/posts/this-website-is-hosted-on-bluesky/).

Bluesky is mostly known as a social platform. The AT Protocol underneath is a content-addressable system with built-in distribution. Every blob gets a CID, retrievable through any AT Proto node. It's IPFS in different clothes.

If you can upload arbitrary blobs and get stable URLs back, you can use it as web hosting. Here's the recipe.

1. First, create a session with your Bluesky credentials:

```
curl -X POST 'https://bsky.social/xrpc/com.atproto.server.createSession' \ -H 'Content-Type: application/json' \ -d '{"identifier": "your-handle.bsky.social", "password": "your-password"}'
```

Save the `accessJwt` from the response for the next steps.

2. Create an HTML file (`index.html`) with your website content.
3. Upload your HTML file as a blob:

```
curl -X POST 'https://bsky.social/xrpc/com.atproto.repo.uploadBlob' \ -H 'Authorization: Bearer YOUR_ACCESS_JWT' \ -H 'Content-Type: text/html' \ --data-binary '@index.html'
```

The response will include a blob reference with a CID. Save this CID for the next step.

4. Create a record referencing your blob:

```
curl -X POST 'https://bsky.social/xrpc/com.atproto.repo.createRecord' \ -H 'Authorization: Bearer YOUR_ACCESS_JWT' \ -H 'Content-Type: application/json' \ -d '{ "repo": "your-handle.bsky.social", "collection": "com.yourdomain.website", "record": { "$type": "com.yourdomain.website", "website": { "$type": "blob", "ref": { "$link": "YOUR_BLOB_CID" }, "mimeType": "text/html", "size": YOUR_FILE_SIZE } } }'
```

5. Get the URL of your website:

```
curl -I 'https://bsky.social/xrpc/com.atproto.sync.getBlob?did=YOUR_DID&cid=YOUR_BLOB_CID'
```

The response includes a `location` header with your website's permanent URL. Here's a [real example](https://amanita.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did:plc:p5xem22ammiafn5kxonaksfa&cid=bafkreih2pbifus4ed6p7kfuqjbjbqmzewlnyaz7f7ykmk5bvchkj7w3eb4):

```
https://amanita.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did:plc:p5xem22ammiafn5kxonaksfa&cid=bafkreih2pbifus4ed6p7kfuqjbjbqmzewlnyaz7f7ykmk5bvchkj7w3eb4
```

The URL parts: `amanita.us-east.host.bsky.network` is a Bluesky content delivery node, `com.atproto.sync.getBlob` is the retrieval endpoint, `did` is the content owner, `cid` is the content hash.

The trade-offs are real. You depend on Bluesky's infrastructure. Blobs have size caps. The platform isn't built for static hosting, so content could disappear. The setup is just dead simple.

It's not pure internet in the sovereign sense, since the federation still owns the delivery. But it leaves a question hanging: how far can a social protocol stretch before it becomes a general-purpose CDN?

---

## Related

- [Pure Internet](https://iammatthias.com/posts/1731955749292-pure-internet.md): Pure Internet is a running collection of small experiments in publishing with fewer layers.
- [Pure Internet: no-html](https://iammatthias.com/posts/1740682611811-pure-internet-no-html.md): A plain Markdown file hosted on Bluesky's blob storage and rendered directly by the browser.
- [Notes on using a PDS as Content Infrastructure](https://iammatthias.com/posts/1767505149657-notes-on-using-a-pds-as-content-infrastructure.md): Content addressing with normal web requests, identity baked in, delivery over boring HTTPS.
- [orbz dot com](https://iammatthias.com/posts/1736537615834-orbz-dot-com.md): orbz.fun reads Orbiter's onchain site registry and turns it into a StumbleUpon-style discovery tool.
- [Mint thyself](https://iammatthias.com/posts/1685948400001-mint-thyself.md): A Zora HTML edition that embeds its own mint interface and can be minted from itself.
