---
name: Releases CLI
slug: releases-cli
type: github
source_url: https://github.com/buildinternet/releases-cli
organization: Releases
organization_slug: releases-sh
total_releases: 117
latest_version: v0.73.1
latest_date: 2026-07-28
last_updated: 2026-08-15
tracking_since: 2026-04-20
canonical: https://releases.sh/releases-sh/releases-cli
organization_url: https://releases.sh/releases-sh
---

<Release version="v0.73.1" date="July 28, 2026" published="2026-07-28T22:23:17.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.73.1">

### Patch Changes

- 7fe55de: `source backfill --dry-run` now reports how much of the extracted history the source doesn't already have, as `N not yet stored`. Previously the dry-run line reported only how many entries were on the page, which said nothing about whether any of them were missing — during the 2026-07-23 ingest outage that gap let a run over a source missing its entire recent history read as uneventful. Requires an API worker carrying the new `notStored` field; against an older server the clause is omitted rather than guessed. The report type also catches up with the server: `inserted` is `null` on a dry run (nothing was written, no count computed) rather than a fabricated `0`.
- b124608: Fix `getApiUrl()` memoizing the API base URL process-wide on first call. Under `bun test`, every test file shares one process, so whichever file called it first locked the base URL for the rest of the run — files that set `RELEASES_API_URL` afterward got the stale (production) URL instead and their assertions failed. This was silently CI-red on `main` (22 tests failing) because CI's clean environment produces a call order that trips the memoization, while a developer machine with real credentials hits a different, unrelated set of failures. `getApiUrl()` now re-resolves from the environment on every call instead of caching.
- f7a1b54: Fix `releases stats` reporting every source as never-fetched with zero recent releases. The command composed its summary from the legacy flat fields of `/v1/stats` and hardcoded source health, `releasesInPeriod`, and every `lastFetchedAt` to `0`/`null` — a stale workaround from before the endpoint returned the full `StatsSummary` shape. It now reads the server's real values, so the output reflects actual ingestion health instead of implying the index is dead.
</Release>

<Release version="v0.73.0" date="July 13, 2026" published="2026-07-13T19:51:41.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.73.0">

### Minor Changes

