The only PDS hosted on a jailbroken chromebook

first commit

Daniel Morrisey 149eb054

+746
+11
about.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta http-equiv="refresh" content="0; url=/index.html" /> 6 + <title>Redirecting...</title> 7 + </head> 8 + <body> 9 + <p>Redirecting to <a href="/index.html">home page</a>...</p> 10 + </body> 11 + </html>
+1
about/index.html
··· 1 + comming soon TM
+109
about/privacy.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Privacy Policy - pds.madebydanny.uk</title> 7 + <link rel="icon" id="favicon" href="/media/seo/icon.png" type="image/png" /> 8 + <meta property="og:title" content="MBD PDS Privacy Policy"> 9 + <meta property="og:description" id="og-description" content= "The MBD PDS is an open (no invite code needed) AT Protocol Personal Data server, a Bluesky PDS. Anyone can use my (Daniel Morrisey) PDS but that does mean you have to follow the rules."> 10 + <meta property="og:type" content="website"> 11 + <meta property="og:url" content="https://pds.madebydanny.uk/"> 12 + <meta property="og:image" id="og-image" content="/media/seo/privacy.png"> 13 + <style> 14 + body { 15 + background-color: #0d0d0d; 16 + color: #f0f0f0; 17 + font-family: 'Courier New', monospace; 18 + padding: 2rem; 19 + max-width: 800px; 20 + margin: 0 auto; 21 + line-height: 1.7; 22 + } 23 + h1 { 24 + color: #4eaaff; 25 + font-size: 2rem; 26 + border-bottom: 2px solid #4eaaff; 27 + padding-bottom: 0.5rem; 28 + } 29 + h2 { 30 + color: #82cfff; 31 + margin-top: 2rem; 32 + font-size: 1.3rem; 33 + } 34 + a { 35 + color: #4eaaff; 36 + text-decoration: none; 37 + } 38 + a:hover { 39 + text-decoration: underline; 40 + } 41 + .warning { 42 + background: #1a1a1a; 43 + border-left: 4px solid #ff4444; 44 + padding: 1rem; 45 + margin: 1.5rem 0; 46 + } 47 + code { 48 + background: #1a1a1a; 49 + padding: 0.2rem 0.5rem; 50 + border-radius: 3px; 51 + color: #82cfff; 52 + } 53 + .timestamp { 54 + color: #666; 55 + font-size: 0.9rem; 56 + } 57 + </style> 58 + </head> 59 + <body> 60 + <h1>// MBD PDS Privacy Policy</h1> 61 + <p class="timestamp">Last Updated Dec 12 17:03 EST (GMT-5:00)</p> 62 + <p> 63 + The AT Protocol is public by design, Everything you post is visible to the entire network. 64 + <br><br> 65 + When you sign up for the MBD PDS, we store: 66 + <ul> 67 + <li>Email address</li> 68 + <li>Handle </li> 69 + <li>Password <i>(hashed)</i></li> 70 + </ul> 71 + <h2>What's Public vs Private</h2> 72 + <b>PUBLIC:</b> 73 + <ul> 74 + <li>Your posts</li> 75 + <li>Your likes</li> 76 + <li>Your follows & followers</li> 77 + <li>Your profile (bio, avatar, banner)</li> 78 + <li>Your handle & DID (decentralized identifier)</li> 79 + </ul> 80 + <b>PRIVATE:</b> 81 + <ul> 82 + <li>Your email address</li> 83 + <li>Your password</li> 84 + </ul> 85 + Your email is only used for account password resets, critical service updates, PLC changes, etc. 86 + <br><br> 87 + Everything else is federated across the AT Protocol network. That means: 88 + <ul> 89 + <li>Other PDS servers can pull your public posts</li> 90 + <li>App Views aggregate and distribute your data</li> 91 + <li>Anyone can build apps that query your public activity</li> 92 + <li>Your content will appear on bsky.app, third-party apps, or anywhere else</li> 93 + </ul> 94 + <h2>Data Sharing & Federation</h2> 95 + Your public data is shared with: 96 + <ul> 97 + <li>AT Protocol relays (e.g., bsky.network)</li> 98 + <li>Other PDS instances when someone follows you</li> 99 + <li>Any client application that queries the network</li> 100 + <li>Search engines and archival services</li> 101 + </ul> 102 + Your data sticks around as long as your account exists. Delete your account and everything goes away. 103 + <br><br> 104 + These terms will change without notice. By using the MBD PDS you agree to the terms listed above. 105 + </p> 106 + <p style="margin-top: 3rem;"><a href="/">← Back to home</a></p> 107 + <p>&copy; 2024-2025 Made by Danny UK, <i>by <a>Daniel Morrisey</a></i> - Powered by Resend, UpCloud and Cloudflae</p> 108 + </body> 109 + </html>
+93
about/terms.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Terms of Service - pds.madebydanny.uk</title> 7 + <link rel="icon" id="favicon" href="/media/seo/icon.png" type="image/png" /> 8 + <meta property="og:title" content="MBD PDS Terms of Service"> 9 + <meta property="og:description" id="og-description" content= "The MBD PDS is an open (no invite code needed) AT Protocol Personal Data server, a Bluesky PDS. Anyone can use my (Daniel Morrisey) PDS but that does mean you have to follow the rules."> 10 + <meta property="og:type" content="website"> 11 + <meta property="og:url" content="https://pds.madebydanny.uk/"> 12 + <meta property="og:image" id="og-image" content="/media/seo/terms.png"> 13 + <style> 14 + body { 15 + background-color: #0d0d0d; 16 + color: #f0f0f0; 17 + font-family: 'Courier New', monospace; 18 + padding: 2rem; 19 + max-width: 800px; 20 + margin: 0 auto; 21 + line-height: 1.7; 22 + } 23 + h1 { 24 + color: #4eaaff; 25 + font-size: 2rem; 26 + border-bottom: 2px solid #4eaaff; 27 + padding-bottom: 0.5rem; 28 + } 29 + h2 { 30 + color: #82cfff; 31 + margin-top: 2rem; 32 + font-size: 1.3rem; 33 + } 34 + a { 35 + color: #4eaaff; 36 + text-decoration: none; 37 + } 38 + a:hover { 39 + text-decoration: underline; 40 + } 41 + .warning { 42 + background: #1a1a1a; 43 + border-left: 4px solid #ff4444; 44 + padding: 1rem; 45 + margin: 1.5rem 0; 46 + } 47 + code { 48 + background: #1a1a1a; 49 + padding: 0.2rem 0.5rem; 50 + border-radius: 3px; 51 + color: #82cfff; 52 + } 53 + .timestamp { 54 + color: #666; 55 + font-size: 0.9rem; 56 + } 57 + </style> 58 + </head> 59 + <body> 60 + <h1>// MBD PDS Terms of Service</h1> 61 + <p class="timestamp">Last Updated Dec 11 14:41 EST (GMT-5:00)</p> 62 + The MBD PDS is an open (no invite code needed) AT Protocol Personal Data server, a Bluesky PDS. Anyone can use my (Daniel Morrisey) PDS but that does mean you have to follow the rules. 63 + <br><br> 64 + <p> 65 + If you fail to comply with our TOS you will be warned, via an Email and/or a Bluesky DM, after 3 warnings your account will be deleted. 66 + <br><br> 67 + Let me be clear: <b>every post, like, follow, and profile detail is PUBLIC</b>. The AT Protocol is locked open. If you post something, assume the entire internet can see it. Forever. Act accordingly. 68 + <br><br> 69 + Your data lives here on this PDS, but it also federates across the AT Protocol network. Anyone can see anything using tools like <a href="https://pdsls.dev">pdsls.dev</a>. 70 + <br><br> 71 + I can delete your account at any time for any reason. Because I own this server and pay for it, I have the right to do whatever I want on/to it. 72 + <br><br> 73 + </p> 74 + <h2>Content Rules</h2> 75 + <ul> 76 + <li>No illegal content</li> 77 + <li>No child sexual abuse material (CSAM)</li> 78 + <li>No harassment, doxxing, or abuse</li> 79 + <li>No spam or bot networks</li> 80 + <li>No impersonation of others</li> 81 + <li>No sharing of private information without consent</li> 82 + <li>No promotion of violence or hate speech</li> 83 + </ul> 84 + <p> 85 + Break these rules and your account will be deleted after 3 warnings. 86 + <br><br> 87 + <b>These terms will change without notice.</b> 88 + By using the MBD PDS you agree to the terms listed above. 89 + </p> 90 + <p style="margin-top: 3rem;"><a href="/">← Back to home</a></p> 91 + <p>&copy; 2024-2025 Made by Danny UK, <i>by <a>Daniel Morrisey</a></i> - Powered by Resend, UpCloud and Cloudflae</p> 92 + </body> 93 + </html>
+303
create.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Create Account - pds.madebydanny.uk</title> 7 + <style> 8 + * { 9 + box-sizing: border-box; 10 + margin: 0; 11 + padding: 0; 12 + } 13 + 14 + body { 15 + background-color: #0d0d0d; 16 + color: #f0f0f0; 17 + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; 18 + padding: 2rem; 19 + min-height: 100vh; 20 + display: flex; 21 + align-items: center; 22 + justify-content: center; 23 + } 24 + 25 + .container { 26 + max-width: 500px; 27 + width: 100%; 28 + background: #1a1a1a; 29 + border-radius: 12px; 30 + padding: 2rem; 31 + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); 32 + } 33 + 34 + h1 { 35 + color: #4eaaff; 36 + margin-bottom: 0.5rem; 37 + font-size: 1.75rem; 38 + } 39 + 40 + .subtitle { 41 + color: #999; 42 + margin-bottom: 2rem; 43 + font-size: 0.9rem; 44 + } 45 + 46 + .form-group { 47 + margin-bottom: 1.5rem; 48 + } 49 + 50 + label { 51 + display: block; 52 + margin-bottom: 0.5rem; 53 + color: #ccc; 54 + font-size: 0.9rem; 55 + font-weight: 500; 56 + } 57 + 58 + input[type="text"], 59 + input[type="email"], 60 + input[type="password"], 61 + select { 62 + width: 100%; 63 + padding: 0.75rem; 64 + background: #0d0d0d; 65 + border: 1px solid #333; 66 + border-radius: 6px; 67 + color: #f0f0f0; 68 + font-size: 1rem; 69 + transition: border-color 0.2s; 70 + } 71 + 72 + input[type="text"]:focus, 73 + input[type="email"]:focus, 74 + input[type="password"]:focus, 75 + select:focus { 76 + outline: none; 77 + border-color: #4eaaff; 78 + } 79 + 80 + .handle-input-wrapper { 81 + display: flex; 82 + flex-direction: column; 83 + gap: 0.5rem; 84 + } 85 + 86 + .helper-text { 87 + font-size: 0.8rem; 88 + color: #666; 89 + margin-top: 0.25rem; 90 + } 91 + 92 + button { 93 + width: 100%; 94 + padding: 0.875rem; 95 + background: #4eaaff; 96 + color: #fff; 97 + border: none; 98 + border-radius: 6px; 99 + font-size: 1rem; 100 + font-weight: 600; 101 + cursor: pointer; 102 + transition: background 0.2s; 103 + } 104 + 105 + button:hover { 106 + background: #3d99ee; 107 + } 108 + 109 + button:disabled { 110 + background: #333; 111 + cursor: not-allowed; 112 + } 113 + 114 + .error { 115 + background: #ff4444; 116 + color: white; 117 + padding: 0.75rem; 118 + border-radius: 6px; 119 + margin-bottom: 1rem; 120 + display: none; 121 + } 122 + 123 + .success { 124 + background: #44ff44; 125 + color: #000; 126 + padding: 0.75rem; 127 + border-radius: 6px; 128 + margin-bottom: 1rem; 129 + display: none; 130 + } 131 + 132 + .back-link { 133 + text-align: center; 134 + margin-top: 1.5rem; 135 + } 136 + 137 + .back-link a { 138 + color: #4eaaff; 139 + text-decoration: none; 140 + font-size: 0.9rem; 141 + } 142 + 143 + .back-link a:hover { 144 + text-decoration: underline; 145 + } 146 + 147 + .loading { 148 + display: none; 149 + text-align: center; 150 + color: #4eaaff; 151 + margin-top: 1rem; 152 + } 153 + </style> 154 + </head> 155 + <body> 156 + <div class="container"> 157 + <h1>Create Account</h1> 158 + <p class="subtitle">Join pds.madebydanny.uk on the AT Protocol network</p> 159 + 160 + <div class="error" id="error"></div> 161 + <div class="success" id="success"></div> 162 + 163 + <form id="createAccountForm"> 164 + <div class="form-group"> 165 + <label for="handle">Handle *</label> 166 + <div class="handle-input-wrapper"> 167 + <input 168 + type="text" 169 + id="handle" 170 + name="handle" 171 + required 172 + placeholder="yourname" 173 + pattern="[a-zA-Z0-9-]+" 174 + autocomplete="off" 175 + > 176 + <select id="domain" name="domain" required> 177 + <option value=".pds.madebydanny.uk">.pds.madebydanny.uk</option> 178 + <option value=".pds.danielmorrisey.com">.pds.danielmorrisey.com</option> 179 + <option value=".good-example.com">.good-example.com</option> 180 + <option value=".mbdio.uk">.mbdio.uk</option> 181 + <option value=".certifiedshitposter.com">.certifiedshitposter.com</option> 182 + </select> 183 + </div> 184 + <div class="helper-text">Letters, numbers, and hyphens only</div> 185 + </div> 186 + 187 + <div class="form-group"> 188 + <label for="email">Email *</label> 189 + <input 190 + type="email" 191 + id="email" 192 + name="email" 193 + required 194 + placeholder="you@example.com" 195 + autocomplete="email" 196 + > 197 + </div> 198 + 199 + <div class="form-group"> 200 + <label for="password">Password *</label> 201 + <input 202 + type="password" 203 + id="password" 204 + name="password" 205 + required 206 + minlength="8" 207 + placeholder="At least 8 characters" 208 + autocomplete="new-password" 209 + > 210 + </div> 211 + 212 + <button type="submit" id="submitBtn">Create Account</button> 213 + <div class="loading" id="loading">Creating your account...</div> 214 + </form> 215 + 216 + <div class="back-link"> 217 + <a href="/">← Back to home</a> 218 + </div> 219 + </div> 220 + 221 + <script> 222 + const form = document.getElementById('createAccountForm'); 223 + const errorDiv = document.getElementById('error'); 224 + const successDiv = document.getElementById('success'); 225 + const submitBtn = document.getElementById('submitBtn'); 226 + const loadingDiv = document.getElementById('loading'); 227 + 228 + function showError(message) { 229 + errorDiv.textContent = message; 230 + errorDiv.style.display = 'block'; 231 + successDiv.style.display = 'none'; 232 + } 233 + 234 + function showSuccess(message) { 235 + successDiv.textContent = message; 236 + successDiv.style.display = 'block'; 237 + errorDiv.style.display = 'none'; 238 + } 239 + 240 + function hideMessages() { 241 + errorDiv.style.display = 'none'; 242 + successDiv.style.display = 'none'; 243 + } 244 + 245 + form.addEventListener('submit', async (e) => { 246 + e.preventDefault(); 247 + hideMessages(); 248 + 249 + const handle = document.getElementById('handle').value.trim(); 250 + const domain = document.getElementById('domain').value; 251 + const email = document.getElementById('email').value.trim(); 252 + const password = document.getElementById('password').value; 253 + 254 + // Validate handle 255 + if (!/^[a-zA-Z0-9-]+$/.test(handle)) { 256 + showError('Handle can only contain letters, numbers, and hyphens'); 257 + return; 258 + } 259 + 260 + // Build full handle 261 + const fullHandle = `${handle}${domain}`; 262 + 263 + // Disable form 264 + submitBtn.disabled = true; 265 + loadingDiv.style.display = 'block'; 266 + 267 + try { 268 + // Create account via AT Protocol API 269 + const response = await fetch('/xrpc/com.atproto.server.createAccount', { 270 + method: 'POST', 271 + headers: { 272 + 'Content-Type': 'application/json', 273 + }, 274 + body: JSON.stringify({ 275 + email: email, 276 + handle: fullHandle, 277 + password: password, 278 + }) 279 + }); 280 + 281 + const data = await response.json(); 282 + 283 + if (!response.ok) { 284 + throw new Error(data.message || 'Failed to create account'); 285 + } 286 + 287 + // Account created successfully 288 + showSuccess('Account created successfully! You can now log in to Bluesky with your credentials.'); 289 + 290 + // Clear form 291 + form.reset(); 292 + 293 + } catch (error) { 294 + console.error('Error:', error); 295 + showError(error.message || 'An error occurred. Please try again.'); 296 + } finally { 297 + submitBtn.disabled = false; 298 + loadingDiv.style.display = 'none'; 299 + } 300 + }); 301 + </script> 302 + </body> 303 + </html>
+157
css/beszel.css
··· 1 + * { 2 + margin: 0; 3 + padding: 0; 4 + box-sizing: border-box; 5 + } 6 + 7 + body { 8 + font-family: 'Georgia', 'Times New Roman', serif; 9 + background: #ffffff; 10 + min-height: 100vh; 11 + display: flex; 12 + align-items: center; 13 + justify-content: center; 14 + padding: 20px; 15 + } 16 + 17 + .container { 18 + background: white; 19 + border: 1px solid #000000; 20 + padding: 60px 40px; 21 + max-width: 500px; 22 + width: 100%; 23 + } 24 + 25 + h1 { 26 + color: #000000; 27 + margin-bottom: 10px; 28 + font-size: 24px; 29 + font-weight: 400; 30 + letter-spacing: 0.5px; 31 + } 32 + 33 + .subtitle { 34 + color: #000000; 35 + margin-bottom: 40px; 36 + font-size: 14px; 37 + font-weight: 300; 38 + } 39 + 40 + .credential-group { 41 + margin-bottom: 20px; 42 + } 43 + 44 + label { 45 + display: block; 46 + color: #000000; 47 + font-weight: 400; 48 + margin-bottom: 8px; 49 + font-size: 13px; 50 + text-transform: uppercase; 51 + letter-spacing: 1px; 52 + } 53 + 54 + .input-wrapper { 55 + display: flex; 56 + gap: 10px; 57 + } 58 + 59 + input { 60 + flex: 1; 61 + padding: 12px 16px; 62 + border: 1px solid #000000; 63 + font-size: 15px; 64 + background: #ffffff; 65 + color: #000000; 66 + font-family: 'Courier New', monospace; 67 + } 68 + 69 + .copy-btn { 70 + padding: 12px 20px; 71 + background: #000000; 72 + color: white; 73 + border: 1px solid #000000; 74 + cursor: pointer; 75 + font-weight: 400; 76 + font-size: 13px; 77 + transition: all 0.2s; 78 + white-space: nowrap; 79 + text-transform: uppercase; 80 + letter-spacing: 0.5px; 81 + } 82 + 83 + .copy-btn:hover { 84 + background: #ffffff; 85 + color: #000000; 86 + } 87 + 88 + .copy-btn:active { 89 + transform: translateY(0); 90 + } 91 + 92 + .copy-btn.copied { 93 + background: #ffffff; 94 + color: #000000; 95 + } 96 + 97 + .instructions { 98 + background: #ffffff; 99 + border: 1px solid #000000; 100 + padding: 20px; 101 + margin-top: 40px; 102 + } 103 + 104 + .instructions h3 { 105 + color: #000000; 106 + font-size: 14px; 107 + margin-bottom: 12px; 108 + font-weight: 400; 109 + text-transform: uppercase; 110 + letter-spacing: 1px; 111 + } 112 + 113 + .instructions p { 114 + color: #000000; 115 + font-size: 14px; 116 + line-height: 1.8; 117 + font-weight: 300; 118 + } 119 + 120 + .login-url { 121 + display: flex; 122 + gap: 10px; 123 + margin-top: 15px; 124 + } 125 + 126 + .url-input { 127 + flex: 1; 128 + padding: 12px; 129 + border: 1px solid #000000; 130 + word-break: break-all; 131 + font-family: 'Courier New', monospace; 132 + font-size: 13px; 133 + color: #000000; 134 + background: #ffffff; 135 + } 136 + 137 + .url-btn { 138 + padding: 12px 20px; 139 + background: #000000; 140 + color: white; 141 + border: 1px solid #000000; 142 + cursor: pointer; 143 + font-weight: 400; 144 + font-size: 13px; 145 + transition: all 0.2s; 146 + white-space: nowrap; 147 + text-transform: uppercase; 148 + letter-spacing: 0.5px; 149 + text-decoration: none; 150 + display: flex; 151 + align-items: center; 152 + } 153 + 154 + .url-btn:hover { 155 + background: #ffffff; 156 + color: #000000; 157 + }
+20
css/index.css
··· 1 + body { 2 + background-color: #0d0d0d; 3 + color: #f0f0f0; 4 + font-family: monospace; 5 + padding: 2rem; 6 + margin: 0; 7 + max-width: 800px; 8 + margin: 0 auto; 9 + } 10 + a { 11 + color: #4eaaff; 12 + text-decoration: none; 13 + } 14 + a:hover { 15 + color: #82cfff; 16 + text-decoration: underline; 17 + } 18 + h1 { 19 + color: #4eaaff; 20 + }
+43
index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="description" content="ChromeDS - A free AT Protocol Personal Data Server for Bluesky, hosted on UpCloud and maintained by @madebydanny.uk"> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>ChromeDS - badpds.madebydanny.uk</title> 8 + <link rel="icon" id="favicon" href="/media/seo/icon.png" type="image/png" /> 9 + <meta property="og:title" content="ChromeDS - badpds.madebydanny.uk"> 10 + <meta property="og:description" id="og-description" content="This is an AT Protocol Personal Data Server (PDS) hosted on UpCloud maintained by @madebydanny.uk"> 11 + <meta property="og:type" content="website"> 12 + <meta property="og:url" content="https://badpds.madebydanny.uk/"> 13 + <meta property="og:image" id="og-image" content="/media/seo/og-image.png"> 14 + <link rel="stylesheet" href="/css/index.css" /> 15 + </head> 16 + <body> 17 + <main> 18 + <h1>ChromeDS - badpds.madebydanny.uk</h1> 19 + <p>This is an AT Protocol Personal Data Server <i>(PDS)</i> hosted on Jailbroken Chromebook maintained by <a href="https://madebydanny.uk/followonbsky?did=madebydanny.uk" target="_blank">@madebydanny.uk</a></p> 20 + 21 + <h2>About</h2> 22 + <p>The ChromeDS is a free-to-use, publicly available Bluesky PDS <i>(Personal Data Server)</i> that <b>anyone can use</b>. Maintained by <a href="https://madebydanny.uk/followonbsky?did=madebydanny.uk" target="_blank">@madebydanny.uk</a>, we are committed to providing the best Bluesky experience.</p> 23 + <ul> 24 + <li><a href="/about/index.html">Learn more</a></li> 25 + <li><a href="/about/privacy.html">Privacy Policy</a></li> 26 + <li><a href="/about/terms.html">Terms of Service</a></li> 27 + </ul> 28 + 29 + <h2>Links</h2> 30 + <ul> 31 + <li><a href="https://status.badpds.madebydanny.uk">Check System Status</a></li> 32 + </ul> 33 + 34 + <h2>Developer Info</h2> 35 + <p><b>API</b> - Most API routes are under <code>/xrpc/</code></p> 36 + <h3>Supported handles</h3> 37 + <i>None, please contact PDS owner</i> 38 + </main> 39 + <footer> 40 + <p>&copy; 2024-2025 Made by Danny UK, <i>by <a href="https://madebydanny.uk/followonbsky?did=madebydanny.uk">Daniel Morrisey</a></i> - Powered by Resend and Upcloud</p> 41 + </footer> 42 + </body> 43 + </html>
media/seo/beszel.png

This is a binary file and will not be displayed.

media/seo/icon.png

This is a binary file and will not be displayed.

media/seo/og-image.png

This is a binary file and will not be displayed.

media/seo/privacy.png

This is a binary file and will not be displayed.

media/seo/terms.png

This is a binary file and will not be displayed.

+9
readme.md
··· 1 + # madebydanny.uk/mbd-pds 2 + The MBD PDS is a free-to-use, publicly available Bluesky PDS (Personal Data Server) that anyone can use. Hosted on an Upcloud server in New York and maintained by @madebydanny.uk, we are committed to providing the best Bluesky experience. 3 + 4 + ## Features 5 + - Daily Backups, at the root/server level 6 + - 5 Available User Domains, *(.pds.madebydanny.uk, .pds.danielmorrisey.com, .good-example.com, .mbdio.uk, .certifiedshitposter.com)* 7 + - [Sever Status Page](https://pds.madebydanny.uk/status.html), thanks to [@fry69.dev](https://madebydanny.uk/followonbsky.html?did=fry69.dev) 8 + - 95%+ Sever Uptime 9 + - [System Status Page](https://status.pds.madebydanny.uk)