From releases
How the Releases fetch and parse pipeline works — covers feed vs scrape adapters, incremental vs bulk parsing, dry-run testing, crawl mode, content hashing, and enrichment
How this skill is triggered — by the user, by Claude, or both
Slash command
/releases:parsing-changelogsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
How the Releases fetch pipeline converts changelog pages into structured release data.
How the Releases fetch pipeline converts changelog pages into structured release data.
The fetch pipeline follows this priority order:
metadata.feedUrl), fetch and parse the feed directly. Fastest and most reliable.metadata.markdownUrl is set, fetch raw markdown instead of rendered HTML.render: false. ~10-30x faster than full rendering. Controlled by provider staticContent hint or per-source renderRequired metadata.After fetching content, the pipeline parses it:
--full is specified.Trigger a fetch for a source by ID or slug. CLI: releases admin source fetch <slug> [--dry-run] [--max <n>]. Typed tool: manage_source action "fetch" with identifier (ID or slug) param.
Key CLI flags (not available via typed tool — the typed tool always does a full server-side fetch):
--dry-run — parse but don't persist. Essential for validation.--max <n> — limit releases to extract (default: 200).--full — bypass incremental parsing, force full re-parse.--crawl / --no-crawl — enable/disable crawl mode.After fetching, verify releases were persisted. CLI: releases tail <slug> --json or releases admin source fetch-log <slug>. Typed tool: get_latest_releases with source param. Use get_organization (or releases admin org get <slug> --json) to see the full picture of an org's sources.
--full): Parses the entire page content into releases. Used when no releases exist yet or when you suspect the incremental parser missed something.Each fetch computes a SHA-256 hash of the page content. If the hash matches the previous fetch, parsing is skipped entirely (no AI calls). This prevents redundant processing when a page hasn't changed.
For index-style pages that link to individual release pages:
Enable with --crawl flag or by setting metadata.crawlEnabled: true on the source.
Automatic detection: The feed adapter now auto-detects title-only feeds — if every item has fewer than 20 characters of content, the feed is marked feedContentDepth: "summary-only" and fetchViaFeed returns null, causing the scrape adapter to fall through to crawl or single-page extraction. This handles the worst case (feeds like Notion, Apollo, LangChain, LaunchDarkly that carry only <title> + <link> with no <description> or <content:encoded>) without manual intervention. Once marked, the flag persists and subsequent fetches skip the feed entirely.
Manual assessment is still required for partial-content feeds. Auto-detection only catches completely empty content. Many feeds provide decent text summaries but the actual pages have significantly richer content — product screenshots, video demos, detailed code examples, and inline media that the feed strips out.
The anti-pattern to avoid: fetching the bare changelog index, seeing that content came back, and declaring success without ever checking whether each release has a dedicated article page with more detail. A paragraph of feed text is not evidence that the page is equally thin.
When to check: After every feed fetch where feedContentDepth is not already set. Do not skip this because feed entries have multiple sentences. The question is not "does the feed have some content?" but "does the actual page have substantially more?"
How to check: Dispatch a bulk-worker subagent to sample 2-3 release URLs. Prompt the subagent:
"Fetch these URLs with WebFetch and compare the page content against these feed summaries. For each URL, report: (1) how much content is on the page vs the feed summary, (2) whether there are images, screenshots, or embedded videos (YouTube, Vimeo, Loom), (3) whether there are code examples or detailed explanations not in the feed. Summarize your findings."
Do NOT fetch release URLs in the parent agent — always delegate to a subagent to keep your context window clean.
What to do based on the result:
If pages are richer than feed content (more text, images, videos, or code examples):
releases admin source update <identifier> --metadata '{"feedContentDepth":"summary-only","crawlEnabled":true}'. Typed tool: manage_source action "edit" with the same metadata. Subsequent fetches will follow links to per-release pages and extract full content in one pass.releases admin source fetch <slug> --full. Typed tool: manage_source action "fetch".releases list <slug> --json or releases tail <slug>. Typed tool: get_latest_releases — check content is richer after the re-fetch.If feed already provides full content with no meaningful additions on the page:
feedContentDepth: "full" so future sessions skip the sampling step.Once feedContentDepth is set, skip the sampling step on future encounters. Crawl mode handles the rest during normal fetches — there is no separate enrichment phase.
Per-source AI instructions: If a source has unique content patterns (e.g., videos always embedded, unusual changelog format), note this in the discovery state so parseInstructions can be set later via the CLI.
Engineering blogs and news pages mix product announcements with educational content, opinion pieces, and corporate news. They can be useful supplementary sources but require aggressive filtering via parseInstructions to avoid noise.
Before working with blog sources: Check the org's playbook (releases admin playbook <org>) for notes about how existing blog sources perform, what filtering works, and which products they cover.
When to add a blog source:
How to configure:
--type scrape with --priority low (blog pages change infrequently)parseInstructions that tell the AI what to include and — more importantly — what to skipreleases admin source fetch <slug> --dry-run to check signal-to-noise ratioWriting effective parseInstructions for blogs:
Example parseInstructions for an engineering blog:
ONLY extract posts that announce a NEW product, feature, tool, service, or capability.
Signals: titles containing "Introducing", "launching", or describing something new.
SKIP: best practices guides, benchmark analyses, eval methodology, postmortems,
technical deep-dives, and educational content. When in doubt, skip.
Example parseInstructions for a corporate news page:
ONLY extract posts about: (1) new model launches, (2) major new product features or services,
(3) significant platform capability announcements. Skip all: partnerships, MOUs, policy statements,
office openings, funding, acquisitions, research publications, safety reports, and opinion pieces.
Versioning: Blog posts don't have traditional version strings. Set parseInstructions to tell the AI that dates are not versions (same as for date-headed changelogs like Claude's consumer release notes).
Content depth: Blog index pages typically show card summaries, not full post content. The extracted releases will have thin content. Enable crawl mode (--crawl) to follow links to full posts if richer content is needed, but this is expensive — only enable for high-value sources.
Every release should get a publishedAt if one can be recovered from the page, even an approximate one — sources with no dates drop out of the release feed's time-based views entirely.
2026-03-03.2026-04-01. Many API changelogs (e.g. Brex Developer API) group entries by month; this is the right call, not "omit date."2025-07-01, Fall → 2025-09-01).2025-01-01.publishedAt. Only do this if there truly is no date signal anywhere — check adjacent headings, breadcrumbs, and the URL slug before giving up.Approximation is better than omission. A release with an approximate month-start date still surfaces in sort orders, "last 30 days" windows, and monthly groupings.
Most releases are features — individual version bumps, single product announcements, or tight incremental changelog entries. Some are rollups — seasonal, quarterly, or annual catch-all pages that collect many already-shipped features into a single banner post. The parser assigns each release a type field so agents and the web UI can treat them differently.
When to set type: "rollup":
publishedAt moment).shopify.com/editions/summer2025, twice-yearly microsite with 100+ features), Brex Fall Release, Ramp quarterly blog posts, Vercel Ship recaps, Stripe Sessions roundups, AWS re:Invent summaries.When NOT to set rollup:
How to recognize rollup sources:
Before parsing, always read the playbook (CLI: releases admin playbook <org>, typed tool: manage_playbook action "get" with organization param). If a company publishes rollups as its primary cadence — quarterly, seasonal, "every few months" — the playbook notes should say so explicitly. Example notes:
/product-announcements/{fall,spring,summer,winter}-release-YYYY. Treat each as type: rollup."/blog/new-on-ramp-*-edition and /new-on-ramp-q*-* are quarterly/monthly rollups. Classify as type: rollup; individual features within are not separately indexed."/editions/{summer,winter}YYYY — index page at /editions lists all of them. Each Edition is a type: rollup with 100+ features under themed sections; crawl mode needed to pull the full page."When you encounter a new rollup source during discovery or fetch, update the playbook notes so future fetches classify correctly without re-deriving the pattern. See the managing-sources skill for how to update notes.
Leave type unset or "feature" by default. Only mark rollup when the signals are clear.
When adding a new source, always validate before committing:
releases admin source fetch <slug> --dry-run then releases admin source fetch <slug>. Typed tool: manage_source action "fetch" with identifier (ID or slug).releases tail <slug> --json or releases admin source fetch-log <slug>. Typed tool: get_latest_releases with source identifier.releases admin source update <identifier> --type feed. Typed tool: manage_source action "edit" with identifier.releases admin source delete <slug> --ignore --reason "...". Typed tool: manage_source action "remove" with identifier, then exclude_url.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub buildinternet/releases-cli --plugin releases