A very simple single-file PDS home page to list active users
5
fork

Configure Feed

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

initial commit

finxol d12e9171

+1319
+24
.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw?
+3
.zed/settings.json
··· 1 + { 2 + "language_servers": ["vtsls", "biome", "vscode-html-language-server"] 3 + }
+49
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>PDS Homepage</title> 7 + <link rel="preconnect" href="https://fonts.bunny.net" /> 8 + <link 9 + href="https://fonts.bunny.net/css?family=actor:400|coiny:400" 10 + rel="stylesheet" 11 + /> 12 + <script type="importmap"> 13 + { 14 + "imports": { 15 + "@atcute/client": "https://unpkg.com/react@18/umd/react.development.js" 16 + } 17 + } 18 + </script> 19 + <link rel="stylesheet" href="src/reset.css" /> 20 + <link rel="stylesheet" href="src/style.css" /> 21 + </head> 22 + <body> 23 + <main> 24 + <svg class="atproto-logo" aria-hidden="true" viewBox="0 0 28 28"> 25 + <path 26 + d="M14.362 27.78c-1.956 0-3.756-.324-5.4-.972-1.644-.648-3.072-1.566-4.284-2.754a12.247 12.247 0 0 1-2.808-4.158c-.66-1.596-.99-3.33-.99-5.202 0-2.232.342-4.212 1.026-5.94.696-1.728 1.656-3.18 2.88-4.356a12.48 12.48 0 0 1 4.284-2.7c1.632-.612 3.378-.918 5.238-.918 2.28 0 4.278.354 5.994 1.062 1.716.708 3.144 1.668 4.284 2.88a11.706 11.706 0 0 1 2.538 4.158c.552 1.548.804 3.168.756 4.86-.06 2.328-.546 4.116-1.458 5.364-.912 1.236-2.328 1.854-4.248 1.854a5.839 5.839 0 0 1-2.826-.702 3.703 3.703 0 0 1-1.764-2.07l1.044.054c-.492.924-1.164 1.572-2.016 1.944a6.464 6.464 0 0 1-2.61.558c-1.212 0-2.28-.258-3.204-.774a5.682 5.682 0 0 1-2.178-2.214c-.528-.948-.792-2.046-.792-3.294 0-1.284.276-2.394.828-3.33a5.77 5.77 0 0 1 2.232-2.196c.936-.516 1.992-.774 3.168-.774.78 0 1.59.162 2.43.486.852.324 1.512.78 1.98 1.368l-.738.936V8.664h2.412l-.054 6.462c0 .924.18 1.62.54 2.088.36.468.894.702 1.602.702.624 0 1.104-.174 1.44-.522.348-.36.588-.846.72-1.458a10.66 10.66 0 0 0 .252-2.106c.036-1.86-.24-3.426-.828-4.698-.588-1.272-1.386-2.298-2.394-3.078a9.499 9.499 0 0 0-3.294-1.71c-1.2-.36-2.394-.54-3.582-.54-1.68 0-3.174.27-4.482.81-1.308.528-2.412 1.278-3.312 2.25-.888.96-1.56 2.1-2.016 3.42-.444 1.308-.654 2.748-.63 4.32.048 1.56.33 2.964.846 4.212a9.324 9.324 0 0 0 2.16 3.204 9.38 9.38 0 0 0 3.276 2.034c1.26.468 2.64.702 4.14.702.84 0 1.674-.096 2.502-.288.84-.18 1.608-.438 2.304-.774l1.026 2.808c-.924.432-1.896.75-2.916.954a14.649 14.649 0 0 1-3.078.324Zm-.144-10.098c.852 0 1.566-.246 2.142-.738.576-.492.864-1.326.864-2.502 0-1.068-.258-1.872-.774-2.412-.504-.552-1.218-.828-2.142-.828-1.092 0-1.908.288-2.448.864-.54.576-.81 1.368-.81 2.376 0 1.032.276 1.83.828 2.394.564.564 1.344.846 2.34.846Z" 27 + ></path> 28 + </svg> 29 + <h1>PDS Homepage</h1> 30 + <p> 31 + This is an atproto PDS.<br /> 32 + You can find more information about what that means on the 33 + <a 34 + href="https://atproto.com/guides/glossary#pds-personal-data-server" 35 + > 36 + atproto website </a 37 + >. 38 + </p> 39 + </main> 40 + 41 + <section class="users"> 42 + <h3>Users</h3> 43 + 44 + <p>No users found on this PDS</p> 45 + </section> 46 + </body> 47 + 48 + <script type="module" src="src/main.ts"></script> 49 + </html>
+29
package.json
··· 1 + { 2 + "name": "pds-home", 3 + "private": true, 4 + "version": "0.0.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "tsc && vite build", 9 + "preview": "vite preview" 10 + }, 11 + "devDependencies": { 12 + "typescript": "~5.9.3", 13 + "vite": "npm:rolldown-vite@7.1.14", 14 + "vite-plugin-singlefile": "^2.3.0" 15 + }, 16 + "pnpm": { 17 + "overrides": { 18 + "vite": "npm:rolldown-vite@7.1.14" 19 + } 20 + }, 21 + "dependencies": { 22 + "@atcute/atproto": "^3.1.4", 23 + "@atcute/bluesky": "^3.2.3", 24 + "@atcute/client": "^4.0.3", 25 + "@atcute/identity": "^1.1.0", 26 + "@atcute/identity-resolver": "^1.1.3", 27 + "@atcute/lexicons": "^1.1.1" 28 + } 29 + }
+857
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + overrides: 8 + vite: npm:rolldown-vite@7.1.14 9 + 10 + importers: 11 + 12 + .: 13 + dependencies: 14 + '@atcute/atproto': 15 + specifier: ^3.1.4 16 + version: 3.1.4 17 + '@atcute/bluesky': 18 + specifier: ^3.2.3 19 + version: 3.2.3 20 + '@atcute/client': 21 + specifier: ^4.0.3 22 + version: 4.0.3 23 + '@atcute/identity': 24 + specifier: ^1.1.0 25 + version: 1.1.0 26 + '@atcute/identity-resolver': 27 + specifier: ^1.1.3 28 + version: 1.1.3(@atcute/identity@1.1.0) 29 + '@atcute/lexicons': 30 + specifier: ^1.1.1 31 + version: 1.1.1 32 + devDependencies: 33 + typescript: 34 + specifier: ~5.9.3 35 + version: 5.9.3 36 + vite: 37 + specifier: npm:rolldown-vite@7.1.14 38 + version: rolldown-vite@7.1.14 39 + vite-plugin-singlefile: 40 + specifier: ^2.3.0 41 + version: 2.3.0(rolldown-vite@7.1.14)(rollup@4.52.4) 42 + 43 + packages: 44 + 45 + '@atcute/atproto@3.1.4': 46 + resolution: {integrity: sha512-v0/ue7mZYtjYw4vWbtda51bLwW88mqsUQB8F/UZNO18ANAQWmKq1HDceVqjvruaLe2QPqE43XM3WkEyZ2FhOrA==} 47 + 48 + '@atcute/bluesky@3.2.3': 49 + resolution: {integrity: sha512-IdPQQ54F1BLhW5z49k81ZUC/GQl/tVygZ+CzLHYvQySHA6GJRcvPzwEf8aV21u0SZOJF+yF4CWEGNgtryyxPmg==} 50 + 51 + '@atcute/client@4.0.3': 52 + resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 53 + 54 + '@atcute/identity-resolver@1.1.3': 55 + resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} 56 + peerDependencies: 57 + '@atcute/identity': ^1.0.0 58 + 59 + '@atcute/identity@1.1.0': 60 + resolution: {integrity: sha512-6vRvRqJatDB+JUQsb+UswYmtBGQnSZcqC3a2y6H5DB/v5KcIh+6nFFtc17G0+3W9rxdk7k9M4KkgkdKf/YDNoQ==} 61 + 62 + '@atcute/lexicons@1.1.1': 63 + resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 64 + 65 + '@atcute/util-fetch@1.0.2': 66 + resolution: {integrity: sha512-6kOwQzaoPu7ss0EwvgSOPVg/JIJdozbXva5d/g99bBg8RaSX8se//INOyr/nby/GwrpxCIZU9Wzm+pl7xerI0Q==} 67 + 68 + '@badrap/valita@0.4.6': 69 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 70 + engines: {node: '>= 18'} 71 + 72 + '@emnapi/core@1.5.0': 73 + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} 74 + 75 + '@emnapi/runtime@1.5.0': 76 + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} 77 + 78 + '@emnapi/wasi-threads@1.1.0': 79 + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} 80 + 81 + '@napi-rs/wasm-runtime@1.0.6': 82 + resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} 83 + 84 + '@oxc-project/runtime@0.92.0': 85 + resolution: {integrity: sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==} 86 + engines: {node: ^20.19.0 || >=22.12.0} 87 + 88 + '@oxc-project/types@0.93.0': 89 + resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} 90 + 91 + '@rolldown/binding-android-arm64@1.0.0-beta.41': 92 + resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} 93 + engines: {node: ^20.19.0 || >=22.12.0} 94 + cpu: [arm64] 95 + os: [android] 96 + 97 + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': 98 + resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} 99 + engines: {node: ^20.19.0 || >=22.12.0} 100 + cpu: [arm64] 101 + os: [darwin] 102 + 103 + '@rolldown/binding-darwin-x64@1.0.0-beta.41': 104 + resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} 105 + engines: {node: ^20.19.0 || >=22.12.0} 106 + cpu: [x64] 107 + os: [darwin] 108 + 109 + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': 110 + resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} 111 + engines: {node: ^20.19.0 || >=22.12.0} 112 + cpu: [x64] 113 + os: [freebsd] 114 + 115 + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': 116 + resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} 117 + engines: {node: ^20.19.0 || >=22.12.0} 118 + cpu: [arm] 119 + os: [linux] 120 + 121 + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': 122 + resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} 123 + engines: {node: ^20.19.0 || >=22.12.0} 124 + cpu: [arm64] 125 + os: [linux] 126 + 127 + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': 128 + resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} 129 + engines: {node: ^20.19.0 || >=22.12.0} 130 + cpu: [arm64] 131 + os: [linux] 132 + 133 + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': 134 + resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} 135 + engines: {node: ^20.19.0 || >=22.12.0} 136 + cpu: [x64] 137 + os: [linux] 138 + 139 + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': 140 + resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} 141 + engines: {node: ^20.19.0 || >=22.12.0} 142 + cpu: [x64] 143 + os: [linux] 144 + 145 + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': 146 + resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} 147 + engines: {node: ^20.19.0 || >=22.12.0} 148 + cpu: [arm64] 149 + os: [openharmony] 150 + 151 + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': 152 + resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} 153 + engines: {node: '>=14.0.0'} 154 + cpu: [wasm32] 155 + 156 + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': 157 + resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} 158 + engines: {node: ^20.19.0 || >=22.12.0} 159 + cpu: [arm64] 160 + os: [win32] 161 + 162 + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': 163 + resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} 164 + engines: {node: ^20.19.0 || >=22.12.0} 165 + cpu: [ia32] 166 + os: [win32] 167 + 168 + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': 169 + resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} 170 + engines: {node: ^20.19.0 || >=22.12.0} 171 + cpu: [x64] 172 + os: [win32] 173 + 174 + '@rolldown/pluginutils@1.0.0-beta.41': 175 + resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} 176 + 177 + '@rollup/rollup-android-arm-eabi@4.52.4': 178 + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} 179 + cpu: [arm] 180 + os: [android] 181 + 182 + '@rollup/rollup-android-arm64@4.52.4': 183 + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} 184 + cpu: [arm64] 185 + os: [android] 186 + 187 + '@rollup/rollup-darwin-arm64@4.52.4': 188 + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} 189 + cpu: [arm64] 190 + os: [darwin] 191 + 192 + '@rollup/rollup-darwin-x64@4.52.4': 193 + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} 194 + cpu: [x64] 195 + os: [darwin] 196 + 197 + '@rollup/rollup-freebsd-arm64@4.52.4': 198 + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} 199 + cpu: [arm64] 200 + os: [freebsd] 201 + 202 + '@rollup/rollup-freebsd-x64@4.52.4': 203 + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} 204 + cpu: [x64] 205 + os: [freebsd] 206 + 207 + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 208 + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} 209 + cpu: [arm] 210 + os: [linux] 211 + 212 + '@rollup/rollup-linux-arm-musleabihf@4.52.4': 213 + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} 214 + cpu: [arm] 215 + os: [linux] 216 + 217 + '@rollup/rollup-linux-arm64-gnu@4.52.4': 218 + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} 219 + cpu: [arm64] 220 + os: [linux] 221 + 222 + '@rollup/rollup-linux-arm64-musl@4.52.4': 223 + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} 224 + cpu: [arm64] 225 + os: [linux] 226 + 227 + '@rollup/rollup-linux-loong64-gnu@4.52.4': 228 + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} 229 + cpu: [loong64] 230 + os: [linux] 231 + 232 + '@rollup/rollup-linux-ppc64-gnu@4.52.4': 233 + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} 234 + cpu: [ppc64] 235 + os: [linux] 236 + 237 + '@rollup/rollup-linux-riscv64-gnu@4.52.4': 238 + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} 239 + cpu: [riscv64] 240 + os: [linux] 241 + 242 + '@rollup/rollup-linux-riscv64-musl@4.52.4': 243 + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} 244 + cpu: [riscv64] 245 + os: [linux] 246 + 247 + '@rollup/rollup-linux-s390x-gnu@4.52.4': 248 + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} 249 + cpu: [s390x] 250 + os: [linux] 251 + 252 + '@rollup/rollup-linux-x64-gnu@4.52.4': 253 + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} 254 + cpu: [x64] 255 + os: [linux] 256 + 257 + '@rollup/rollup-linux-x64-musl@4.52.4': 258 + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} 259 + cpu: [x64] 260 + os: [linux] 261 + 262 + '@rollup/rollup-openharmony-arm64@4.52.4': 263 + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} 264 + cpu: [arm64] 265 + os: [openharmony] 266 + 267 + '@rollup/rollup-win32-arm64-msvc@4.52.4': 268 + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} 269 + cpu: [arm64] 270 + os: [win32] 271 + 272 + '@rollup/rollup-win32-ia32-msvc@4.52.4': 273 + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} 274 + cpu: [ia32] 275 + os: [win32] 276 + 277 + '@rollup/rollup-win32-x64-gnu@4.52.4': 278 + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} 279 + cpu: [x64] 280 + os: [win32] 281 + 282 + '@rollup/rollup-win32-x64-msvc@4.52.4': 283 + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} 284 + cpu: [x64] 285 + os: [win32] 286 + 287 + '@tybys/wasm-util@0.10.1': 288 + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} 289 + 290 + '@types/estree@1.0.8': 291 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 292 + 293 + ansis@4.2.0: 294 + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} 295 + engines: {node: '>=14'} 296 + 297 + braces@3.0.3: 298 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 299 + engines: {node: '>=8'} 300 + 301 + detect-libc@2.1.1: 302 + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} 303 + engines: {node: '>=8'} 304 + 305 + esm-env@1.2.2: 306 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 307 + 308 + fdir@6.5.0: 309 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 310 + engines: {node: '>=12.0.0'} 311 + peerDependencies: 312 + picomatch: ^3 || ^4 313 + peerDependenciesMeta: 314 + picomatch: 315 + optional: true 316 + 317 + fill-range@7.1.1: 318 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 319 + engines: {node: '>=8'} 320 + 321 + fsevents@2.3.3: 322 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 323 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 324 + os: [darwin] 325 + 326 + is-number@7.0.0: 327 + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 328 + engines: {node: '>=0.12.0'} 329 + 330 + lightningcss-android-arm64@1.30.2: 331 + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} 332 + engines: {node: '>= 12.0.0'} 333 + cpu: [arm64] 334 + os: [android] 335 + 336 + lightningcss-darwin-arm64@1.30.2: 337 + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} 338 + engines: {node: '>= 12.0.0'} 339 + cpu: [arm64] 340 + os: [darwin] 341 + 342 + lightningcss-darwin-x64@1.30.2: 343 + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} 344 + engines: {node: '>= 12.0.0'} 345 + cpu: [x64] 346 + os: [darwin] 347 + 348 + lightningcss-freebsd-x64@1.30.2: 349 + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} 350 + engines: {node: '>= 12.0.0'} 351 + cpu: [x64] 352 + os: [freebsd] 353 + 354 + lightningcss-linux-arm-gnueabihf@1.30.2: 355 + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} 356 + engines: {node: '>= 12.0.0'} 357 + cpu: [arm] 358 + os: [linux] 359 + 360 + lightningcss-linux-arm64-gnu@1.30.2: 361 + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} 362 + engines: {node: '>= 12.0.0'} 363 + cpu: [arm64] 364 + os: [linux] 365 + 366 + lightningcss-linux-arm64-musl@1.30.2: 367 + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} 368 + engines: {node: '>= 12.0.0'} 369 + cpu: [arm64] 370 + os: [linux] 371 + 372 + lightningcss-linux-x64-gnu@1.30.2: 373 + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} 374 + engines: {node: '>= 12.0.0'} 375 + cpu: [x64] 376 + os: [linux] 377 + 378 + lightningcss-linux-x64-musl@1.30.2: 379 + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} 380 + engines: {node: '>= 12.0.0'} 381 + cpu: [x64] 382 + os: [linux] 383 + 384 + lightningcss-win32-arm64-msvc@1.30.2: 385 + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} 386 + engines: {node: '>= 12.0.0'} 387 + cpu: [arm64] 388 + os: [win32] 389 + 390 + lightningcss-win32-x64-msvc@1.30.2: 391 + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} 392 + engines: {node: '>= 12.0.0'} 393 + cpu: [x64] 394 + os: [win32] 395 + 396 + lightningcss@1.30.2: 397 + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} 398 + engines: {node: '>= 12.0.0'} 399 + 400 + micromatch@4.0.8: 401 + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 402 + engines: {node: '>=8.6'} 403 + 404 + nanoid@3.3.11: 405 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 406 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 407 + hasBin: true 408 + 409 + picocolors@1.1.1: 410 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 411 + 412 + picomatch@2.3.1: 413 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 414 + engines: {node: '>=8.6'} 415 + 416 + picomatch@4.0.3: 417 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 418 + engines: {node: '>=12'} 419 + 420 + postcss@8.5.6: 421 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 422 + engines: {node: ^10 || ^12 || >=14} 423 + 424 + rolldown-vite@7.1.14: 425 + resolution: {integrity: sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==} 426 + engines: {node: ^20.19.0 || >=22.12.0} 427 + hasBin: true 428 + peerDependencies: 429 + '@types/node': ^20.19.0 || >=22.12.0 430 + esbuild: ^0.25.0 431 + jiti: '>=1.21.0' 432 + less: ^4.0.0 433 + sass: ^1.70.0 434 + sass-embedded: ^1.70.0 435 + stylus: '>=0.54.8' 436 + sugarss: ^5.0.0 437 + terser: ^5.16.0 438 + tsx: ^4.8.1 439 + yaml: ^2.4.2 440 + peerDependenciesMeta: 441 + '@types/node': 442 + optional: true 443 + esbuild: 444 + optional: true 445 + jiti: 446 + optional: true 447 + less: 448 + optional: true 449 + sass: 450 + optional: true 451 + sass-embedded: 452 + optional: true 453 + stylus: 454 + optional: true 455 + sugarss: 456 + optional: true 457 + terser: 458 + optional: true 459 + tsx: 460 + optional: true 461 + yaml: 462 + optional: true 463 + 464 + rolldown@1.0.0-beta.41: 465 + resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==} 466 + engines: {node: ^20.19.0 || >=22.12.0} 467 + hasBin: true 468 + 469 + rollup@4.52.4: 470 + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} 471 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 472 + hasBin: true 473 + 474 + source-map-js@1.2.1: 475 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 476 + engines: {node: '>=0.10.0'} 477 + 478 + tinyglobby@0.2.15: 479 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 480 + engines: {node: '>=12.0.0'} 481 + 482 + to-regex-range@5.0.1: 483 + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 484 + engines: {node: '>=8.0'} 485 + 486 + tslib@2.8.1: 487 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 488 + 489 + typescript@5.9.3: 490 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 491 + engines: {node: '>=14.17'} 492 + hasBin: true 493 + 494 + vite-plugin-singlefile@2.3.0: 495 + resolution: {integrity: sha512-DAcHzYypM0CasNLSz/WG0VdKOCxGHErfrjOoyIPiNxTPTGmO6rRD/te93n1YL/s+miXq66ipF1brMBikf99c6A==} 496 + engines: {node: '>18.0.0'} 497 + peerDependencies: 498 + rollup: ^4.44.1 499 + vite: ^5.4.11 || ^6.0.0 || ^7.0.0 500 + 501 + snapshots: 502 + 503 + '@atcute/atproto@3.1.4': 504 + dependencies: 505 + '@atcute/lexicons': 1.1.1 506 + 507 + '@atcute/bluesky@3.2.3': 508 + dependencies: 509 + '@atcute/atproto': 3.1.4 510 + '@atcute/lexicons': 1.1.1 511 + 512 + '@atcute/client@4.0.3': 513 + dependencies: 514 + '@atcute/identity': 1.1.0 515 + '@atcute/lexicons': 1.1.1 516 + 517 + '@atcute/identity-resolver@1.1.3(@atcute/identity@1.1.0)': 518 + dependencies: 519 + '@atcute/identity': 1.1.0 520 + '@atcute/lexicons': 1.1.1 521 + '@atcute/util-fetch': 1.0.2 522 + '@badrap/valita': 0.4.6 523 + 524 + '@atcute/identity@1.1.0': 525 + dependencies: 526 + '@atcute/lexicons': 1.1.1 527 + '@badrap/valita': 0.4.6 528 + 529 + '@atcute/lexicons@1.1.1': 530 + dependencies: 531 + esm-env: 1.2.2 532 + 533 + '@atcute/util-fetch@1.0.2': 534 + dependencies: 535 + '@badrap/valita': 0.4.6 536 + 537 + '@badrap/valita@0.4.6': {} 538 + 539 + '@emnapi/core@1.5.0': 540 + dependencies: 541 + '@emnapi/wasi-threads': 1.1.0 542 + tslib: 2.8.1 543 + optional: true 544 + 545 + '@emnapi/runtime@1.5.0': 546 + dependencies: 547 + tslib: 2.8.1 548 + optional: true 549 + 550 + '@emnapi/wasi-threads@1.1.0': 551 + dependencies: 552 + tslib: 2.8.1 553 + optional: true 554 + 555 + '@napi-rs/wasm-runtime@1.0.6': 556 + dependencies: 557 + '@emnapi/core': 1.5.0 558 + '@emnapi/runtime': 1.5.0 559 + '@tybys/wasm-util': 0.10.1 560 + optional: true 561 + 562 + '@oxc-project/runtime@0.92.0': {} 563 + 564 + '@oxc-project/types@0.93.0': {} 565 + 566 + '@rolldown/binding-android-arm64@1.0.0-beta.41': 567 + optional: true 568 + 569 + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': 570 + optional: true 571 + 572 + '@rolldown/binding-darwin-x64@1.0.0-beta.41': 573 + optional: true 574 + 575 + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': 576 + optional: true 577 + 578 + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': 579 + optional: true 580 + 581 + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': 582 + optional: true 583 + 584 + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': 585 + optional: true 586 + 587 + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': 588 + optional: true 589 + 590 + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': 591 + optional: true 592 + 593 + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': 594 + optional: true 595 + 596 + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': 597 + dependencies: 598 + '@napi-rs/wasm-runtime': 1.0.6 599 + optional: true 600 + 601 + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': 602 + optional: true 603 + 604 + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': 605 + optional: true 606 + 607 + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': 608 + optional: true 609 + 610 + '@rolldown/pluginutils@1.0.0-beta.41': {} 611 + 612 + '@rollup/rollup-android-arm-eabi@4.52.4': 613 + optional: true 614 + 615 + '@rollup/rollup-android-arm64@4.52.4': 616 + optional: true 617 + 618 + '@rollup/rollup-darwin-arm64@4.52.4': 619 + optional: true 620 + 621 + '@rollup/rollup-darwin-x64@4.52.4': 622 + optional: true 623 + 624 + '@rollup/rollup-freebsd-arm64@4.52.4': 625 + optional: true 626 + 627 + '@rollup/rollup-freebsd-x64@4.52.4': 628 + optional: true 629 + 630 + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 631 + optional: true 632 + 633 + '@rollup/rollup-linux-arm-musleabihf@4.52.4': 634 + optional: true 635 + 636 + '@rollup/rollup-linux-arm64-gnu@4.52.4': 637 + optional: true 638 + 639 + '@rollup/rollup-linux-arm64-musl@4.52.4': 640 + optional: true 641 + 642 + '@rollup/rollup-linux-loong64-gnu@4.52.4': 643 + optional: true 644 + 645 + '@rollup/rollup-linux-ppc64-gnu@4.52.4': 646 + optional: true 647 + 648 + '@rollup/rollup-linux-riscv64-gnu@4.52.4': 649 + optional: true 650 + 651 + '@rollup/rollup-linux-riscv64-musl@4.52.4': 652 + optional: true 653 + 654 + '@rollup/rollup-linux-s390x-gnu@4.52.4': 655 + optional: true 656 + 657 + '@rollup/rollup-linux-x64-gnu@4.52.4': 658 + optional: true 659 + 660 + '@rollup/rollup-linux-x64-musl@4.52.4': 661 + optional: true 662 + 663 + '@rollup/rollup-openharmony-arm64@4.52.4': 664 + optional: true 665 + 666 + '@rollup/rollup-win32-arm64-msvc@4.52.4': 667 + optional: true 668 + 669 + '@rollup/rollup-win32-ia32-msvc@4.52.4': 670 + optional: true 671 + 672 + '@rollup/rollup-win32-x64-gnu@4.52.4': 673 + optional: true 674 + 675 + '@rollup/rollup-win32-x64-msvc@4.52.4': 676 + optional: true 677 + 678 + '@tybys/wasm-util@0.10.1': 679 + dependencies: 680 + tslib: 2.8.1 681 + optional: true 682 + 683 + '@types/estree@1.0.8': {} 684 + 685 + ansis@4.2.0: {} 686 + 687 + braces@3.0.3: 688 + dependencies: 689 + fill-range: 7.1.1 690 + 691 + detect-libc@2.1.1: {} 692 + 693 + esm-env@1.2.2: {} 694 + 695 + fdir@6.5.0(picomatch@4.0.3): 696 + optionalDependencies: 697 + picomatch: 4.0.3 698 + 699 + fill-range@7.1.1: 700 + dependencies: 701 + to-regex-range: 5.0.1 702 + 703 + fsevents@2.3.3: 704 + optional: true 705 + 706 + is-number@7.0.0: {} 707 + 708 + lightningcss-android-arm64@1.30.2: 709 + optional: true 710 + 711 + lightningcss-darwin-arm64@1.30.2: 712 + optional: true 713 + 714 + lightningcss-darwin-x64@1.30.2: 715 + optional: true 716 + 717 + lightningcss-freebsd-x64@1.30.2: 718 + optional: true 719 + 720 + lightningcss-linux-arm-gnueabihf@1.30.2: 721 + optional: true 722 + 723 + lightningcss-linux-arm64-gnu@1.30.2: 724 + optional: true 725 + 726 + lightningcss-linux-arm64-musl@1.30.2: 727 + optional: true 728 + 729 + lightningcss-linux-x64-gnu@1.30.2: 730 + optional: true 731 + 732 + lightningcss-linux-x64-musl@1.30.2: 733 + optional: true 734 + 735 + lightningcss-win32-arm64-msvc@1.30.2: 736 + optional: true 737 + 738 + lightningcss-win32-x64-msvc@1.30.2: 739 + optional: true 740 + 741 + lightningcss@1.30.2: 742 + dependencies: 743 + detect-libc: 2.1.1 744 + optionalDependencies: 745 + lightningcss-android-arm64: 1.30.2 746 + lightningcss-darwin-arm64: 1.30.2 747 + lightningcss-darwin-x64: 1.30.2 748 + lightningcss-freebsd-x64: 1.30.2 749 + lightningcss-linux-arm-gnueabihf: 1.30.2 750 + lightningcss-linux-arm64-gnu: 1.30.2 751 + lightningcss-linux-arm64-musl: 1.30.2 752 + lightningcss-linux-x64-gnu: 1.30.2 753 + lightningcss-linux-x64-musl: 1.30.2 754 + lightningcss-win32-arm64-msvc: 1.30.2 755 + lightningcss-win32-x64-msvc: 1.30.2 756 + 757 + micromatch@4.0.8: 758 + dependencies: 759 + braces: 3.0.3 760 + picomatch: 2.3.1 761 + 762 + nanoid@3.3.11: {} 763 + 764 + picocolors@1.1.1: {} 765 + 766 + picomatch@2.3.1: {} 767 + 768 + picomatch@4.0.3: {} 769 + 770 + postcss@8.5.6: 771 + dependencies: 772 + nanoid: 3.3.11 773 + picocolors: 1.1.1 774 + source-map-js: 1.2.1 775 + 776 + rolldown-vite@7.1.14: 777 + dependencies: 778 + '@oxc-project/runtime': 0.92.0 779 + fdir: 6.5.0(picomatch@4.0.3) 780 + lightningcss: 1.30.2 781 + picomatch: 4.0.3 782 + postcss: 8.5.6 783 + rolldown: 1.0.0-beta.41 784 + tinyglobby: 0.2.15 785 + optionalDependencies: 786 + fsevents: 2.3.3 787 + 788 + rolldown@1.0.0-beta.41: 789 + dependencies: 790 + '@oxc-project/types': 0.93.0 791 + '@rolldown/pluginutils': 1.0.0-beta.41 792 + ansis: 4.2.0 793 + optionalDependencies: 794 + '@rolldown/binding-android-arm64': 1.0.0-beta.41 795 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.41 796 + '@rolldown/binding-darwin-x64': 1.0.0-beta.41 797 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.41 798 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41 799 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41 800 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41 801 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41 802 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.41 803 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.41 804 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.41 805 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41 806 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 807 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 808 + 809 + rollup@4.52.4: 810 + dependencies: 811 + '@types/estree': 1.0.8 812 + optionalDependencies: 813 + '@rollup/rollup-android-arm-eabi': 4.52.4 814 + '@rollup/rollup-android-arm64': 4.52.4 815 + '@rollup/rollup-darwin-arm64': 4.52.4 816 + '@rollup/rollup-darwin-x64': 4.52.4 817 + '@rollup/rollup-freebsd-arm64': 4.52.4 818 + '@rollup/rollup-freebsd-x64': 4.52.4 819 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 820 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 821 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 822 + '@rollup/rollup-linux-arm64-musl': 4.52.4 823 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 824 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 825 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 826 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 827 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 828 + '@rollup/rollup-linux-x64-gnu': 4.52.4 829 + '@rollup/rollup-linux-x64-musl': 4.52.4 830 + '@rollup/rollup-openharmony-arm64': 4.52.4 831 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 832 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 833 + '@rollup/rollup-win32-x64-gnu': 4.52.4 834 + '@rollup/rollup-win32-x64-msvc': 4.52.4 835 + fsevents: 2.3.3 836 + 837 + source-map-js@1.2.1: {} 838 + 839 + tinyglobby@0.2.15: 840 + dependencies: 841 + fdir: 6.5.0(picomatch@4.0.3) 842 + picomatch: 4.0.3 843 + 844 + to-regex-range@5.0.1: 845 + dependencies: 846 + is-number: 7.0.0 847 + 848 + tslib@2.8.1: 849 + optional: true 850 + 851 + typescript@5.9.3: {} 852 + 853 + vite-plugin-singlefile@2.3.0(rolldown-vite@7.1.14)(rollup@4.52.4): 854 + dependencies: 855 + micromatch: 4.0.8 856 + rollup: 4.52.4 857 + vite: rolldown-vite@7.1.14
+85
src/atproto.ts
··· 1 + import type { } from "@atcute/atproto" 2 + import type { } from "@atcute/bluesky" 3 + import { Client, CredentialManager } from "@atcute/client" 4 + import { isAtprotoDid } from "@atcute/identity"; 5 + import { CompositeDidDocumentResolver, DocumentNotFoundError, FailedDocumentResolutionError, HandleResolutionError, ImproperDidError, PlcDidDocumentResolver, UnsupportedDidMethodError, WebDidDocumentResolver } from "@atcute/identity-resolver"; 6 + import { tryCatch } from "./utils"; 7 + 8 + type DID = `did:${string}:${string}` 9 + 10 + const pds = location.protocol === "https:" ? location.origin : "https://pds.finxol.io" 11 + 12 + export async function getUsers() { 13 + const rpc = new Client({ 14 + handler: new CredentialManager({ service: pds }), 15 + }) 16 + 17 + const r = await rpc.get("com.atproto.sync.listRepos", { 18 + params: { limit: 100, cursor: "" }, // I don't have that many users so I'll implement the cursor later if needed 19 + }) 20 + 21 + if (!r.ok) { 22 + console.error("Failed to fetch users list:", r.data) 23 + return [] 24 + } 25 + 26 + return r.data.repos 27 + } 28 + 29 + export async function resolveAliases(did: DID) { 30 + // DID document resolution 31 + const docResolver = new CompositeDidDocumentResolver({ 32 + methods: { 33 + plc: new PlcDidDocumentResolver(), 34 + web: new WebDidDocumentResolver(), 35 + }, 36 + }); 37 + 38 + if (!isAtprotoDid(did)) { 39 + return 40 + } 41 + 42 + const doc = await tryCatch(docResolver.resolve(did)); 43 + 44 + if (!doc.success) { 45 + if (doc.error instanceof DocumentNotFoundError) { 46 + // did returned no document 47 + console.error("Document not found"); 48 + } 49 + if (doc.error instanceof UnsupportedDidMethodError) { 50 + // resolver doesn't support did method (composite resolver) 51 + console.error("Unsupported DID method"); 52 + } 53 + if (doc.error instanceof ImproperDidError) { 54 + // resolver considers did as invalid (atproto did:web) 55 + console.error("Improper DID"); 56 + } 57 + if (doc.error instanceof FailedDocumentResolutionError) { 58 + // document resolution had thrown something unexpected (fetch error) 59 + console.error("Failed document resolution"); 60 + } 61 + 62 + if (doc.error instanceof HandleResolutionError) { 63 + // the errors above extend this class, so you can do a catch-all. 64 + console.error("Handle resolution error"); 65 + } 66 + return 67 + } 68 + 69 + console.log(doc.value); 70 + 71 + return doc.value.alsoKnownAs; 72 + } 73 + 74 + export async function getAvatar(did: DID) { 75 + const rpc = new Client({ 76 + handler: new CredentialManager({ service: "https://public.api.bsky.app" }), 77 + }) 78 + 79 + const res = await rpc.get("app.bsky.actor.getProfile", { params: { actor: did } }); 80 + 81 + if (res.ok) { 82 + return res.data.avatar; 83 + } 84 + return undefined; 85 + }
+39
src/main.ts
··· 1 + import { getAvatar, getUsers, resolveAliases } from "./atproto" 2 + 3 + 4 + const users = await getUsers() 5 + 6 + let cleared = false 7 + 8 + const list = document.createElement("div") 9 + for (const user of users) { 10 + if (!user.active) { 11 + continue; 12 + } 13 + 14 + if (!cleared) { 15 + document.querySelector("section.users > p")?.remove() 16 + cleared = true 17 + } 18 + 19 + const handleElement = document.createElement("div") 20 + handleElement.textContent = user.did 21 + 22 + const handle = (await resolveAliases(user.did))?.at(0)?.replace("at://", "") || user.did 23 + 24 + const container = document.createElement("div") 25 + container.innerHTML = ` 26 + <img src="${await getAvatar(user.did)}" alt="${handle}" /> 27 + <div class="info"> 28 + <a href="https://pdsls.dev/at://${user.did}" class="handle" target="_blank"> 29 + ${handle} 30 + </a> 31 + </div> 32 + ` 33 + list.appendChild(container) 34 + } 35 + 36 + 37 + const doc = document.querySelector("section.users") 38 + //biome-ignore lint/style/noNonNullAssertion: it's fine 39 + doc!.appendChild(list)
+92
src/reset.css
··· 1 + /* CSS Reset by Andy Bell, https://piccalil.li/blog/a-more-modern-css-reset/ */ 2 + 3 + /* Box sizing rules */ 4 + *, 5 + *::before, 6 + *::after { 7 + box-sizing: border-box; 8 + } 9 + 10 + /* Prevent font size inflation */ 11 + html { 12 + -moz-text-size-adjust: none; 13 + -webkit-text-size-adjust: none; 14 + text-size-adjust: none; 15 + } 16 + 17 + /* Remove default margin in favour of better control in authored CSS */ 18 + body, 19 + h1, 20 + h2, 21 + h3, 22 + h4, 23 + p, 24 + figure, 25 + blockquote, 26 + dl, 27 + dd { 28 + margin-block-end: 0; 29 + } 30 + 31 + /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ 32 + ul[role="list"], 33 + ol[role="list"] { 34 + list-style: none; 35 + } 36 + 37 + /* Set core body defaults */ 38 + body { 39 + min-height: 100vh; 40 + line-height: 1.5; 41 + } 42 + 43 + /* Set shorter line heights on headings and interactive elements */ 44 + h1, 45 + h2, 46 + h3, 47 + h4, 48 + button, 49 + input, 50 + label { 51 + line-height: 1.1; 52 + } 53 + 54 + /* Balance text wrapping on headings */ 55 + h1, 56 + h2, 57 + h3, 58 + h4 { 59 + text-wrap: balance; 60 + } 61 + 62 + /* A elements that don't have a class get default styles */ 63 + a:not([class]) { 64 + text-decoration-skip-ink: auto; 65 + color: currentColor; 66 + } 67 + 68 + /* Make images easier to work with */ 69 + img, 70 + picture { 71 + max-width: 100%; 72 + display: block; 73 + } 74 + 75 + /* Inherit fonts for inputs and buttons */ 76 + input, 77 + button, 78 + textarea, 79 + select { 80 + font-family: inherit; 81 + font-size: inherit; 82 + } 83 + 84 + /* Make sure textareas without a rows attribute are not tiny */ 85 + textarea:not([rows]) { 86 + min-height: 10em; 87 + } 88 + 89 + /* Anything that has been anchored to should have extra scroll margin */ 90 + :target { 91 + scroll-margin-block: 5ex; 92 + }
+88
src/style.css
··· 1 + body { 2 + margin: 0; 3 + padding: 0; 4 + font-family: "Actor", sans-serif; 5 + min-height: 100svh; 6 + display: flex; 7 + flex-direction: column; 8 + align-items: center; 9 + justify-content: start; 10 + } 11 + 12 + main { 13 + margin: 0; 14 + padding: 1rem; 15 + display: flex; 16 + flex-direction: column; 17 + align-items: center; 18 + justify-content: center; 19 + 20 + h1, 21 + h2, 22 + h3 { 23 + font-family: "Coiny", serif; 24 + font-weight: bold; 25 + } 26 + 27 + & > p { 28 + text-align: center; 29 + } 30 + } 31 + 32 + .atproto-logo { 33 + height: 7rem; 34 + 35 + path { 36 + fill: oklch(62.3% 0.214 259.815); 37 + } 38 + } 39 + 40 + section.users { 41 + display: flex; 42 + flex-direction: column; 43 + align-items: center; 44 + justify-content: start; 45 + gap: 1rem; 46 + 47 + & > div { 48 + display: flex; 49 + flex-direction: column; 50 + align-items: start; 51 + justify-content: start; 52 + gap: 1rem; 53 + 54 + & > div { 55 + display: flex; 56 + flex-direction: row; 57 + align-items: center; 58 + justify-content: start; 59 + gap: 1rem; 60 + 61 + width: 100%; 62 + background-color: #f5f5f5; 63 + border-radius: 0.5rem; 64 + padding: 1rem; 65 + 66 + & > img { 67 + width: 3rem; 68 + aspect-ratio: 1/1; 69 + border-radius: 50%; 70 + object-fit: cover; 71 + } 72 + 73 + & > div { 74 + display: flex; 75 + flex-direction: column; 76 + align-items: center; 77 + justify-content: center; 78 + 79 + & > .handle { 80 + font-size: 1.2rem; 81 + font-weight: bold; 82 + text-decoration: none; 83 + color: inherit; 84 + } 85 + } 86 + } 87 + } 88 + }
+21
src/utils.ts
··· 1 + export async function tryCatch<T, E = Error>( 2 + promise: Promise<T> 3 + ): Promise< 4 + | { 5 + success: true 6 + value: T 7 + error: null 8 + } 9 + | { 10 + success: false 11 + value: null 12 + error: E 13 + } 14 + > { 15 + try { 16 + const value = await promise 17 + return { success: true, value, error: null } 18 + } catch (error) { 19 + return { success: false, value: null, error: error as E } 20 + } 21 + }
+26
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2022", 4 + "useDefineForClassFields": true, 5 + "module": "ESNext", 6 + "lib": ["ES2022", "DOM", "DOM.Iterable"], 7 + "types": ["vite/client"], 8 + "skipLibCheck": true, 9 + 10 + /* Bundler mode */ 11 + "moduleResolution": "bundler", 12 + "allowImportingTsExtensions": true, 13 + "verbatimModuleSyntax": true, 14 + "moduleDetection": "force", 15 + "noEmit": true, 16 + 17 + /* Linting */ 18 + "strict": true, 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": true, 21 + "erasableSyntaxOnly": true, 22 + "noFallthroughCasesInSwitch": true, 23 + "noUncheckedSideEffectImports": true 24 + }, 25 + "include": ["src"] 26 + }
+6
vite.config.ts
··· 1 + import { defineConfig } from 'vite' 2 + import { viteSingleFile } from 'vite-plugin-singlefile' 3 + 4 + export default defineConfig({ 5 + plugins: [viteSingleFile()], 6 + })