- 88999c9: `releases search --json` now passes AI-scored `importance` (1–5) through in the slim search-hit shape, normalized to `null` when unscored — same norm as `get` / `tail` / `latest`. The TTY search table also marks importance ≥ 4 with the quiet glyph. Bumps `@buildinternet/releases-api-types` to `^0.48.0` for the search/related/digest wire field (monorepo #2135).

### Patch Changes

- e97462a: Surface a NODE_EXTRA_CA_CERTS / SSL_CERT_FILE hint on TLS certificate verification failures, and document custom-CA support (TLS-intercepting proxies) in the README.
</Release>

<Release version="v0.72.0" date="July 11, 2026" published="2026-07-11T04:48:35.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.72.0">

### Minor Changes

- 0b1a45e: Remove the deprecated `get_source_changelog` tool from the local stdio MCP bridge. It was deprecated in 0.71.0 in favor of `get_catalog_entry` with the `changelog_*` params (`include_changelog` / `changelog_path` / `changelog_offset` / `changelog_limit` / `changelog_tokens`); calling `get_source_changelog` by name now returns MCP's standard unknown-tool error. The REST helper `sourceChangelog()` is unchanged — `get_catalog_entry` and the `admin source changelog` CLI command still use it.
- e7d50b4: `releases search` gains `--category <slug>` and `--collection <slug>` filters. `--category` scopes hits to organizations in a category (the API validates and resolves curator aliases like `e-commerce` → `commerce`, so the value is forwarded as-is); `--collection` scopes to a curated collection's member orgs (unknown slugs report "no collection matching …", mirroring `--domain`). Both forward to the new `/v1/search` params and compose with the existing `--domain` / `--product` / `--kind` / `--since` / `--until` scopes.
- 2d4b707: Surface the registry's AI-scored release `importance` (1–5, `null` when unscored). `tail`/`latest` gains `--min-importance <1-5>` (forwarded as `?minImportance=`); the human table marks importance ≥4 with a quiet glyph (outline at 4, solid at 5), mirroring the web's render threshold, while `--json` output (`get`/`tail`/`latest`) passes the raw score through verbatim, including `null`. Bumps the `@buildinternet/releases-api-types` and `@buildinternet/releases-core` pins to the versions that carry the `importance` field.
</Release>

<Release version="v0.71.0" date="July 10, 2026" published="2026-07-10T12:26:56.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.71.0">

### Minor Changes

- 735ba8a: The local stdio MCP bridge's `get_catalog_entry` tool now accepts `include_changelog`, `changelog_path`, `changelog_offset`, `changelog_limit`, and `changelog_tokens` — matching the hosted server at mcp.releases.sh — so a source entry's tracked CHANGELOG can be inlined or sliced in the same call, without a separate lookup. `changelog_tokens` takes precedence over `changelog_limit`, and any `changelog_*` param implies `include_changelog`; the params are ignored (with a clear message) for product entries. The standalone `get_source_changelog` tool is now deprecated in favor of these params — it remains registered and functional for this release, but agents should migrate.
- 7ba0ebd: `releases org get` now renders stub-tier orgs (#1947): a `stub · not yet tracked` marker on the header and a `Declared locations` section listing each declared locator (kind, target, `canonical` flag), plus a hint to promote. Previously a stub printed as a bare identity block with no indication it was a declared-but-untracked listing. `--json` output is unchanged.

### Patch Changes

- 64951a6: Add `releases admin release refetch <releaseId>` to re-fetch a single release's live page and heal it in place (title/content/publishedAt, same `rel_` id). Supports `--url` for releases whose stored URL is a synthesized `#fragment` index anchor, defaults to a dry-run preview, and writes with `--apply`.
- abeab6e: Consolidate agent skills by audience: this repo now ships only the three user-facing skills (`releases-mcp`, `releases-cli`, `analyzing-releases`). The `releases-admin` plugin, its five mirrored operator skills, and the `discovery`/`worker` agent definitions are removed — the canonical operator skills live in the backend monorepo's `.claude/skills/` tree. The `@buildinternet/releases-skills` npm wrapper is retired (removed from the workspace and the changesets fixed group; deprecated on npm). `npx skills add buildinternet/releases-cli` and `releases skills install` continue to work unchanged.
</Release>

<Release version="v0.70.1" date="July 9, 2026" published="2026-07-09T02:30:48.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.70.1">

### Patch Changes

- cee0540: Fix overview stale warning to use content write time (`updatedAt`) instead of original generation time. Amended overviews no longer show as months-old when recently rewritten.
</Release>

<Release version="v0.70.0" date="July 9, 2026" published="2026-07-09T00:14:03.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.70.0">

### Minor Changes

- eaa4ad1: Add `releases json export <org>` — generate a `releases.json` v2 domain manifest from an already-tracked org. Reconstructs the manifest from what the registry knows about the org (products + release sources) by calling the backend `GET /v1/orgs/:slug/manifest` endpoint, so an owner can host the result at `/.well-known/releases.json` and take ownership of their listing. Prints to stdout by default (pipeable into `releases json validate -`) or writes to a file with `-o/--output`. Completes the owner round-trip alongside `releases json validate`. Re-ingest enriches missing fields only (fill-if-empty), never overwriting existing values.

  Bumps `@buildinternet/releases-api-types` to `^0.41.0` for the product-level `tags` field, so `releases json validate` accepts manifests that declare product tags. `json export` itself trusts the backend and does not strict-validate the API response against the pinned schema (the deployed API can run ahead of the published types), so it only guards for a `version: 2` shape.
</Release>

<Release version="v0.69.0" date="July 8, 2026" published="2026-07-08T20:21:32.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.69.0">

### Minor Changes

- f1f11ae: `releases json validate <domain>` now validates live against the registry's listing endpoint (previously deferred). The domain form POSTs the public `/v1/listing/validate` endpoint and renders the verdict plus the materialization plan — identity, products, and each release locator with its classification ("goes live" / "reviewed first") — ending with an activation pointer for unlisted domains. Exit codes: 0 valid, 1 invalid or check failed (the old unconditional exit 2 is gone). `--json` emits the raw `ListingValidationResult` merged with `{ target }`. Bumps `@buildinternet/releases-api-types` to ^0.39.0 for the listing wire types.
- af88692: `releases admin release update` (and its deprecated `release edit` alias) now accept a `--url <url>` flag to set a release's canonical URL. Passing a non-empty value sets the URL; passing an empty string (`--url ""`) clears it. The backend `PATCH /v1/releases/:id` route already accepted the `url` field — this wires it through the CLI.
- 042efbd: Add stub-tier org verbs (buildinternet/releases#1947): `releases admin org create-stub` (curator-authored stub org with repeatable `--location` JSON locators and/or `--from-file`), `releases admin org create-stub-from-domain <domain>` (stub from a domain's `/.well-known/releases.json` manifest, `--dry-run` supported), and `releases admin org promote <slug>` (materialize declared locations into sources and flip the org to tracked, `--dry-run` supported). Bumps `@buildinternet/releases-api-types` to ^0.38.0 for the stub-tier wire types.
</Release>

<Release version="v0.68.0" date="July 5, 2026" published="2026-07-05T18:02:58.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.68.0">

### Minor Changes

- c1e5ee6: Add `releases json validate <path>` — validate a `releases.json` v2 owner manifest against the published schema (`ReleasesJsonConfigSchema`) before publishing it. Accepts a file path or `-` for stdin, detects the hosting scope (domain vs repo) for readable path-anchored errors, and supports `--json` for machine output (exit 0 valid / 1 invalid). The `domain` form (live fetch + materialization plan) is deferred until the public dry-run endpoint lands (buildinternet/releases#1910) so web and CLI share one verdict.

### Patch Changes

- cf95da6: Adopt `@buildinternet/releases-api-types` 0.37.0 (releases.json v2 schema) and migrate the repo-root `releases.json` to the v2 manifest format (product binding + `github: "self"` release locator).
</Release>

<Release version="v0.67.3" date="July 4, 2026" published="2026-07-04T19:02:52.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.67.3">

### Patch Changes

- 9fae093: `releases admin org update --overview-cadence <days|auto>` — pin an org's automated overview-regen cadence (1–90 days) or clear back to the velocity-tiered automatic default; `releases admin org get` shows the override when set (buildinternet/releases#1895).
- cb01cc2: Removed `releases admin overview batch` — its API route was retired in buildinternet/releases#1902; use the automated overview regen (per-org cadence) or `--overview-cadence` instead.
</Release>

<Release version="v0.67.2" date="July 4, 2026" published="2026-07-04T15:41:47.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.67.2">

### Patch Changes

- b8d7f2f: Read API error messages through api-types' canonical `decodeApiError` instead of a hand-rolled envelope reader. Behavior is unchanged — the nested `{ error: { code, type, message } }` envelope, a legacy flat `{ message }` body, and malformed payloads (which fall back to the HTTP status text) all resolve exactly as before — but the CLI now shares the published wire-shape decoder rather than duplicating it. Bumps `@buildinternet/releases-api-types` to `^0.35.0` and `@buildinternet/releases-core` to `^0.25.0` (the versions that first export the errors module).
</Release>

<Release version="v0.67.1" date="July 2, 2026" published="2026-07-02T20:41:17.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.67.1">

### Patch Changes

- 9a286fa: Read API error messages from the standardized nested error envelope. The API now
  returns `{ error: { code, type, message } }`; the CLI was still reading a
  top-level `body.message`, so non-2xx responses surfaced a generic status text
  (e.g. "Bad Request") instead of the server's actual message. A new
  `apiErrorMessage()` reader pulls `error.message` (tolerating the legacy flat
  `{ message }` body), restoring precise error output.
</Release>

<Release version="v0.67.0" date="July 1, 2026" published="2026-07-01T14:38:00.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.67.0">

### Minor Changes

- bf51f1b: Add `--auto-generate-content` / `--no-auto-generate-content` to `releases admin org update` — the single backend gate that decides whether an org gets AI overviews and per-release summaries. Previously the only way to toggle it was a raw `curl` PATCH. `releases admin org get` now shows the current value, and `releases admin overview plan` surfaces an `opted_out` action for orgs the batch skips because the flag is off.
</Release>

<Release version="v0.66.0" date="June 24, 2026" published="2026-06-24T20:03:35.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.66.0">

### Minor Changes

- 26e14ad: Add `--format slack` to `releases webhook add`/`edit` to deliver releases as formatted Slack messages via a Slack incoming webhook URL.
</Release>

<Release version="v0.65.0" date="June 24, 2026" published="2026-06-24T00:39:18.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.65.0">

### Minor Changes

- 5d70021: Agent-DX: uniform `dryRun: true` marker on every dry-run output, and `--dry-run` for the mutations that lacked it.
  - Every `--json` dry-run payload now carries a uniform `dryRun: true` marker (via the new `markDryRun` helper in `src/lib/dry-run.ts`), additively — each command keeps its existing preview fields (`status: "would-add"`, `wouldUpdate`, `wouldRemove`, `wouldPost`, …). An agent can now detect "this was a preview, not a write" without per-command knowledge.
  - Added `--dry-run` to the mutations that previously had none: `follow`/`unfollow`, `keys create`/`keys revoke`, `admin webhook add`/`edit`/`remove`/`test`/`rotate-secret`, and `admin onboard apply` (per-source would-action preview, no writes).
  - `admin release delete --source` and `import` gained a `--json` dry-run body where they previously printed only text.

- e806807: Agent-DX: `--fields` projection mask on the reader commands.

  `--fields id,version,source.slug` post-filters `--json` output down to a comma-separated mask (dot-notation for nested keys), so an agent can pull exactly the leaves it needs and spend fewer tokens.
  - Available on `get` (release/source/org/product), `search`, and `tail`/`latest`.
  - It's a post-projection over whatever shape the reader produced, so it **composes with `--full`** (mask the full payload) and reuses the slim vocabulary by default — no new field names to learn.
  - Dot-notation walks plain objects only (request an array-valued field like `media` whole). A field that resolves nowhere is dropped with one stderr warning; `--fields` without `--json` warns and is ignored, matching `--full`.
  - Generic backend in `src/lib/fields.ts` (`projectFields`/`applyFieldMask`), reusable for future readers.

- 292b1c8: Agent-DX: `--page-all` streams every page of a list reader as NDJSON.

  `releases list --json --page-all` (and `org list` / `admin product list`) walks every page itself and emits one source/org/product per line as newline-delimited JSON, instead of returning a single `{ items, pagination }` page the caller has to paginate by hand.
  - One agent command consumes a whole result set — no `--page`/`--limit` bookkeeping, no truncation warning to react to.
  - NDJSON keeps memory flat and lets a consumer (`jq -c`, a stream parser) process rows as they arrive rather than buffering one giant array.
  - `--json`-only, like `--full`/`--fields`: without `--json` it warns and falls through to the normal table. `--page-all` together with `--page` is rejected (they contradict). `--limit` still sets the per-request page size as a round-trip tuning knob.
  - Shared backend in `src/lib/paginate.ts` (`streamAllPages`), reusable for future page-based readers.

- 403738a: Agent-DX: raw JSON payloads for source mutations via `--input`.

  `releases admin source create` and `releases admin source update` now accept a `--input <json>` body, so an agent can send the request shape directly instead of reverse-mapping it onto a dozen bespoke flags. Pass a literal JSON string, `@<path>` for a file, or `-` for stdin.
  - The body maps to the **CLI input shape**, not the raw API — dedup, org-resolution, metadata-packing, and validation still run. `create --input` mirrors a `--batch` element (`name`/`url`/`type`/`org`/`metadataSet`/…); `update --input` maps to the update fields plus a convenience `metadata` object (each key set directly, a JSON `null` value deletes it).
  - `--strict`/`--dry-run`/`--json` remain execution modifiers from the flags (the body never sets them). On `create`, `--input` is mutually exclusive with `--batch`.
  - Invalid JSON and shape errors throw `CliError`, so they serialize to the structured `{ error }` payload under `--json`.

### Patch Changes

- 624370c: Agent-DX hardening: structured `--json` errors and input validation.
  - When `--json` is set, thrown errors now emit a parseable `{ error: { kind, message, status?, method?, path?, field? } }` payload on stdout (with a non-zero exit) instead of an unstructured stderr dump. Without `--json`, known error types (API + invalid-input) print a clean one-line message rather than a stack trace.
  - User-supplied identifiers are validated before any network call — control characters, `..` traversal, `%` percent-encoding, embedded `?`/`#`, whitespace, and backslashes are rejected at the entity resolvers (`findOrg`/`findProduct`/`findSource`/`getRelease`). `apiFetch` gains a control-character backstop, and file-reading flags reject `..` traversal.

- c0c91f1: Fix: streaming output (`--page-all`, `tail -f --json`) now exits cleanly when a reader closes the pipe early (`… | head`).

  Piping NDJSON streaming output into a consumer that closes stdout before EOF — e.g. `releases list --json --page-all | head` or `… | jq | head` — caused the CLI to hang indefinitely. On the early close the next stdout write raises EPIPE, which Bun surfaces as an `'error'` event (rather than crashing); with no handler, the writer was left awaiting a `'drain'` that can never fire. A startup `process.stdout.on("error", …)` handler now treats a broken pipe as a clean `exit(0)`, so `| head` terminates immediately. Full consumption (to EOF, to a file, `| wc -l`) is unaffected.
</Release>

<Release version="v0.64.0" date="June 19, 2026" published="2026-06-19T17:06:07.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.64.0">

### Minor Changes

- f874edd: Add user-facing `releases webhook` commands for self-serve `/v1/me/webhooks`: `list`, `add`, `show`, `edit`, `remove`, `test`, `rotate-secret`, and `deliveries`. Requires `releases login` (or `RELEASES_API_KEY`). Supports org-scoped (`--org`, optional `--source`) and follows-scoped (`--scope follows`) subscriptions. `webhook verify` remains a local, no-auth signature check. Closes buildinternet/releases-cli#320.

### Patch Changes

- 1dfac19: Add `--product`, `--type`, and `--clear-*` filter flags to `releases webhook add` and `webhook edit`, matching per-event filters on `POST/PATCH /v1/me/webhooks`. Companion to buildinternet/releases#1683.
</Release>

<Release version="v0.63.0" date="June 19, 2026" published="2026-06-19T01:01:17.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.63.0">

### Minor Changes

- 767f32f: Add bulk release delete and suppress to `releases admin release`. Multiple positional `rel_…` IDs or `--file` (one ID per line, `-` for stdin) route through `DELETE /v1/releases/batch` and `POST /v1/releases/batch-suppress`; a single ID keeps the existing per-row endpoints. `scripts/bulk-suppress.ts` now uses the batch API grouped by reason instead of one HTTP call per release. Pairs with buildinternet/releases#1654.

### Patch Changes

- 728f826: Wrap `apiFetch` transport errors (DNS failure, connection refused, abort) with endpoint context. The thrown message now includes the HTTP verb and path (`API request failed on GET /v1/…: ECONNREFUSED`), matching the existing HTTP-error message shape. The original error is preserved via `cause`.
- 728f826: Return `undefined` from `getMonthlySummary` on a GET 404 instead of throwing `TypeError: Cannot read properties of null`. The function's declared return type is `Promise<ReleaseSummary | undefined>`; the null guard (`rows?.[0]`) now honors that contract.
- 88192e9: Show a one-line account nudge ("Create a free account for personalized feeds and higher rate limits — run `releases login`") on the bare `releases` landing screen when no credential is configured. TTY-only and self-resolving once signed in, mirroring the completion notice.
- 728f826: Constrain API-derived trace IDs (`session.sessionId`, workflow `instanceId`) to a single safe path segment before writing trace files, so a malicious or tampered API response can't traverse out of the trace directory (`../`, separators, absolute paths). Fails closed: an unusable id throws rather than writing to an unexpected location.
- 61afcc3: Internal refactor: split `src/api/client.ts` into per-domain modules (admin, collections, follows, orgs, products, releases, sources, webhooks) behind a re-export barrel. No user-visible changes.
- 728f826: Restrict credential file ACLs on Windows using `icacls` after write so the token file is readable only by the current user. Soft-fails silently if `icacls` is unavailable, leaving login functional. Unix behavior unchanged.
</Release>

<Release version="v0.62.1" date="June 12, 2026" published="2026-06-12T01:00:20.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.62.1">

### Patch Changes

- 09aec58: `releases admin source fetch` no longer silently drops a source identifier when combined with `--org` (#307). Previously `source fetch <identifier> --org <org>` ignored the identifier and dispatched a managed-agent session over every active source in the org; it now errors out on the conflict, matching `releases latest`'s `--product`/`--org` rejection. Passing both the positional identifier and `--source` is also rejected instead of silently preferring the positional. The `--org` fan-out additionally skips push-only `agent` sources — they have no fetch adapter, so dispatching a session over one was a wasted no-op — and reports how many were skipped.
- ec76928: `releases import` now dedups org accounts on the exact `(platform, handle)` pair instead of platform alone (#283). `org_accounts` is one-to-many — the server's unique index is on the pair — so an org can hold a second handle on a platform it's already linked to (e.g. Cloudflare's `x/Cloudflare` plus `x/cfchangelog`). Previously, importing a manifest that added a second handle on an already-linked platform was silently skipped, logging "already linked" for a handle that was never linked. The import now fetches the org's full account list and links any pair it doesn't already hold; an exact already-linked pair still reports "already linked" and is not re-created. The `--dry-run` preview mirrors the same dedup so it no longer over-reports accounts it would link.
- 4c3f42f: Add `releases admin source show <src_…|org/slug|slug>` (alias `get`) to inspect a single source's config — type, fetch method, priority/paused state, last-fetch, and the metadata flags operators care about (render/crawl, feed URL, parse instructions, etc.). `--json` returns the source with parsed metadata instead of the raw JSON-in-JSON string. Previously the only way to read a source's config was to dump the whole org and filter the `sources` array by hand (#295).

  Fix `source update <src_…> --json`: the JSON-refresh step re-resolved the source by its bare slug, so updating a source whose slug collides across orgs (e.g. `release-notes`) threw `AmbiguousSourceError` _after_ the update had already applied — even though the source was addressed by an unambiguous `src_…` id. The refresh now resolves through the typed id (#294).
</Release>

<Release version="v0.62.0" date="June 9, 2026" published="2026-06-09T18:05:07.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.62.0">

### Minor Changes

- ca636fa: Improve the release-reader ergonomics for `get`, `latest`/`tail`, and `list` (#303, #304):
  - `get <id> --json` now surfaces `media[]` (with the R2-mirrored `r2Url`) when a release has media, plus a `contentTruncated: true` hint so callers know the body was projected to an excerpt and `--full` exists. Previously the slim shape dropped media entirely with no signal it existed, forcing a round-trip to `--full` or the raw API to verify media presence. `--full` is unchanged.
  - `latest`/`tail` gain `--limit` (an alias for the existing `--count`) so the absence of `--limit` — which works on other commands — no longer errors with "unknown option". Both clamp to the server's `[1, 100]` window, and a one-shot listing that fills the requested window now prints a truncation hint to stderr (raise `--limit`, narrow with `--since`/`--until`/`--source`/`--org`, or for `--product` feeds, page with the surfaced `--cursor`).
  - `latest --product` is cursor-paginated; a new `--cursor` flag pages through it deterministically (the global latest feed has no cursor — it is count-capped — so `--cursor` errors there).
  - `releases list` now shows a `Releases` per-source count column in the text table, so "how many releases does this source have?" is answerable without dropping to `--json` (which already carried `releaseCount`) or the raw API.

### Patch Changes

- e045fe0: Trim the README to a leaner npm landing page (291 → ~130 lines): merge the install paths, condense the shell-completion and output-format prose into pointers to `--help`, drop the closed-beta admin-triage detail, and consolidate the auth sections. Reframe sign-in messaging around its present-day value — following orgs/products and a personalized feed — with read-only keys explicitly non-write/non-admin (and a path to higher rate limits), rather than leading with the closed-beta write/admin caveat.
</Release>

<Release version="v0.61.0" date="June 9, 2026" published="2026-06-09T13:07:53.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.61.0">

### Minor Changes

- 695039d: Add personalized follows + feed verbs: `releases follow <org|product>`, `releases unfollow <org|product>`, `releases following` (list), and `releases feed` (your personalized release timeline). They act on the signed-in user's account via the API's `/v1/me/*` routes — sign in with `releases login` (or set `RELEASES_API_KEY`) first. `follow`/`unfollow` accept an org slug, an `org/product` coordinate, or an `org_…`/`prod_…` id; `feed` reuses the same renderer as `releases tail` and is page-paginated (`--page` / `--limit`, `--json`). Requires `@buildinternet/releases-api-types` ≥ 0.32.0 for the follows wire types.
- de9ce26: Add `releases source fetch <source> --dry-run`: probe a single source without writing to D1 or dispatching (billing) the managed agent. For a client-rendered scrape source (`crawlEnabled`/`renderRequired`) it renders the index once via Browser Rendering and reports how many candidate release links were found — the cheap "can the steady-state cron render actually see releases here, or is it hitting an empty JS shell?" check that onboarding previously had no way to answer. For a feed/GitHub source it reports candidate releases parsed. Single source only; `--json` supported.
</Release>

<Release version="v0.60.0" date="June 9, 2026" published="2026-06-09T00:35:52.000Z" url="https://github.com/buildinternet/releases-cli/releases/tag/v0.60.0">

### Minor Changes

- 5d191ea: Add `releases admin webhook` commands for managing outbound webhook subscriptions: `add`, `list`, `show`, `edit`, `remove`, `test`, `rotate-secret`, and `deliveries`. These wrap the existing root-key-gated `/v1/webhooks` API routes so Phase-A operators can manage subscriptions without raw API calls.

  The subscriber-facing `webhook verify` (local signature check, no auth) moves from `admin webhook verify` to top-level `webhook verify`.

- 313ffb0: Rename the local stdio MCP server's tools (`releases admin mcp serve`) to mirror the canonical names served by the hosted server at `mcp.releases.sh`: `search_releases` → `search` (now returns the full unified result — orgs, catalog, and releases — with an optional `type` section filter), `list_sources` + `list_products` → `list_catalog` (org-scoped via `GET /v1/orgs/:slug/catalog`; global path folds products + standalone sources), and `get_product` → `get_catalog_entry` (dispatches product vs. source on the identifier prefix). `get_source` / `get_source_changelog` are unchanged.
</Release>

<Pagination cursor="2026-06-09T00:35:52.000Z|2026-06-11T19:52:26.941Z|rel_Bumq0fr2VYA2mnzor-2Fa" next="https://releases.sh/releases-sh/releases-cli.md?cursor=2026-06-09T00%3A35%3A52.000Z%7C2026-06-11T19%3A52%3A26.941Z%7Crel_Bumq0fr2VYA2mnzor-2Fa&limit=20" />
