A single-user ATProto PDS that runs on a Cloudflare Worker
See the codeThe lightest PDS in the Atmosphere
A single-user AT Protocol Personal Data Server (PDS) that runs on a Cloudflare Worker.
A PDS is where Bluesky data lives – posts, follows, profile, and media. Running a personal PDS provides:
This implementation uses Cloudflare Workers with Durable Objects and R2:
The result is a PDS that runs at the edge with no servers to manage, automatic scaling, and pay-per-use pricing.
npm create pds
This scaffolds a new project, installs dependencies, and runs the setup wizard. See the PDS package documentation for detailed setup and configuration.
Before running your PDS, you'll need:
Once your domain is active in Cloudflare, you can proceed with the setup wizard.
| Package | Description |
|---|---|
@getcirrus/pds | The PDS implementation – handles repository operations, federation, OAuth, and the CLI |
@getcirrus/oauth-provider | OAuth 2.1 provider for "Login with Bluesky" |
create-pds | Scaffolding CLI to create new PDS projects |
⚠️ This is experimental beta software under active development. While the core features are functional and account migration has been tested, this PDS implementation is still being refined. Breaking changes may occur, and not all edge cases have been discovered. Consider backing up important data before migrating a primary account.
Core features currently working:
See the PDS documentation for current limitations and roadmap.
Your signing key controls your identity. Cloudflare secrets cannot be retrieved after they're set, so backing up your key during setup is critical.
When you run pds init, you'll be prompted to back up your signing key. Store it somewhere safe – a password manager, encrypted backup, or similar.
If you've cloned to a new machine and see the "Key Recovery Required" error:
.dev.vars:
SIGNING_KEY=your-backed-up-key-here
pds init will detect the local key and continueFor did:web users:
.dev.vars and re-running pds initFor did:plc users:
MIT. © Matt Kane (@ascorbic)
TypeScript
97.9%
HTML
1.4%
A single-user ATProto PDS that runs on a Cloudflare Worker
See the codeThe lightest PDS in the Atmosphere
A single-user AT Protocol Personal Data Server (PDS) that runs on a Cloudflare Worker.
A PDS is where Bluesky data lives – posts, follows, profile, and media. Running a personal PDS provides:
This implementation uses Cloudflare Workers with Durable Objects and R2:
The result is a PDS that runs at the edge with no servers to manage, automatic scaling, and pay-per-use pricing.
npm create pds
This scaffolds a new project, installs dependencies, and runs the setup wizard. See the PDS package documentation for detailed setup and configuration.
Before running your PDS, you'll need:
Once your domain is active in Cloudflare, you can proceed with the setup wizard.
| Package | Description |
|---|---|
@getcirrus/pds | The PDS implementation – handles repository operations, federation, OAuth, and the CLI |
@getcirrus/oauth-provider | OAuth 2.1 provider for "Login with Bluesky" |
create-pds | Scaffolding CLI to create new PDS projects |
⚠️ This is experimental beta software under active development. While the core features are functional and account migration has been tested, this PDS implementation is still being refined. Breaking changes may occur, and not all edge cases have been discovered. Consider backing up important data before migrating a primary account.
Core features currently working:
See the PDS documentation for current limitations and roadmap.
Your signing key controls your identity. Cloudflare secrets cannot be retrieved after they're set, so backing up your key during setup is critical.
When you run pds init, you'll be prompted to back up your signing key. Store it somewhere safe – a password manager, encrypted backup, or similar.
If you've cloned to a new machine and see the "Key Recovery Required" error:
.dev.vars:
SIGNING_KEY=your-backed-up-key-here
pds init will detect the local key and continueFor did:web users:
.dev.vars and re-running pds initFor did:plc users:
MIT. © Matt Kane (@ascorbic)
TypeScript
97.9%
HTML
1.4%