From colophon-skills
Review a colophon site's received webmentions for spam/abuse and distill the bad ones into small, general glob rules in the committed blocklist (.colophon/webmention-block.yml), so moderation survives the cache's full regenerate. Use when the user asks to moderate, clean up, or block webmention spam/replies.
How this skill is triggered — by the user, by Claude, or both
Slash command
/colophon-skills:colophon-moderate-mentionsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Received webmentions are third-party content, so some will be spam or abuse. colophon's
Received webmentions are third-party content, so some will be spam or abuse. colophon's
moderation is a declarative, committed blocklist of glob rules over a mention's attributes,
applied at webmention fetch (and again at build). It must be declarative because fetch
fully regenerates the cache each run — editing the generated JSON is pointless, it gets
overwritten. Your job: find the bad mentions and turn them into the smallest, most general
rules that catch them (and their likely siblings) without catching legitimate replies.
The user wants to moderate inbound mentions — "block this spammer", "clean up the replies",
"my webmentions have spam". Not for sending (that's webmention send).
This skill drives the colophon CLI. Before the first command, confirm it's installed:
command -v colophon || echo "colophon not found"
If missing, stop and offer the install — don't install silently:
go install github.com/jmylchreest/colophon/cmd/colophon@latest (or a release binary).
Refresh and inspect the current mentions:
colophon webmention fetch -v # pulls + applies the existing blocklist; writes the cache
Then read .colophon/cache/webmentions/**/*.json — each is {target, mentions: [{type, author{name,url,photo}, url, content, published}]}.
Classify. For each mention decide: keep (genuine reply/like/repost), or block (spam, abuse, link farms, off-topic promotion). When unsure, lean keep and surface it to the user — false positives silence real people.
Distill, don't enumerate. This is the point of the skill: instead of listing every bad URL, find the pattern and write one rule. Prefer, in order:
- "*.spam.example"- author.url: "https://troll.example/*"- content: "*free crypto*"- type: "bookmark"Collapse several individual bad mentions into the fewest rules that cover them. Keep the list small and effective — re-read existing rules and merge rather than append duplicates.
Write the blocklist at .colophon/webmention-block.yml (create if absent). It's a YAML
list; each item is a bare string (matches the author/source domain or author URL) or a
{field: glob} mapping. Fields: domain, url, author.name, author.url, content,
type. Globs use * (any run) and ? (one char), case-insensitive, anchored to the value.
# .colophon/webmention-block.yml — committed; survives fetch's full regenerate
- "*.linkfarm.example"
- author.url: "https://troll.example/*"
- content: "*casino*"
Verify the rules catch what you intended and nothing else:
colophon webmention fetch -v # re-run: the log shows "blocked N"; confirm the count
Spot-check the cache that a legitimate reply you expected to keep is still present.
Commit the blocklist (it's authoritative and must travel with the repo) and publish the refreshed mentions:
git add .colophon/webmention-block.yml
colophon webmention publish --env production --allow-publish # deploys only _mentions/
fetch won't return it. The committed blocklist is the version-controlled,
reproducible path and the right home for anything recurring.live display mode ships the glob rules to the browser for client-side filtering, so a
domain/author.url/content glob works there too; field precision and any future semantic
rules apply server-side only.published date or one-off urls unless truly necessary — those don't
generalise and bloat the list.Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
Guides reception of code review feedback: verify before implementing, avoid performative agreement, push back with technical reasoning when needed.
Creates platform-native content for X, LinkedIn, TikTok, YouTube, and newsletters from source material. Adapts voice and format per platform while avoiding engagement bait and filler.
npx claudepluginhub jmylchreest/colophon --plugin colophon-skills