my pkgs monorepo
0
fork

Configure Feed

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

refactor(pds-landing): reset

ewancroft.uk 9da70d44 93732348

verified
+112 -1132
-7
packages/pds-landing/.npmignore
··· 1 - styles/ 2 - assets/icon/instructions.txt 3 - build.mjs 4 - tailwind.config.js 5 - default.nix 6 - flake.nix 7 - flake.lock
+53 -10
packages/pds-landing/README.md
··· 1 - # pds-landing 1 + # Svelte library 2 + 3 + Everything you need to build a Svelte library, powered by [`sv`](https://npmjs.com/package/sv). 4 + 5 + Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging). 6 + 7 + ## Creating a project 8 + 9 + If you're seeing this, you've probably already done this step. Congrats! 10 + 11 + ```sh 12 + # create a new project in the current directory 13 + npx sv create 14 + 15 + # create a new project in my-app 16 + npx sv create my-app 17 + ``` 18 + 19 + To recreate this project with the same configuration: 20 + 21 + ```sh 22 + # recreate this project 23 + pnpm dlx sv@0.12.5 create --template library --types ts --add prettier tailwindcss="plugins:typography" sveltekit-adapter="adapter:static" --install pnpm ./packages/pds-landing 24 + ``` 25 + 26 + ## Developing 27 + 28 + Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 29 + 30 + ```sh 31 + npm run dev 32 + 33 + # or start the server and open the app in a new browser tab 34 + npm run dev -- --open 35 + ``` 2 36 3 - Static landing page for [pds.ewancroft.uk](https://pds.ewancroft.uk) — a personal ATProto PDS. 37 + Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app. 4 38 5 - Built with SvelteKit, Svelte 5, TypeScript, and Tailwind CSS v4. 39 + ## Building 6 40 7 - Displays live PDS status by querying `/xrpc/_health` and 8 - `/xrpc/com.atproto.server.describeServer` on load. 41 + To build your library: 9 42 10 - ## Build 43 + ```sh 44 + npm pack 45 + ``` 46 + 47 + To create a production version of your showcase app: 11 48 12 49 ```sh 13 - pnpm build 50 + npm run build 14 51 ``` 15 52 16 - Output is in `build/` — a directory of static files suitable for serving with Caddy or any file server. 53 + You can preview the production build with `npm run preview`. 54 + 55 + > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. 56 + 57 + ## Publishing 17 58 18 - ## Dev 59 + Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)). 60 + 61 + To publish your library to [npm](https://www.npmjs.com): 19 62 20 63 ```sh 21 - pnpm dev 64 + npm publish 22 65 ```
-29
packages/pds-landing/build.mjs
··· 1 - import { copyFileSync, cpSync, mkdirSync, renameSync } from 'fs' 2 - import { execSync } from 'child_process' 3 - import { join } from 'path' 4 - 5 - const dist = 'dist' 6 - mkdirSync(dist, { recursive: true }) 7 - mkdirSync(join(dist, 'assets'), { recursive: true }) 8 - 9 - // Bundle TypeScript → dist/script.js (IIFE so the browser needs no module loader) 10 - execSync('npx tsup src/script.ts --format iife --globalName pdsLanding --outDir dist --no-dts --clean', { 11 - stdio: 'inherit', 12 - }) 13 - 14 - // tsup names IIFE output script.global.js — rename to script.js 15 - renameSync(join(dist, 'script.global.js'), join(dist, 'script.js')) 16 - 17 - // Compile Tailwind CSS 18 - execSync( 19 - 'npx tailwindcss --config tailwind.config.js --input styles/input.css --output dist/style.css --minify', 20 - { stdio: 'inherit' } 21 - ) 22 - 23 - // Copy static files 24 - copyFileSync('index.html', join(dist, 'index.html')) 25 - 26 - // Copy assets 27 - cpSync('assets', join(dist, 'assets'), { recursive: true }) 28 - 29 - console.log('pds-landing built →', dist)
-80
packages/pds-landing/default.nix
··· 1 - { 2 - lib, 3 - stdenv, 4 - pkgs, 5 - tailwindcss_3, 6 - }: 7 - 8 - stdenv.mkDerivation { 9 - pname = "pds-landing"; 10 - version = "1.0.0"; 11 - 12 - src = lib.sourceByRegex ./. [ 13 - "^(index\.html|script\.js|status\.js|utils\.js)$" 14 - "^styles(/.*)?$" 15 - "^assets(/.*)?$" 16 - ]; 17 - 18 - nativeBuildInputs = [ tailwindcss_3 ]; 19 - 20 - buildPhase = '' 21 - # Lay out source so Tailwind's content scanner finds all class names. 22 - mkdir -p src/styles 23 - cp index.html src/index.html 24 - cp utils.js src/utils.js 25 - cp status.js src/status.js 26 - cp script.js src/script.js 27 - cp styles/input.css src/styles/input.css 28 - 29 - cat > tailwind.config.js << 'EOF' 30 - module.exports = { content: ['./src/**/*.{html,js}'], theme: { extend: {} } } 31 - EOF 32 - tailwindcss \ 33 - --config tailwind.config.js \ 34 - --input src/styles/input.css \ 35 - --output style.css \ 36 - --minify 37 - ''; 38 - 39 - installPhase = '' 40 - mkdir -p $out/assets 41 - 42 - cp src/index.html $out/index.html 43 - cp src/utils.js $out/utils.js 44 - cp src/status.js $out/status.js 45 - cp src/script.js $out/script.js 46 - cp style.css $out/style.css 47 - 48 - cp assets/thumb.svg $out/assets/thumb.svg 49 - 50 - # Favicons / web-app manifest 51 - cp assets/icon/ms-icon-310x310.png $out/favicon.ico 52 - cp assets/icon/ms-icon-310x310.png $out/ms-icon-310x310.png 53 - cp assets/icon/ms-icon-150x150.png $out/ms-icon-150x150.png 54 - cp assets/icon/ms-icon-144x144.png $out/ms-icon-144x144.png 55 - cp assets/icon/ms-icon-70x70.png $out/ms-icon-70x70.png 56 - cp assets/icon/manifest.json $out/manifest.json 57 - cp assets/icon/favicon-256x256.png $out/favicon-256x256.png 58 - cp assets/icon/favicon-96x96.png $out/favicon-96x96.png 59 - cp assets/icon/favicon-32x32.png $out/favicon-32x32.png 60 - cp assets/icon/favicon-16x16.png $out/favicon-16x16.png 61 - cp assets/icon/browserconfig.xml $out/browserconfig.xml 62 - cp assets/icon/apple-icon-180x180.png $out/apple-icon-180x180.png 63 - cp assets/icon/apple-icon-152x152.png $out/apple-icon-152x152.png 64 - cp assets/icon/apple-icon-144x144.png $out/apple-icon-144x144.png 65 - cp assets/icon/apple-icon-120x120.png $out/apple-icon-120x120.png 66 - cp assets/icon/apple-icon-114x114.png $out/apple-icon-114x114.png 67 - cp assets/icon/apple-icon-76x76.png $out/apple-icon-76x76.png 68 - cp assets/icon/apple-icon-72x72.png $out/apple-icon-72x72.png 69 - cp assets/icon/apple-icon-60x60.png $out/apple-icon-60x60.png 70 - cp assets/icon/apple-icon-57x57.png $out/apple-icon-57x57.png 71 - cp assets/icon/android-icon-192x192.png $out/android-icon-192x192.png 72 - ''; 73 - 74 - meta = with lib; { 75 - description = "Ewan's personal PDS landing page"; 76 - homepage = "https://pds.ewancroft.uk"; 77 - license = licenses.agpl3Only; 78 - platforms = platforms.all; 79 - }; 80 - }
-18
packages/pds-landing/flake.nix
··· 1 - { 2 - description = "Ewan's personal PDS landing page"; 3 - 4 - inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11"; 5 - 6 - outputs = { self, nixpkgs }: 7 - let 8 - systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; 9 - forAllSystems = nixpkgs.lib.genAttrs systems; 10 - in { 11 - packages = forAllSystems (system: 12 - let pkgs = nixpkgs.legacyPackages.${system}; in 13 - { 14 - default = pkgs.callPackage ./default.nix { }; 15 - } 16 - ); 17 - }; 18 - }
-231
packages/pds-landing/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.ewancroft.uk — Ewan's ATProto PDS</title> 7 - 8 - <!-- Primary meta --> 9 - <meta 10 - name="description" 11 - content="Ewan's personal ATProto PDS — a self-hosted Bluesky-compatible server running at pds.ewancroft.uk." 12 - /> 13 - 14 - <!-- Open Graph --> 15 - <meta property="og:type" content="website" /> 16 - <meta property="og:url" content="https://pds.ewancroft.uk" /> 17 - <meta property="og:title" content="pds.ewancroft.uk — Ewan's ATProto PDS" /> 18 - <meta 19 - property="og:description" 20 - content="Ewan's personal ATProto PDS — a self-hosted Bluesky-compatible server running at pds.ewancroft.uk." 21 - /> 22 - <meta 23 - property="og:image" 24 - content="https://pds.ewancroft.uk/assets/thumb.svg" 25 - /> 26 - <meta property="og:image:width" content="1200" /> 27 - <meta property="og:image:height" content="630" /> 28 - <meta property="og:image:type" content="image/svg+xml" /> 29 - <meta 30 - property="og:image:alt" 31 - content="pds.ewancroft.uk — Ewan's self-hosted ATProto PDS" 32 - /> 33 - 34 - <!-- Twitter / Bluesky card --> 35 - <meta name="twitter:card" content="summary_large_image" /> 36 - <meta 37 - name="twitter:image" 38 - content="https://pds.ewancroft.uk/assets/thumb.svg" 39 - /> 40 - <meta 41 - name="twitter:image:alt" 42 - content="pds.ewancroft.uk — Ewan's self-hosted ATProto PDS" 43 - /> 44 - <meta 45 - name="twitter:title" 46 - content="pds.ewancroft.uk — Ewan's ATProto PDS" 47 - /> 48 - <meta 49 - name="twitter:description" 50 - content="Ewan's personal ATProto PDS — a self-hosted Bluesky-compatible server running at pds.ewancroft.uk." 51 - /> 52 - <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin /> 53 - <link 54 - href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap" 55 - rel="stylesheet" 56 - /> 57 - <link rel="stylesheet" href="/style.css" /> 58 - 59 - <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png" /> 60 - <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png" /> 61 - <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png" /> 62 - <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png" /> 63 - <link 64 - rel="apple-touch-icon" 65 - sizes="114x114" 66 - href="/apple-icon-114x114.png" 67 - /> 68 - <link 69 - rel="apple-touch-icon" 70 - sizes="120x120" 71 - href="/apple-icon-120x120.png" 72 - /> 73 - <link 74 - rel="apple-touch-icon" 75 - sizes="144x144" 76 - href="/apple-icon-144x144.png" 77 - /> 78 - <link 79 - rel="apple-touch-icon" 80 - sizes="152x152" 81 - href="/apple-icon-152x152.png" 82 - /> 83 - <link 84 - rel="apple-touch-icon" 85 - sizes="180x180" 86 - href="/apple-icon-180x180.png" 87 - /> 88 - <link 89 - rel="icon" 90 - type="image/png" 91 - sizes="256x256" 92 - href="/favicon-256x256.png" 93 - /> 94 - <link 95 - rel="icon" 96 - type="image/png" 97 - sizes="192x192" 98 - href="/android-icon-192x192.png" 99 - /> 100 - <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" /> 101 - <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" /> 102 - <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" /> 103 - <link rel="manifest" href="/manifest.json" /> 104 - <meta name="msapplication-TileColor" content="#1a2420" /> 105 - <meta name="msapplication-TileImage" content="/ms-icon-144x144.png" /> 106 - <meta name="theme-color" content="#1a2420" /> 107 - </head> 108 - <body> 109 - <div class="card"> 110 - <div class="card-titlebar"> 111 - <span class="dot"></span> 112 - <span class="dot"></span> 113 - <span class="dot"></span> 114 - <span style="margin-left: 0.4rem">ewan's pds</span> 115 - </div> 116 - <div class="card-body"> 117 - <div class="prompt-line"> 118 - <span class="user-marker">server@pds.ewancroft.uk</span 119 - ><span class="prompt-path">:~</span 120 - ><span class="prompt-char"> $</span> 121 - </div> 122 - <p class="tagline"> 123 - Bluesky-compatible ATProto PDS · personal instance 124 - </p> 125 - 126 - <div class="section-label">status</div> 127 - <div class="kv-grid"> 128 - <span class="kv-key">reachable</span> 129 - <span class="kv-val loading" id="val-reachable">…</span> 130 - 131 - <span class="kv-key">version</span> 132 - <span class="kv-val loading" id="val-version">…</span> 133 - 134 - <span class="kv-key">did</span> 135 - <span class="kv-val loading" id="val-did">…</span> 136 - 137 - <span class="kv-key">accounts</span> 138 - <span class="kv-val loading" id="val-accounts">…</span> 139 - 140 - <span class="kv-key">invite required</span> 141 - <span class="kv-val loading" id="val-invite">…</span> 142 - 143 - <span class="kv-key" id="key-phone" style="display: none" 144 - >phone verify</span 145 - > 146 - <span class="kv-val" id="val-phone" style="display: none"></span> 147 - 148 - <span class="kv-key" id="key-domains" style="display: none" 149 - >user domains</span 150 - > 151 - <span class="kv-val" id="val-domains" style="display: none"></span> 152 - </div> 153 - 154 - <hr class="divider" /> 155 - 156 - <div class="section-label">endpoints</div> 157 - <p class="endpoints-note"> 158 - Most API routes are under <span class="highlight">/xrpc/</span> 159 - </p> 160 - <ul class="link-list"> 161 - <li> 162 - <a 163 - href="https://github.com/bluesky-social/atproto" 164 - target="_blank" 165 - rel="noopener" 166 - >atproto source code</a 167 - > 168 - </li> 169 - <li> 170 - <a 171 - href="https://github.com/bluesky-social/pds" 172 - target="_blank" 173 - rel="noopener" 174 - >self-hosting guide</a 175 - > 176 - </li> 177 - <li> 178 - <a href="https://atproto.com" target="_blank" rel="noopener" 179 - >protocol docs</a 180 - > 181 - </li> 182 - </ul> 183 - 184 - <hr class="divider" /> 185 - 186 - <div class="section-label">links</div> 187 - <ul class="link-list" id="links-list"> 188 - <li> 189 - <a href="https://witchsky.app" target="_blank" rel="noopener" 190 - >Witchsky Web Client</a 191 - > 192 - </li> 193 - </ul> 194 - 195 - <hr class="divider" /> 196 - 197 - <div class="section-label">contact</div> 198 - <p class="contact-note"> 199 - Send a mention on Bluesky to 200 - <a 201 - href="https://witchsky.app/profile/ewancroft.uk" 202 - target="_blank" 203 - rel="noopener" 204 - >@ewancroft.uk</a 205 - > 206 - </p> 207 - <p 208 - class="contact-note" 209 - id="val-contact-email" 210 - style="display: none; margin-top: 0.4rem" 211 - ></p> 212 - </div> 213 - </div> 214 - 215 - <footer> 216 - powered by 217 - <a 218 - href="https://search.nixos.org/packages?show=bluesky-pds" 219 - target="_blank" 220 - rel="noopener" 221 - >nixpkgs#bluesky-pds</a 222 - > 223 - &nbsp;·&nbsp; 224 - <a href="https://atproto.com" target="_blank" rel="noopener" 225 - >atproto.com</a 226 - > 227 - </footer> 228 - 229 - <script src="/script.js"></script> 230 - </body> 231 - </html>
+31 -21
packages/pds-landing/package.json
··· 1 1 { 2 - "name": "@ewanc26/pds-landing", 3 - "version": "0.1.2", 4 - "description": "SvelteKit landing page for Ewan's personal ATProto PDS at pds.ewancroft.uk", 5 - "author": "Ewan Croft", 6 - "license": "AGPL-3.0-only", 7 - "private": false, 8 - "publishConfig": { 9 - "access": "public" 10 - }, 11 - "files": [ 12 - "build", 13 - "README.md" 14 - ], 15 - "type": "module", 2 + "name": "pds-landing", 3 + "version": "0.0.1", 16 4 "scripts": { 17 5 "dev": "vite dev", 18 - "build": "vite build", 6 + "build": "vite build && npm run prepack", 19 7 "preview": "vite preview", 20 8 "prepare": "svelte-kit sync || echo ''", 9 + "prepack": "svelte-kit sync && svelte-package && publint", 21 10 "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 22 11 "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 23 12 "lint": "prettier --check .", 24 - "format": "prettier --write .", 25 - "prepublishOnly": "pnpm build" 13 + "format": "prettier --write ." 26 14 }, 27 - "dependencies": { 28 - "@ewanc26/ui": "workspace:*" 15 + "files": [ 16 + "dist", 17 + "!dist/**/*.test.*", 18 + "!dist/**/*.spec.*" 19 + ], 20 + "sideEffects": [ 21 + "**/*.css" 22 + ], 23 + "svelte": "./dist/index.js", 24 + "types": "./dist/index.d.ts", 25 + "type": "module", 26 + "exports": { 27 + ".": { 28 + "types": "./dist/index.d.ts", 29 + "svelte": "./dist/index.js" 30 + } 31 + }, 32 + "peerDependencies": { 33 + "svelte": "^5.0.0" 29 34 }, 30 35 "devDependencies": { 31 - "@sveltejs/adapter-auto": "^7.0.0", 36 + "@sveltejs/adapter-static": "^3.0.10", 32 37 "@sveltejs/kit": "^2.50.2", 38 + "@sveltejs/package": "^2.5.7", 33 39 "@sveltejs/vite-plugin-svelte": "^6.2.4", 34 40 "@tailwindcss/typography": "^0.5.19", 35 41 "@tailwindcss/vite": "^4.1.18", 36 42 "prettier": "^3.8.1", 37 43 "prettier-plugin-svelte": "^3.4.1", 38 44 "prettier-plugin-tailwindcss": "^0.7.2", 45 + "publint": "^0.3.17", 39 46 "svelte": "^5.51.0", 40 47 "svelte-check": "^4.4.2", 41 48 "tailwindcss": "^4.1.18", 42 49 "typescript": "^5.9.3", 43 50 "vite": "^7.3.1" 44 - } 51 + }, 52 + "keywords": [ 53 + "svelte" 54 + ] 45 55 }
+1 -76
packages/pds-landing/src/app.html
··· 2 2 <html lang="en"> 3 3 <head> 4 4 <meta charset="utf-8" /> 5 + <link rel="icon" href="%sveltekit.assets%/favicon.svg" /> 5 6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 - 7 - <title>pds.ewancroft.uk — Ewan's ATProto PDS</title> 8 - 9 - <!-- Primary meta --> 10 - <meta 11 - name="description" 12 - content="Ewan's personal ATProto PDS — a self-hosted Bluesky-compatible server running at pds.ewancroft.uk." 13 - /> 14 - 15 - <!-- Open Graph --> 16 - <meta property="og:type" content="website" /> 17 - <meta property="og:url" content="https://pds.ewancroft.uk" /> 18 - <meta property="og:title" content="pds.ewancroft.uk — Ewan's ATProto PDS" /> 19 - <meta 20 - property="og:description" 21 - content="Ewan's personal ATProto PDS — a self-hosted Bluesky-compatible server running at pds.ewancroft.uk." 22 - /> 23 - <meta property="og:image" content="https://pds.ewancroft.uk/assets/thumb.svg" /> 24 - <meta property="og:image:width" content="1200" /> 25 - <meta property="og:image:height" content="630" /> 26 - <meta property="og:image:type" content="image/svg+xml" /> 27 - <meta 28 - property="og:image:alt" 29 - content="pds.ewancroft.uk — Ewan's self-hosted ATProto PDS" 30 - /> 31 - 32 - <!-- Twitter / Bluesky card --> 33 - <meta name="twitter:card" content="summary_large_image" /> 34 - <meta name="twitter:image" content="https://pds.ewancroft.uk/assets/thumb.svg" /> 35 - <meta 36 - name="twitter:image:alt" 37 - content="pds.ewancroft.uk — Ewan's self-hosted ATProto PDS" 38 - /> 39 - <meta name="twitter:title" content="pds.ewancroft.uk — Ewan's ATProto PDS" /> 40 - <meta 41 - name="twitter:description" 42 - content="Ewan's personal ATProto PDS — a self-hosted Bluesky-compatible server running at pds.ewancroft.uk." 43 - /> 44 - 45 - <!-- Fonts --> 46 - <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="anonymous" /> 47 - <link 48 - href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap" 49 - rel="stylesheet" 50 - /> 51 - 52 - <!-- Favicons --> 53 - <link rel="apple-touch-icon" sizes="57x57" href="/assets/icon/apple-icon-57x57.png" /> 54 - <link rel="apple-touch-icon" sizes="60x60" href="/assets/icon/apple-icon-60x60.png" /> 55 - <link rel="apple-touch-icon" sizes="72x72" href="/assets/icon/apple-icon-72x72.png" /> 56 - <link rel="apple-touch-icon" sizes="76x76" href="/assets/icon/apple-icon-76x76.png" /> 57 - <link rel="apple-touch-icon" sizes="114x114" href="/assets/icon/apple-icon-114x114.png" /> 58 - <link rel="apple-touch-icon" sizes="120x120" href="/assets/icon/apple-icon-120x120.png" /> 59 - <link rel="apple-touch-icon" sizes="144x144" href="/assets/icon/apple-icon-144x144.png" /> 60 - <link rel="apple-touch-icon" sizes="152x152" href="/assets/icon/apple-icon-152x152.png" /> 61 - <link rel="apple-touch-icon" sizes="180x180" href="/assets/icon/apple-icon-180x180.png" /> 62 - <link 63 - rel="icon" 64 - type="image/png" 65 - sizes="256x256" 66 - href="/assets/icon/favicon-256x256.png" 67 - /> 68 - <link 69 - rel="icon" 70 - type="image/png" 71 - sizes="192x192" 72 - href="/assets/icon/android-icon-192x192.png" 73 - /> 74 - <link rel="icon" type="image/png" sizes="32x32" href="/assets/icon/favicon-32x32.png" /> 75 - <link rel="icon" type="image/png" sizes="96x96" href="/assets/icon/favicon-96x96.png" /> 76 - <link rel="icon" type="image/png" sizes="16x16" href="/assets/icon/favicon-16x16.png" /> 77 - <link rel="manifest" href="/assets/icon/manifest.json" /> 78 - <meta name="msapplication-TileColor" content="#1a2420" /> 79 - <meta name="msapplication-TileImage" content="/assets/icon/ms-icon-144x144.png" /> 80 - <meta name="theme-color" content="#1a2420" /> 81 - 82 7 %sveltekit.head% 83 8 </head> 84 9 <body data-sveltekit-preload-data="hover">
packages/pds-landing/src/lib/assets/favicon.svg packages/pds-landing/static/favicon.svg
-14
packages/pds-landing/src/lib/components/KvRow.svelte
··· 1 - <script lang="ts"> 2 - import type { StatusClass } from '$lib/status.svelte.js'; 3 - 4 - interface Props { 5 - key: string; 6 - text: string; 7 - cls?: StatusClass; 8 - } 9 - 10 - let { key, text, cls = '' }: Props = $props(); 11 - </script> 12 - 13 - <span class="kv-key">{key}</span> 14 - <span class="kv-val {cls}">{text}</span>
+1 -1
packages/pds-landing/src/lib/index.ts
··· 1 - export { fetchJSON } from './utils.js'; 1 + // Reexport your entry components here
-137
packages/pds-landing/src/lib/status.svelte.ts
··· 1 - import { fetchJSON } from './utils.js'; 2 - 3 - // ─── types ──────────────────────────────────────────────────────────────────── 4 - 5 - export type StatusClass = 'ok' | 'err' | 'warn' | 'loading' | ''; 6 - 7 - export interface KvRow { 8 - key: string; 9 - text: string; 10 - cls: StatusClass; 11 - } 12 - 13 - interface HealthResponse { 14 - version?: string; 15 - } 16 - 17 - interface ServerDescription { 18 - did?: string; 19 - inviteCodeRequired?: boolean; 20 - phoneVerificationRequired?: boolean; 21 - availableUserDomains?: string[]; 22 - links?: { privacyPolicy?: string; termsOfService?: string }; 23 - contact?: { email?: string }; 24 - } 25 - 26 - interface RepoPage { 27 - repos?: unknown[]; 28 - cursor?: string; 29 - } 30 - 31 - // ─── helpers ────────────────────────────────────────────────────────────────── 32 - 33 - const LOADING: KvRow = { key: '', text: '…', cls: 'loading' }; 34 - const blank = (key: string): KvRow => ({ key, text: '—', cls: '' }); 35 - 36 - // ─── reactive state class (Svelte 5 runes) ──────────────────────────────────── 37 - 38 - class PdsStatus { 39 - reachable = $state<KvRow>({ ...LOADING, key: 'reachable' }); 40 - version = $state<KvRow>({ ...LOADING, key: 'version' }); 41 - did = $state<KvRow>({ ...LOADING, key: 'did' }); 42 - accounts = $state<KvRow>({ ...LOADING, key: 'accounts' }); 43 - invite = $state<KvRow>({ ...LOADING, key: 'invite required' }); 44 - phone = $state<KvRow | null>(null); 45 - domains = $state<KvRow | null>(null); 46 - 47 - extraLinks = $state<Array<{ href: string; label: string }>>([]); 48 - contactEmail = $state<string | null>(null); 49 - 50 - /** Ordered rows for the kv-grid — optional rows are filtered out automatically. */ 51 - get kvRows(): KvRow[] { 52 - return [ 53 - this.reachable, 54 - this.version, 55 - this.did, 56 - this.accounts, 57 - this.invite, 58 - ...(this.phone ? [this.phone] : []), 59 - ...(this.domains ? [this.domains] : []) 60 - ]; 61 - } 62 - 63 - async load(): Promise<void> { 64 - // ── health ────────────────────────────────────────────────────────────── 65 - try { 66 - const h = await fetchJSON<HealthResponse>('/xrpc/_health'); 67 - this.reachable = { key: 'reachable', text: '✓ online', cls: 'ok' }; 68 - this.version = { key: 'version', text: h.version ?? 'unknown', cls: '' }; 69 - } catch { 70 - this.reachable = { key: 'reachable', text: '✗ unreachable', cls: 'err' }; 71 - this.version = { key: 'version', text: '—', cls: 'err' }; 72 - } 73 - 74 - // ── server description ────────────────────────────────────────────────── 75 - try { 76 - const d = await fetchJSON<ServerDescription>( 77 - '/xrpc/com.atproto.server.describeServer' 78 - ); 79 - 80 - this.did = { key: 'did', text: d.did ?? '—', cls: '' }; 81 - this.invite = { 82 - key: 'invite required', 83 - text: d.inviteCodeRequired ? 'yes' : 'no', 84 - cls: d.inviteCodeRequired ? 'warn' : 'ok' 85 - }; 86 - 87 - if (typeof d.phoneVerificationRequired === 'boolean') { 88 - this.phone = { 89 - key: 'phone verify', 90 - text: d.phoneVerificationRequired ? 'yes' : 'no', 91 - cls: d.phoneVerificationRequired ? 'warn' : 'ok' 92 - }; 93 - } 94 - 95 - if (d.availableUserDomains?.length) { 96 - this.domains = { 97 - key: 'user domains', 98 - text: d.availableUserDomains.join(', '), 99 - cls: '' 100 - }; 101 - } 102 - 103 - const linkKeys: [keyof NonNullable<ServerDescription['links']>, string][] = [ 104 - ['privacyPolicy', 'Privacy Policy'], 105 - ['termsOfService', 'Terms of Service'] 106 - ]; 107 - for (const [k, label] of linkKeys) { 108 - const href = d.links?.[k]; 109 - if (href) this.extraLinks = [...this.extraLinks, { href, label }]; 110 - } 111 - 112 - if (d.contact?.email) this.contactEmail = d.contact.email; 113 - } catch { 114 - this.did = blank('did'); 115 - this.invite = blank('invite required'); 116 - } 117 - 118 - // ── account count (paginated) ─────────────────────────────────────────── 119 - try { 120 - let cursor: string | undefined; 121 - let total = 0; 122 - do { 123 - const url = 124 - '/xrpc/com.atproto.sync.listRepos?limit=1000' + 125 - (cursor ? '&cursor=' + encodeURIComponent(cursor) : ''); 126 - const r = await fetchJSON<RepoPage>(url); 127 - total += (r.repos ?? []).length; 128 - cursor = r.cursor; 129 - } while (cursor); 130 - this.accounts = { key: 'accounts', text: total.toString(), cls: '' }; 131 - } catch { 132 - this.accounts = blank('accounts'); 133 - } 134 - } 135 - } 136 - 137 - export const pdsStatus = new PdsStatus();
-5
packages/pds-landing/src/lib/utils.ts
··· 1 - export async function fetchJSON<T>(path: string): Promise<T> { 2 - const r = await fetch(path); 3 - if (!r.ok) throw new Error(`HTTP ${r.status}`); 4 - return r.json() as Promise<T>; 5 - }
+1 -3
packages/pds-landing/src/routes/+layout.svelte
··· 1 1 <script lang="ts"> 2 2 import './layout.css'; 3 - import favicon from '$lib/assets/favicon.svg'; 4 3 5 - let { children } = $props(); 4 + const { children } = $props(); 6 5 </script> 7 6 8 - <svelte:head><link rel="icon" href={favicon} /></svelte:head> 9 7 {@render children()}
+3 -73
packages/pds-landing/src/routes/+page.svelte
··· 1 - <script lang="ts"> 2 - import { onMount } from 'svelte'; 3 - import { pdsStatus } from '$lib/status.svelte.js'; 4 - import KvRow from '$lib/components/KvRow.svelte'; 5 - 6 - onMount(() => pdsStatus.load()); 7 - </script> 8 - 9 - <div class="card"> 10 - <div class="card-titlebar"> 11 - <span class="dot"></span> 12 - <span class="dot"></span> 13 - <span class="dot"></span> 14 - <span style="margin-left: 0.4rem">ewan's pds</span> 15 - </div> 16 - <div class="card-body"> 17 - <div class="prompt-line"> 18 - <span class="user-marker">server@pds.ewancroft.uk</span><span class="prompt-path" 19 - >:~</span 20 - ><span class="prompt-char"> $</span> 21 - </div> 22 - <p class="tagline">Bluesky-compatible ATProto PDS · personal instance</p> 23 - 24 - <div class="section-label">status</div> 25 - <div class="kv-grid"> 26 - {#each pdsStatus.kvRows as row (row.key)} 27 - <KvRow key={row.key} text={row.text} cls={row.cls} /> 28 - {/each} 29 - </div> 30 - 31 - <hr class="divider" /> 32 - 33 - <div class="section-label">endpoints</div> 34 - <p class="endpoints-note"> 35 - Most API routes are under <span class="highlight">/xrpc/</span> 36 - </p> 37 - <ul class="link-list"> 38 - <li><a href="https://github.com/bluesky-social/atproto" target="_blank" rel="noopener">atproto source code</a></li> 39 - <li><a href="https://github.com/bluesky-social/pds" target="_blank" rel="noopener">self-hosting guide</a></li> 40 - <li><a href="https://atproto.com" target="_blank" rel="noopener">protocol docs</a></li> 41 - </ul> 42 - 43 - <hr class="divider" /> 44 - 45 - <div class="section-label">links</div> 46 - <ul class="link-list"> 47 - <li><a href="https://witchsky.app" target="_blank" rel="noopener">Witchsky Web Client</a></li> 48 - {#each pdsStatus.extraLinks as link (link.href)} 49 - <li><a href={link.href} target="_blank" rel="noopener">{link.label}</a></li> 50 - {/each} 51 - </ul> 52 - 53 - <hr class="divider" /> 54 - 55 - <div class="section-label">contact</div> 56 - <p class="contact-note"> 57 - Send a mention on Bluesky to 58 - <a href="https://witchsky.app/profile/ewancroft.uk" target="_blank" rel="noopener">@ewancroft.uk</a> 59 - </p> 60 - {#if pdsStatus.contactEmail} 61 - <p class="contact-note" style="margin-top: 0.4rem"> 62 - Email: <a href="mailto:{pdsStatus.contactEmail}">{pdsStatus.contactEmail}</a> 63 - </p> 64 - {/if} 65 - </div> 66 - </div> 67 - 68 - <footer> 69 - powered by 70 - <a href="https://search.nixos.org/packages?show=bluesky-pds" target="_blank" rel="noopener">nixpkgs#bluesky-pds</a> 71 - &nbsp;·&nbsp; 72 - <a href="https://atproto.com" target="_blank" rel="noopener">atproto.com</a> 73 - </footer> 1 + <h1>Welcome to your library project</h1> 2 + <p>Create your package using @sveltejs/package and preview/showcase your work with SvelteKit</p> 3 + <p>Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation</p>
-258
packages/pds-landing/src/routes/layout.css
··· 1 1 @import 'tailwindcss'; 2 2 @plugin '@tailwindcss/typography'; 3 - @import '@ewanc26/ui/styles/pds-tokens.css'; 4 - 5 - /* ─── local aliases → pds tokens ─────────────────────────────────────────── */ 6 - :root { 7 - --font-mono: var(--pds-font-mono); 8 - 9 - --color-crust: var(--pds-color-crust); 10 - --color-mantle: var(--pds-color-mantle); 11 - --color-base: var(--pds-color-base); 12 - --color-surface-0: var(--pds-color-surface-0); 13 - --color-surface-1: var(--pds-color-surface-1); 14 - --color-overlay-0: var(--pds-color-overlay-0); 15 - --color-text: var(--pds-color-text); 16 - --color-subtext-0: var(--pds-color-subtext-0); 17 - --color-green: var(--pds-color-green); 18 - --color-red: var(--pds-color-red); 19 - --color-yellow: var(--pds-color-yellow); 20 - --color-shadow: var(--pds-color-shadow); 21 - } 22 - 23 - /* ─── reset ──────────────────────────────────────────────────────────────── */ 24 - *, 25 - *::before, 26 - *::after { 27 - box-sizing: border-box; 28 - margin: 0; 29 - padding: 0; 30 - } 31 - 32 - html, 33 - body { 34 - @apply min-h-dvh; 35 - background-color: var(--color-crust); 36 - color: var(--color-text); 37 - font-family: var(--font-mono); 38 - font-size: clamp(13px, 3.5vw, 15px); 39 - line-height: 1.6; 40 - } 41 - 42 - body { 43 - @apply flex flex-col items-center; 44 - padding: clamp(1.5rem, 6vw, 4rem) clamp(1rem, 4vw, 1.5rem) clamp(1.5rem, 6vw, 3rem); 45 - gap: 2rem; 46 - } 47 - 48 - /* ─── terminal card ──────────────────────────────────────────────────────── */ 49 - .card { 50 - @apply w-full overflow-hidden rounded-lg; 51 - max-width: 680px; 52 - background-color: var(--color-mantle); 53 - border: 1px solid var(--color-surface-1); 54 - box-shadow: 55 - 0 0 0 1px color-mix(in srgb, var(--color-green) 6%, transparent), 56 - 0 8px 32px color-mix(in srgb, var(--color-shadow) 50%, transparent); 57 - } 58 - 59 - .card-titlebar { 60 - @apply flex items-center gap-2 text-xs; 61 - min-width: 0; 62 - padding: 0.55rem 1rem; 63 - background-color: var(--color-surface-0); 64 - color: var(--color-green); 65 - border-bottom: 1px solid color-mix(in srgb, var(--color-green) 15%, transparent); 66 - } 67 - 68 - .card-titlebar span:last-child { 69 - @apply truncate min-w-0; 70 - } 71 - 72 - .dot { 73 - @apply rounded-full shrink-0; 74 - width: 10px; 75 - height: 10px; 76 - background-color: color-mix(in srgb, var(--color-green) 25%, transparent); 77 - border: 1px solid color-mix(in srgb, var(--color-green) 40%, transparent); 78 - } 79 - 80 - .card-body { 81 - padding: 1.4rem 1.6rem; 82 - } 83 - 84 - /* ─── prompt header ──────────────────────────────────────────────────────── */ 85 - .prompt-line { 86 - @apply flex items-baseline; 87 - gap: 0.4rem; 88 - margin-bottom: 0.3rem; 89 - } 90 - 91 - .prompt-char, 92 - .prompt-path { 93 - @apply font-bold select-none; 94 - color: var(--color-subtext-0); 95 - font-size: clamp(0.95em, 4vw, 1.15em); 96 - } 97 - 98 - .prompt-path { 99 - opacity: 0.6; 100 - } 101 - 102 - .user-marker { 103 - @apply font-bold break-all; 104 - color: var(--color-green); 105 - font-size: clamp(0.95em, 4vw, 1.15em); 106 - letter-spacing: -0.01em; 107 - } 108 - 109 - .tagline { 110 - color: var(--color-overlay-0); 111 - font-size: 0.82em; 112 - margin-top: 0.2rem; 113 - margin-bottom: 1.4rem; 114 - line-height: 1.5; 115 - } 116 - 117 - /* ─── key-value rows ─────────────────────────────────────────────────────── */ 118 - .kv-grid { 119 - display: grid; 120 - grid-template-columns: max-content 1fr; 121 - gap: 0.25rem 1.2rem; 122 - font-size: 0.88em; 123 - margin-bottom: 1.4rem; 124 - } 125 - 126 - .kv-key { 127 - color: var(--color-green); 128 - opacity: 0.6; 129 - white-space: nowrap; 130 - } 131 - 132 - .kv-val { 133 - color: var(--color-text); 134 - word-break: break-all; 135 - min-width: 0; 136 - } 137 - 138 - .kv-val.ok { 139 - color: var(--color-green); 140 - } 141 - .kv-val.warn { 142 - color: var(--color-yellow); 143 - } 144 - .kv-val.err { 145 - color: var(--color-red); 146 - } 147 - 148 - .loading { 149 - color: var(--color-surface-1); 150 - animation: pulse 1.2s ease-in-out infinite; 151 - } 152 - 153 - @keyframes pulse { 154 - 0%, 155 - 100% { 156 - opacity: 0.4; 157 - } 158 - 50% { 159 - opacity: 1; 160 - } 161 - } 162 - 163 - /* ─── divider ────────────────────────────────────────────────────────────── */ 164 - .divider { 165 - border: none; 166 - border-top: 1px solid color-mix(in srgb, var(--color-green) 12%, transparent); 167 - margin: 1.2rem 0; 168 - } 169 - 170 - /* ─── section label ──────────────────────────────────────────────────────── */ 171 - .section-label { 172 - @apply font-bold uppercase; 173 - font-size: 0.72em; 174 - letter-spacing: 0.12em; 175 - color: var(--color-green); 176 - margin-bottom: 0.7rem; 177 - } 178 - 179 - /* ─── links ──────────────────────────────────────────────────────────────── */ 180 - .link-list { 181 - @apply list-none flex flex-col; 182 - gap: 0.35rem; 183 - font-size: 0.88em; 184 - } 185 - 186 - .link-list li::before { 187 - content: '→ '; 188 - color: var(--color-green); 189 - } 190 - 191 - .link-list a { 192 - @apply no-underline; 193 - color: var(--color-green); 194 - opacity: 0.85; 195 - transition: opacity 0.15s; 196 - } 197 - 198 - .link-list a:hover { 199 - opacity: 1; 200 - } 201 - 202 - /* ─── notes ──────────────────────────────────────────────────────────────── */ 203 - .endpoints-note, 204 - .contact-note { 205 - font-size: 0.88em; 206 - color: var(--color-subtext-0); 207 - } 208 - 209 - .endpoints-note { 210 - margin-bottom: 0.7rem; 211 - } 212 - 213 - .highlight { 214 - color: var(--color-green); 215 - } 216 - 217 - .contact-note a { 218 - @apply no-underline; 219 - color: var(--color-green); 220 - } 221 - 222 - .contact-note a:hover { 223 - text-decoration: underline; 224 - } 225 - 226 - /* ─── footer ─────────────────────────────────────────────────────────────── */ 227 - footer { 228 - @apply text-center; 229 - color: color-mix(in srgb, var(--color-green) 35%, transparent); 230 - font-size: 0.75em; 231 - } 232 - 233 - footer a { 234 - @apply underline; 235 - color: color-mix(in srgb, var(--color-green) 35%, transparent); 236 - } 237 - 238 - footer a:hover { 239 - color: var(--color-green); 240 - } 241 - 242 - /* ─── responsive ─────────────────────────────────────────────────────────── */ 243 - @media (max-width: 440px) { 244 - .card-body { 245 - padding: 1.1rem; 246 - } 247 - .kv-grid { 248 - grid-template-columns: 1fr; 249 - gap: 0; 250 - } 251 - .kv-key { 252 - @apply uppercase opacity-100; 253 - font-size: 0.7em; 254 - letter-spacing: 0.1em; 255 - margin-top: 0.7rem; 256 - } 257 - .kv-key:first-child { 258 - margin-top: 0; 259 - } 260 - }
packages/pds-landing/static/assets/icon/android-icon-192x192.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-114x114.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-120x120.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-144x144.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-152x152.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-180x180.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-57x57.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-60x60.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-72x72.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/apple-icon-76x76.png

This is a binary file and will not be displayed.

-2
packages/pds-landing/static/assets/icon/browserconfig.xml
··· 1 - <?xml version="1.0" encoding="utf-8"?> 2 - <browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
packages/pds-landing/static/assets/icon/favicon-16x16.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/favicon-256x256.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/favicon-32x32.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/favicon-96x96.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/favicon.ico

This is a binary file and will not be displayed.

-22
packages/pds-landing/static/assets/icon/instructions.txt
··· 1 - 1) Upload images 2 - Upload your images into your domain's root directory 3 - 4 - 2) Add HTML code 5 - Insert the following HTML code between the <head> </head> tags: 6 - <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png"> 7 - <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png"> 8 - <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png"> 9 - <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png"> 10 - <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png"> 11 - <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png"> 12 - <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png"> 13 - <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png"> 14 - <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"> 15 - <link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png"> 16 - <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 17 - <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"> 18 - <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> 19 - <link rel="manifest" href="/manifest.json"> 20 - <meta name="msapplication-TileColor" content="#ffffff"> 21 - <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> 22 - <meta name="theme-color" content="#ffffff">
-41
packages/pds-landing/static/assets/icon/manifest.json
··· 1 - { 2 - "name": "App", 3 - "icons": [ 4 - { 5 - "src": "\/android-icon-36x36.png", 6 - "sizes": "36x36", 7 - "type": "image\/png", 8 - "density": "0.75" 9 - }, 10 - { 11 - "src": "\/android-icon-48x48.png", 12 - "sizes": "48x48", 13 - "type": "image\/png", 14 - "density": "1.0" 15 - }, 16 - { 17 - "src": "\/android-icon-72x72.png", 18 - "sizes": "72x72", 19 - "type": "image\/png", 20 - "density": "1.5" 21 - }, 22 - { 23 - "src": "\/android-icon-96x96.png", 24 - "sizes": "96x96", 25 - "type": "image\/png", 26 - "density": "2.0" 27 - }, 28 - { 29 - "src": "\/android-icon-144x144.png", 30 - "sizes": "144x144", 31 - "type": "image\/png", 32 - "density": "3.0" 33 - }, 34 - { 35 - "src": "\/android-icon-192x192.png", 36 - "sizes": "192x192", 37 - "type": "image\/png", 38 - "density": "4.0" 39 - } 40 - ] 41 - }
packages/pds-landing/static/assets/icon/ms-icon-144x144.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/ms-icon-150x150.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/ms-icon-310x310.png

This is a binary file and will not be displayed.

packages/pds-landing/static/assets/icon/ms-icon-70x70.png

This is a binary file and will not be displayed.

-78
packages/pds-landing/static/assets/thumb.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630"> 2 - <defs> 3 - <!-- grid pattern background --> 4 - <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse"> 5 - <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1e3328" stroke-width="0.5" opacity="0.4"/> 6 - </pattern> 7 - <!-- subtle vignette --> 8 - <radialGradient id="vignette" cx="50%" cy="50%" r="70%"> 9 - <stop offset="0%" stop-color="transparent"/> 10 - <stop offset="100%" stop-color="#0d1210" stop-opacity="0.6"/> 11 - </radialGradient> 12 - <!-- card shadow --> 13 - <filter id="shadow" x="-5%" y="-5%" width="110%" height="120%"> 14 - <feDropShadow dx="0" dy="8" stdDeviation="24" flood-color="#000000" flood-opacity="0.6"/> 15 - </filter> 16 - </defs> 17 - 18 - <!-- background --> 19 - <rect width="1200" height="630" fill="#0d1210"/> 20 - <rect width="1200" height="630" fill="url(#grid)"/> 21 - <rect width="1200" height="630" fill="url(#vignette)"/> 22 - 23 - <!-- card --> 24 - <g filter="url(#shadow)"> 25 - <rect x="160" y="90" width="880" height="450" rx="10" fill="#141c19" stroke="#2e3d34" stroke-width="1"/> 26 - <!-- outer glow ring --> 27 - <rect x="160" y="90" width="880" height="450" rx="10" fill="none" stroke="#a6e3a1" stroke-width="0.5" opacity="0.08"/> 28 - </g> 29 - 30 - <!-- titlebar --> 31 - <rect x="160" y="90" width="880" height="44" rx="10" fill="#243028"/> 32 - <rect x="160" y="114" width="880" height="20" fill="#243028"/> 33 - <rect x="160" y="91" width="880" height="1" fill="#2e3d34"/> 34 - <rect x="160" y="134" width="880" height="1" fill="#2e3d34"/> 35 - 36 - <!-- traffic lights --> 37 - <circle cx="196" cy="112" r="6" fill="#4a7a62" opacity="0.4"/> 38 - <circle cx="218" cy="112" r="6" fill="#4a7a62" opacity="0.4"/> 39 - <circle cx="240" cy="112" r="6" fill="#4a7a62" opacity="0.4"/> 40 - 41 - <!-- titlebar label --> 42 - <text x="264" y="117" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="13" fill="#4a7a62">ewan's pds</text> 43 - 44 - <!-- prompt line --> 45 - <text x="200" y="210" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="32" font-weight="700" fill="#a6e3a1">server@pds.ewancroft.uk</text> 46 - <text x="200" y="210" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="32" font-weight="700" fill="#93b09a" opacity="0.6">:~</text> 47 - <!-- measure approx: "server@pds.ewancroft.uk" at 32px mono ≈ 23 chars × ~19.2px = ~442px, then ":~" ≈ 38px --> 48 - <text x="200" y="210" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="32" font-weight="700"> 49 - <tspan fill="#a6e3a1">server@pds.ewancroft.uk</tspan><tspan fill="#93b09a" opacity="0.6">:~</tspan><tspan fill="#93b09a"> $</tspan> 50 - </text> 51 - 52 - <!-- tagline --> 53 - <text x="200" y="248" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#4d6b58">Bluesky-compatible ATProto PDS · personal instance</text> 54 - 55 - <!-- divider --> 56 - <line x1="200" y1="272" x2="1000" y2="272" stroke="#1e3328" stroke-width="1" opacity="0.8"/> 57 - 58 - <!-- STATUS section --> 59 - <text x="200" y="300" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="11" font-weight="700" letter-spacing="2" fill="#4d6b58">STATUS</text> 60 - 61 - <!-- kv rows --> 62 - <text x="200" y="328" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#4a7a62" opacity="0.7">reachable</text> 63 - <text x="390" y="328" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#a6e3a1">✓ online</text> 64 - 65 - <text x="200" y="356" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#4a7a62" opacity="0.7">did</text> 66 - <text x="390" y="356" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#cdd6f4" opacity="0.85">did:web:pds.ewancroft.uk</text> 67 - 68 - <text x="200" y="384" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#4a7a62" opacity="0.7">invite required</text> 69 - <text x="390" y="384" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="15" fill="#f9e2af">yes</text> 70 - 71 - <!-- divider --> 72 - <line x1="200" y1="410" x2="1000" y2="410" stroke="#1e3328" stroke-width="1" opacity="0.8"/> 73 - 74 - <!-- footer line --> 75 - <text x="600" y="475" font-family="'JetBrains Mono', 'Fira Mono', monospace" font-size="13" fill="#2e3d34" text-anchor="middle">powered by nixpkgs#bluesky-pds · atproto.com</text> 76 - 77 - 78 - </svg>
-3
packages/pds-landing/static/robots.txt
··· 1 - # allow crawling everything by default 2 - User-agent: * 3 - Disallow:
+2 -9
packages/pds-landing/svelte.config.js
··· 1 - import adapter from '@sveltejs/adapter-auto'; 1 + import adapter from '@sveltejs/adapter-static'; 2 2 3 3 /** @type {import('@sveltejs/kit').Config} */ 4 - const config = { 5 - kit: { 6 - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 7 - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 8 - // See https://svelte.dev/docs/kit/adapters for more information about adapters. 9 - adapter: adapter() 10 - } 11 - }; 4 + const config = { kit: { adapter: adapter() } }; 12 5 13 6 export default config;
+2 -7
packages/pds-landing/tsconfig.json
··· 4 4 "rewriteRelativeImportExtensions": true, 5 5 "allowJs": true, 6 6 "checkJs": true, 7 - "esModuleInterop": true, 8 7 "forceConsistentCasingInFileNames": true, 9 8 "resolveJsonModule": true, 10 9 "skipLibCheck": true, 11 10 "sourceMap": true, 12 11 "strict": true, 13 - "moduleResolution": "bundler" 12 + "module": "NodeNext", 13 + "moduleResolution": "NodeNext" 14 14 } 15 - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias 16 - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files 17 - // 18 - // To make changes to top-level options such as include and exclude, we recommend extending 19 - // the generated config; see https://svelte.dev/docs/kit/configuration#typescript 20 15 }
+18 -7
pnpm-lock.yaml
··· 18 18 version: 5.9.3 19 19 20 20 packages/pds-landing: 21 - dependencies: 22 - '@ewanc26/ui': 23 - specifier: workspace:* 24 - version: link:../ui 25 21 devDependencies: 26 - '@sveltejs/adapter-auto': 27 - specifier: ^7.0.0 28 - version: 7.0.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1))) 22 + '@sveltejs/adapter-static': 23 + specifier: ^3.0.10 24 + version: 3.0.10(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1))) 29 25 '@sveltejs/kit': 30 26 specifier: ^2.50.2 31 27 version: 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) 28 + '@sveltejs/package': 29 + specifier: ^2.5.7 30 + version: 2.5.7(svelte@5.53.7)(typescript@5.9.3) 32 31 '@sveltejs/vite-plugin-svelte': 33 32 specifier: ^6.2.4 34 33 version: 6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) ··· 47 46 prettier-plugin-tailwindcss: 48 47 specifier: ^0.7.2 49 48 version: 0.7.2(prettier-plugin-svelte@3.5.1(prettier@3.8.1)(svelte@5.53.7))(prettier@3.8.1) 49 + publint: 50 + specifier: ^0.3.17 51 + version: 0.3.18 50 52 svelte: 51 53 specifier: ^5.51.0 52 54 version: 5.53.7 ··· 613 615 614 616 '@sveltejs/adapter-auto@7.0.1': 615 617 resolution: {integrity: sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==} 618 + peerDependencies: 619 + '@sveltejs/kit': ^2.0.0 620 + 621 + '@sveltejs/adapter-static@3.0.10': 622 + resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==} 616 623 peerDependencies: 617 624 '@sveltejs/kit': ^2.0.0 618 625 ··· 2094 2101 acorn: 8.16.0 2095 2102 2096 2103 '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))': 2104 + dependencies: 2105 + '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) 2106 + 2107 + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))': 2097 2108 dependencies: 2098 2109 '@sveltejs/kit': 2.53.4(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.7)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(svelte@5.53.7)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) 2099 2110