Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations.
pdsmoover.com
pds
atproto
migrations
moo
cow
1{%- import "partials/cow-header.askama.html" as cow -%}
2{% extends "layout.askama.html" %}
3
4{% block meta %}
5 <meta property="og:description" content="PDS MOOver – ATProto tools for PDS migrations and backups"/>
6 <meta property="og:image" content="/halloween_moover.webp">
7{% endblock %}
8
9{% block content %}
10<script>
11
12
13document.addEventListener('alpine:init', () => {
14 window.Alpine.data('serverStats', () => ({
15 loading: true,
16 error: null,
17 stats: null,
18 async init() {
19 try {
20 const res = await fetch('/xrpc/com.pdsmoover.backup.describeServer');
21 if (!res.ok) throw new Error(`Failed to load: ${res.status}`);
22 this.stats = await res.json();
23 } catch (e) {
24 console.error(e);
25 this.error = 'Failed to load server stats. Please try again later.';
26 } finally {
27 this.loading = false;
28 }
29 },
30 //TODO bad but do not want to figure out onload with current setup
31
32
33 }));
34});
35
36</script>
37
38<div class="container">
39 {% call cow::cow_header("PDS MOOver") %}
40
41 <section class="section" style="text-align:left">
42 <p>
43 PDS MOOver is a set of AT Protocol tools to help you
44 <a href="/moover">migrate to a new PDS</a>,
45 <a href="/missing-blobs">find your missing blobs</a>,
46 sign up for free automated <a href="/backups">backups</a>, and <a href="/restore">restore your account</a>
47 in the event you need to.
48 </p>
49 <ul>
50 <li><a href="/moover">Moover</a> – helps you migrate to a new PDS.</li>
51 <li><a href="/missing-blobs">Missing Blobs</a> – find any missing blobs (pictures/videos) from a previous migration.</li>
52 <li><a href="/backups">Backups</a> – sign up for free automated backups stored on PDS MOOver servers and view your account's backup status.</li>
53 <li><a href="/restore">Restore</a> – restore from your backups if needed.</li>
54 <li><a href="/turn-off">Turn Off</a> – helper to make sure your old account is deactivated.</li>
55 <li><a href="/info">Info</a> – FAQs and a few other bits of information about our tools.</li>
56 <li><a href="https://tangled.org/@baileytownsend.dev/pds-moover">Check our source code on tangled</a></li>
57 </ul>
58 </section>
59
60 <section class="section" aria-labelledby="stats-heading" x-data="serverStats()" x-init="init()">
61 <h2 id="stats-heading">Server stats</h2>
62 <span>Total stats for all accounts backed up on pdsmoover.com</span>
63 <div style="padding-top: 5%" class="stats-grid" x-show="!error">
64 <div class="stat-card">
65 <div class="stat-label">Total repositories</div>
66 <div class="stat-value" x-text="stats?.totalRepos.toLocaleString()"></div>
67 </div>
68 <div class="stat-card">
69 <div class="stat-label">Total blobs</div>
70 <div class="stat-value" x-text="stats?.totalBlobs.toLocaleString()"></div>
71 </div>
72 <div class="stat-card">
73 <div class="stat-label">Estimated total repo size</div>
74 <div class="stat-value" x-text="fmtBytes(stats?.estimatedReposSizeOnDisk)"></div>
75 </div>
76 <div class="stat-card">
77 <div class="stat-label">Estimated total blob size</div>
78 <div class="stat-value" x-text="fmtBytes(stats?.estimatedBlobsSizeOnDisk)"></div>
79 </div>
80 <div class="stat-card">
81 <div class="stat-label">Last backup ran at</div>
82 <div class="stat-value stat-value--small" x-text="fmtDate(stats?.lastBackupAt)"></div>
83 </div>
84 <div class="stat-card">
85 <div class="stat-label">Server Status last updated</div>
86 <div class="stat-value stat-value--small" x-text="fmtDate(stats?.statusLastUpdated)"></div>
87 </div>
88 </div>
89 <div class="warning-message" x-show="error" x-text="error"></div>
90 </section>
91</div>
92
93
94
95{% endblock %}