The HTML files displayed at pds.madeydanny.uk pds.madebydanny.uk
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial commit

Danny Morrisey 901e29fc

+603
+1
.gitignore
··· 1 + status.html
+135
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 + <style> 8 + body { 9 + background-color: #0d0d0d; 10 + color: #f0f0f0; 11 + font-family: 'Courier New', monospace; 12 + padding: 2rem; 13 + max-width: 800px; 14 + margin: 0 auto; 15 + line-height: 1.7; 16 + } 17 + h1 { 18 + color: #4eaaff; 19 + font-size: 2rem; 20 + border-bottom: 2px solid #4eaaff; 21 + padding-bottom: 0.5rem; 22 + } 23 + h2 { 24 + color: #82cfff; 25 + margin-top: 2rem; 26 + font-size: 1.3rem; 27 + } 28 + a { 29 + color: #4eaaff; 30 + text-decoration: none; 31 + } 32 + a:hover { 33 + text-decoration: underline; 34 + } 35 + .warning { 36 + background: #1a1a1a; 37 + border-left: 4px solid #ff4444; 38 + padding: 1rem; 39 + margin: 1.5rem 0; 40 + } 41 + code { 42 + background: #1a1a1a; 43 + padding: 0.2rem 0.5rem; 44 + border-radius: 3px; 45 + color: #82cfff; 46 + } 47 + .timestamp { 48 + color: #666; 49 + font-size: 0.9rem; 50 + } 51 + ul { 52 + margin-left: 1.5rem; 53 + } 54 + </style> 55 + </head> 56 + <body> 57 + <h1>// Privacy Policy</h1> 58 + <p class="timestamp">Last updated: Dec 2, 2025 - 22:31 EST</p> 59 + 60 + <div class="warning"> 61 + <strong>⚠️ KEY POINT:</strong> The AT Protocol is PUBLIC by design. Everything you post is visible to the entire network. There's no such thing as "privacy" for your posts, likes, or follows. Only your email and brith day stays private. 62 + </div> 63 + 64 + <h2>What We Collect</h2> 65 + <p>When you sign up, we store:</p> 66 + <ul> 67 + <li><strong>Email address</strong> - For account recovery and occasional updates</li> 68 + <li><strong>Handle</strong> - Your username <i>(e.g., <code>you.pds.madebydanny.uk</code>)</i></li> 69 + <li><strong>Password <i>(hashed)</i></strong> - We don't store plaintext passwords, obviously</li> 70 + <li><strong>Posts, likes, follows, profile info</strong> - Everything you do on the network</li> 71 + <li><strong>Server logs</strong> - IP addresses, timestamps, API requests <i>(standard server stuff)</i></li> 72 + </ul> 73 + 74 + <h2>What's Public vs Private</h2> 75 + <p><strong>PUBLIC <i>(visible to everyone)</i>:</strong></p> 76 + <ul> 77 + <li>Your posts</li> 78 + <li>Your likes</li> 79 + <li>Your follows & followers</li> 80 + <li>Your profile <i>(bio, avatar, banner)</i></li> 81 + <li>Your handle & DID <i>(decentralized identifier)</i></li> 82 + </ul> 83 + 84 + <p><strong>PRIVATE <i>(only visible to server admins)</i>:</strong></p> 85 + <ul> 86 + <li>Your email address</li> 87 + <li>Your Birthday</li> 88 + <li>Your password hash</li> 89 + <li>IP addresses in server logs</li> 90 + </ul> 91 + 92 + <h2>How Your Data is Used</h2> 93 + <p>Your email is only used for account stuff—password resets, critical service updates, that kind of thing. I'm not selling it or spamming you.</p> 94 + 95 + <p>Everything else? It's federated across the AT Protocol network. That means:</p> 96 + <ul> 97 + <li>Other PDS servers can pull your public posts</li> 98 + <li>Relays aggregate and distribute your data</li> 99 + <li>Anyone can build apps that query your public activity</li> 100 + <li>Your content might appear on bsky.app, third-party apps, or anywhere else</li> 101 + </ul> 102 + 103 + <p>This isn't a bug—it's literally how the protocol works. Decentralization means your data flows freely across the network.</p> 104 + 105 + <h2>Data Sharing & Federation</h2> 106 + <p>Your public data is shared with:</p> 107 + <ul> 108 + <li>AT Protocol relays <i>(e.g., bsky.network)</i></li> 109 + <li>Other PDS instances when someone follows you</li> 110 + <li>Any client application that queries the network</li> 111 + <li>Search engines and archival services <i>(because it's public!)</i></li> 112 + </ul> 113 + 114 + <h2>Data Retention</h2> 115 + <p>Your data sticks around as long as your account exists. Delete your account and everything goes away <i>(from this server, at least—other servers might've already cached it)</i>.</p> 116 + 117 + <h2>Security</h2> 118 + <p>I take reasonable precautions: HTTPS everywhere, hashed passwords, regular updates, etc. But let's be real—no system is 100% secure. If nation-state hackers really want your memes, I can't stop them.</p> 119 + 120 + <h2>Cookies & Tracking</h2> 121 + <p>This site doesn't use tracking cookies or analytics. Server logs capture standard web server data <i>(IP, timestamp, user agent)</i> but that's it. No Google Analytics, no Facebook Pixel, none of that garbage.</p> 122 + 123 + <h2>Kids & Privacy</h2> 124 + <p>This service isn't for kids under 13. If you're under 13, go away. If I find out you lied about your age, your account gets deleted.</p> 125 + 126 + <h2>Changes to This Policy</h2> 127 + <p>Privacy policy might change. I'll update the date at the top when it does. Still using the service = you're cool with the changes.</p> 128 + 129 + <h2>Contact</h2> 130 + <p>Questions? Email: <a href="mailto:danielmorrisey@pm.me">danielmorrisey@pm.me</a></p> 131 + 132 + <p style="margin-top: 3rem;"><a href="/">← Back to home</a></p> 133 + <p>&copy; 2024-2025 Made by Danny UK, <i>by <a>Daniel Morrisey</a></i> - Powered by Resend, UpCloud and Cloudflae</p> 134 + </body> 135 + </html>
+98
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 + <style> 8 + body { 9 + background-color: #0d0d0d; 10 + color: #f0f0f0; 11 + font-family: 'Courier New', monospace; 12 + padding: 2rem; 13 + max-width: 800px; 14 + margin: 0 auto; 15 + line-height: 1.7; 16 + } 17 + h1 { 18 + color: #4eaaff; 19 + font-size: 2rem; 20 + border-bottom: 2px solid #4eaaff; 21 + padding-bottom: 0.5rem; 22 + } 23 + h2 { 24 + color: #82cfff; 25 + margin-top: 2rem; 26 + font-size: 1.3rem; 27 + } 28 + a { 29 + color: #4eaaff; 30 + text-decoration: none; 31 + } 32 + a:hover { 33 + text-decoration: underline; 34 + } 35 + .warning { 36 + background: #1a1a1a; 37 + border-left: 4px solid #ff4444; 38 + padding: 1rem; 39 + margin: 1.5rem 0; 40 + } 41 + code { 42 + background: #1a1a1a; 43 + padding: 0.2rem 0.5rem; 44 + border-radius: 3px; 45 + color: #82cfff; 46 + } 47 + .timestamp { 48 + color: #666; 49 + font-size: 0.9rem; 50 + } 51 + </style> 52 + </head> 53 + <body> 54 + <h1>// Terms of Service</h1> 55 + <p class="timestamp">Last updated: Dec 2 2025 - 22:31 EST</p> 56 + 57 + <div class="warning"> 58 + <strong>⚠️ IMPORTANT:</strong> Everything you post on this PDS is <strong>PUBLIC</strong>. Your posts, likes, follows, and profile are visible to anyone on the AT Protocol network. 59 + </div> 60 + 61 + <h2>The Basics</h2> 62 + <p>By creating an account on <code>pds.madebydanny.uk</code>, you're agreeing to play by the rules. This is a personal server running on the AT Protocol network. Think of it like hosting your own piece of the decentralized social web.</p> 63 + 64 + <h2>Your Account, Your Responsibility</h2> 65 + <p>You're in charge of your account security. Pick a good password, don't share it, and if someone gets in—that's on you. We're not here to babysit.</p> 66 + 67 + <h2>Everything is Public</h2> 68 + <p>Let me be crystal clear: <strong>every post, like, follow, and profile detail is PUBLIC</strong>. This isn't Twitter with protected accounts or Discord with private servers. The AT Protocol is designed for openness. If you post something, assume the entire internet can see it. Forever. Act accordingly.</p> 69 + 70 + <h2>Content Rules</h2> 71 + <ul> 72 + <li>No illegal content</li> 73 + <li>No harassment, doxxing, or abuse</li> 74 + <li>No spam or bot networks</li> 75 + <li>Don't impersonate others</li> 76 + <li>Use common sense</li> 77 + </ul> 78 + <p>Break these rules and your account gets nuked. No appeals, no drama.</p> 79 + 80 + <h2>Service Availability</h2> 81 + <p>This is a hobby project running on a VPS. It could go down. I'll do my best to keep it running, but there are <strong>zero guarantees</strong>. If uptime matters to you, run your own PDS or use a commercial provider.</p> 82 + 83 + <h2>Data & Federation</h2> 84 + <p>Your data lives here, but it also federates across the AT Protocol network. Other servers can <i>(and will)</i> pull your public posts. That's literally how this protocol works. You can't un-ring that bell.</p> 85 + 86 + <h2>Account Termination</h2> 87 + <p>I can delete your account at any time for any reason. Usually it'll be because you violated the rules above, but technically I could just decide I don't like your vibes. It's my server.</p> 88 + 89 + <h2>Changes to These Terms</h2> 90 + <p>These terms might change. I'll update the date at the top. Keep using the service = you accept the new terms. Simple.</p> 91 + 92 + <h2>Liability</h2> 93 + <p>This service is provided AS-IS with no warranty whatsoever. If something breaks, gets hacked, or your data evaporates—that sucks, but it's not my legal problem. Use at your own risk.</p> 94 + 95 + <p style="margin-top: 3rem;"><a href="/">← Back to home</a></p> 96 + <p>&copy; 2024-2025 Made by Danny UK, <i>by <a>Daniel Morrisey</a></i> - Powered by Resend, UpCloud and Cloudflae</p> 97 + </body> 98 + </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>
+66
index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <title>MBD PDS - pds.madebydanny.uk</title> 6 + <link rel="icon" id="favicon" href="https://pds.madebydanny.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:xidsxosndmahil4vafyudri2&cid=bafkreidrxnqobl4mjzi3fjw6bmgjvzd5mjyw4d7agkkahhvvdzsqtn6fsi"> 7 + <meta property="og:title" content="MBD PDS - pds.madebydanny.uk"> 8 + <meta property="og:description" id="og-description" content="This is an AT Protocol Personal Data Server (PDS) hosted on UpCloud maintained by @madebydanny.uk"> 9 + <meta property="og:type" content="website"> 10 + <meta property="og:url" content="https://pds.madebydanny.uk/"> 11 + <meta property="og:image" id="og-image" content="https://pds.madebydanny.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreialdlhknpvsebaa73k4gbi2fhxdatognnvsuo6fbuab4jfegrvpxy"> 12 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 13 + <style> 14 + body { 15 + background-color: #0d0d0d; 16 + color: #f0f0f0; 17 + font-family: monospace; 18 + padding: 2rem; 19 + margin: 0; 20 + max-width: 800px; 21 + margin: 0 auto; 22 + } 23 + a { 24 + color: #4eaaff; 25 + text-decoration: none; 26 + } 27 + a:hover { 28 + color: #82cfff; 29 + text-decoration: underline; 30 + } 31 + h1 { 32 + color: #4eaaff; 33 + } 34 + </style> 35 + </head> 36 + <body> 37 + <h1>MBD PDS - pds.madebydanny.uk</h1> 38 + <p>This is an AT Protocol Personal Data Server <i>(PDS)</i> hosted on <a href="https://upcloud.com" target="_blank">UpCloud</a> maintained by <a href="https://madebydanny.uk/followonbsky?did=madebydanny.uk" target="_blank">@madebydanny.uk</a></p> 39 + <h2>About</h2> 40 + <p>The MBD PDS is a free-to-use, publicly available Bluesky PDS <i>(Personal Data Server)</i> that <b>anyone can use</b>. Hosted on an Upcloud server in New York and maintained by <a href="https://madebydanny.uk/followonsbsky?did=madebydanny,uk" target="_blank">@madebydanny.uk</a>, we are committed to providing the best Bluesky experience.</p> 41 + <ul> 42 + <li><a href="/about.html">Learn more</a></li> 43 + <li><a href="/about/privacy.html"> Privacy Policy</a></li> 44 + <li><a href="about/terms.html"> Terms of Service</a></li> 45 + </ul> 46 + <h2>Links</h2> 47 + <ul> 48 + <li><a href="/status.html">View Server Status</a></li> 49 + <li><a href="https://status.pds.madebydanny.uk">Check System Status</a></li> 50 + <li><a href="/create.html">Create your Free Account</a></li> 51 + <li><a href="https://atproto.com" target="_blank">Learn more about the AT Protocol</a></li> 52 + <li><a href="https://github.com/bluesky-social/pds" target="_blank">View PDS on GitHub</a></li> 53 + </ul> 54 + <h2>Developer Info</h2> 55 + <p><b>API</b> - Most API routes are under <code>/xrpc/</code></p> 56 + <h3>Supported handles</h3> 57 + <ul> 58 + <li>.pds.madebydanny.uk</li> 59 + <li>.pds.danielmorrisey.com</li> 60 + <li>.good-example.com</li> 61 + <li>.mbdio.uk</li> 62 + <li>.certifiedshitposter.com</li> 63 + </ul> 64 + <p>&copy; 2024-2025 Made by Danny UK, <i>by <a>Daniel Morrisey</a></i> - Powered by Resend, UpCloud and Cloudflae</p> 65 + </body> 66 + </html>