@ewanc26/pds-landing
@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.
Part of the @ewanc26/pkgs monorepo.
Installation
Quick start — full page
The PDSPage component is a drop-in fully-assembled landing page:
Import the PDS design tokens once in your layout CSS:
Composing primitives
All sub-components are exported individually for custom layouts:
Fetching status manually
Components
| Component | Description |
|---|---|
| PDSPage | Full assembled landing page (convenience wrapper) |
| TerminalCard | Terminal window shell with traffic-light titlebar |
| PromptLine | user@host:path $ bash prompt header |
| Tagline | Dimmed subtitle beneath the prompt |
| SectionLabel | Uppercase section heading |
| Divider | Thin green-tinted |
| KVGrid | Key-value grid with ok / warn / err / loading states |
| StatusGrid | Live-fetching PDS status grid (wraps KVGrid) |
| LinkList | → link list |
| ContactSection | Bluesky mention + optional email |
| PDSFooter | Footer with nixpkgs / atproto links |
How it works
On mount, StatusGrid (via fetchPDSStatus) calls three XRPC endpoints on the PDS:
- /xrpc/_health — liveness check and version
- /xrpc/com.atproto.server.describeServer — DID, invite requirements, links, contact email
- /xrpc/com.atproto.sync.listRepos — paginated account count
PDSPage 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.
Tech stack
- Svelte 5 with runes ($state, $derived, $props)
- SvelteKit 2 (component library via @sveltejs/package)
- Tailwind CSS v4
- TypeScript 5.9+
- Zero runtime dependencies beyond @ewanc26/ui (design tokens / base styles)
Design tokens
All components consume CSS custom properties from @ewanc26/ui/styles/pds-tokens.css:
Deployment
The 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:
The Nix derivation builds the SvelteKit app at eval time, so the output is reproducible without node_modules on the server.
Publishing
New 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.
Licence
AGPL-3.0-only — see the pkgs monorepo.
Discussion in the ATmosphere