madebydanny.uk written in html, css, and a lot of JavaScript I don't understand madeydanny.uk
html css javascript

New Update V17 - 17/11

- Added New Green Color Design

- Ueses UpCloud as CDN and not my PDS

- Speed improvements

- New Font (Itim)

- Updates to followonbsky thing

+381 -302
.DS_Store

This is a binary file and will not be displayed.

+152 -64
css/bsky.css
··· 1 1 :root{ 2 - --bg:#0d0d0d; 3 - --card:#141414; 4 - --muted:#bdbdbd; 5 - --accent:#0070f3; 6 - --glass:rgba(255,255,255,0.02); 7 - --radius:14px; 8 - --maxw:360px; 2 + --bg: #0a0a0f; 3 + --card: #1a1a24; 4 + --card-secondary: #13131d; 5 + --text-primary: #e8e8f0; 6 + --text-muted: #9494a8; 7 + --accent: #6366f1; 8 + --accent-hover: #818cf8; 9 + --glass: rgba(99, 102, 241, 0.05); 10 + --border: rgba(99, 102, 241, 0.15); 11 + --radius: 16px; 12 + --maxw: 420px; 9 13 } 10 14 11 - html,body{height:100%} 15 + html,body{height:100%;margin:0} 12 16 body{ 13 - margin:0; 14 - font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial; 17 + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; 15 18 display:flex; 16 19 align-items:center; 17 20 justify-content:center; 18 - padding:28px; 19 - background:linear-gradient(180deg,var(--bg),#050505); 20 - color:#f7f7f7; 21 + padding:24px; 22 + background: radial-gradient(ellipse at top, #1a1a2e 0%, var(--bg) 50%); 23 + color: var(--text-primary); 24 + line-height: 1.6; 21 25 } 22 26 23 27 .card{ 24 28 width:100%; 25 29 max-width:var(--maxw); 26 - background:linear-gradient(180deg,var(--card),#0f0f0f); 30 + background: var(--card); 31 + border: 1px solid var(--border); 27 32 border-radius:var(--radius); 28 - padding:22px; 29 - box-shadow:0 10px 30px rgba(0,0,0,0.6); 33 + padding:32px 28px; 34 + box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 1px rgba(99, 102, 241, 0.3); 30 35 text-align:center; 31 - transition:transform .14s ease,box-shadow .14s ease; 36 + transition: transform 0.2s ease, box-shadow 0.2s ease; 37 + } 38 + .card:hover{ 39 + transform:translateY(-2px); 40 + box-shadow: 0 24px 70px rgba(0,0,0,0.6), 0 0 2px rgba(99, 102, 241, 0.5); 32 41 } 33 - .card:hover{transform:translateY(-4px);box-shadow:0 18px 40px rgba(0,0,0,0.7)} 34 42 35 43 .profile{ 36 44 display:flex; 37 - gap:14px; 45 + gap:16px; 38 46 align-items:center; 39 47 justify-content:center; 40 48 flex-direction:column; 49 + margin-bottom: 24px; 41 50 } 42 51 .avatar{ 43 - width:86px;height:86px; 52 + width:96px; 53 + height:96px; 44 54 border-radius:50%; 45 55 object-fit:cover; 46 - border:2px solid var(--accent); 47 - background:linear-gradient(180deg,#222,#0a0a0a); 56 + border:3px solid var(--accent); 57 + background: var(--card-secondary); 58 + box-shadow: 0 8px 24px rgba(99, 102, 241, 0.3); 48 59 } 49 - .name{margin:8px 0 0;font-size:1.05rem;font-weight:600} 50 - .tagline{margin:6px 0 0;color:var(--muted);font-size:.9rem} 60 + .name{ 61 + margin:4px 0 0; 62 + font-size:1.35rem; 63 + font-weight:700; 64 + letter-spacing: -0.02em; 65 + } 66 + .tagline{ 67 + margin:6px 0 0; 68 + color:var(--text-muted); 69 + font-size:0.95rem; 70 + line-height: 1.5; 71 + } 51 72 52 73 .links{ 53 - margin-top:18px; 74 + margin-top:20px; 54 75 display:grid; 55 76 grid-template-columns:repeat(2,1fr); 56 - gap:10px; 77 + gap:12px; 57 78 } 58 79 .link{ 59 80 display:flex; 60 - gap:10px; 81 + gap:12px; 61 82 align-items:center; 62 - padding:10px; 63 - border-radius:10px; 83 + padding:14px 12px; 84 + border-radius:12px; 64 85 text-decoration:none; 65 - background:var(--glass); 66 - color:inherit; 67 - transition:transform .12s ease,box-shadow .12s ease,background .12s ease,color .12s ease; 86 + background: var(--glass); 87 + border: 1px solid var(--border); 88 + color: var(--text-primary); 89 + transition: all 0.2s ease; 90 + } 91 + .link img{ 92 + width:32px; 93 + height:32px; 94 + border-radius:8px; 95 + flex:0 0 32px; 96 + } 97 + .link .label{ 98 + font-weight:600; 99 + font-size:0.95rem; 100 + text-align: left; 101 + } 102 + .link:hover{ 103 + transform:translateY(-2px); 104 + background: rgba(255, 255, 255, 0.08); 105 + border-color: var(--accent); 68 106 } 69 - .link img{width:28px;height:28px;border-radius:6px;flex:0 0 28px} 70 - .link .label{font-weight:600;font-size:.95rem} 71 - .link:hover{transform:translateY(-4px);background:#fff} 72 107 73 108 /* Brand hover colors */ 74 - .link.bsky:hover{color:#1083fd;background:black;box-shadow:0 0 12px rgb(14, 118, 255)} 75 - .link.deer:hover{color:#749f7a;background:rgb(0, 0, 0);box-shadow:0 0 12px rgb(97,255,134,0.4)} 76 - .link.catsky:hover{color:#cca6f7;background:#000;box-shadow:0 0 12px rgba(204,166,247,1)} 77 - .link.blacksky:hover{color:#000000;background:#ffffff;box-shadow:0 0 12px rgb(255, 255, 255)} 78 - .link.anisota:hover{color:#c28431;background:#000;box-shadow:0 0 12px rgba(255,69,0,0.4)} 79 - .link.tangled:hover{color:white;background:black;box-shadow:0 0 12px rgba(255, 255, 255, 0.4)} 80 - .link.nooki:hover{color:#FDC417;background:black;box-shadow:0 0 12px rgba(253, 196, 23, 1)} 81 - .link.splace:hover{color:#ffffff;background:#000000;box-shadow:0 0 12px rgba(248, 186, 202)} 82 - .link.bitch:hover{color:#402c44;background:black;box-shadow:0 0 12px rgb(64, 43, 68)} 83 - .link.redd:hover{color:#ff4242;background:black;box-shadow:0 0 12px rgba(255, 66, 66)} 109 + .link.bsky:hover{color:#1083fd;border-color:#1083fd;box-shadow:0 4px 16px rgba(16,131,253,0.3)} 110 + .link.deer:hover{color:#749f7a;border-color:#749f7a;box-shadow:0 4px 16px rgba(116,159,122,0.3)} 111 + .link.catsky:hover{color:#cca6f7;border-color:#cca6f7;box-shadow:0 4px 16px rgba(204,166,247,0.3)} 112 + .link.blacksky:hover{color:#ffffff;border-color:#ffffff;box-shadow:0 4px 16px rgba(255,255,255,0.3)} 113 + .link.anisota:hover{color:#c28431;border-color:#c28431;box-shadow:0 4px 16px rgba(194,132,49,0.3)} 114 + .link.tangled:hover{color:#ffffff;border-color:#ffffff;box-shadow:0 4px 16px rgba(255,255,255,0.3)} 115 + .link.nooki:hover{color:#FDC417;border-color:#FDC417;box-shadow:0 4px 16px rgba(253,196,23,0.3)} 116 + .link.splace:hover{color:#f8baca;border-color:#f8baca;box-shadow:0 4px 16px rgba(248,186,202,0.3)} 117 + .link.bitch:hover{color:#9b7ba0;border-color:#9b7ba0;box-shadow:0 4px 16px rgba(155,123,160,0.3)} 118 + .link.redd:hover{color:#ff4242;border-color:#ff4242;box-shadow:0 4px 16px rgba(255,66,66,0.3)} 119 + 120 + #more-clients{ 121 + display: none; 122 + } 123 + #more-clients.show{ 124 + display: grid; 125 + } 126 + 127 + .show-more-btn{ 128 + margin-top: 12px; 129 + padding: 12px 20px; 130 + background: var(--glass); 131 + border: 1px solid var(--border); 132 + border-radius: 10px; 133 + color: var(--accent-hover); 134 + font-weight: 600; 135 + cursor: pointer; 136 + transition: all 0.2s ease; 137 + font-size: 0.9rem; 138 + } 139 + .show-more-btn:hover{ 140 + background: rgba(99, 102, 241, 0.1); 141 + border-color: var(--accent); 142 + transform: translateY(-1px); 143 + } 84 144 85 145 .controls{ 86 - margin-top:16px; 146 + margin-top:24px; 87 147 display:flex; 88 148 flex-direction:column; 89 149 gap:10px; 150 + padding-top: 24px; 151 + border-top: 1px solid var(--border); 90 152 } 91 - .control-row{display:flex;gap:8px;align-items:center} 153 + .control-row{ 154 + display:flex; 155 + gap:10px; 156 + align-items:center; 157 + } 92 158 .control-row input{ 93 159 flex:1; 94 - padding:9px 10px; 95 - border-radius:8px; 96 - border:1px solid rgba(255,255,255,0.04); 97 - background:transparent; 98 - color:inherit; 160 + padding:12px 14px; 161 + border-radius:10px; 162 + border:1px solid var(--border); 163 + background: var(--card-secondary); 164 + color: var(--text-primary); 99 165 outline:none; 166 + font-size: 0.95rem; 167 + transition: border-color 0.2s ease; 168 + } 169 + .control-row input:focus{ 170 + border-color: var(--accent); 171 + } 172 + .control-row input::placeholder{ 173 + color: var(--text-muted); 100 174 } 101 175 .control-row button{ 102 - padding:9px 12px; 103 - border-radius:8px; 176 + padding:12px 18px; 177 + border-radius:10px; 104 178 border:0; 105 179 cursor:pointer; 106 - background:var(--accent); 107 - color:white; 180 + background: var(--accent); 181 + color: white; 108 182 font-weight:600; 183 + font-size: 0.95rem; 184 + transition: background 0.2s ease, transform 0.2s ease; 185 + } 186 + .control-row button:hover{ 187 + background: var(--accent-hover); 188 + transform: translateY(-1px); 109 189 } 110 190 111 191 .meta{ 112 - margin-top:16px; 113 - font-size:13px; 114 - color:var(--muted); 115 - text-align:left; 192 + margin-top:20px; 193 + font-size:0.85rem; 194 + color:var(--text-muted); 195 + } 196 + .meta a{ 197 + color:var(--accent-hover); 198 + text-decoration:none; 199 + transition: color 0.2s ease; 200 + } 201 + .meta a:hover{ 202 + color: var(--accent); 203 + text-decoration:underline; 116 204 } 117 - .meta a{color:var(--accent);text-decoration:none} 118 - .meta a:hover{text-decoration:underline} 119 205 120 - @media(max-width:380px){ 206 + @media(max-width:480px){ 121 207 :root{--maxw:100%} 122 - .links{grid-template-columns:1fr} 208 + .links, #more-clients{grid-template-columns:1fr} 209 + body{padding: 16px} 210 + .card{padding: 24px 20px} 123 211 }
+61 -68
css/index.css
··· 1 1 body { 2 2 background-color: black; 3 3 color: white; 4 - background-image: url("https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicehnxcease3yatg5zr4h7jlwmlklodiwasynkz6td5yaw65p5gki"); 5 - background-repeat: no-repeat; 4 + background-image: url("https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/com.atproto.sync.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T224744Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=56e16996c616a1574e71d5a4e7e9bc142a82065f0d4e0ba15e8fee46a580d85a&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject"); 6 5 background-position: center center; 7 6 background-size: cover; 8 7 background-attachment: fixed; 9 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif; 8 + font-family: "Itim", cursive; 9 + font-weight: 400; 10 + font-style: normal; 10 11 margin: 0; 11 12 padding: 20px 0; 12 13 line-height: 1.6; ··· 38 39 /* White card styling */ 39 40 .white-card { 40 41 backdrop-filter: blur(20px); 41 - background: linear-gradient(135deg, rgba(175, 64, 175, 0.6), rgba(64, 106, 175, 0.6)); 42 + background: #79f7a394; 42 43 border-radius: 16px; 43 44 padding: 30px; 44 45 margin: 20px 0; ··· 95 96 96 97 /* Links with better visibility */ 97 98 a { 98 - color: #b3b3ff; 99 + color: #79F7A4; 99 100 text-decoration: none; 100 101 transition: color 0.2s ease; 101 102 } 102 103 a:hover { 103 - color: #d4d4ff; 104 + color: white; 104 105 text-decoration: underline; 105 106 } 106 107 ··· 130 131 font-size: 18px; 131 132 border: none; 132 133 outline: none; 133 - background-color: #9999ff; 134 + background-color: #2F7D61; 134 135 color: white; 135 136 cursor: pointer; 136 137 padding: 15px; 137 138 border-radius: 8px; 138 139 transition: all 0.3s ease; 139 - box-shadow: 0 4px 12px rgba(175, 64, 175, 0.54); 140 140 } 141 141 #myBtn:hover { 142 - background-color: #b3b3ff; 142 + background-color: #5CFFC5; 143 143 transform: translateY(-2px); 144 - box-shadow: 0 6px 16px rgba(153, 153, 255, 0.6); 145 144 } 146 145 147 146 /* Bluesky Profile Header with better contrast */ ··· 152 151 backdrop-filter: blur(20px); 153 152 border: 1px solid rgba(153, 153, 255, 0.2); 154 153 box-sizing: border-box; 155 - background: linear-gradient(135deg, rgba(64, 106, 175, 0.6), rgba(175, 64, 175, 0.5)); 154 + background: #79F7A494; 156 155 box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 157 156 0 0 0 1px rgba(255, 255, 255, 0.1) inset; 158 157 transition: all 0.3s ease; ··· 180 179 object-fit: cover; 181 180 display: none; 182 181 margin: -60px 0 15px 0; 183 - border: 4px solid #9999ff; 182 + border: 4px solid #2F7D61; 184 183 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.6), 185 184 0 0 0 2px rgba(255, 255, 255, 0.1); 186 185 transition: transform 0.3s ease, box-shadow 0.3s ease; 187 186 } 188 - 189 187 #pfp:hover { 190 188 transform: scale(1.05); 191 - box-shadow: 0 12px 32px rgba(0, 0, 0, 0.7), 192 - 0 0 0 2px rgba(153, 153, 255, 0.5); 193 189 } 194 190 .bsky-info { 195 191 margin-top: 10px; ··· 198 194 font-size: 28px; 199 195 font-weight: bold; 200 196 margin-bottom: 5px; 201 - color: #ffffff; 197 + color: #2F7D61; 202 198 } 203 199 #handle { 204 200 font-size: 16px; 205 - color: #b3b3ff; 201 + color: #2F7D61; 206 202 margin-bottom: 15px; 207 203 } 208 204 #bio { 209 - color: #e6e6e6; 205 + color: #2F7D61; 210 206 line-height: 1.7; 211 207 white-space: pre-wrap; 212 208 margin-bottom: 15px; ··· 216 212 display: flex; 217 213 gap: 25px; 218 214 font-size: 14px; 219 - color: #d0d0d0; 215 + color: #2F7D61; 220 216 } 221 217 #stats span { 222 - color: #ffffff; 218 + color: #2F7D61; 223 219 font-weight: bold; 224 220 } 225 221 .bsky-loading { ··· 231 227 .bsky-button { 232 228 display: inline-block; 233 229 padding: 12px 24px; 234 - background-color: #9999ff; 230 + background-color: #2F7D61; 235 231 color: white; 236 232 text-decoration: none; 237 233 border-radius: 8px; 238 234 font-weight: bold; 239 235 transition: all 0.3s ease; 240 236 margin-top: 10px; 241 - box-shadow: 0 4px 12px rgba(153, 153, 255, 0.3); 242 237 } 243 238 .bsky-button:hover { 244 - background-color: #b3b3ff; 239 + background-color: #79F7A4; 245 240 transform: translateY(-2px); 246 - box-shadow: 0 6px 16px rgba(153, 153, 255, 0.5); 241 + color: #2F7D61; 247 242 } 248 243 249 244 /* Latest Bluesky Post with better contrast */ 250 245 #latest-bsky-post { 251 246 backdrop-filter: blur(20px); 252 - background: linear-gradient(135deg, rgba(64, 106, 175, 0.6), rgba(175, 64, 175, 0.5)); 247 + background: #79f7a394; 253 248 border-radius: 16px; 254 249 padding: 30px; 255 250 margin: 20px 0; ··· 276 271 width: 48px; 277 272 height: 48px; 278 273 border-radius: 50%; 279 - border: 2px solid #9999ff; 274 + border: 2px solid #2F7D61; 280 275 } 281 276 282 277 .post-user-info { ··· 285 280 286 281 .post-display-name { 287 282 font-weight: bold; 288 - color: #ffffff; 283 + color: #2F7D61; 289 284 font-size: 16px; 290 285 cursor: pointer; 291 286 transition: color 0.2s ease; 292 287 } 293 288 294 289 .post-display-name:hover { 295 - color: #b3b3ff; 290 + color: white; 296 291 } 297 292 298 293 .post-handle { 299 - color: #b3b3ff; 294 + color: #2F7D61; 300 295 font-size: 14px; 301 296 cursor: pointer; 302 297 transition: color 0.2s ease; 303 298 } 304 299 305 300 .post-handle:hover { 306 - color: #d4d4ff; 301 + color: white; 307 302 text-decoration: underline; 308 303 } 309 304 310 305 .post-timestamp { 311 - color: #cccccc; 306 + color: #2F7D61; 312 307 font-size: 13px; 313 308 } 314 309 315 310 .post-text { 316 - color: #e6e6e6; 311 + color: #2F7D61; 317 312 line-height: 1.7; 318 313 margin-bottom: 15px; 319 314 white-space: pre-wrap; ··· 322 317 } 323 318 324 319 .post-text a { 325 - color: #b3b3ff; 320 + color: white; 326 321 text-decoration: none; 327 322 transition: color 0.2s ease; 328 323 } ··· 389 384 } 390 385 391 386 .post-embed-url { 392 - color: #9999ff; 387 + color: #2F7D61; 393 388 font-size: 12px; 394 389 } 395 390 ··· 398 393 gap: 25px; 399 394 margin-top: 15px; 400 395 padding-top: 15px; 401 - border-top: 1px solid rgba(153, 153, 255, 0.3); 402 396 font-size: 14px; 403 397 color: #d0d0d0; 404 398 } 405 399 406 400 .post-stats i { 407 401 margin-right: 6px; 408 - color: #9999ff; 402 + color: #2F7D61; 403 + } 404 + 405 + .post-stats div { 406 + color:#2F7D61; 409 407 } 410 408 411 409 .view-post-link { 412 410 display: inline-block; 413 411 margin-top: 12px; 414 - color: #b3b3ff; 412 + color: #2F7D61; 415 413 text-decoration: none; 416 414 font-size: 14px; 417 415 font-weight: 500; 418 416 } 419 417 420 418 .view-post-link:hover { 421 - color: #d4d4ff; 419 + color: white; 422 420 text-decoration: underline; 423 421 } 424 422 ··· 529 527 width: 80px; 530 528 height: 80px; 531 529 margin: -40px 0 10px 0; 532 - border: 3px solid #9999ff; 530 + border: 3px solid #2F7D61; 533 531 } 534 532 #user { 535 533 font-size: 22px; ··· 550 548 text-align: center; 551 549 margin: 20px 0; 552 550 backdrop-filter: blur(20px); 553 - background: linear-gradient(135deg, rgba(64, 106, 175, 0.6), rgba(175, 64, 175, 0.5)); 551 + background: #79f7a396; 554 552 border-radius: 16px; 555 553 padding: 30px; 556 554 box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), ··· 569 567 font-size: 1.6em; 570 568 font-weight: 700; 571 569 margin-bottom: 20px; 572 - color: #ffffff; 570 + color: #2F7D61; 573 571 display: flex; 574 - align-items: center; 575 - justify-content: center; 572 + align-items: left; 573 + justify-content: left; 576 574 gap: 12px; 577 575 } 578 576 579 577 #simple-photo-gallery h2 i { 580 - color: #9999ff; 578 + color: #2F7D61; 581 579 } 582 580 583 581 .gallery { ··· 600 598 601 599 .gallery-item:hover { 602 600 transform: scale(1.08) rotate(2deg); 603 - box-shadow: 0 12px 32px rgba(153, 153, 255, 0.4), 604 - 0 0 0 2px rgba(153, 153, 255, 0.6); 605 - border-color: rgba(153, 153, 255, 0.5); 601 + box-shadow: #2F7D61; 602 + border-color: #2F7D61; 606 603 z-index: 10; 607 604 } 608 605 ··· 655 652 656 653 /* Current Status Card */ 657 654 #current-status { 658 - background: linear-gradient(135deg, rgba(153, 153, 255, 0.2), rgba(179, 179, 255, 0.15)); 659 - border: 2px solid rgba(153, 153, 255, 0.3); 655 + background: #79F7A4; 656 + border: 2px solid #5CFFC9; 660 657 border-radius: 16px; 661 658 padding: 20px; 662 659 margin-bottom: 20px; 663 660 text-align: center; 664 661 backdrop-filter: blur(20px); 665 - box-shadow: 0 8px 24px rgba(153, 153, 255, 0.2), 666 - 0 0 0 1px rgba(255, 255, 255, 0.1) inset; 667 - transition: all 0.3s ease; 662 + box-shadow:#2F7D61; 668 663 position: relative; 669 664 overflow: hidden; 670 665 } ··· 687 682 688 683 #current-status:hover { 689 684 transform: scale(1.02); 690 - border-color: rgba(153, 153, 255, 0.5); 691 - box-shadow: 0 12px 32px rgba(153, 153, 255, 0.3), 692 - 0 0 0 1px rgba(255, 255, 255, 0.2) inset; 685 + border-color: #2F7D61; 693 686 } 694 687 695 688 #current-status b { 696 - color: #9999ff; 689 + color: #2F7D61; 697 690 font-size: 1.1em; 698 691 position: relative; 699 692 z-index: 1; ··· 718 711 left: 0; 719 712 width: 4px; 720 713 height: 100%; 721 - background: linear-gradient(180deg, #9999ff, #b3b3ff); 714 + background: linear-gradient(180deg, #5CFFC5, #5CFFC5); 722 715 opacity: 0; 723 716 transition: opacity 0.3s ease; 724 717 } 725 718 726 719 .project-item:hover, .tangled-item:hover { 727 720 transform: translateX(8px); 728 - border-color: rgba(153, 153, 255, 0.4); 721 + border-color: #79F7A4; 729 722 background: linear-gradient(135deg, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.3)); 730 723 box-shadow: 0 8px 24px rgba(153, 153, 255, 0.15); 731 724 } ··· 755 748 } 756 749 757 750 .project-item h3 a:hover, .tangled-item h3 a:hover { 758 - color: #b3b3ff; 751 + color: #79F7A4; 759 752 } 760 753 761 754 .project-item h3 a::after, .tangled-item h3 a::after { ··· 778 771 } 779 772 780 773 .project-item p strong, .tangled-item p strong { 781 - color: #b3b3ff; 774 + color: #2F7D61; 782 775 font-weight: 600; 783 776 } 784 777 785 778 /* Tangled repo specific styling */ 786 779 .tangled-item .fa-server { 787 - color: #9999ff; 780 + color: #79F7A4; 788 781 } 789 782 790 783 .tangled-item .fa-clock { 791 - color: #9999ff; 784 + color: #79F7A4; 792 785 margin-right: 6px; 793 786 } 794 787 ··· 797 790 font-size: 1.6em; 798 791 font-weight: 700; 799 792 margin-bottom: 20px; 800 - color: #ffffff; 793 + color: #2F7D61; 801 794 display: flex; 802 795 align-items: center; 803 796 gap: 12px; 804 797 padding-bottom: 12px; 805 - border-bottom: 2px solid rgba(153, 153, 255, 0.3); 798 + border-bottom: 2px solid #2F7D61; 806 799 } 807 800 808 801 #projects h2 i, #tangled-repo h2 i, #leaflets h2 i, #thanks h2 i { 809 - color: #9999ff; 802 + color: #2F7D61; 810 803 font-size: 0.9em; 811 804 } 812 805 ··· 839 832 #leaflets #rss .leaflet-item:hover, 840 833 #rss .feedItem:hover { 841 834 transform: translateX(8px); 842 - border-color: rgba(153, 153, 255, 0.4); 835 + border-color: #2F7D61; 843 836 background: linear-gradient(135deg, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.3)); 844 837 box-shadow: 0 8px 24px rgba(153, 153, 255, 0.15); 845 838 } ··· 861 854 862 855 #leaflets #rss a, 863 856 #rss .feedItem a { 864 - color: #ffffff; 857 + color: #2F7D61; 865 858 text-decoration: none; 866 859 transition: color 0.3s ease; 867 860 display: inline-flex; ··· 871 864 872 865 #leaflets #rss a:hover, 873 866 #rss .feedItem a:hover { 874 - color: #b3b3ff; 867 + color: #2F7D61; 875 868 } 876 869 877 870 #leaflets #rss .leaflet-description,
+9 -6
followonbsky.html
··· 5 5 <meta name="viewport" content="width=device-width,initial-scale=1" /> 6 6 <title>Follow on Bluesky</title> 7 7 <meta name="description" content="Quick profile card to open an AT Protocol (Bluesky) profile in multiple clients." /> 8 - <link rel="stylesheet" href="css/bsky.css"> 9 8 <meta name="robots" content="index, follow" /> 9 + <link rel="stylesheet" href="/css/bsky.css" /> 10 10 </head> 11 11 <body> 12 12 <main class="card" role="main" aria-labelledby="displayName"> ··· 17 17 </section> 18 18 19 19 <nav id="links" class="links" aria-label="Open in client"></nav> 20 + <div id="more-clients" class="links"></div> 21 + <button id="show-more" class="show-more-btn" style="display:none;">Show More Clients</button> 20 22 21 23 <section class="controls" aria-label="Actions"> 22 24 <div class="control-row"> ··· 24 26 <button id="try-button" type="button">Try</button> 25 27 </div> 26 28 <div class="control-row"> 27 - <input id="custom-client" type="url" placeholder="https://client.example" aria-label="Custom client base URL" /> 29 + <input id="custom-client" type="url" placeholder="https://main.bsky.dev" aria-label="Custom client base URL" /> 28 30 <button id="custom-open" type="button">Open</button> 29 31 </div> 30 32 </section> 31 33 32 - <p class="meta" style="text-align: center;"> 33 - by <a href="/followonbsky.html?did=did:plc:l37td5yhxl2irrzrgvei4qay">@madebydanny.uk</a>, 34 + <p class="meta"> 35 + by <a href="?did=did:plc:l37td5yhxl2irrzrgvei4qay">@madebydanny.uk</a>, 34 36 add a client <a href="https://tally.so/r/nrzQDl" target="_blank" rel="noopener">here</a> 35 37 </p> 36 38 </main> 37 - <script src="js/bsky.js"></script> 39 + 40 + <script src="/js/bsky.js"></script> 38 41 </body> 39 - </html> 42 + </html>
+21 -47
index.html
··· 19 19 <link rel="dns-prefetch" href="https://feed.madebydannyuk.workers.dev"> 20 20 <link rel="dns-prefetch" href="https://imrs.madebydanny.uk"> 21 21 <link rel="dns-prefetch" href="https://cdn.madebydanny.uk"> 22 + <link rel="preconnect" href="https://fonts.googleapis.com"> 23 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 24 + <link href="https://fonts.googleapis.com/css2?family=Itim&display=swap" rel="stylesheet"> 22 25 23 26 <!-- ✅ SEO Keywords --> 24 27 <meta name="keywords" content="Daniel Morrisey, developer, writer, blog, projects, Bluesky, web development, creative work"> ··· 33 36 <link rel="canonical" href="https://madebydanny.uk/"> 34 37 35 38 <!-- ✅ Favicon --> 36 - <link rel="icon" id="favicon" href="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreibnauwgdhmqejzc3nrp463gx672fsrbcv4yjy6s7dmcpenuw7pbei"> 39 + <link rel="icon" id="favicon" href="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/seo/favicon.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225026Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=ac76845bd34504acaec37fe99609b3a91ad8eb071626ce79c1f437958e9b7d12&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject"> 37 40 38 41 <!-- ✅ Open Graph --> 39 42 <meta property="og:title" content="Daniel Morrisey - Home"> 40 43 <meta property="og:description" id="og-description" content="Posting everything into the endless jet stream of posts"> 41 44 <meta property="og:type" content="website"> 42 45 <meta property="og:url" content="https://madebydanny.uk/"> 43 - <meta property="og:image" id="og-image" content="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicehnxcease3yatg5zr4h7jlwmlklodiwasynkz6td5yaw65p5gki"> 44 - 45 - <!-- ✅ Twitter Card --> 46 - <meta name="twitter:card" content="summary_large_image"> 47 - <meta name="twitter:title" content="Daniel Morrisey - Home"> 48 - <meta name="twitter:description" content="Posting everything into the endless jet stream of posts"> 49 - <meta name="twitter:image" content="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicehnxcease3yatg5zr4h7jlwmlklodiwasynkz6td5yaw65p5gki"> 50 - 51 - <!-- ✅ Theme Colors (Mobile optimization) --> 52 - <meta name="theme-color" content="#000000"> 53 - <meta name="apple-mobile-web-app-status-bar-style" content="black"> 54 - 55 - <!-- ✅ Schema.org Basic Metadata --> 56 - <script type="application/ld+json"> 57 - { 58 - "@context": "https://schema.org", 59 - "@type": "Person", 60 - "name": "Daniel Morrisey", 61 - "url": "https://madebydanny.uk/", 62 - "image": "https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-11-06%2F1762389113966_bafkreibnauwgdhmqejzc3nrp463gx672fsrbcv4yjy6s7dmcpenuw7pbei.jpg", 63 - "jobTitle": "Developer & Writer", 64 - "sameAs": [ 65 - "https://bsky.app/profile/madebydanny.uk", 66 - "https://github.com/madebydanny" 67 - ] 68 - } 69 - </script> 46 + <meta property="og:image" id="og-image" content="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/seo/og-img.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225017Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=07f0ebd87fc5b347391d6e79a9132590d600d6f1c9e61cc33721f67d9e004962&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject"> 70 47 <link rel="stylesheet" href="css/index.css"> 71 48 <script src="https://kit.fontawesome.com/0ca27f8db1.js" crossorigin="anonymous" defer></script> 72 49 </head> ··· 75 52 <div class="white-card" id="current-status" style="margin-bottom: 20px; text-align: center;"> 76 53 <b>Current Status:</b> Loading... 77 54 </div> 78 - <button onclick="clearCookiesAndRefresh()" style="margin-bottom: 20px; padding: 10px 20px; background-color: #ff6b6b; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 14px; font-weight: bold;"> 79 - Site not loading? Click here 80 - </button> 81 55 <div class="top-section"> 82 56 <div class="bsky-profile-header"> 83 57 <img id="banner" alt="Profile banner"> ··· 115 89 <section id="simple-photo-gallery"> 116 90 <h2><i class="fa-solid fa-images"></i> Pined Photos</h2> 117 91 <div class="gallery"> 118 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreifjsdoqxidmlge6emrwvfgkpb64xctatabw5w32nkjyqxgdlhlqsa" alt="Placeholder Image 1" class="gallery-item" loading="lazy"> 119 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicgrzxiiuzryfmob5m2zz5mips3suokqny735xfqgfqqba7miqnzu" alt="Placeholder Image 2" class="gallery-item" loading="lazy"> 120 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreifez6o4x7t6f6koeqyi2nzaeotb6kdiieyldxpbes2duyxvpimfeq" alt="Placeholder Image 3" class="gallery-item" loading="lazy"> 121 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreih2akb6rfal4j3e7ulj5ks2wqdhfhnhc7s3m3ypgvzdjd5wyxvuye" alt="Placeholder Image 4" class="gallery-item" loading="lazy"> 122 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreidimctpgyolunn6b76jt6rbgyadtlrdpq7jcejnijrybqtorm66vq" alt="Placeholder Image 6" class="gallery-item" loading="lazy"> 123 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreidmp6kjnaf6zksiw7oigwqr3opjdadnrigwlevjhulmhbpsb5dlve" alt="Placeholder Image 7" class="gallery-item" loading="lazy"> 124 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreigea2dlfok7dzfpniuymzxldsxadfz2zytwbnvogggc3ap7rts7bm" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 125 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiaejjaojx4dkmtbxrwcgzt3dha62wpl557bnqogk7ikqnils73bia" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 126 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiheh7ndxgp7vgaj2cnssl54kplkslhi6hqna6msjif7hzkiks6hmm" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 127 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicp65cb6wjjxgdlajkbhzn5p372tg6vdadbovde26xdff722nnupa" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 128 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreihrzhshej3k53fbto7gcigvfkmw2uxd4xpb5nafsqdapsdsnbe5bu" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 129 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicxugtysxx6vf6i3gjoxs6zlfn32namznsezgf24eq2dckehzgqou" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 130 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreibx4m4kzmldblttdxnfbktgezn6erh5ixgyorfaunea55dk66d2eu" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 131 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreia5qgq6eh7d7ahn6wehkqojsavxgmlkiqurqeb5u4e4epkqapn5hy" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 132 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreidddgd7tlelokd5qhtjiyzgirjeyqajg6gqwlu5to6fdvnb27t36m" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 133 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreih7bc7zbg5dtbq6gfzag4clf2vz35rb4zxga6w7ycdhuc7cjpayxe" alt="Placeholder Image 6" class="gallery-item" loading="lazy"> 92 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img1.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223605Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=c1c5ecc721ab9cf437e1204e449f3745514c3c0c528fb0419f640273b1f6061a&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 1" class="gallery-item" loading="lazy"> 93 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img10.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223625Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=899c8c568753805abbfc8090f6ef6b7a14ecc19041938009ba4f323103072c06&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 2" class="gallery-item" loading="lazy"> 94 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img11.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223643Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=40fbe24099b4167e8c3c4ff6a7fb4d1c8780bf2c596647a9fdc9e9f9f1ca7698&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 3" class="gallery-item" loading="lazy"> 95 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img12.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223659Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=fbfd3a5e544ddd5aac65d04f8bd4b6a3b1713136f58a4ca0d85c550a2640b4bc&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 4" class="gallery-item" loading="lazy"> 96 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img13.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223702Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=28b4e11751a8b834697b979c3a520210adad7cefcc1da4f5cfe5eac4966c3e68&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 6" class="gallery-item" loading="lazy"> 97 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img14.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223713Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=7cf8b44e7e7cc8fe68fe5e0af718a4bc6c69900e08e0dc332369716e4ee39832&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 7" class="gallery-item" loading="lazy"> 98 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img15.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223743Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=9104a22f021e885a2c733dd9c55a644d35a2fe8aec80c028c57c22aac50f8a77&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 99 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img16.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223800Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=a028142ed66def2a5f46f953134d83e9aa9a8ad0de064d5739b3ba5450678790&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 100 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img2.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223823Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=ad73bbc3cef0a519c16466d908d4084e7fb5d7c06cff2294cf6610f3a42bc057&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 101 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img3.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223835Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=41af04bffbd61177f7842df3375380710930647410fd3fc6a7de61f0183da6be&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 102 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img4.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223851Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=e8917d307cbaf766080fee096cc02dbaaba78be21cc522f6af8e57f5fef39963&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 103 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img5.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223907Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=b0ef214303970cf4fd50b1d6dd0ac85c5bdba9077458719d939f7be08a0f6ff9&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 104 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img6.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223920Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=eb0c59ef299ef115b715038a08bd787e1cb8f5749dca1f7d159293ca54e6d7af&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 105 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img7.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T223938Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=0ddf1508e2168db7da6d546366bab284c79500303a6535f8de71b72f4e4c7526&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 106 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img8.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T224000Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=24a0b3d46c81d4bac496bc094d8b5b771aef5976eaddc7e6ed99f19d19831ae7&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 107 + <img src="https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/photos/img9.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T224003Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=100d2cb8fb52e03d68ad18ff296c2f62c2bb52b8023df1f7b32e77212684a909&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject" alt="Placeholder Image 6" class="gallery-item" loading="lazy"> 134 108 </div> 135 109 </section> 136 110 </div>
+115 -103
js/bsky.js
··· 1 1 (function () { 2 - const clients = [ 3 - { name: "Bluesky", base: "https://bsky.app/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/bsky.png", cls: "bsky" }, 4 - { name: "Deer Social", base: "https://deer.social/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/deer-social.png", cls: "deer" }, 5 - { name: "Catsky", base: "https://catsky.social/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/catsky.png", cls: "catsky" }, 6 - { name: "Blacksky", base: "https://blacksky.community/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/black-sky.png", cls: "blacksky" }, 7 - { name: "Anisota", base: "https://anisota.net/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/user-content/2025-10-11/1760219737665_bafkreico43sttmdhwk5vu5veou3bu6amu3s2cgvvqwpav6mrnpv5gz5icq.jpg", cls: "anisota" }, 8 - { name: "Deer (ayla fork)", base: "https://deer.aylac.top/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/user-content/2025-10-11/1760222708511_bafkreihiorp2tzyfjovyne3pv6tsxdy4vilfunodi7z2u4fancgvyo25xe.jpg", cls: "deer" }, 9 - { name: "Tangled", base: "https://tangled.org/", icon: "https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-10-19%2F1760916775018_did%20plc%20wshs7t2adsemcrrd4snkeqli%20avatar.jpeg", cls: "tangled" }, 10 - { name: "Sky Space", base: "https://skyspace.me/?", icon: "https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-10-20%2F1760974273575_SkySpace%20Deer.jpg", cls: "bsky" }, 11 - { name: "Nooki", base: "https://nooki.me/user/", icon: "https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-11-08%2F1762617628615_nooki.png", cls: "nooki" }, 12 - { name: "Stream Place", base: "https://stream.place/", icon: "https://cdn.madebydanny.uk/user-content/2025-11-08/1762618009699_favicon.ico", cls: "splace" }, 13 - { name: "Bitchsky", base: "https://bitchsky.app/profile/", icon: "https://cdn.madebydanny.uk/user-content/2025-11-08/1762619931978_android_base.svg", cls: "bitch" }, 14 - { name: "Red Dwarf ", base: "https://reddwarf.app/profile", icon: "https://western-na-cdn.madebydanny.uk/user-content/2025-11-09/1762732194596_favicon.ico", cls: "redd" }, 15 - { name: "plyr.fm", base: "https://plyr.fm/u/", icon: "https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicpbbriebe36n4tree2wxt6nnd4cceiaym4ujxa56eyjqy5wv2ugy", cls: "redd" }, 16 - { name: "PDSls", base: "https://pdsls.dev/at://", icon: "https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiaxhayvk2dsjzvnfet7y24clx4xcfpliwzi2t6i4lzs5tjupjsb3i", cls: "bsky" }, 17 - ]; 2 + const clients = [ 3 + { name: "Bluesky", base: "https://bsky.app/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/bsky.png", cls: "bsky" }, 4 + { name: "Blacksky", base: "https://blacksky.community/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/black-sky.png", cls: "blacksky" }, 5 + { name: "Anisota", base: "https://anisota.net/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/user-content/2025-10-11/1760219737665_bafkreico43sttmdhwk5vu5veou3bu6amu3s2cgvvqwpav6mrnpv5gz5icq.jpg", cls: "anisota" }, 6 + { name: "Deer Social", base: "https://deer.social/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/deer-social.png", cls: "deer" }, 7 + { name: "Catsky", base: "https://catsky.social/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/followonbluesky/catsky.png", cls: "catsky" }, 8 + { name: "Red Dwarf", base: "https://reddwarf.app/profile", icon: "https://western-na-cdn.madebydanny.uk/user-content/2025-11-09/1762732194596_favicon.ico", cls: "redd" }, 9 + { name: "Deer (ayla fork)", base: "https://deer.aylac.top/profile/", icon: "https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/user-content/2025-10-11/1760222708511_bafkreihiorp2tzyfjovyne3pv6tsxdy4vilfunodi7z2u4fancgvyo25xe.jpg", cls: "deer" }, 10 + { name: "Tangled", base: "https://tangled.org/", icon: "https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-10-19%2F1760916775018_did%20plc%20wshs7t2adsemcrrd4snkeqli%20avatar.jpeg", cls: "tangled" }, 11 + { name: "Nooki", base: "https://nooki.me/user/", icon: "https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-11-08%2F1762617628615_nooki.png", cls: "nooki" }, 12 + { name: "Stream Place", base: "https://stream.place/", icon: "https://cdn.madebydanny.uk/user-content/2025-11-08/1762618009699_favicon.ico", cls: "splace" }, 13 + { name: "Bitchsky", base: "https://bitchsky.app/profile/", icon: "https://cdn.madebydanny.uk/user-content/2025-11-08/1762619931978_android_base.svg", cls: "bitch" }, 14 + { name: "PDSls", base: "https://pdsls.dev/at://", icon: "https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiaxhayvk2dsjzvnfet7y24clx4xcfpliwzi2t6i4lzs5tjupjsb3i", cls: "bsky" }, 15 + ]; 18 16 19 - const avatarEl = document.getElementById('avatar'); 20 - const nameEl = document.getElementById('displayName'); 21 - const tagEl = document.getElementById('tagline'); 22 - const linksRoot = document.getElementById('links'); 23 - const tryInput = document.getElementById('try-handle'); 24 - const tryBtn = document.getElementById('try-button'); 25 - const customInput = document.getElementById('custom-client'); 26 - const customBtn = document.getElementById('custom-open'); 17 + const avatarEl = document.getElementById('avatar'); 18 + const nameEl = document.getElementById('displayName'); 19 + const tagEl = document.getElementById('tagline'); 20 + const linksRoot = document.getElementById('links'); 21 + const moreClientsRoot = document.getElementById('more-clients'); 22 + const showMoreBtn = document.getElementById('show-more'); 23 + const tryInput = document.getElementById('try-handle'); 24 + const tryBtn = document.getElementById('try-button'); 25 + const customInput = document.getElementById('custom-client'); 26 + const customBtn = document.getElementById('custom-open'); 27 27 28 - function setText(el, txt){ el.textContent = txt ?? ''; } 28 + function setText(el, txt){ el.textContent = txt ?? ''; } 29 29 30 - function makeClientLink(c, handle){ 31 - const a = document.createElement('a'); 32 - a.className = 'link ' + (c.cls || ''); 33 - a.href = c.base + encodeURIComponent(handle); 34 - a.target = '_blank'; 35 - a.rel = 'noopener'; 36 - a.setAttribute('aria-label', `Open ${c.name} for ${handle}`); 30 + function makeClientLink(c, handle){ 31 + const a = document.createElement('a'); 32 + a.className = 'link ' + (c.cls || ''); 33 + a.href = c.base + encodeURIComponent(handle); 34 + a.target = '_blank'; 35 + a.rel = 'noopener'; 36 + a.setAttribute('aria-label', `Open ${c.name} for ${handle}`); 37 37 38 - const img = document.createElement('img'); 39 - img.src = c.icon; 40 - img.alt = c.name + ' icon'; 41 - img.loading = 'lazy'; 38 + const img = document.createElement('img'); 39 + img.src = c.icon; 40 + img.alt = c.name + ' icon'; 41 + img.loading = 'lazy'; 42 42 43 - const span = document.createElement('span'); 44 - span.className = 'label'; 45 - span.textContent = c.name; 46 - 47 - a.append(img, span); 48 - return a; 49 - } 43 + const span = document.createElement('span'); 44 + span.className = 'label'; 45 + span.textContent = c.name; 50 46 51 - function openCustom(handle){ 52 - let url = (customInput.value || '').trim(); 53 - if(!url)return; 54 - if(!/^https?:\/\//i.test(url))url='https://'+url; 55 - url=url.replace(/\/+$/,'')+'/profile/'+encodeURIComponent(handle); 56 - window.open(url,'_blank','noopener'); 57 - } 47 + a.append(img, span); 48 + return a; 49 + } 58 50 59 - // ✅ Improved DID/handle entry support 60 - function tryProfile() { 61 - let value = (tryInput.value || '').trim(); 62 - if (!value) return; 51 + function openCustom(handle){ 52 + let url = (customInput.value || '').trim(); 53 + if(!url)return; 54 + if(!/^https?:\/\//i.test(url))url='https://'+url; 55 + url=url.replace(/\/+$/,'')+'/profile/'+encodeURIComponent(handle); 56 + window.open(url,'_blank','noopener'); 57 + } 63 58 64 - // Strip leading @ 65 - if (value.startsWith('@')) value = value.slice(1); 59 + function tryProfile() { 60 + let value = (tryInput.value || '').trim(); 61 + if (!value) return; 66 62 67 - // Extract handle from URLs like https://bsky.app/profile/handle 68 - try { 69 - const parsed = new URL(value); 70 - const parts = parsed.pathname.split('/').filter(Boolean); 71 - if (parts.length && (parts[0] === 'profile' || parts[0] === 'actor')) { 72 - value = parts[1]; 73 - } 74 - } catch (_) { /* not a URL */ } 63 + if (value.startsWith('@')) value = value.slice(1); 75 64 76 - // Update query param and reload 77 - const u = new URL(location.href); 78 - u.searchParams.set('did', value); 79 - location.href = u.toString(); 65 + try { 66 + const parsed = new URL(value); 67 + const parts = parsed.pathname.split('/').filter(Boolean); 68 + if (parts.length && (parts[0] === 'profile' || parts[0] === 'actor')) { 69 + value = parts[1]; 80 70 } 71 + } catch (_) { } 81 72 82 - async function loadProfile(){ 83 - const params=new URLSearchParams(location.search); 84 - const did=params.get('did'); 85 - if(!did){ 86 - setText(nameEl,'Missing ?did='); 87 - setText(tagEl,'Add a DID or handle to view a profile.'); 88 - tryBtn.onclick=tryProfile; 89 - tryInput.onkeydown=e=>{if(e.key==='Enter')tryProfile()}; 90 - return; 91 - } 92 - try{ 93 - const res=await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${encodeURIComponent(did)}`); 94 - if(!res.ok)throw new Error('fetch failed'); 95 - const data=await res.json(); 96 - const handle=data.handle||did; 97 - const avatar=data.avatar?`https://imrs.madebydanny.uk?url=${encodeURIComponent(data.avatar)}`:'https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/user-content/2025-10-11/1760220038748_cloudflare-brands-solid-full.svg'; 73 + const u = new URL(location.href); 74 + u.searchParams.set('did', value); 75 + location.href = u.toString(); 76 + } 77 + 78 + async function loadProfile(){ 79 + const params=new URLSearchParams(location.search); 80 + const did=params.get('did'); 81 + if(!did){ 82 + setText(nameEl,'Missing ?did='); 83 + setText(tagEl,'Add a DID or handle to view a profile.'); 84 + tryBtn.onclick=tryProfile; 85 + tryInput.onkeydown=e=>{if(e.key==='Enter')tryProfile()}; 86 + return; 87 + } 88 + try{ 89 + const res=await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${encodeURIComponent(did)}`); 90 + if(!res.ok)throw new Error('fetch failed'); 91 + const data=await res.json(); 92 + const handle=data.handle||did; 93 + const avatar=data.avatar?`https://imrs.madebydanny.uk?url=${encodeURIComponent(data.avatar)}`:'https://imrs.madebydanny.uk/?url=https://public-cdn.madebydanny.uk/user-content/2025-10-11/1760220038748_cloudflare-brands-solid-full.svg'; 98 94 99 - avatarEl.src=avatar; 100 - avatarEl.alt=`${data.displayName||handle} avatar`; 101 - setText(nameEl,data.displayName||handle); 102 - setText(tagEl,`@${handle} is on the AT Protocol — pick a client to follow them!`); 95 + avatarEl.src=avatar; 96 + avatarEl.alt=`${data.displayName||handle} avatar`; 97 + setText(nameEl,data.displayName||handle); 98 + setText(tagEl,`@${handle} is on the AT Protocol – pick a client to follow them!`); 103 99 104 - linksRoot.innerHTML=''; 105 - clients.forEach(c=>linksRoot.appendChild(makeClientLink(c,handle))); 100 + linksRoot.innerHTML=''; 101 + moreClientsRoot.innerHTML=''; 102 + 103 + const topClients = clients.slice(0, 6); 104 + const moreClients = clients.slice(6); 105 + 106 + topClients.forEach(c=>linksRoot.appendChild(makeClientLink(c,handle))); 107 + moreClients.forEach(c=>moreClientsRoot.appendChild(makeClientLink(c,handle))); 106 108 107 - customBtn.onclick=()=>openCustom(handle); 108 - customInput.onkeydown=e=>{if(e.key==='Enter')openCustom(handle)}; 109 - tryBtn.onclick=tryProfile; 110 - tryInput.onkeydown=e=>{if(e.key==='Enter')tryProfile()}; 111 - }catch(e){ 112 - nameEl.textContent='Error loading profile'; 113 - tagEl.textContent='Check your DID or try again.'; 114 - linksRoot.innerHTML=''; 115 - tryBtn.onclick=tryProfile; 116 - tryInput.onkeydown=e=>{if(e.key==='Enter')tryProfile()}; 117 - } 109 + if(moreClients.length > 0){ 110 + showMoreBtn.style.display = 'block'; 111 + showMoreBtn.onclick = function(){ 112 + moreClientsRoot.classList.toggle('show'); 113 + this.textContent = moreClientsRoot.classList.contains('show') ? 'Show Less' : 'Show More Clients'; 114 + }; 118 115 } 119 116 120 - document.addEventListener('DOMContentLoaded',loadProfile); 121 - })(); 117 + customBtn.onclick=()=>openCustom(handle); 118 + customInput.onkeydown=e=>{if(e.key==='Enter')openCustom(handle)}; 119 + tryBtn.onclick=tryProfile; 120 + tryInput.onkeydown=e=>{if(e.key==='Enter')tryProfile()}; 121 + }catch(e){ 122 + nameEl.textContent='Error loading profile'; 123 + tagEl.textContent='Check your DID or try again.'; 124 + linksRoot.innerHTML=''; 125 + moreClientsRoot.innerHTML=''; 126 + showMoreBtn.style.display = 'none'; 127 + tryBtn.onclick=tryProfile; 128 + tryInput.onkeydown=e=>{if(e.key==='Enter')tryProfile()}; 129 + } 130 + } 131 + 132 + document.addEventListener('DOMContentLoaded',loadProfile); 133 + })();
+2 -2
js/index.js
··· 184 184 const parentTimeAgo = formatTimeAgo(parentDate); 185 185 186 186 postHTML += ` 187 - <div style="opacity: 0.8; border-left: 3px solid #9999ff; padding-left: 15px; margin-bottom: 15px;"> 187 + <div style="opacity: 0.8; border-left: 3px solid #2F7D61; padding-left: 15px; margin-bottom: 15px;"> 188 188 <div class="post-header"> 189 189 <a href="/followonbsky.html?did=${parentAuthor.handle}" target="_blank" style="text-decoration: none;"> 190 190 <img src="https://imrs.madebydanny.uk?url=${parentAuthor.avatar || ''}" alt="Avatar" class="post-avatar"> ··· 205 205 </div> 206 206 <div class="post-text">${linkifyText(parentRecord.text || '')}</div> 207 207 </div> 208 - <div style="color: #b3b3ff; font-size: 13px; margin-bottom: 10px;"> 208 + <div style="color: #2F7D61; font-size: 13px; margin-bottom: 10px;"> 209 209 <i class="fa-solid fa-reply"></i> Replying to <a href="/followonbsky.html?did=${parentAuthor.handle}" target="_blank" style="color: inherit;">@${parentAuthor.handle}</a> 210 210 </div> 211 211 `;
+21 -12
readme.md
··· 1 1 # @madebydanny.uk / website 2 + ## New Update V17 - 17/11 3 + 4 + - Added New Green Color Design 5 + 6 + - Ueses UpCloud as CDN and not my PDS 7 + 8 + - Speed improvements 9 + 10 + - New Font *(Itim)* 2 11 3 - This is my personal website hosted on [@wisp.place](https://wisp.place), accessible at [madebydanny.uk](https://madebydanny.uk) with site content fetched from [@mbdio.uk](https://mbdio.uk) 12 + - Updates to followonbsky thing 13 + --- 14 + This is my personal website hosted on [upcloud](https://madebydanny.uk/upcloud.com), accessible at [madebydanny.uk](https://madebydanny.uk) with site content fetched from [@mbdio.uk](https://mbdio.uk) *(my PDS)* 4 15 5 - Website files can be found at [/wisplace](https://tangled.org/@madebydanny.uk/website/tree/main/wispplace) - Made possible thanks to [@mbdio.uk](https://madebydanny.uk/followonbsky.html?did=mbdio.uk), [@tangled.org](https://madebydanny.uk/followonbsky.html?did=tangled.org), [@wisp.place](https://madebydanny.uk/followonbsky.html?did=wisp.place), [@nekomimi.pet](https://madebydanny.uk/followonbsky.html?did=/nekomimi.pet), [@juli.ee](https://madebydanny.uk/followonbsky.html?did=juli.ee), [lovable.dev](https://lovable.dev), [@pdsls.dev](https://pdsls.dev), [cloudflare.com](https://cloudflare.com), [@vscode.dev](https://madebydanny.uk/followonbsky.html?did=/vscode.dev), [@github.com](https://github.com), [jack.xyz](https://madebydanny.uk/followonbsky.html?did=jack.xyz), [upcloud.com](https://upcloud.com), [tailscale.com](https://tailscale.com), [raspberrypi.com](https://raspberrypi.com), Ubuntu, Apple, Reddit, [Linus Tech Tips](www.youtube.com/@LinusTechTips), [W3Schools](https://w3schools.com) and you 🫵 *{1}* 16 + Made possible thanks to [@mbdio.uk](https://madebydanny.uk/followonbsky.html?did=mbdio.uk), [@tangled.org](https://madebydanny.uk/followonbsky.html?did=tangled.org), [@wisp.place](https://madebydanny.uk/followonbsky.html?did=wisp.place), [@nekomimi.pet](https://madebydanny.uk/followonbsky.html?did=/nekomimi.pet), [@juli.ee](https://madebydanny.uk/followonbsky.html?did=juli.ee), [lovable.dev](https://lovable.dev), [@pdsls.dev](https://pdsls.dev), [cloudflare.com](https://cloudflare.com), [@vscode.dev](https://madebydanny.uk/followonbsky.html?did=/vscode.dev), [@github.com](https://github.com), [jack.xyz](https://madebydanny.uk/followonbsky.html?did=jack.xyz), [upcloud.com](https://upcloud.com), [tailscale.com](https://tailscale.com), [raspberrypi.com](https://raspberrypi.com), Ubuntu, Apple, Reddit, [Linus Tech Tips](www.youtube.com/@LinusTechTips), [W3Schools](https://w3schools.com) and you 🫵 *{1}* 6 17 7 18 My website is built in HTML, CSS, and JavaScript because I can, and don't have any plans to switch to TypeScript. 8 19 9 - **Site Preview /wisplace/index.html** - *Images are loaded from my PDS* [mbdio.uk](https://mbdio.uk) *so may take longer to load* 10 - ![img](https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicu3sa2ayzyo4nkbgo6i4xizsadqpv5uarj4aeur7aowg3qnplj64) 11 - ![img](https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreigtr4pxljel434jmhpnsmo4czy5x62dafjvef4dntoefnrv4pkc7u) 12 - ![img](https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreihdqwn4o4q6iljzvojvgla4y2dggocf4pekcmcfvvajliizcbnkvi) 13 - ![img](https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreih6htpgimspqgz2uyym7ffe4offtvg3fcuod6nkbl6amo223rkbiy) 20 + **Site Preview /index.html** 21 + ![img](https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/readme.md/Screenshot%202025-11-17%20at%2017.54.20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225652Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=2131fc2d8e967a96ada11f5bf509d01c9ac9905f1dafe4eee9206b9314b15c4e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 22 + ![img](https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/readme.md/Screenshot%202025-11-17%20at%2017.54.27.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225702Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=71babf7174c56cdad4fae629b8522723687d2a5a839aafcaeaf999c24ed33780&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 23 + ![img](https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/readme.md/Screenshot%202025-11-17%20at%2017.54.34.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225718Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=06126346612cdc287891a21d19a8420976339d65f1b95b2136c71c91058c7e87&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 24 + ![img](https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/readme.md/Screenshot%202025-11-17%20at%2017.54.42.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225647Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=2f69fbd6cc5ce5ded893ffd0e4f1fb929d44a797d8362248790f5035c2081c18&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 25 + ![img](https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/readme.md/Screenshot%202025-11-17%20at%2017.54.52.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T225807Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=4fe041e840943fd321d676c21ac75f9bc5de2fe7b6f43f657925532c5c27e743&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 14 26 15 27 ## Follow on Bluesky Thing {2} 16 28 A simple tool where anyone can enter a DID *(or handle)* and get a profile photo preview and a list of **top** clients, such as Deer, Anisota, Blacksky, etc., with the option for a custom client that serves profiles at *client.com/profile/handle.com*. 17 29 18 30 Try it 👉 [madebydanny.uk/followonbsky](https://madebydanny.uk/followonbsky.html) 19 31 20 - ![img](https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiffmj3g5d6b5jsexzepmb5g6qahoobgdjj4qdudlkt4g2qlyqrtki) 32 + ![img](https://7gl4s.upcloudobjects.com/cdn/madebydanny.uk/site-files/readme.md/Screen%20Recording%202025-11-17%20at%2018.15.53.gif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAE3343CC5EA1C9069%2F20251117%2Fus-1%2Fs3%2Faws4_request&X-Amz-Date=20251117T231908Z&X-Amz-Expires=3600&X-Amz-Security-Token=CiAxMjNjMmE0ZWZhNzg0MzFhYWY4MzkzNDE1NzVmNWY1ZhIhX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci11c2VyGhRBUk9BQUQwNjBFOUI1OUU0RjZGOCJUdXJuOmVjczppYW06OjEyM2MyYTRlZmE3ODQzMWFhZjgzOTM0MTU3NWY1ZjVmOnJvbGUvX3VwY2xvdWQtbWFuYWdlZC1maWxlYnJvd3Nlci1yb2xlKhRBU0lBRTMzNDNDQzVFQTFDOTA2OTJQTWFzdGVyS2V5UmVjb3JkLTNkYTRlMmU2YzIwY2IzODY0NWVlMmViOWQ1ZTFjNTE4MmJhMGFiNDc1YjEwODhhYTk0MGYzMjJlMDI1YTNjZDU46b2yoakzUiRiM2Y4ODBkNS1mNzYzLTRmMjYtOWEyNy0zNDczZDAwMTNhZTVov8buyAaKAQhJQU1fVVNFUg&X-Amz-Signature=253aee9f5e55b198c48ed92d5ec49134a33a35a300e39fb5d36ce70f8bba6f82&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 21 33 ### Current Client List 22 34 - **Bluesky** - [bsky.app](https://bsky.app) 23 35 - **Deer Social** - [deer.social](https://deer.social) ··· 32 44 - **Bitchsky** - [bitchsky.app](https://bitchsky.app) 33 45 - **Red Dwarf** - [reddwarf.app](https://reddwarf.app) 34 46 - **plyr.fm** - [plyr.fm](https://plyr.fm) 35 - 36 - **Site Preview [/wisplace/followonbsky.html](https://madebydanny.uk/followonbsky.html)** 37 - 38 - ![img](https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreihdnjx4vcezy47caqxw6jb4sn24jiqyzbdrqktwgquqrlviznxn5y) 47 + - **pdslds/dev** - [pdsls.dev](https://pdsls.dev) 39 48 --- 40 49 *{1}* - List is not final and is still a work in progress 41 50 *{2}* - Still in active development