this repo has no description

Lewis' BS PDS Sandbox#

When I'm actually done then yeah let's make this into a proper official-looking repo perhaps under an official-looking account or something.

This project implements a Personal Data Server (PDS) implementation for the AT Protocol.

Uses PostgreSQL instead of SQLite, S3-compatible blob storage, and aims to be a complete drop-in replacement for Bluesky's reference PDS implementation.

In fact I aim to also implement a plugin system soon, so that we can add things onto our own PDSes on top of the default BS.

I'm also taking ideas on what other PDSes lack, such as an on-PDS webpage that users can access to manage their records and preferences.

:3

Running locally#

The reader will need rust installed locally.

I personally run the postgres db, and an S3-compatible object store with podman compose up db objsto -d.

Run the PDS directly:

just run

Configuration is via environment variables:

DATABASE_URL          postgres connection string
S3_BUCKET             blob storage bucket name
S3_ENDPOINT           S3 endpoint URL (for MinIO etc)
AWS_ACCESS_KEY_ID     S3 credentials
AWS_SECRET_ACCESS_KEY
AWS_REGION
PDS_HOSTNAME          public hostname of this PDS
APPVIEW_URL           appview to proxy unimplemented endpoints to
RELAYS                comma-separated list of relay WebSocket URLs

Optional email stuff:

MAIL_FROM_ADDRESS     sender address (enables email notifications)
MAIL_FROM_NAME        sender name (default: BSPDS)
SENDMAIL_PATH         path to sendmail binary

Development

just              shows available commands
just test         run tests (spins up postgres and minio via testcontainers)
just lint         clippy + fmt check
just db-reset     drop and recreate local database

The test suite uses testcontainers so you don't need to set up anything manually for running tests.

What's implemented#

Most of the com.atproto.* namespace is done. Server endpoints, repo operations, sync, identity, admin, moderation. The firehose websocket works. OAuth is not done yet.

See TODO.md for the full breakdown of what's done and what's left.

Structure

src/
  main.rs           server entrypoint
  lib.rs            router setup
  state.rs          app state (db pool, stores)
  api/              XRPC handlers organized by namespace
  auth/             JWT handling
  repo/             postgres block store
  storage/          S3 blob storage
  sync/             firehose, relay clients
  notifications/    email service
tests/              integration tests
migrations/         sqlx migrations

License

idk