Why className and style props make your life harder, not easier
Convert pub.leaflet RTF-block documents (site.standard.document ATProto records) to Markdown — available as both a CLI tool and a TypeScript library.
Generic deterministic value-noise generation. Arbitrary dimensions, multi-octave FBM, multiple colour modes. Zero dependencies, works in browsers and Node.js.
Deterministic value-noise avatar generation from a string seed — thin wrapper around @ewanc26/noise, works in browsers and Node.js.
Composable Svelte 5 components for an ATProto PDS landing page — terminal aesthetic, live status fetching, zero config to drop in.
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.
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.
A simple Bluesky bot that posts random wolf noises at random intervals. Unmaintained.
A Bluesky bot that posts daily moon phase updates with a lycanthropic twist. Unmaintained.
CLI tool for syncing GitHub repositories to Tangled with ATProto record publishing — now part of the @ewanc26/pkgs monorepo.
A look at why the "x" in y syntax in TypeScript can lead to dead code.