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

Changelog#

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

[Unreleased]#

[0.2.0] - 2026-01-07#

Added#

  • OAuth 2.0 authorization server with full AT Protocol support
    • Discovery endpoints (AS metadata, protected resource, JWKS)
    • Pushed Authorization Requests (PAR)
    • Authorization endpoint with dark-themed consent UI
    • Token endpoint (authorization_code + refresh_token grants)
    • Token revocation (RFC 7009)
    • DPoP proof validation and token binding
    • PKCE with S256 code challenge
    • Client metadata fetching and validation
    • Loopback client support for development
  • DPoP JTI tracking to prevent replay attacks
  • Comprehensive OAuth e2e tests

Changed#

  • BREAKING: Normalized SQL schema to snake_case convention
    • Tables: blobblobs, record_blobrecord_blobs
    • Columns: mimeTypemime_type, createdAtcreated_at, blobCidblob_cid, recordUrirecord_uri
    • Existing Durable Objects require storage reset
  • Consolidated error responses to use errorResponse helper
  • Moved OAuth types to TYPES & CONSTANTS section

[0.1.0] - 2025-01-07#

Initial experimental release.

Added#

  • Repo operations: createRecord, getRecord, putRecord, deleteRecord, applyWrites, listRecords
  • Sync endpoints: getRepo (CAR export), subscribeRepos (WebSocket firehose), getLatestCommit
  • Authentication: createSession, getSession, refreshSession with JWT tokens
  • Blob storage: uploadBlob, getBlob, listBlobs with R2 backend
    • MIME type sniffing (JPEG, PNG, GIF, WebP, MP4, AVIF, HEIC)
    • Automatic orphaned blob cleanup via DO alarms
    • Blob-record association tracking
  • Identity: Handle resolution, PLC directory registration
  • Federation: Relay notification (requestCrawl), AppView proxy for app.bsky.* endpoints
  • Infrastructure:
    • Merkle Search Tree (MST) for repo structure
    • DAG-CBOR encoding with CID generation
    • P-256 ECDSA signing via Web Crypto
    • TypeScript checking via JSDoc annotations
    • Setup script for key generation and PLC registration