gray.bot is a live editorial site about apparel, tech, home objects, vehicles, art and film. Its pipeline finds material, drafts and evaluates posts, and leaves publication to a person.
The architecture
A TypeScript worker scrapes sources into immutable files. Sharp detects gray from each image's pixels rather than its tags or captions.
An LLM drafts posts, and an automated stage evaluates their quality. Human review gates publication and retains the final editorial decision.
No database, no hidden state
Data moves from immutable scraped data in raw/ to editable posts in wiki/, then into a static build. Files are the source of truth, git is the audit trail, and editorial decisions remain visible as diffs.
Scraped inputs remain intact while editorial changes accumulate in the wiki. The static build consumes this visible state without another store that can drift from the files.
The publishing layer
Astro builds the static site for Cloudflare Pages, with images stored on Cloudflare R2.
What the filter is tuned for
The objective is recall against a capped review burden rather than accuracy, because a person approves every post: a miss costs the product, and a wrong admission costs one click. Against 30 candidates carrying human verdicts, the shipped rule recovers all 5 that were approved while surfacing 9 for review. The rule it replaced recovered 3, and every alternative that also reached 5 surfaced 11 or more.
Five pixel-only approaches to subject isolation were measured against that set, and all five scored worse than shipping nothing, 27 of 30 at best against a do-nothing baseline of 28. The negative result was written up and the approach closed rather than tuned further. The evaluation set stores measured frame statistics instead of images, so it replays offline and deterministically, and the repository holds no copies of other people's photographs.
Current state
The pipeline and the Astro interface run on Cloudflare Pages, with automated evaluation and a human gate before publication. One seed post is published so far. Repository files are the source of truth for text, with two exceptions worth naming: images live on Cloudflare R2, and the deduplication index is rebuilt on every run rather than tracked.
Ken Faiman · Applied AI, agent & evaluation systems · faiman.com