Monthly GitHub Actions workflow that scans your repositories for missing sponsor links and opens pull requests to add them.
Unbroke pnpm install and type-checking, added robots.txt/sitemap.xml and canonical URLs, fixed the same duplicate-ToC-anchor bug as docsite, and pinned dependencies after a floating "latest" broke a sibling repo.
Fixed a broken pnpm install and a no-op Prettier config, then shipped real SEO routes and fixed an email header-injection and unsafe social-link bug in the contact form.
Unbroke a pnpm install, replaced the untouched scaffold README with a real one, and typed the remote PDS responses instead of trusting them as any.
The ATProto MCP server was wired into a working state with public and authenticated Bluesky tools, tests, and docs.
Go 1.26 rebuilt go fix on the analysis framework. It modernizes your code and respects the Go version your module declares. The post covers the modernizers, the bigger x/tools suite, and what //go:fix inline can and can't migrate.
The Minefetch Paper plugin added a GitHub release update checker, cross-platform host support, and on-demand sysinfo refresh.
mc-server and minefetch add cross-platform host support with PowerShell file watcher
Removed sequoia.json from pkgs to maintain clear separation of project-specific configurations.
CSS @property has been Baseline for almost two years, but most existing projects still do not use it. A small experiment in the CSS Property Type Validator generates a reviewable first draft of @property registrations from the custom properties you already have.
Adding AGENTS.md and llms.txt files across repositories to improve AI discoverability and documentation.
How cmd/go's script tests led me to testscript, and how to use it for CLI tests that exercise argv, stdout, stderr, exit codes, and scratch files.
Added OG hero SVGs to all five project landing pages, bismuth fetch flags, and devlog project to croft-click
Replaced astronomical season detection with traditional Wheel of the Year sabbat dates, added midnight auto-update and reset-to-seasonal
Created the digital-person agent repository
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
txtar is a tiny plain-text archive format Russ Cox introduced in 2018 for multi-file test fixtures. The Go Playground, cmd/go's script tests, gopls's marker tests, and rsc.io/rf all reach for it.
Added publication fetching, expanded conversion options, and rebuilt parts of the converter UI.
OG image URLs were relative — crawlers need absolute URLs. Index page was also missing an OG image entirely.
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.
Every devlog entry was invisible on load — $state on an IntersectionObserver variable caused the effect to disconnect it before it could fire.
Umami analytics retired — all Umami script tags removed from bismuth-web, malachite-web, jasper-web, opal-web, and croft-click.
Split the monolithic layout.css and inline page logic into focused modules and components.
Porting the entire site from SvelteKit to Astro for ultimate static performance and a terminal-inspired layout.
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.
Convert Instagram data exports into posts, stories, and videos on Grain or Spark while preserving original timestamps.
Full OAuth flow for importing Instagram posts to AT Protocol as Grain/Spark records.
Started using Letta Code — a persistent coding agent with memory. 80 commits across 15 repositories in four days.
Scripts for populating and maintaining the Sifa professional profile on AT Protocol.
Added pre-commit hooks and Nix flakes to all 30+ projects for consistent dev environments.
Convert richtext-block documents from the Standard.site ecosystem (Leaflet, Pckt, Offprint) to Markdown — available as both a CLI tool and a TypeScript library.
A WAFRN theme using the pds-landing Catppuccin terminal aesthetic — dark forest-green palette, JetBrains Mono, soft rounded cards.
Source code for docs.ewancroft.uk — a documentation site for ewan's projects, built with SvelteKit and published via Sequoia.
Some MCP servers for web standards and specifications.
This blog has been updated to use vinext, a Vite-based framework that provides a Next.js App Router-compatible API.
SvelteKit component library for displaying Ko-fi supporters and GitHub Sponsors, backed by an ATProto PDS.
Rust CLI tools for managing nixos/nix-darwin configurations — now part of the @ewanc26/pkgs monorepo.
SvelteKit template with Resend-backed contact form and dark mode.
Zero-dependency, spec-compliant AT Protocol TID generation for Node.js and browsers.
A server-side AT Protocol link shortener powered by your Linkat board. No database required.