this repo has no description

did a thing

+192 -165
-145
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 - <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"> 15 - </head> 16 - <body> 17 - <div class="container"> 18 - <h1>Create Account</h1> 19 - <p class="subtitle">Join the MBD PDS for free</p> 20 - 21 - <div class="alert error" id="error"></div> 22 - <div class="alert success" id="success"></div> 23 - 24 - <form id="createAccountForm"> 25 - <div class="form-group"> 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> 29 - <input 30 - type="text" 31 - id="handle" 32 - name="handle" 33 - required 34 - placeholder="daniel" 35 - pattern="[a-zA-Z0-9-]+" 36 - autocomplete="off" 37 - > 38 - <select id="domain" name="domain" required> 39 - <option value=".pds.madebydanny.uk">.pds.madebydanny.uk</option> 40 - <option value=".pds.danielmorrisey.com">.pds.danielmorrisey.com</option> 41 - <option value=".mbdio.uk">.mbdio.uk</option> 42 - <option value=".certifiedshitposter.com">.certifiedshitposter.com</option> 43 - </select> 44 - </div> 45 - <div class="helper-text">Letters, numbers, and hyphens only</div> 46 - </div> 47 - 48 - <div class="form-group"> 49 - <label for="email"><i class="fa-solid fa-envelope"></i> Email Address</label> 50 - <input 51 - type="email" 52 - id="email" 53 - name="email" 54 - required 55 - placeholder="you@example.com" 56 - autocomplete="email" 57 - > 58 - </div> 59 - 60 - <div class="form-group"> 61 - <label for="password"><i class="fa-solid fa-key"></i> Password</label> 62 - <input 63 - type="password" 64 - id="password" 65 - name="password" 66 - required 67 - minlength="8" 68 - placeholder="Min. 8 characters" 69 - autocomplete="new-password" 70 - > 71 - </div> 72 - 73 - <button type="submit" id="submitBtn">Create Account</button> 74 - <div class="loading-spinner" id="loading"></div> 75 - </form> 76 - 77 - <div class="back-link"> 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> 79 - </div> 80 - </div> 81 - 82 - <script> 83 - // ... (Keep your original script, it is logic-heavy and works well) 84 - // Just update the UI references if needed 85 - const form = document.getElementById('createAccountForm'); 86 - const errorDiv = document.getElementById('error'); 87 - const successDiv = document.getElementById('success'); 88 - const submitBtn = document.getElementById('submitBtn'); 89 - const loadingDiv = document.getElementById('loading'); 90 - 91 - function showError(message) { 92 - errorDiv.textContent = message; 93 - errorDiv.style.display = 'block'; 94 - successDiv.style.display = 'none'; 95 - } 96 - 97 - function showSuccess(message) { 98 - successDiv.textContent = message; 99 - successDiv.style.display = 'block'; 100 - errorDiv.style.display = 'none'; 101 - } 102 - 103 - form.addEventListener('submit', async (e) => { 104 - e.preventDefault(); 105 - errorDiv.style.display = 'none'; 106 - successDiv.style.display = 'none'; 107 - 108 - const handle = document.getElementById('handle').value.trim(); 109 - const domain = document.getElementById('domain').value; 110 - const email = document.getElementById('email').value.trim(); 111 - const password = document.getElementById('password').value; 112 - 113 - if (!/^[a-zA-Z0-9-]+$/.test(handle)) { 114 - showError('Handle can only contain letters, numbers, and hyphens'); 115 - return; 116 - } 117 - 118 - const fullHandle = `${handle}${domain}`; 119 - submitBtn.disabled = true; 120 - submitBtn.textContent = "Processing..."; 121 - loadingDiv.style.display = 'block'; 122 - 123 - try { 124 - const response = await fetch('/xrpc/com.atproto.server.createAccount', { 125 - method: 'POST', 126 - headers: { 'Content-Type': 'application/json' }, 127 - body: JSON.stringify({ email, handle: fullHandle, password }) 128 - }); 129 - 130 - const data = await response.json(); 131 - if (!response.ok) throw new Error(data.message || 'Failed to create account'); 132 - 133 - showSuccess('Success! You can now log in to Bluesky.'); 134 - form.reset(); 135 - } catch (error) { 136 - showError(error.message || 'An error occurred.'); 137 - } finally { 138 - submitBtn.disabled = false; 139 - submitBtn.textContent = "Create Account"; 140 - loadingDiv.style.display = 'none'; 141 - } 142 - }); 143 - </script> 144 - </body> 145 - </html>
+62 -2
css/index.css
··· 22 22 /* Announcement banner styles */ 23 23 .announcement { 24 24 box-sizing: border-box; 25 - background: linear-gradient(90deg,#f45454,#f48954); 25 + background: #f45454; 26 26 color: white; 27 27 padding: 12px 16px; 28 28 display: flex; ··· 46 46 @media (max-width:520px) { 47 47 .announcement { flex-direction: column; align-items: flex-start; } 48 48 .announcement .controls { width:100%; justify-content: flex-end; } 49 - } 49 + } 50 + /* Button Row Styles */ 51 + .button-row { 52 + display: flex; 53 + flex-wrap: wrap; 54 + gap: 12px; 55 + margin: 1.5rem 0; 56 + } 57 + 58 + .btn { 59 + display: inline-block; 60 + padding: 10px 20px; 61 + background-color: #222; /* Darker background to contrast body */ 62 + color: #f0f0f0 !important; /* Keep text light */ 63 + border: 1px solid #444; 64 + border-radius: 8px; 65 + font-size: 0.9rem; 66 + transition: all 0.2s ease; 67 + text-decoration: none !important; 68 + } 69 + 70 + .btn:hover { 71 + background-color: #333; 72 + border-color: #f45454; 73 + transform: translateY(-2px); 74 + } 75 + 76 + /* Primary "Create Account" button style */ 77 + .btn.primary { 78 + background: linear-gradient(90deg, #f45454, #f48954); 79 + border: none; 80 + font-weight: bold; 81 + } 82 + 83 + .btn.primary:hover { 84 + filter: brightness(1.1); 85 + box-shadow: 0 4px 15px rgba(244, 84, 84, 0.3); 86 + } 87 + 88 + /* Ensure it looks good on mobile */ 89 + @media (max-width: 520px) { 90 + .button-row { 91 + flex-direction: column; 92 + } 93 + .btn { 94 + text-align: center; 95 + } 96 + } 97 + .warning { 98 + box-sizing: border-box; 99 + background: #f45454; 100 + color: white; 101 + padding: 12px 16px; 102 + display: flex; 103 + align-items: center; 104 + justify-content: space-between; 105 + gap: 12px; 106 + font-size: 14px; 107 + } 108 + .warning p { margin: 0; } 109 + .warning a { color: white; text-decoration: underline; }
+14 -18
index.html
··· 17 17 <link rel="stylesheet" href="/css/index.css" /> 18 18 </head> 19 19 <body> 20 - <!-- Announcement banner (dismissible for 24 hours) --> 21 - 22 - <div id="announcement" class="announcement" role="region" aria-label="Site announcement"> 23 - <p><strong>What's new:</strong> Starting Sat Dec 27 16:04 <i>(EST)</i> the MBD PDS will now support Email 2FA, <a href="https://www.youtube.com/watch?v=9PJdA431FEU" target="_blank">learn how to enable email 2FA</a></p> 20 + <div id="announcement" class="announcement" role="region" aria-label="Site announcement"> 21 + <p><strong>What's new:</strong> You can now migrate to the MBD PDS using PDS MOOver! Learn how to MOOve!</a></p> 24 22 <div class="controls"> 25 23 <button class="dismiss" id="dismissAnnouncement" aria-label="Dismiss announcement">Dismiss</button> 26 24 </div> 27 25 </div> 28 26 <main> 29 27 <h1>MBD PDS - pds.madebydanny.uk</h1> 28 + <div class="button-row"> 29 + <a href="/join/index.html" class="btn">Join / Migrate</a> 30 + <a href="/account" class="btn">Login</a> 31 + <a href="/status.html" class="btn">Server Status</a> 32 + <a href="/about/terms.html" class="btn">Terms of Service</a> 33 + <a href="/about/privacy.html" class="btn">Privacy Policy</a> 34 + </div> 30 35 <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> 31 36 32 37 <h2>About</h2> 33 38 <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 39 38 - <h3>Quick Links</h3> 39 - <ul> 40 - <li><a href="/about/index.html">Learn more</a></li> 41 - <li><a href="/about/privacy.html">Privacy Policy</a></li> 42 - <li><a href="/about/terms.html">Terms of Service</a></li> 43 - </ul> 44 - 45 - <h2>Links</h2> 40 + <h3>Links</h3> 46 41 <ul> 47 42 <li><a href="https://pdsls.dev/firehose?instance=wss%3A%2F%2Fpds.madebydanny.uk" target="_blank">PDS Firehose</a></li> 48 - <li><a href="https://drive.proton.me/urls/SX17XS2B98#ul4Rq5mCjN8W" target="_blank">Account Database</a></li> 49 43 <li><a href="/status.html">View Server Status</a></li> 44 + <li><a href="https://pdsmoover.com/moover/pds.madebydanny.uk">MOOve<i>(Migrate)</i></a></li> 45 + <li><a href="/about/privacy.html">Privacy Policy</a></li> 46 + <li><a href="/about/terms.html">Terms of Service</a></li> 47 + <li><a href="/account">Manage Account</a></li> 50 48 <li><a href="https://status.pds.madebydanny.uk">Check System Status</a></li> 51 - <li><a href="/create.html">Create your Free Account</a></li> 52 - <li><a href="/account">Login - Manage your Account</a></li> 53 49 </ul> 54 50 55 51 <h2>Developer Info</h2>
+116
join/index.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>Join MBD PDS - Choose Your Path</title> 7 + <link rel="icon" href="/media/seo/icon.png" type="image/png" /> 8 + <link rel="preconnect" href="https://fonts.googleapis.com"> 9 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 10 + <link href="https://fonts.googleapis.com/css2?family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet"> 11 + <link rel="stylesheet" href="/css/index.css" /> 12 + <style> 13 + .join-container { 14 + display: grid; 15 + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); 16 + gap: 20px; 17 + margin-top: 2rem; 18 + } 19 + .join-card { 20 + background: #1a1a1a; 21 + border: 1px solid #333; 22 + padding: 24px; 23 + border-radius: 12px; 24 + display: flex; 25 + flex-direction: column; 26 + transition: transform 0.2s, border-color 0.2s; 27 + } 28 + .join-card:hover { 29 + transform: translateY(-5px); 30 + border-color: #f45454; 31 + } 32 + .join-card h3 { 33 + margin-top: 0; 34 + color: #f45454; 35 + } 36 + .join-card p { 37 + font-size: 0.9rem; 38 + flex-grow: 1; 39 + margin-bottom: 20px; 40 + } 41 + .back-link { 42 + display: inline-block; 43 + margin-top: 2rem; 44 + font-size: 0.9rem; 45 + } 46 + 47 + /* Input styling */ 48 + .client-input-group { 49 + display: flex; 50 + gap: 8px; 51 + } 52 + .client-input-group input { 53 + flex-grow: 1; 54 + padding: 10px; 55 + border-radius: 8px; 56 + border: 1px solid #444; 57 + background: #0d0d0d; 58 + color: white; 59 + font-family: inherit; 60 + } 61 + .client-input-group input:focus { 62 + outline: none; 63 + border-color: #f45454; 64 + } 65 + </style> 66 + </head> 67 + <body> 68 + <main> 69 + <h1>Join the MBD PDS</h1> 70 + <p>Choose the best way for you to get started on the MBD PDS</p> 71 + 72 + <div class="join-container"> 73 + 74 + <div class="join-card"> 75 + <h3>Use a client</h3> 76 + <p>Sign up via your favorite client by selecting <code>pds.madebydanny.uk</code> as your provider.</p> 77 + <div style="display: flex; flex-direction: column; gap: 10px;"> 78 + <small style="font-size: 0.75rem; color: #888;">Try bsky.app, witchsky.app, blacksky.community, etc</small> 79 + <div class="client-input-group"> 80 + <input type="text" id="clientUrl" placeholder="bsky.app"> 81 + <button onclick="openClient()" class="btn" style="padding: 8px 15px;">Go</button> 82 + </div> 83 + </div> 84 + </div> 85 + 86 + <div class="join-card"> 87 + <h3>Use PDS MOOver</h3> 88 + <p>Already have a Bluesky account? Move your existing data and followers over to our PDS using PDS Moover.</p> 89 + <a href="https://pdsmoover.com/moover/pds.madebydanny.uk" target="_blank" class="btn">Migrate using PDS MOOver</a> 90 + </div> 91 + </div> 92 + 93 + <a href="/" class="back-link">← Back to Home</a> 94 + </main> 95 + 96 + <footer> 97 + <p>&copy; 2024-2025 Made by Danny UK - Powered by Resend and Upcloud</p> 98 + </footer> 99 + 100 + <script> 101 + function openClient() { 102 + const input = document.getElementById('clientUrl').value.trim(); 103 + const target = input || 'bsky.app'; 104 + const url = target.startsWith('http') ? target : 'https://' + target; 105 + window.open(url, '_blank'); 106 + } 107 + 108 + // Allow "Enter" key to submit 109 + document.getElementById('clientUrl').addEventListener('keypress', function (e) { 110 + if (e.key === 'Enter') { 111 + openClient(); 112 + } 113 + }); 114 + </script> 115 + </body> 116 + </html>