Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations.

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('');