Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations. pdsmoover.com
pds atproto migrations moo cow
Rust 36%
TypeScript 36%
Svelte 22%
HTML 5%
PLpgSQL <1%
CSS <1%
JavaScript <1%
Dockerfile <1%
Just <1%

README.md

PDS MOOver: The Next Generation #

A series of web tools to help users: migrate to a new PDS, find missing blobs, have free backups, and restore from backups in the event of emergency. pdsmoover.com

cow

A little light on documentation as I come off of about a week long crunch but.

  • Looking for the old pds moover for simple code to fork check here, if you'd like to see the newer front end check here
  • Want to run your own instance of PDS MOOver? check this docker compose. It should have all the services in one easy docker compose up, just don't forget to create a .env from .env.template

Break down of projects from the top #

A bit of a mess will probably either condense or rename a couple of these to make it more coherent in the future

  • admin_cli - Like pdsadmin, but for pds moover. Can add a whole PDS to be tracked and their users backed up, remove users, etc. VERY WIP and not everything there yet
  • cron-worker - Very simple binary to tick every hour telling the main worker to check for repos that need an update
  • Dockerfiles - Dockerfiles for all the services in the repo
  • packages/lexicons - TypeScript types for PDS MOOver lexicons
  • packages/moover - The logic that handles all the atproto processes (migrations, missing blobs, backups, restores, plc ops). Platform agnostic and also published as a node module at @pds-moover/moover
  • packages/mock-atmosphere - An in-memory mock of two PDSs (each with its own OAuth server), plc.directory, slingshot and the PDS MOOver directory API. What the tests run against
  • lexicon_types_crate - Rust lexicon types
  • lexicons - JSON Lexicons
  • ProductionComposes - What I use to run PDS MOOver in production. One instance of web behind a load balancer, one worker node currently with 3 instances on that one server. All can scale horizontally
  • shared - Shared code between all the services
  • web - The web server that serves the XRPC endpoints
  • web-ui - Svelte frontend. Signs you in to your current account with atproto OAuth and runs the migration in your browser
  • worker - What acutally handles all the backing up, but the actual logic is in ./shared/src/jobs/

I think there's everything?

Working on the frontend #

The JavaScript side is one pnpm workspace (web-ui and everything in packages), so install and run from the repo root:

pnpm install
pnpm dev        # the web ui at http://127.0.0.1:5173 (it has to be 127.0.0.1, OAuth will not sign in on localhost)
pnpm lint && pnpm check && pnpm test
pnpm test:e2e   # Playwright against the mock, first run needs `pnpm --filter web-ui exec playwright install chromium`

More in the web-ui README and AGENTS.md.

Do you have a pretty picture to show how the network looks? #

yes. Thanks to Orual