Skip to main content
Generate a structured API changelog by diffing schema snapshots. Uses the same data as dino diff but outputs categorized entries in Keep a Changelog format: Added, Changed, Deprecated, Removed, and Breaking — with migration hints.

Usage

dino changelog --tenant <id> [flags]

Flags

FlagTypeDefaultDescription
--tenantstringRequired. Tenant ID (or set in .dino.yml)
--envstringTenant defaultTarget environment
--format"markdown" | "json""markdown"Output format
--quietbooleanfalseSuppress stdout output
--snapshot-dirstring.dino/snapshotsDirectory for reading and writing snapshots
--fail-on-breakingbooleanfalseExit with code 1 if breaking changes are present
--fromstringLatest snapshotSnapshot ID to compare against (instead of the most recent)

How It Works

  1. Discover — Introspects the live API schema
  2. Build snapshot — Creates a snapshot of the current schema
  3. Load previous — Reads the snapshot specified by --from, or the most recent
  4. Diff — Compares previous vs. current schema
  5. Generate changelog — Categorizes changes into Keep a Changelog sections
  6. Save — Writes the current snapshot as the new baseline
On the first run (no previous snapshot), the current schema is saved as a baseline. No changelog is produced.

Examples

Generate a changelog

dino changelog --tenant acme --env production
# API Changelog — acme / production

## Breaking
  - Removed field `User.legacyId`
    Migration: Use `User.id` instead

## Added
  - Query `searchUsers` — full-text search across user fields
  - Field `User.avatarUrl`

## Changed
  - Field `User.email` — type changed (String → String!)

## Deprecated
  - Query `getUsers` — use `searchUsers` instead

Compare against a specific snapshot

dino changelog --tenant acme --from snap_2024-01-15T10-30-00Z
Compares the current schema against the named snapshot instead of the most recent one. Useful for generating changelogs across multiple releases.
If the snapshot ID passed to --from does not exist, the command exits with code 1 and prints: Snapshot not found: <id>

CI gate for breaking changes

dino changelog --tenant acme --env production --fail-on-breaking --format json > changelog.json
- name: Changelog check
  run: |
    dino changelog --tenant acme --env production --fail-on-breaking
Use --format json to pipe changelog data into release automation tools, Slack notifications, or developer portal updates.

Changelog Categories

CategoryCounts as Breaking?Description
BreakingYesRemoved fields/operations, incompatible type changes
AddedNoNew operations, fields, or types
ChangedNoModified signatures, updated types
DeprecatedNoOperations or fields marked as deprecated
RemovedYesOperations or fields that were deleted

Exit Codes

CodeMeaning
0Changelog generated, first run (baseline saved), or no breaking changes
1Breaking changes detected with --fail-on-breaking, --from snapshot not found, or command error
  • dino diff — Raw schema diff (same data, different output)
  • dino scan — Full pipeline run (also saves snapshots)
  • dino lint — SDL description coverage audit