.DS_Store
.DS_Store
This is a binary file and will not be displayed.
+2
-1
.env.example
+2
-1
.env.example
+2
.gitignore
+2
.gitignore
+35
-9
.zed/settings.json
+35
-9
.zed/settings.json
···+// For a full list of overridable settings, and general information on folder-specific settings,
+6
-15
README.md
+6
-15
README.md
···Airport is a web application built with Fresh and Deno that helps users safely migrate and backup their Bluesky PDS data. It provides a user-friendly interface for managing your AT Protocol data.-โ ๏ธ **Alpha Status**: Airport is currently in alpha. Please use migration tools at your own risk and avoid using with main accounts during this phase.···
+65
components/Link.tsx
+65
components/Link.tsx
···+d="M4.25 5.5a.75.75 0 00-.75.75v8.5c0 .414.336.75.75.75h8.5a.75.75 0 00.75-.75v-4a.75.75 0 011.5 0v4A2.25 2.25 0 0112.75 17h-8.5A2.25 2.25 0 012 14.75v-8.5A2.25 2.25 0 014.25 4h5a.75.75 0 010 1.5h-5z"+d="M6.194 12.753a.75.75 0 001.06.053L16.5 4.44v2.81a.75.75 0 001.5 0v-4.5a.75.75 0 00-.75-.75h-4.5a.75.75 0 000 1.5h2.553l-9.056 8.194a.75.75 0 00-.053 1.06z"
+267
-80
islands/DidPlcProgress.tsx
+267
-80
islands/DidPlcProgress.tsx
······+<div class="p-3 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700">+<div class="p-3 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700">+<div class="p-3 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700">+<div class="p-4 bg-red-50 dark:bg-red-900 rounded-lg border-2 border-red-500 dark:border-red-700 mb-4">+<div class="p-3 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700">+<div class="p-4 bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700">·········-<div class="bg-blue-50 dark:bg-blue-900 p-6 rounded-lg border border-blue-200 dark:border-blue-800">+<div class="boarding-label text-amber-500 dark:text-amber-400 font-mono font-bold tracking-wider text-sm mb-2">+class={`px-4 py-2 font-mono text-slate-600 dark:text-slate-400 hover:text-slate-800 dark:hover:text-slate-200 transition-colors duration-200 flex items-center space-x-2 ${+class="px-6 py-2 bg-amber-500 hover:bg-amber-600 text-white font-mono rounded-md transition-colors duration-200 flex items-center space-x-2"+class="px-4 py-2 font-mono text-slate-600 dark:text-slate-400 hover:text-slate-800 dark:hover:text-slate-200 transition-colors duration-200 flex items-center space-x-2"-<div class="mt-6 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">-class="mt-6 px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-md transition-colors duration-200 flex items-center space-x-2"
+15
-6
islands/Header.tsx
+15
-6
islands/Header.tsx
············
+35
islands/LoginButton.tsx
+35
islands/LoginButton.tsx
···
+536
-264
islands/MigrationProgress.tsx
+536
-264
islands/MigrationProgress.tsx
··················-case 2: return step.name === "Enter the token sent to your email to complete identity migration"···············-const errorMessage = `${data.reason || "Verification failed"}\nStatus details: ${JSON.stringify(statusDetails, null, 2)}`;+? "bg-yellow-50 border-yellow-200 text-yellow-800 dark:bg-yellow-900/20 dark:border-yellow-800 dark:text-yellow-200"+: "bg-red-50 border-red-200 text-red-800 dark:bg-red-900/20 dark:border-red-800 dark:text-red-200"···+class="px-3 py-1 text-xs bg-blue-600 hover:bg-blue-700 text-white rounded transition-colors duration-200 dark:bg-blue-500 dark:hover:bg-blue-400"+class="px-3 py-1 text-xs bg-white border border-gray-300 text-gray-700 hover:bg-gray-100 rounded transition-colors duration-200······<div class="p-4 bg-green-50 dark:bg-green-900 rounded-lg border-2 border-green-200 dark:border-green-800">-class="mt-4 mr-4 px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-md transition-colors duration-200"-<a href="https://ko-fi.com/knotbin" target="_blank" class="mt-4 px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-md transition-colors duration-200">+class="px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-md transition-colors duration-200 flex items-center space-x-2"+class="px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-md transition-colors duration-200 flex items-center space-x-2"+d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"
+61
-7
islands/MigrationSetup.tsx
+61
-7
islands/MigrationSetup.tsx
························+? "bg-yellow-50 border-yellow-200 text-yellow-800 dark:bg-yellow-900/20 dark:border-yellow-800 dark:text-yellow-200"+: "bg-red-50 border-red-200 text-red-800 dark:bg-red-900/20 dark:border-red-800 dark:text-red-200"+migrationState.state === "maintenance" ? "text-yellow-600 dark:text-yellow-400" : "text-red-600 dark:text-red-400"<p class="text-gray-600 dark:text-gray-400 mt-4">Please complete your migration check-in</p>···<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>···class="w-full flex justify-center items-center py-3 px-4 rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"···-<span class="font-semibold text-red-500">Warning:</span> This migration process can be <strong>irreversible</strong>.<br />Airport is in <strong>alpha</strong> currently, and we don't recommend it for main accounts. Migrate at your own risk. We reccomend backing up your data before proceeding.+<span class="font-semibold text-red-500">Warning:</span> This migration is <strong>irreversible</strong> if coming from Bluesky servers.<br />Bluesky does not recommend it for main accounts. Migrate at your own risk. We reccomend backing up your data before proceeding.
+15
-7
islands/Ticket.tsx
+15
-7
islands/Ticket.tsx
·········
+7
lib/check-dids.ts
+7
lib/check-dids.ts
···
+70
lib/migration-state.ts
+70
lib/migration-state.ts
···+message: "Migration services are temporarily unavailable as we investigate an issue. Please try again later.",+message: "Migration services are temporarily unavailable for maintenance. Please try again later.",
+31
-10
lib/sessions.ts
+31
-10
lib/sessions.ts
··················
+1
-1
lib/storage.ts
+1
-1
lib/storage.ts
routes/.DS_Store
routes/.DS_Store
This is a binary file and will not be displayed.
routes/api/.DS_Store
routes/api/.DS_Store
This is a binary file and will not be displayed.
+4
-4
routes/api/logout.ts
+4
-4
routes/api/logout.ts
······
+6
-2
routes/api/migrate/create.ts
+6
-2
routes/api/migrate/create.ts
·········
+187
-49
routes/api/migrate/data/blobs.ts
+187
-49
routes/api/migrate/data/blobs.ts
·········-migrationLogs.push(`[${new Date().toISOString()}] Counting blobs on page ${pageCount + 1}...`);···-console.log(`[${new Date().toISOString()}] Found ${newBlobs} blobs on page ${pageCount + 1} in ${pageTime/1000} seconds, total so far: ${totalBlobs}`);-migrationLogs.push(`[${new Date().toISOString()}] Found ${newBlobs} blobs on page ${pageCount + 1} in ${pageTime/1000} seconds, total so far: ${totalBlobs}`);···-migrationLogs.push(`[${new Date().toISOString()}] Fetching blob list page ${pageCount + 1}...`);···-console.log(`[${new Date().toISOString()}] Found ${listedBlobs.data.cids.length} blobs on page ${pageCount + 1} in ${pageTime/1000} seconds`);-migrationLogs.push(`[${new Date().toISOString()}] Found ${listedBlobs.data.cids.length} blobs on page ${pageCount + 1} in ${pageTime/1000} seconds`);-console.log(`[${new Date().toISOString()}] Starting migration for blob ${cid} (${processedBlobs + 1} of ${totalBlobs})...`);-migrationLogs.push(`[${new Date().toISOString()}] Starting migration for blob ${cid} (${processedBlobs + 1} of ${totalBlobs})...`);···-migrationLogs.push(`[${new Date().toISOString()}] Downloading blob ${cid} (${size} bytes)...`);-console.log(`[${new Date().toISOString()}] Successfully migrated blob ${cid} in ${blobTime/1000} seconds`);-migrationLogs.push(`[${new Date().toISOString()}] Successfully migrated blob ${cid} in ${blobTime/1000} seconds`);-throw new Error(`Upload failed: ${uploadError instanceof Error ? uploadError.message : String(uploadError)}`);-const detailedError = `[${new Date().toISOString()}] Failed to migrate blob ${cid}: ${errorMessage}`;-const progressLog = `[${new Date().toISOString()}] Progress: ${processedBlobs}/${totalBlobs} blobs processed (${Math.round((processedBlobs/totalBlobs)*100)}%)`;···-const completionMessage = `[${new Date().toISOString()}] Blob migration completed in ${totalTime/1000} seconds: ${migratedBlobs.length} blobs migrated${failedBlobs.length > 0 ? `, ${failedBlobs.length} failed` : ''} (${pageCount} pages processed)`;···
+99
-37
routes/api/migrate/data/prefs.ts
+99
-37
routes/api/migrate/data/prefs.ts
······-migrationLogs.push(`[${new Date().toISOString()}] Preferences fetched in ${fetchTime/1000} seconds`);-console.log(`[${new Date().toISOString()}] Preferences updated in ${updateTime/1000} seconds`);-migrationLogs.push(`[${new Date().toISOString()}] Preferences updated in ${updateTime/1000} seconds`);-const completionMessage = `[${new Date().toISOString()}] Preferences migration completed in ${totalTime/1000} seconds total`;···
+93
-38
routes/api/migrate/data/repo.ts
+93
-38
routes/api/migrate/data/repo.ts
······-migrationLogs.push(`[${new Date().toISOString()}] Repo data fetched in ${fetchTime/1000} seconds`);-migrationLogs.push(`[${new Date().toISOString()}] Repo data imported in ${importTime/1000} seconds`);-const completionMessage = `[${new Date().toISOString()}] Repo migration completed in ${totalTime/1000} seconds total`;···
+17
routes/api/migrate/finalize.ts
+17
routes/api/migrate/finalize.ts
······
+22
-4
routes/api/migrate/identity/request.ts
+22
-4
routes/api/migrate/identity/request.ts
············
+20
-3
routes/api/migrate/identity/sign.ts
+20
-3
routes/api/migrate/identity/sign.ts
·········
+2
-2
routes/api/migrate/next-step.ts
+2
-2
routes/api/migrate/next-step.ts
······
+130
-104
routes/api/migrate/status.ts
+130
-104
routes/api/migrate/status.ts
···
+44
routes/api/migration-state.ts
+44
routes/api/migration-state.ts
···
+36
-10
routes/api/plc/update.ts
+36
-10
routes/api/plc/update.ts
······
+131
routes/api/plc/verify.ts
+131
routes/api/plc/verify.ts
···
+2
-17
routes/index.tsx
+2
-17
routes/index.tsx
······<p class="font-mono text-lg sm:text-xl font-bold mb-4 sm:mb-6 mt-0 text-center text-gray-600 dark:text-gray-300">-Airport is in <strong>alpha</strong> currently, and we don't recommend it for main accounts. <br/> Please use its migration tools at your own risk.<p class="font-mono text-lg sm:text-xl mb-4 mt-4 sm:mb-6 text-center text-gray-600 dark:text-gray-300">Airport is made with love by <a class="text-blue-500 hover:underline" href="https://bsky.app/profile/knotbin.com">Roscoe</a> for <a class="text-blue-500 hover:underline" href="https://sprk.so">Spark</a>, a new short-video platform for AT Protocol.
+2
-2
routes/migrate/progress.tsx
+2
-2
routes/migrate/progress.tsx
······
+4
static/icons/account.svg
+4
static/icons/account.svg