{
  "path": "/projects/pds-landing",
  "site": "at://did:plc:ofrbh253gwicbkc5nktqepol/site.standard.publication/3mfyq5mpohw25",
  "tags": [
    "atproto",
    "pkgs",
    "typescript",
    "website"
  ],
  "$type": "site.standard.document",
  "title": "@ewanc26/pds-landing",
  "description": "Composable Svelte 5 components for an ATProto PDS landing page — terminal aesthetic, live status fetching, zero config to drop in.",
  "publishedAt": "2026-03-08T00:00:00.000Z",
  "textContent": "@ewanc26/pds-landing is a composable Svelte 5 component library for building ATProto PDS landing pages. It powers the page served at pds.ewancroft.uk and is consumed there via a standalone SvelteKit app in the nix-config repository.\n\nPart of the @ewanc26/pkgs monorepo.\n\nInstallation\n\nQuick start — full page\n\nThe PDSPage component is a drop-in fully-assembled landing page:\n\nImport the PDS design tokens once in your layout CSS:\n\nComposing primitives\n\nAll sub-components are exported individually for custom layouts:\n\nFetching status manually\n\nComponents\n\n| Component | Description |\n|---|---|\n| PDSPage | Full assembled landing page (convenience wrapper) |\n| TerminalCard | Terminal window shell with traffic-light titlebar |\n| PromptLine | user@host:path $ bash prompt header |\n| Tagline | Dimmed subtitle beneath the prompt |\n| SectionLabel | Uppercase section heading |\n| Divider | Thin green-tinted <hr> |\n| KVGrid | Key-value grid with ok / warn / err / loading states |\n| StatusGrid | Live-fetching PDS status grid (wraps KVGrid) |\n| LinkList | → link list |\n| ContactSection | Bluesky mention + optional email |\n| PDSFooter | Footer with nixpkgs / atproto links |\n\nHow it works\n\nOn mount, StatusGrid (via fetchPDSStatus) calls three XRPC endpoints on the PDS:\n\n- /xrpc/_health — liveness check and version\n- /xrpc/com.atproto.server.describeServer — DID, invite requirements, links, contact email\n- /xrpc/com.atproto.sync.listRepos — paginated account count\n\nPDSPage also appends any privacy policy / terms of service URLs returned by describeServer to the links section automatically. Fields absent from the server response are hidden rather than shown as errors.\n\nTech stack\n\n- Svelte 5 with runes ($state, $derived, $props)\n- SvelteKit 2 (component library via @sveltejs/package)\n- Tailwind CSS v4\n- TypeScript 5.9+\n- Zero runtime dependencies beyond @ewanc26/ui (design tokens / base styles)\n\nDesign tokens\n\nAll components consume CSS custom properties from @ewanc26/ui/styles/pds-tokens.css:\n\nDeployment\n\nThe actual page at pds.ewancroft.uk is served by a small SvelteKit app in nix-config/modules/server/pds-landing. It consumes this package as an npm dependency, builds to a fully static site with @sveltejs/adapter-static, and is served by Caddy in the NixOS configuration:\n\nThe Nix derivation builds the SvelteKit app at eval time, so the output is reproducible without node_modules on the server.\n\nPublishing\n\nNew versions are published to npm automatically when a tag matching pds-landing/v..* is pushed to the monorepo. The GitHub Actions workflow builds the package and publishes it with provenance via OIDC.\n\nLicence\n\nAGPL-3.0-only — see the pkgs monorepo.",
  "canonicalUrl": "https://docs.ewancroft.uk/projects/pds-landing"
}