Tourmaline gained word clouds, bar-chart races, region breakdowns, cumulative charts, dataset explorer, Eddington stats, rank history, anniversaries, and dozens of stat tiles. Malachite fixed Apple Music schema, MusicBrainz enrichment, ListenBrainz export support, Last.fm API fetch, and Spotify/YouTube name fabrication. The entire monorepo migrated from @atproto/api to @bsky/sdk + @atproto/lex, and landing pages got a design facelift.
The AT Protocol tools directory — a free, browser-based hub linking Jasper, Malachite, Bismuth, Opal, and Tourmaline.
Shared Svelte landing page layout, CSS, and components for the *-web tool sites (Jasper, Malachite, Opal, Bismuth, Tourmaline).
Dynamic OpenGraph image generator with noise backgrounds, bold typography, and Satori-based rendering.
A new -m polish mode (and matching web wizard card) backfills legacy fm.teal.alpha.feed.play scrobbles into production fm.teal.feed.play, preserving rkeys, then removes the legacy copies after each backfill succeeds. The migration logic is shared through croft-click-core.
Malachite and its web frontend gained a ListenBrainz import mode, tourmaline switched to CAR-export scrobble fetching and hardened its server routes, pds-landing got a live activity feed, and every write-capable tool now shares one ~/.ewanc26 state directory.
croft-click now aggregates toolkit usage across the whole network instead of trusting client-side writes from each tool, and pds-landing's components resolve their hostname at runtime instead of assuming one domain.
Removed sequoia.json from pkgs to maintain clear separation of project-specific configurations.
Added ListenBrainz as a malachite import source (community contribution), integrated Vercel Blob for OG image caching, and added a documentation OG template.
Malachite gains OAuth-based CLI authentication for ATProto and did:web DID resolution, alongside a restructured web frontend.
Build configuration updates for pnpm-workspace.yaml and centralization of lexicon and domain constants.
Adding import support for Apple Music and YouTube Music, and updating branding.
Unifying TID generation, adding sign-out functionality, and implementing toolkit usage analytics.
Adding AGENTS.md and llms.txt files across repositories to improve AI discoverability and documentation.
Implementing PDS rate limiting, fixing routing issues, and refining component reactivity for Tourmaline.
Porting analytics, upgrading CTA copy, and refining mobile responsive layouts for Tourmaline.
Replaced analytics taglines, removed duplicate footers from LandingPage and all about pages, deduplicated Tourmaline header navLinks
Moved Tourmaline from standalone repo into packages/tourmaline, enhanced landing-ui with backdrop blur, nav links, snippet props, and fixed source URLs across all projects
LandingLayout improvements (subtitle, expanded footer, @theme bridge), cross-references between all five tools, inline symbols replaced with Lucide icons, support links consolidated to ewancroft.uk/support
Moved the entire analysis pipeline from server-side POST to a browser web worker, fixing Vercel body size limits for large scrobble histories
Added web OAuth import flow, post threading for long content, and TID-based record keys to the Twitter/Mastodon/Threads to Bluesky converter
Profile redesign with tabbed layout, listening sessions, on this day, story-mode recap, date range filtering, and listening evolution phases
Added OG hero SVGs to all five project landing pages, bismuth fetch flags, and devlog project to croft-click
Minutes listened, music evolution, remarkable days, discovery, and yearly wrapped card with scroll-reveal animations
Replaced astronomical season detection with traditional Wheel of the Year sabbat dates, added midnight auto-update and reset-to-seasonal
Listening clock, listening stats, and service origins
Added genre bars, mood indicators, stat badges, and dynamic SVG layout to the personality card
Era analysis, time-of-day mood weighting, genre blending, Gini-based loyalty, full-artist genre profile
Fixed personality card SVG clipping and switched to aturi.to for post links
Added More tools sections linking each project to the other four, and pointed all support links to ewancroft.uk/support
Swapped unicode symbols for Lucide icon components across malachite, opal, jasper, bismuth, tourmaline, landing-ui, and croft-click
Added hero SVG OG images to malachite, opal, jasper, bismuth, and tourmaline landing pages
First release of tourmaline — personality archetypes, genre profiles, mood mapping, and share-to-Bluesky for Teal.fm scrobbles.
Added --frontmatter and --output flags to the fetch subcommand, and bumped to 0.2.4.
Docsite client bundle dropped from 1.3MB to 12KB, devlog layout data optimised, website duplicate fetches eliminated
Each devlog post now generates its own OG image on demand using @ewanc26/og — warm amber on dark, with noise texture.
The colour theme picker now shows when a seasonal theme is active and lets you lock it in explicitly.
Colour themes now follow the Wheel of the Year — eight distinct themes for each sabbat, shifting automatically as midnight crosses into a new period.
Convert Twitter, Mastodon, Threads, and Nostr posts to Bluesky with thread splitting and TID-based rkeys.
Landing page at croft.click and a shared @ewanc26/landing-ui package for all web packages.
I've been publishing to the AT Protocol for a while now. Blog posts, project documentation, the odd creative thing — all of it lives as site.standard.document records on my PDS, which means all of it lives as block trees. Richtext blocks, facets with byte-slice annotations, nested lists, images as blob references. Great for a federated document store. Opaque to everything else.
Converts site.standard.document records to Markdown with math and code highlighting.
Full OAuth flow for importing Instagram posts to AT Protocol as Grain/Spark records.
Package for fetching and displaying GitHub repository metadata.
Convert richtext-block documents from the Standard.site ecosystem (Leaflet, Pckt, Offprint) to Markdown — available as both a CLI tool and a TypeScript library.
Ko-fi and GitHub Sponsors webhooks, Popfeed review cards, and crypto donation addresses.
A WAFRN theme using the pds-landing Catppuccin terminal aesthetic — dark forest-green palette, JetBrains Mono, soft rounded cards.
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.
SvelteKit component library for displaying Ko-fi supporters and GitHub Sponsors, backed by an ATProto PDS.