A zero-dependency AT Protocol Personal Data Server written in JavaScript
atproto pds

PDS Endpoint Comparison: pds.js vs atproto/packages/pds#

Comparison of endpoints and parameters between this implementation and the official AT Protocol PDS.


Endpoints Missing from pds.js#

com.atproto.admin.* (entire namespace missing)#

Endpoint Params
deleteAccount did
disableAccountInvites account, note
disableInviteCodes accounts, codes
enableAccountInvites account, note
getAccountInfo did
getAccountInfos dids
getInviteCodes cursor, limit, sort
getSubjectStatus blob, did, uri
searchAccounts cursor, email, limit
sendEmail comment, content, recipientDid, senderDid, subject
updateAccountEmail account, email
updateAccountHandle did, handle
updateAccountPassword did, password
updateAccountSigningKey did, signingKey
updateSubjectStatus deactivated, subject, takedown

com.atproto.identity.* (mostly missing)#

Endpoint Params Notes
getRecommendedDidCredentials (none)
refreshIdentity identifier
requestPlcOperationSignature (none)
resolveDid did
resolveIdentity identifier
signPlcOperation alsoKnownAs, rotationKeys, services, token, verificationMethods
submitPlcOperation operation
updateHandle handle

pds.js only implements: resolveHandle

com.atproto.server.* (many missing)#

Endpoint Params
activateAccount (none)
checkAccountStatus (none)
confirmEmail email, token
createAccount did, email, handle, inviteCode, password, plcOp, recoveryKey, verificationCode, verificationPhone
createAppPassword name, privileged
createInviteCode forAccount, useCount
createInviteCodes codeCount, forAccounts, useCount
deactivateAccount deleteAfter
deleteAccount did, password, token
deleteSession (none)
getAccountInviteCodes createAvailable, includeUsed
getServiceAuth aud, exp, lxm
listAppPasswords (none)
requestAccountDelete (none)
requestEmailConfirmation (none)
requestEmailUpdate (none)
requestPasswordReset email
reserveSigningKey did
resetPassword password, token
revokeAppPassword name
updateEmail email, emailAuthFactor, token

pds.js implements: createSession, getSession, refreshSession, describeServer

com.atproto.sync.* (some missing)#

Endpoint Params
getBlocks cids, did
getHostStatus hostname
listHosts cursor, limit
listReposByCollection collection, cursor, limit
notifyOfUpdate hostname
requestCrawl hostname

pds.js implements: listRepos, getLatestCommit, getRepoStatus, getRepo, getRecord, getBlob, listBlobs, subscribeRepos

com.atproto.repo.* (some missing)#

Endpoint Params
importRepo (binary)
listMissingBlobs cursor, limit

pds.js implements: createRecord, deleteRecord, putRecord, applyWrites, getRecord, describeRepo, listRecords, uploadBlob

com.atproto.moderation.*#

Endpoint Params
createReport modTool, reason, reasonType, subject

com.atproto.temp.* (entire namespace missing)#

Endpoint Params
addReservedHandle handle
checkHandleAvailability birthDate, email, handle
checkSignupQueue (none)
dereferenceScope scope
fetchLabels limit, since
requestPhoneVerification phoneNumber
revokeAccountCredentials account

Missing Parameters in Shared Endpoints#

Endpoints that exist in both implementations, but pds.js is missing parameters:

Endpoint pds.js has Missing from pds.js
repo.createRecord collection, record, rkey repo, validate, swapCommit
repo.deleteRecord collection, rkey repo, swapCommit, swapRecord
repo.putRecord collection, rkey, record repo, validate, swapCommit, swapRecord
repo.applyWrites writes repo, validate, swapCommit
sync.getRepo did since
sync.listBlobs did, cursor, limit since
sync.listRepos (none) cursor, limit
server.createSession identifier, password allowTakendown, authFactorToken

Bold = likely important for compatibility


app.bsky.* Coverage#

Both implementations handle app.bsky.* the same way:

Category Endpoints Notes
Native (stored in PDS) actor.getPreferences, actor.putPreferences Both implementations
Proxied to AppView ~87 endpoints feed., graph., notification.*, etc.

Extra in pds.js (not in atproto spec)#

Custom endpoints specific to this implementation:

Endpoint Purpose
POST /init Initialize PDS with DID/keys
GET /status Health check
POST /register-did Register a DID
GET /get-registered-dids List registered DIDs
POST /register-handle Register a handle
GET /resolve-handle Resolve handle (non-XRPC path)
POST /forward-event Forward sync events to other instances
GET /repo-info Get repository info
GET /oauth-public-key Get OAuth public key
POST /check-dpop-jti DPoP replay protection

OAuth 2.0 Stack (full implementation)#

Endpoint Purpose
GET /.well-known/oauth-authorization-server OAuth server metadata
GET /.well-known/oauth-protected-resource Protected resource metadata
GET /oauth/jwks JSON Web Key Set
POST /oauth/par Pushed Authorization Request
GET/POST /oauth/authorize Authorization endpoint
POST /oauth/token Token endpoint (with DPoP)
POST /oauth/revoke Token revocation

Summary#

Category pds.js atproto PDS
com.atproto.admin.* 0 15
com.atproto.identity.* 1 9
com.atproto.moderation.* 0 1
com.atproto.repo.* 8 10
com.atproto.server.* 4 25
com.atproto.sync.* 8 14
com.atproto.temp.* 0 7
app.bsky.* (native) 2 2
app.bsky.* (proxied) ~87 ~87
Total XRPC (native) 23 85
Custom endpoints 10 0
OAuth endpoints 7 7 (via @atproto/oauth-provider)