Quick start
This page takes a fresh machine to a deployed PDS in around fifteen minutes, assuming the prerequisites are in place.
Scaffold and set up
Section titled “Scaffold and set up”Run the scaffolder from an empty directory:
npm create pds@latestThis single command does the whole setup end to end:
- Prompts for a folder name, package manager, and whether to initialise a git repository.
- Copies the project template into the folder.
- Installs dependencies.
- Runs the setup wizard (
pds init) inside the new project.
The setup wizard then collects the information needed to deploy:
- Cloudflare login. If
wrangleris not authenticated, the wizard opens a browser to sign in. - Account choice. New account or migration from an existing PDS.
- Handle and DID. The handle (for example
alice.example.com) and the DID method. New accounts default todid:plc. Migrations carry the existing DID across. - Hostname. The domain that will serve the PDS (for example
pds.example.com). - Account password. Used to sign in from the Bluesky app.
- Data placement. A Cloudflare location hint. See Data placement — this choice cannot be changed after the first deploy.
The wizard generates a signing key, a JWT secret, and a password hash. It writes the public values to wrangler.jsonc and the secrets to .dev.vars.
For a non-interactive scaffold (defaults for everything), use the --yes flag:
npm create pds@latest -- --yes --pm pnpmSee the create-pds CLI reference for every flag.
Deploy
Section titled “Deploy”From the project directory:
pnpm run deployThis runs wrangler deploy, which uploads the Worker, creates the Durable Object namespace, and provisions the R2 bucket. The first deploy takes a minute or two.
For a production deploy, push the secrets to Cloudflare:
pnpm pds init --productionThe --production flag writes the secrets stored in .dev.vars to Cloudflare as Worker secrets instead of keeping them local.
Verify the deploy
Section titled “Verify the deploy”Open https://pds.example.com/.well-known/atproto-did (replacing the hostname). The response is the account DID.
Open https://pds.example.com/xrpc/com.atproto.server.describeServer. The response is a JSON object describing the PDS’s capabilities.
For an interactive health check, run:
pnpm pds statusThis checks connectivity, resolves the handle, verifies the repository is initialised, and reports the blob count.
- New account: continue to First login to sign in from the Bluesky app.
- Migrating an existing account: follow Migrate from Bluesky.