{"_id":"@dwk/atproto-pds","_rev":"5-e2756c39ccc24db99369193d9f4b2d57","name":"@dwk/atproto-pds","dist-tags":{"beta":"0.1.0-beta.1","latest":"1.0.0-beta.2"},"versions":{"0.1.0-beta.1":{"name":"@dwk/atproto-pds","version":"0.1.0-beta.1","keywords":["atproto","at-protocol","bluesky","pds","personal-data-server","did-web","cloudflare-workers","durable-objects"],"author":{"name":"David W. Keith","email":"me@dwk.io"},"license":"ISC","_id":"@dwk/atproto-pds@0.1.0-beta.1","maintainers":[{"name":"dwk","email":"npmjs@dwk.io"}],"homepage":"https://github.com/davidwkeith/workers/tree/main/packages/atproto-pds#readme","bugs":{"url":"https://github.com/davidwkeith/workers/issues"},"dist":{"shasum":"618946c6598558b6aed792b4e354420db69add6c","tarball":"https://registry.npmjs.org/@dwk/atproto-pds/-/atproto-pds-0.1.0-beta.1.tgz","fileCount":113,"integrity":"sha512-voXxg4t/li6jpfPtP6YEGCZWZp6DXdQ3wnN+JUjBgRrSFPdlVM88/IW+l6wIas4CXPwpYRQG5Aq6wTLF23OUQQ==","signatures":[{"sig":"MEYCIQC2pguN7IXxoYCS5v5PB7TLf172uqJHAoZKwUQdPAFGPQIhAIagJZameiwIiFaALYXO0nKxXuuH1ZJWM8nrHe88Q26o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dwk%2fatproto-pds@0.1.0-beta.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":503790},"main":"./dist/index.js","type":"module","_from":"file:dwk-atproto-pds-0.1.0-beta.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"dwk","email":"npmjs@dwk.io"},"_resolved":"/tmp/26945a1e0c860d5947f33d84cda95861/dwk-atproto-pds-0.1.0-beta.1.tgz","_integrity":"sha512-voXxg4t/li6jpfPtP6YEGCZWZp6DXdQ3wnN+JUjBgRrSFPdlVM88/IW+l6wIas4CXPwpYRQG5Aq6wTLF23OUQQ==","repository":{"url":"git+https://github.com/davidwkeith/workers.git","type":"git","directory":"packages/atproto-pds"},"_npmVersion":"11.16.0","description":"Edge-native AT Protocol Personal Data Server: XRPC surface, signed Merkle Search Tree repository, CAR sync, did:web identity. Ships the per-account Durable Object.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@dwk/log":"0.1.0-beta.3","@noble/curves":"2.2.0","@dwk/safe-fetch":"0.1.0-beta.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/atproto-pds_0.1.0-beta.1_1784127185847_0.46949120333903993","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-beta.2":{"name":"@dwk/atproto-pds","version":"0.1.0-beta.2","keywords":["atproto","at-protocol","bluesky","pds","personal-data-server","did-web","cloudflare-workers","durable-objects"],"author":{"name":"David W. Keith","email":"me@dwk.io"},"license":"ISC","_id":"@dwk/atproto-pds@0.1.0-beta.2","maintainers":[{"name":"dwk","email":"npmjs@dwk.io"}],"homepage":"https://github.com/davidwkeith/workers/tree/main/packages/atproto-pds#readme","bugs":{"url":"https://github.com/davidwkeith/workers/issues"},"dist":{"shasum":"a6316d259b0fa475651f2a315c631cf54d8518e8","tarball":"https://registry.npmjs.org/@dwk/atproto-pds/-/atproto-pds-0.1.0-beta.2.tgz","fileCount":113,"integrity":"sha512-o2g6eKRbfCJ5Ego4LT6XuCp4/ZccpO1NxdyUJ1AC7VpKMAGjBaAQAeAF0jkNu4WkytU6c9O/i3YtlQ64ELfqBQ==","signatures":[{"sig":"MEYCIQCE4uPSlwhFSVCkYnp/7bijCQWjrnsrAm8i+MzA/IgoRwIhAOxKQCjz9hNduS3a11hefX7t96yU5rgsXgvsGYfel/py","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dwk%2fatproto-pds@0.1.0-beta.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":522571},"main":"./dist/index.js","type":"module","_from":"file:dwk-atproto-pds-0.1.0-beta.2.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"dwk","email":"npmjs@dwk.io"},"_resolved":"/tmp/d1ba2175ebc6113c769f0a3a48e20784/dwk-atproto-pds-0.1.0-beta.2.tgz","_integrity":"sha512-o2g6eKRbfCJ5Ego4LT6XuCp4/ZccpO1NxdyUJ1AC7VpKMAGjBaAQAeAF0jkNu4WkytU6c9O/i3YtlQ64ELfqBQ==","repository":{"url":"git+https://github.com/davidwkeith/workers.git","type":"git","directory":"packages/atproto-pds"},"_npmVersion":"11.16.0","description":"Edge-native AT Protocol Personal Data Server: XRPC surface, signed Merkle Search Tree repository, CAR sync, did:web identity. Ships the per-account Durable Object.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@dwk/log":"0.1.0-beta.4","@noble/curves":"2.2.0","@dwk/safe-fetch":"0.1.0-beta.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/atproto-pds_0.1.0-beta.2_1784798777264_0.9682422763189087","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-beta.3":{"name":"@dwk/atproto-pds","version":"0.1.0-beta.3","keywords":["atproto","at-protocol","bluesky","pds","personal-data-server","did-web","cloudflare-workers","durable-objects"],"author":{"name":"David W. Keith","email":"me@dwk.io"},"license":"ISC","_id":"@dwk/atproto-pds@0.1.0-beta.3","maintainers":[{"name":"dwk","email":"npmjs@dwk.io"}],"homepage":"https://github.com/davidwkeith/workers/tree/main/packages/atproto-pds#readme","bugs":{"url":"https://github.com/davidwkeith/workers/issues"},"dist":{"shasum":"5bafc53a9f8512a8bcf09abf97f7139ca9f1d6f0","tarball":"https://registry.npmjs.org/@dwk/atproto-pds/-/atproto-pds-0.1.0-beta.3.tgz","fileCount":113,"integrity":"sha512-Yat9l+2bmklpffbg88WteDGDiXRQ1aeBKyTyRwTdyaCp0McLJBlkvmix4V1MK3pi7JKP8TccJi+adhbgmSjmUA==","signatures":[{"sig":"MEUCIQCigFn3M+5sJPuXvJyDEWP65uuptL4QceuNGqBgfGrc5wIgcyKT/X70XfrMD5hkXakBRFYWEN4dpl6V5W1YmPP6en8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dwk%2fatproto-pds@0.1.0-beta.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":522647},"main":"./dist/index.js","type":"module","_from":"file:dwk-atproto-pds-0.1.0-beta.3.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"dwk","email":"npmjs@dwk.io"},"_resolved":"/tmp/677c6b3c1b12f10c7bedd2cae538f5a2/dwk-atproto-pds-0.1.0-beta.3.tgz","_integrity":"sha512-Yat9l+2bmklpffbg88WteDGDiXRQ1aeBKyTyRwTdyaCp0McLJBlkvmix4V1MK3pi7JKP8TccJi+adhbgmSjmUA==","repository":{"url":"git+https://github.com/davidwkeith/workers.git","type":"git","directory":"packages/atproto-pds"},"_npmVersion":"11.16.0","description":"Edge-native AT Protocol Personal Data Server: XRPC surface, signed Merkle Search Tree repository, CAR sync, did:web identity. Ships the per-account Durable Object.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@dwk/log":"0.1.0-beta.5","@noble/curves":"2.2.0","@dwk/safe-fetch":"0.1.0-beta.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/atproto-pds_0.1.0-beta.3_1784931472426_0.9321450730204546","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.1":{"name":"@dwk/atproto-pds","version":"1.0.0-beta.1","keywords":["atproto","at-protocol","bluesky","pds","personal-data-server","did-web","cloudflare-workers","durable-objects"],"author":{"name":"David W. Keith","email":"me@dwk.io"},"license":"ISC","_id":"@dwk/atproto-pds@1.0.0-beta.1","maintainers":[{"name":"dwk","email":"npmjs@dwk.io"}],"homepage":"https://github.com/davidwkeith/workers/tree/main/packages/atproto-pds#readme","bugs":{"url":"https://github.com/davidwkeith/workers/issues"},"dist":{"shasum":"a23448ca2c2bfef2afbc9885999b09886668e347","tarball":"https://registry.npmjs.org/@dwk/atproto-pds/-/atproto-pds-1.0.0-beta.1.tgz","fileCount":113,"integrity":"sha512-c9rhM6HF9Ui3divTWQZF616FuUBimeKtjWUGsot0twIGi4EIoEkZ/iVnF+YpbvFTTPPh0s2rAOqyTA2Nn1A0rg==","signatures":[{"sig":"MEYCIQDPx77BdH1kc808kqhs6jdAccKp7s9EjC5+fDLETMMTwQIhAOJlK0SnlIfOOoeHIgoozejztDxcujN/ZVC+FnlGlKtB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dwk%2fatproto-pds@1.0.0-beta.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":522647},"main":"./dist/index.js","type":"module","_from":"file:dwk-atproto-pds-1.0.0-beta.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"dwk","email":"npmjs@dwk.io"},"_resolved":"/tmp/a3ff8724478be458f9dd6ef0bf28a3b7/dwk-atproto-pds-1.0.0-beta.1.tgz","_integrity":"sha512-c9rhM6HF9Ui3divTWQZF616FuUBimeKtjWUGsot0twIGi4EIoEkZ/iVnF+YpbvFTTPPh0s2rAOqyTA2Nn1A0rg==","repository":{"url":"git+https://github.com/davidwkeith/workers.git","type":"git","directory":"packages/atproto-pds"},"_npmVersion":"11.16.0","description":"Edge-native AT Protocol Personal Data Server: XRPC surface, signed Merkle Search Tree repository, CAR sync, did:web identity. Ships the per-account Durable Object.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@dwk/log":"1.0.0-beta.1","@noble/curves":"2.2.0","@dwk/safe-fetch":"1.0.0-beta.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/atproto-pds_1.0.0-beta.1_1785269166078_0.14746381727425795","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.2":{"name":"@dwk/atproto-pds","version":"1.0.0-beta.2","description":"Edge-native AT Protocol Personal Data Server: XRPC surface, signed Merkle Search Tree repository, CAR sync, did:web identity. Ships the per-account Durable Object.","keywords":["atproto","at-protocol","bluesky","pds","personal-data-server","did-web","cloudflare-workers","durable-objects"],"type":"module","license":"ISC","author":{"name":"David W. Keith","email":"me@dwk.io"},"homepage":"https://github.com/davidwkeith/workers/tree/main/packages/atproto-pds#readme","repository":{"type":"git","url":"git+https://github.com/davidwkeith/workers.git","directory":"packages/atproto-pds"},"bugs":{"url":"https://github.com/davidwkeith/workers/issues"},"sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"publishConfig":{"access":"public"},"dependencies":{"@noble/curves":"2.2.0","@dwk/log":"1.0.0-beta.1","@dwk/safe-fetch":"1.0.0-beta.1"},"scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json","clean":"rm -rf dist"},"_id":"@dwk/atproto-pds@1.0.0-beta.2","_integrity":"sha512-oF/8vOztNvLWa0Cm28m3PvWCHWhAXRzcw7P3bF+zqNddnp5iGnZSQD0mLS04jKkBQvGNRM6/IYC3+AMlQVd9YQ==","_resolved":"/tmp/bf54dd69443e404845ba12b6e0f4fcff/dwk-atproto-pds-1.0.0-beta.2.tgz","_from":"file:dwk-atproto-pds-1.0.0-beta.2.tgz","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-oF/8vOztNvLWa0Cm28m3PvWCHWhAXRzcw7P3bF+zqNddnp5iGnZSQD0mLS04jKkBQvGNRM6/IYC3+AMlQVd9YQ==","shasum":"95ca4d6211dd4b1688aee05b00d78e040332a5df","tarball":"https://registry.npmjs.org/@dwk/atproto-pds/-/atproto-pds-1.0.0-beta.2.tgz","fileCount":118,"unpackedSize":555449,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dwk%2fatproto-pds@1.0.0-beta.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEsszkg50+IaM33cYiaKbSbwiaUkKit6hqVLLn6YQUm3AiBNHzD4EvFER7VZ9XmJshjksBsbjBtyD3NhmUfA/g2nGg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fc57cf81-2dfb-4600-af1a-fd0258e577c7"}},"directories":{},"maintainers":[{"name":"dwk","email":"npmjs@dwk.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/atproto-pds_1.0.0-beta.2_1786386102698_0.4957879595601471"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-15T14:53:05.668Z","modified":"2026-08-10T18:21:43.175Z","0.1.0-beta.1":"2026-07-15T14:53:06.006Z","0.1.0-beta.2":"2026-07-23T09:26:17.401Z","0.1.0-beta.3":"2026-07-24T22:17:52.571Z","1.0.0-beta.1":"2026-07-28T20:06:06.258Z","1.0.0-beta.2":"2026-08-10T18:21:42.846Z"},"bugs":{"url":"https://github.com/davidwkeith/workers/issues"},"author":{"name":"David W. Keith","email":"me@dwk.io"},"license":"ISC","homepage":"https://github.com/davidwkeith/workers/tree/main/packages/atproto-pds#readme","keywords":["atproto","at-protocol","bluesky","pds","personal-data-server","did-web","cloudflare-workers","durable-objects"],"repository":{"type":"git","url":"git+https://github.com/davidwkeith/workers.git","directory":"packages/atproto-pds"},"description":"Edge-native AT Protocol Personal Data Server: XRPC surface, signed Merkle Search Tree repository, CAR sync, did:web identity. Ships the per-account Durable Object.","maintainers":[{"name":"dwk","email":"npmjs@dwk.io"}],"readme":"# `@dwk/atproto-pds`\n\n> Edge-native AT Protocol Personal Data Server: XRPC surface, a signed Merkle\n> Search Tree repository, CAR sync, and `did:web` identity. Endpoint package +\n> Durable Object.\n\nPart of the [`@dwk` IndieWeb + Solid cohort](../../README.md). See the\n[package specification](../../spec/packages/atproto-pds.md) for the full\nrequirements — including why this package is the cohort's **strategic outlier**.\n\nA self-hosted [AT Protocol](https://atproto.com/specs/atp) **Personal Data\nServer (PDS)** rooted at the user's **own** domain: the home of one account's\nrepository in the Bluesky network. It is the package embodiment of\n[“there are no instances in atproto”](https://overreacted.io/there-are-no-instances-in-atproto/) —\nidentity is a `did:web` the user controls and hosting is a swappable service\nentry in that DID document, so the repository is a portable, signed,\ncontent-addressed structure rather than an identity-defining silo. It mirrors the\narchitecture proven in [`@dwk/solid-pod`](../solid-pod/README.md): a **stateless\nfront door** over a **per-account Durable Object** that is the single authority\nfor the repository signing key, the MST, and the signed commit chain.\n\nUnlike the rest of the cohort it shares **neither** [`@dwk/store`](../store/README.md)\n(the repository is an MST/blockstore, not `key → { rdf | blob }`) **nor**\n[`@dwk/rdf`](../rdf/README.md) (records are lexicon-typed DAG-CBOR, not RDF), so\nits storage core — DAG-CBOR, CIDv1, the MST, CAR, and commit signing — is\nself-contained and built directly on WebCrypto.\n\n## What it covers\n\n- **Identity at your own domain** — `/.well-known/atproto-did` (handle → DID) and\n  `/.well-known/did.json` (a `did:web` document advertising the repository\n  signing key as a `Multikey` and the PDS as an `AtprotoPersonalDataServer`\n  service).\n- **XRPC surface** (`/xrpc/<nsid>`):\n  - `com.atproto.server.*` — `createSession`, `getSession`, `refreshSession`,\n    `describeServer`.\n  - `com.atproto.repo.*` — `createRecord`, `putRecord`, `deleteRecord`,\n    `getRecord`, `listRecords`, `describeRepo`, `uploadBlob`.\n  - `com.atproto.sync.*` — `getRepo` (CAR export), `getLatestCommit`, `getBlob`,\n    `listRepos`.\n  - `com.atproto.identity.resolveHandle`.\n- **A signed, portable repository** — records are DAG-CBOR blocks in a\n  deterministic Merkle Search Tree; each write produces a new commit signed with\n  the account's repository key (compact, low-S) and chained through `prev`.\n  `getRepo` exports the whole thing as a CARv1 whose root commit verifies against\n  the key in the DID document.\n- **Blobs** stream to R2, addressed by their raw-codec CID.\n\n## Design decisions\n\n- **P-256 signing by default, secp256k1 (K-256) opt-in.** Both are valid per AT\n  Protocol's cryptography spec. WebCrypto supports P-256 natively, so it is the\n  dependency-free default (published as a `did:key`, multicodec 0x1200). Set\n  `signingCurve: \"secp256k1\"` for the network-preferred curve real Bluesky\n  accounts use — signed via `@noble/curves` (deterministic, low-S) and published\n  with multicodec 0xe7. The curve is fixed at repository genesis.\n- **`did:web` by default, `did:plc` opt-in (in progress).** `did:web` keeps\n  identity on the user's own origin with no external PLC directory. Set\n  `didMethod: \"plc\"` for a `did:plc` account: the DO mints a DO-custodied\n  rotation key, self-signs a genesis operation, derives its `did:plc`, and serves\n  it consistently. The PLC **directory client** (`plc-directory.ts`) submits the\n  genesis op (`POST /:did`) and resolves DIDs (`GET /:did`); set\n  `plcDirectoryUrl` to register a fresh account on the network at creation — done\n  via a Durable Object alarm with exponential-backoff retry, never blocking init\n  (default unset — nothing reaches the network unless asked).\n- **Single-account scope.** One account per `baseUrl`, authenticated by a\n  configured password. The firehose is future work.\n\n## Usage\n\n```ts\nimport { createAtprotoPds, AtprotoRepoObject } from \"@dwk/atproto-pds\";\n\nconst pds = createAtprotoPds({\n  baseUrl: \"https://alice.example.com\",\n  password: env.ACCOUNT_PASSWORD, // secret binding\n  jwtSecret: env.SESSION_SECRET, // secret binding\n});\n\nexport default {\n  fetch: (request, env, ctx) => pds(request, env, ctx),\n};\n\nexport { AtprotoRepoObject };\n```\n\nThe composed Worker must bind the `REPO` Durable Object namespace\n(`AtprotoRepoObject`) and the `BLOBS` R2 bucket; a missing binding fails loudly\nat startup.\n\n## License\n\nISC\n","readmeFilename":"README.md"}