The stack

Every tool I built
fixes a problem
the last one made.

I wanted a running plan, so I built Pheidi. Pheidi needed people to hear about it, so I built Merge & Tell. Then the robots running my repos drifted apart, so I built NightForge. Then every page wanted fresh screenshots, so I built Screenery. Now they all run each other. (It's turtles. Very productive turtles.)

4

tools that feed each other

1,400+

commits across them in 2026

1

human, plus a team of agents

0

screenshots exported by hand

The web

Each arrow is something one project really does for another, today, in the code. No aspirational arrows. The dashed ones are labeled as next.

How my projects feed each other. The full list of links follows the picture. Merge & Tell → Pheidi: Drafts the posts for every Pheidi merge, for @pheiditraining on X, Bluesky, and Mastodon. Pheidi → Merge & Tell: First real customer. A Pheidi PR where three cards disagreed about one channel rebuilt Merge & Tell's PR page. Screenery → Pheidi: Hosts Pheidi's docs screenshots, Play Store shots, and listing video. A test fails the build if the pictures and the pages drift apart. Pheidi → Screenery: The worked example in Screenery's own CI-setup tests. Pheidi → NightForge: sync-docs, the skill that keeps docs honest, was born in Pheidi and ported into NightForge. NightForge → Pheidi: Runs Pheidi's weekly docs sweep, nightly error sweep, and CodeRabbit re-reviews. NightForge → Merge & Tell: Runs Merge & Tell's weekly docs sweep and CodeRabbit re-reviews. NightForge → Auspex Fatalis: Runs the Auspex Fatalis docs sweep through its own sync-docs port. Screenery → Merge & Tell: Reshoots every Merge & Tell screen on each merge. Public pages use Screenery shots by name, as a rule. Screenery → Auspex Fatalis: Posts a screenshot gallery on every Auspex Fatalis pull request, and serves the help-article images. Screenery → This site: Every live screenshot on this site. Nobody here exports a PNG by hand. Merge & Tell → This site: Writes the 'Recent updates' on the product pages here, from the PRs that shipped them. Merge & Tell → Auspex Fatalis: Drafts the posts for Auspex Fatalis merges, steered by the repo's .marketing.yml. EventBell → Merge & Tell: EventBell's placeholder splash page taught Merge & Tell to leave a field empty instead of inventing one. Merge & Tell → Screenery: Screenery's merges get drafted posts too. Merge & Tell → NightForge: NightForge's skill changes get drafted posts too. Pheidi Merge & Tell NightForge Screenery this site EventBell Auspex Fatalis
Solid lines are wired up today. Dashed ones are next. Hover a line for what it does, click it for the story.

How it happened

In order, with dates from the git history. Each chapter starts with the problem the chapter before it caused.

  1. I needed a running plan

    Pheidi started in 2019 as an Angular toy, then sat untouched for five years. In March 2026 I restarted it with a spec and a team of agents. It's past 700 commits since then. Plans that bend when you get hurt or go on vacation, which is exactly what I needed.

  2. Then nobody heard about it

    Pheidi was shipping every day and telling zero people. I'd merge a two-day fix and already be on the next branch. So I built Merge & Tell: every merged PR becomes a drafted post, and I only have to say yes.

  3. Then the robots drifted

    Now I had several repos, each with a hand-written nightly sweep that read the error logs and opened fixes. In about two months they drifted into three different pipelines. One rediscovered its whole backlog every night. NightForge is the one pipeline they all run now.

  4. Then the screenshots went stale

    Docs, store listings, product pages, and Merge & Tell posts all wanted pictures of the app. Mine were frozen PNGs from whenever someone last remembered. Screenery makes CI push them and gives each one a URL that updates on release. Spec to published CLI in under two weeks.

  5. And then this site

    The page you're reading pulls its screenshots from Screenery and its update notes from Merge & Tell. It's less a portfolio and more the place where all of it lands.

The stories

One project helping another, told with the real pull requests, the real bugs, and the real numbers.

My running app's pull requests write their own posts

Merge & Tell × Pheidi

I shipped Pheidi every day and told nobody. Merge & Tell turns each merge into a drafted post. Then a Pheidi PR where three cards disagreed rebuilt Merge & Tell's own PR page.

Screenshots that fail the build when they lie

Screenery × Pheidi

Pheidi's docs, Play Store listing, and promo video all come out of CI through Screenery. A test reads the source as a syntax tree so a stale screenshot can't sneak through.

Three robot sweeps drifted, so I built a factory

NightForge × every repo

Hand-written nightly sweeps turned into three different pipelines in two months. One wrote 24 KB of the same findings every night. NightForge is the one pipeline they all share now.

Build the thing. Then build the thing that tells people.