Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations. pdsmoover.com
pds atproto migrations moo cow

Compare changes

Choose any two refs to compare.

Changed files
+11 -10
web-ui
src
routes
+2 -1
.dockerignore
··· 4 .idea 5 .env 6 */node_modules 7 - */build
··· 4 .idea 5 .env 6 */node_modules 7 + */build 8 + /web-ui/.env.local
test.compose.yml

This is a binary file and will not be displayed.

+2 -2
web-ui/src/routes/+page.ts
··· 1 import {Client, ok, simpleFetchHandler} from '@atcute/client'; 2 import {ComPdsmooverBackupDescribeServer} from '@pds-moover/lexicons'; 3 import type {PageLoad} from './$types'; 4 - import {PUBLIC_XRPC_BASE} from '$env/static/public'; 5 import type {InferXRPCBodyOutput} from '@atcute/lexicons'; 6 7 export const load: PageLoad = async () => { 8 - const handler = simpleFetchHandler({service: `https://${PUBLIC_XRPC_BASE}`}); 9 const rpc = new Client({handler}); 10 return await ok( 11 //@ts-expect-error: says it's not assignable to never
··· 1 import {Client, ok, simpleFetchHandler} from '@atcute/client'; 2 import {ComPdsmooverBackupDescribeServer} from '@pds-moover/lexicons'; 3 import type {PageLoad} from './$types'; 4 + import {env} from '$env/dynamic/public'; 5 import type {InferXRPCBodyOutput} from '@atcute/lexicons'; 6 7 export const load: PageLoad = async () => { 8 + const handler = simpleFetchHandler({service: `https://${env.PUBLIC_XRPC_BASE}`}); 9 const rpc = new Client({handler}); 10 return await ok( 11 //@ts-expect-error: says it's not assignable to never
+2 -2
web-ui/src/routes/backups/+page.svelte
··· 6 import LoadingSpinner from '$lib/components/LoadingSpinner.svelte'; 7 import type {InferXRPCBodyOutput} from '@atcute/lexicons'; 8 import {ComPdsmooverBackupGetRepoStatus} from '@pds-moover/lexicons'; 9 - import {PUBLIC_XRPC_BASE} from '$env/static/public'; 10 11 12 // Service instances 13 - let backupService = $state(new BackupService(`did:web:${PUBLIC_XRPC_BASE}`)); 14 let plcOps = $state(new PlcOps()); 15 16 // State variables
··· 6 import LoadingSpinner from '$lib/components/LoadingSpinner.svelte'; 7 import type {InferXRPCBodyOutput} from '@atcute/lexicons'; 8 import {ComPdsmooverBackupGetRepoStatus} from '@pds-moover/lexicons'; 9 + import {env} from '$env/dynamic/public'; 10 11 12 // Service instances 13 + let backupService = $state(new BackupService(`did:web:${env.PUBLIC_XRPC_BASE}`)); 14 let plcOps = $state(new PlcOps()); 15 16 // State variables
+1 -1
web-ui/src/routes/info/+page.svelte
··· 60 and enter it on PDS MOOver, this is the final step. 61 </li> 62 <li>Your data will not be deleted from Bluesky(or your previous PDS) during migration. If you find you 63 - are missing any pictures or videos after the move you can use the <a href="/missing">Missing 64 tool</a> to recover those from your previous PDS. 65 </li> 66 </ul>
··· 60 and enter it on PDS MOOver, this is the final step. 61 </li> 62 <li>Your data will not be deleted from Bluesky(or your previous PDS) during migration. If you find you 63 + are missing any pictures or videos after the move you can use the <a href="/missing-blobs">Missing 64 tool</a> to recover those from your previous PDS. 65 </li> 66 </ul>
+2 -2
web-ui/src/routes/moover/[[pds]]/SignThePapers.svelte
··· 3 import {resolve} from '$app/paths' 4 import RotationKeyDisplay from '$lib/components/RotationKeyDisplay.svelte'; 5 import type {RotationKeyType} from '$lib/types'; 6 - import {PUBLIC_XRPC_BASE} from '$env/static/public'; 7 8 let {migrator, newHandle}: { migrator: Migrator, newHandle: string } = $props(); 9 ··· 58 try { 59 backupSignupMessage = 'Signing you up for automated backups...'; 60 //TODO nervous about this state 61 - await migrator.signUpForBackupsFromMigration(`did:web:${PUBLIC_XRPC_BASE}`); 62 backupSignupMessage = 'Signed up for automated backups successfully.'; 63 } catch (e) { 64 console.error(e);
··· 3 import {resolve} from '$app/paths' 4 import RotationKeyDisplay from '$lib/components/RotationKeyDisplay.svelte'; 5 import type {RotationKeyType} from '$lib/types'; 6 + import {env} from '$env/dynamic/public'; 7 8 let {migrator, newHandle}: { migrator: Migrator, newHandle: string } = $props(); 9 ··· 58 try { 59 backupSignupMessage = 'Signing you up for automated backups...'; 60 //TODO nervous about this state 61 + await migrator.signUpForBackupsFromMigration(`did:web:${env.PUBLIC_XRPC_BASE}`); 62 backupSignupMessage = 'Signed up for automated backups successfully.'; 63 } catch (e) { 64 console.error(e);
+2 -2
web-ui/src/routes/restore/+page.svelte
··· 2 import {Restore} from '@pds-moover/moover'; 3 import MooHeader from '$lib/components/MooHeader.svelte'; 4 import LoadingSpinner from '$lib/components/LoadingSpinner.svelte'; 5 - import {PUBLIC_XRPC_BASE} from '$env/static/public'; 6 import OgImage from '$lib/components/OgImage.svelte'; 7 8 //Regexs to catch rotation key type 9 const HEX_REGEX = /^[0-9a-f]+$/i; 10 11 // Service instances 12 - let restoreService = $state(new Restore(`https://${PUBLIC_XRPC_BASE}`)); 13 14 // Form inputs 15 let currentHandle = $state('');
··· 2 import {Restore} from '@pds-moover/moover'; 3 import MooHeader from '$lib/components/MooHeader.svelte'; 4 import LoadingSpinner from '$lib/components/LoadingSpinner.svelte'; 5 + import {env} from '$env/dynamic/public'; 6 import OgImage from '$lib/components/OgImage.svelte'; 7 8 //Regexs to catch rotation key type 9 const HEX_REGEX = /^[0-9a-f]+$/i; 10 11 // Service instances 12 + let restoreService = $state(new Restore(`https://${env.PUBLIC_XRPC_BASE}`)); 13 14 // Form inputs 15 let currentHandle = $state('');