this repo has no description
0
fork

Configure Feed

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

new colors and font

+280 -382
+32 -190
create.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 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> 7 + <link rel="icon" id="favicon" href="/media/seo/icon.png" type="image/png" /> 8 + <meta property="og:title" content="Create Account on the MBD PDS"> 9 + <meta property="og:description" id="og-description" content="Join the MBD PDS for free and start using the AT Protocol"> 10 + <meta property="og:type" content="website"> 11 + <meta property="og:image" id="og-image" content="/media/seo/banner.png"> 12 + <link rel="stylesheet" href="/css/create.css" /> 13 + <script src="https://kit.fontawesome.com/0ca27f8db1.js" crossorigin="anonymous"></script> 14 + <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet"> 154 15 </head> 155 16 <body> 156 17 <div class="container"> 157 18 <h1>Create Account</h1> 158 - <p class="subtitle">Join pds.madebydanny.uk on the AT Protocol network</p> 19 + <p class="subtitle">Join the MBD PDS for free</p> 159 20 160 - <div class="error" id="error"></div> 161 - <div class="success" id="success"></div> 21 + <div class="alert error" id="error"></div> 22 + <div class="alert success" id="success"></div> 162 23 163 24 <form id="createAccountForm"> 164 25 <div class="form-group"> 165 - <label for="handle">Handle *</label> 166 - <div class="handle-input-wrapper"> 26 + <label for="handle"><i class="fa-solid fa-at"></i> Choose Handle</label> 27 + <div class="handle-group"> 28 + <span class="at-symbol"><i class="fa-solid fa-at"></i></span> 167 29 <input 168 30 type="text" 169 31 id="handle" 170 32 name="handle" 171 33 required 172 - placeholder="yourname" 34 + placeholder="daniel" 173 35 pattern="[a-zA-Z0-9-]+" 174 36 autocomplete="off" 175 37 > 176 38 <select id="domain" name="domain" required> 177 39 <option value=".pds.madebydanny.uk">.pds.madebydanny.uk</option> 178 40 <option value=".pds.danielmorrisey.com">.pds.danielmorrisey.com</option> 179 - <option value=".good-example.com">.good-example.com</option> 180 41 <option value=".mbdio.uk">.mbdio.uk</option> 181 42 <option value=".certifiedshitposter.com">.certifiedshitposter.com</option> 182 43 </select> ··· 185 46 </div> 186 47 187 48 <div class="form-group"> 188 - <label for="email">Email *</label> 49 + <label for="email"><i class="fa-solid fa-envelope"></i> Email Address</label> 189 50 <input 190 51 type="email" 191 52 id="email" ··· 197 58 </div> 198 59 199 60 <div class="form-group"> 200 - <label for="password">Password *</label> 61 + <label for="password"><i class="fa-solid fa-key"></i> Password</label> 201 62 <input 202 63 type="password" 203 64 id="password" 204 65 name="password" 205 66 required 206 67 minlength="8" 207 - placeholder="At least 8 characters" 68 + placeholder="Min. 8 characters" 208 69 autocomplete="new-password" 209 70 > 210 71 </div> 211 72 212 73 <button type="submit" id="submitBtn">Create Account</button> 213 - <div class="loading" id="loading">Creating your account...</div> 74 + <div class="loading-spinner" id="loading"></div> 214 75 </form> 215 76 216 77 <div class="back-link"> 217 - <a href="/">← Back to home</a> 78 + <a href="/"><i class="fa-solid fa-arrow-left"></i> Back to home</a> <a href="/account" style="margin-left: 1rem;">Already Have a Account? Login</a> 218 79 </div> 219 80 </div> 220 81 221 82 <script> 83 + // ... (Keep your original script, it is logic-heavy and works well) 84 + // Just update the UI references if needed 222 85 const form = document.getElementById('createAccountForm'); 223 86 const errorDiv = document.getElementById('error'); 224 87 const successDiv = document.getElementById('success'); ··· 237 100 errorDiv.style.display = 'none'; 238 101 } 239 102 240 - function hideMessages() { 241 - errorDiv.style.display = 'none'; 242 - successDiv.style.display = 'none'; 243 - } 244 - 245 103 form.addEventListener('submit', async (e) => { 246 104 e.preventDefault(); 247 - hideMessages(); 105 + errorDiv.style.display = 'none'; 106 + successDiv.style.display = 'none'; 248 107 249 108 const handle = document.getElementById('handle').value.trim(); 250 109 const domain = document.getElementById('domain').value; 251 110 const email = document.getElementById('email').value.trim(); 252 111 const password = document.getElementById('password').value; 253 112 254 - // Validate handle 255 113 if (!/^[a-zA-Z0-9-]+$/.test(handle)) { 256 114 showError('Handle can only contain letters, numbers, and hyphens'); 257 115 return; 258 116 } 259 117 260 - // Build full handle 261 118 const fullHandle = `${handle}${domain}`; 262 - 263 - // Disable form 264 119 submitBtn.disabled = true; 120 + submitBtn.textContent = "Processing..."; 265 121 loadingDiv.style.display = 'block'; 266 122 267 123 try { 268 - // Create account via AT Protocol API 269 124 const response = await fetch('/xrpc/com.atproto.server.createAccount', { 270 125 method: 'POST', 271 - headers: { 272 - 'Content-Type': 'application/json', 273 - }, 274 - body: JSON.stringify({ 275 - email: email, 276 - handle: fullHandle, 277 - password: password, 278 - }) 126 + headers: { 'Content-Type': 'application/json' }, 127 + body: JSON.stringify({ email, handle: fullHandle, password }) 279 128 }); 280 129 281 130 const data = await response.json(); 131 + if (!response.ok) throw new Error(data.message || 'Failed to create account'); 282 132 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 133 + showSuccess('Success! You can now log in to Bluesky.'); 291 134 form.reset(); 292 - 293 135 } catch (error) { 294 - console.error('Error:', error); 295 - showError(error.message || 'An error occurred. Please try again.'); 136 + showError(error.message || 'An error occurred.'); 296 137 } finally { 297 138 submitBtn.disabled = false; 139 + submitBtn.textContent = "Create Account"; 298 140 loadingDiv.style.display = 'none'; 299 141 } 300 142 }); 301 143 </script> 302 144 </body> 303 - </html> 145 + </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 - }
+203
css/create.css
··· 1 + 2 + :root { 3 + --primary: #f45454; 4 + --primary-hover: #f48954; 5 + --bg-dark: #0d0d0d; 6 + --card-bg: #1a1a1a; 7 + --text-main: #f0f0f0; 8 + --text-muted: #999; 9 + --input-bg: #252525; 10 + --border: #333; 11 + } 12 + 13 + * { 14 + box-sizing: border-box; 15 + margin: 0; 16 + padding: 0; 17 + } 18 + 19 + body { 20 + background-color: var(--bg-dark); 21 + color: var(--text-main); 22 + font-family: 'Inter', system-ui, -apple-system, sans-serif; 23 + display: flex; 24 + align-items: center; 25 + justify-content: center; 26 + min-height: 100vh; 27 + padding: 1.5rem; 28 + } 29 + 30 + .container { 31 + max-width: 450px; 32 + width: 100%; 33 + background: var(--card-bg); 34 + border-radius: 16px; 35 + padding: 2.5rem; 36 + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); 37 + border: 1px solid var(--border); 38 + } 39 + 40 + h1 { 41 + color: #fff; 42 + margin-bottom: 0.5rem; 43 + font-size: 1.8rem; 44 + font-weight: 600; 45 + letter-spacing: -0.5px; 46 + } 47 + 48 + .subtitle { 49 + color: var(--text-muted); 50 + margin-bottom: 2rem; 51 + font-size: 0.95rem; 52 + line-height: 1.4; 53 + } 54 + 55 + .form-group { 56 + margin-bottom: 1.25rem; 57 + } 58 + 59 + label { 60 + display: block; 61 + margin-bottom: 0.5rem; 62 + color: #ccc; 63 + font-size: 0.85rem; 64 + font-weight: 500; 65 + text-transform: uppercase; 66 + letter-spacing: 0.5px; 67 + } 68 + 69 + /* Combined Handle/Domain Input */ 70 + .handle-group { 71 + display: flex; 72 + align-items: center; 73 + background: var(--input-bg); 74 + border: 1px solid var(--border); 75 + border-radius: 8px; 76 + overflow: hidden; 77 + transition: border-color 0.2s, box-shadow 0.2s; 78 + } 79 + 80 + .handle-group:focus-within { 81 + border-color: var(--primary); 82 + box-shadow: 0 0 0 2px rgba(78, 170, 255, 0.2); 83 + } 84 + 85 + .at-symbol { 86 + padding-left: 0.75rem; 87 + color: var(--text-muted); 88 + font-weight: 500; 89 + } 90 + 91 + input[type="text"], 92 + input[type="email"], 93 + input[type="password"], 94 + select { 95 + width: 100%; 96 + padding: 0.8rem; 97 + background: var(--input-bg); 98 + border: 1px solid var(--border); 99 + border-radius: 8px; 100 + color: #fff; 101 + font-size: 1rem; 102 + font-family: inherit; 103 + transition: all 0.2s; 104 + } 105 + 106 + /* Overrides for handle layout */ 107 + .handle-group input { 108 + border: none !important; 109 + flex: 1; 110 + padding-left: 0.5rem; 111 + } 112 + 113 + .handle-group select { 114 + border: none !important; 115 + width: auto; 116 + background: #333; 117 + cursor: pointer; 118 + border-left: 1px solid var(--border) !important; 119 + border-radius: 0; 120 + padding: 0 0.5rem; 121 + font-size: 0.85rem; 122 + } 123 + 124 + input:focus { 125 + outline: none; 126 + border-color: var(--primary); 127 + box-shadow: 0 0 0 2px rgba(78, 170, 255, 0.2); 128 + } 129 + 130 + .helper-text { 131 + font-size: 0.75rem; 132 + color: var(--text-muted); 133 + margin-top: 0.4rem; 134 + } 135 + 136 + button[type="submit"] { 137 + width: 100%; 138 + padding: 1rem; 139 + margin-top: 1rem; 140 + background: var(--primary); 141 + color: #fff; 142 + border: none; 143 + border-radius: 8px; 144 + font-size: 1rem; 145 + font-weight: 600; 146 + cursor: pointer; 147 + transition: transform 0.1s, background 0.2s; 148 + } 149 + 150 + button[type="submit"]:hover { 151 + background: var(--primary-hover); 152 + } 153 + 154 + button[type="submit"]:active { 155 + transform: scale(0.98); 156 + } 157 + 158 + button:disabled { 159 + background: #444; 160 + color: #777; 161 + cursor: not-allowed; 162 + } 163 + 164 + /* Status Messages */ 165 + .alert { 166 + padding: 1rem; 167 + border-radius: 8px; 168 + margin-bottom: 1.5rem; 169 + font-size: 0.9rem; 170 + display: none; 171 + line-height: 1.4; 172 + } 173 + .error { background: rgba(255, 68, 68, 0.15); color: #ff6b6b; border: 1px solid #ff4444; } 174 + .success { background: rgba(68, 255, 68, 0.1); color: #44ff44; border: 1px solid #44ff44; } 175 + 176 + .back-link { 177 + text-align: center; 178 + margin-top: 2rem; 179 + } 180 + 181 + .back-link a { 182 + color: var(--text-muted); 183 + text-decoration: none; 184 + font-size: 0.85rem; 185 + transition: color 0.2s; 186 + } 187 + 188 + .back-link a:hover { 189 + color: var(--primary); 190 + } 191 + 192 + .loading-spinner { 193 + display: none; 194 + margin: 1rem auto 0; 195 + width: 20px; 196 + height: 20px; 197 + border: 3px solid rgba(78, 170, 255, 0.3); 198 + border-radius: 50%; 199 + border-top-color: var(--primary); 200 + animation: spin 1s ease-in-out infinite; 201 + } 202 + 203 + @keyframes spin { to { transform: rotate(360deg); } }
+33 -4
css/index.css
··· 1 1 body { 2 2 background-color: #0d0d0d; 3 3 color: #f0f0f0; 4 - font-family: monospace; 4 + /* Update this line: */ 5 + font-family: 'Libre Baskerville', "Times New Roman", serif; 5 6 padding: 2rem; 6 7 margin: 0; 7 8 max-width: 800px; 8 9 margin: 0 auto; 9 10 } 10 11 a { 11 - color: #4eaaff; 12 + color: #f45454; 12 13 text-decoration: none; 13 14 } 14 15 a:hover { 15 - color: #82cfff; 16 + color: #f48954; 16 17 text-decoration: underline; 17 18 } 18 19 h1 { 19 - color: #4eaaff; 20 + color: #f45454; 21 + } 22 + /* Announcement banner styles */ 23 + .announcement { 24 + box-sizing: border-box; 25 + background: linear-gradient(90deg,#f45454,#f48954); 26 + color: white; 27 + padding: 12px 16px; 28 + display: flex; 29 + align-items: center; 30 + justify-content: space-between; 31 + gap: 12px; 32 + font-size: 14px; 33 + } 34 + .announcement p { margin: 0; } 35 + .announcement a { color: white; text-decoration: underline; } 36 + .announcement .controls { display:flex; gap:8px; align-items:center; } 37 + .announcement button.dismiss { 38 + background: rgba(255,255,255,0.12); 39 + color: white; 40 + border: 1px solid rgba(255,255,255,0.18); 41 + padding: 6px 10px; 42 + border-radius: 6px; 43 + cursor: pointer; 44 + } 45 + .announcement button.dismiss:focus { outline: 3px solid rgba(255,255,255,0.18); } 46 + @media (max-width:520px) { 47 + .announcement { flex-direction: column; align-items: flex-start; } 48 + .announcement .controls { width:100%; justify-content: flex-end; } 20 49 }
+12 -31
index.html
··· 10 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 11 <meta property="og:type" content="website"> 12 12 <meta property="og:url" content="https://pds.madebydanny.uk/"> 13 - <meta property="og:image" id="og-image" content="/media/seo/og-image.png"> 13 + <meta property="og:image" id="og-image" content="/media/seo/banner.png"> 14 + <link rel="preconnect" href="https://fonts.googleapis.com"> 15 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 16 + <link href="https://fonts.googleapis.com/css2?family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet"> 14 17 <link rel="stylesheet" href="/css/index.css" /> 15 - <style> 16 - /* Announcement banner styles */ 17 - .announcement { 18 - box-sizing: border-box; 19 - background: linear-gradient(90deg,#0b64fd,#af0ee9); 20 - color: white; 21 - padding: 12px 16px; 22 - display: flex; 23 - align-items: center; 24 - justify-content: space-between; 25 - gap: 12px; 26 - font-size: 14px; 27 - } 28 - .announcement p { margin: 0; } 29 - .announcement a { color: white; text-decoration: underline; } 30 - .announcement .controls { display:flex; gap:8px; align-items:center; } 31 - .announcement button.dismiss { 32 - background: rgba(255,255,255,0.12); 33 - color: white; 34 - border: 1px solid rgba(255,255,255,0.18); 35 - padding: 6px 10px; 36 - border-radius: 6px; 37 - cursor: pointer; 38 - } 39 - .announcement button.dismiss:focus { outline: 3px solid rgba(255,255,255,0.18); } 40 - @media (max-width:520px) { 41 - .announcement { flex-direction: column; align-items: flex-start; } 42 - .announcement .controls { width:100%; justify-content: flex-end; } 43 - } 44 - </style> 45 18 </head> 46 19 <body> 47 20 <!-- Announcement banner (dismissible for 24 hours) --> ··· 58 31 59 32 <h2>About</h2> 60 33 <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/followonbsky?did=madebydanny.uk" target="_blank">@madebydanny.uk</a>, we are committed to providing the best Bluesky experience.</p> 34 + 35 + <h3>What make us different</h3> 36 + <p>The MBD PDS is a public PDS that’s a little bit different than the average PDS. Our PDS supports Email 2FA to help protect your account from bad actors, and has a public Status page that lists all accounts on the PDS as well with system statistics.</p> 37 + 38 + <h3>Quick Links</h3> 61 39 <ul> 62 40 <li><a href="/about/index.html">Learn more</a></li> 63 41 <li><a href="/about/privacy.html">Privacy Policy</a></li> ··· 66 44 67 45 <h2>Links</h2> 68 46 <ul> 47 + <li><a href="https://drive.proton.me/urls/SX17XS2B98#ul4Rq5mCjN8W" target="_blank">Account Database</a></li> 69 48 <li><a href="/status.html">View Server Status</a></li> 70 49 <li><a href="https://status.pds.madebydanny.uk">Check System Status</a></li> 71 50 <li><a href="/create.html">Create your Free Account</a></li> 51 + <li><a href="/account">Login - Manage your Account</a></li> 72 52 </ul> 73 53 74 54 <h2>Developer Info</h2> 75 55 <p><b>API</b> - Most API routes are under <code>/xrpc/</code></p> 56 + <p><b>New Accounts</b> - Account creations are rate limited to 2 new accounts every 5 minutes</p> 76 57 <h3>Supported handles</h3> 77 58 <ul> 78 59 <li>.pds.madebydanny.uk</li>
media/seo/banner.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.