a british poet and programmer who is unreasonably into werewolves. I water the Yew trees.
Deterministic value-noise avatar generation from a string seed — zero dependencies, works in browsers and Node.js.
SvelteKit component library for displaying Ko-fi supporters, backed by an ATProto PDS.
Composable Svelte 5 components for an ATProto PDS landing page — terminal aesthetic, live status fetching, zero config to drop in.
Rust CLI tools for managing nixos/nix-darwin configurations — now part of the @ewanc26/pkgs monorepo.
Ewan's personal package monorepo — language-agnostic workspace with TypeScript, Rust, and Python packages.
Ewan's personal package monorepo — the canonical home for @ewanc26/tid, @ewanc26/atproto, @ewanc26/ui, and @ewanc26/utils.
AT Protocol service layer extracted from ewancroft.uk — profile fetching, Standard.site documents, Bluesky posts, music/mood status, Tangled repos, and a built-in in-memory cache.
Svelte UI component library extracted from ewancroft.uk — pluggable layout, card, SEO, and UI primitive components alongside Svelte stores and a multi-theme config system.
Shared utility functions extracted from ewancroft.uk — date formatting, number formatting, URL helpers, validators, RSS generation, and locale detection.
Zero-dependency, spec-compliant AT Protocol TID generation for Node.js and browsers.
Import your Last.fm and Spotify listening history to the AT Protocol network using the fm.teal.alpha.feed.play lexicon.
A server-side AT Protocol link shortener powered by your Linkat board. No database required.
Classic Snake with AT Protocol OAuth login and high score saving to your PDS.
An early Python experiment — unmaintained and kept for historical interest.
Automatically update your Bluesky avatar (and banner) every hour based on the time of day.