3.95.6

(fix): Disable commit signing and skip hooks for remaining internal throwaway git commits (PersistedTypescriptProject, replay-init) to avoid triggering prompts (e.g. Touch ID on macOS, 1Password SSH agent).

3.95.5

(fix): Optimize throwaway git operations in LocalTaskHandler to avoid triggering commit signing prompts (e.g. Touch ID on macOS). Internal git commits used for .fernignore resolution now disable GPG/SSH signing, skip hooks, and inline user config to reduce spawned git processes.

3.95.4

(fix): Improve YAML parsing error message when scoped npm package names (e.g. @scope/package) are used without quotes in generators.yml. The @ character is a reserved YAML anchor symbol, so unquoted values like package-name: @fixa-dev/server produce a confusing “bad indentation” error. The CLI now detects this pattern and shows a hint suggesting the value be wrapped in double quotes.

3.95.3

(chore): Revert AI example enhancement to use fdr-lambda-docs endpoint instead of the new registry.

3.95.2

(fix): Exclude .fern/metadata.json from the git diff used for AUTO version analysis. Previously, changes to .fern/metadata.json (which includes cliVersion) were counted as meaningful SDK changes, causing CLI-only version bumps to trigger unnecessary SDK releases. The diff now uses :(exclude).fern/metadata.json so that metadata-only changes result in an empty diff and generation is skipped.

3.95.1

(fix): Make operationId optional for webhooks in OpenAPI 3.1 specs. When a webhook does not specify an operationId, the webhook key name is used as the fallback identifier instead of skipping the webhook entirely.


3.95.0

(feat): Add support for multiple override files in spec configuration. The overrides field now accepts either a single path or an array of paths for OpenAPI, AsyncAPI, OpenRPC, and Protobuf specs. When multiple paths are provided, overrides are applied sequentially in order.

3.94.0

(feat): Add package registry version lookups for all supported SDK languages during AUTO version resolution with private registry authentication support. Previously only npm (TypeScript) and PyPI (Python) were supported. Now also queries Maven Central (Java), NuGet Gallery (C#), RubyGems.org (Ruby), Go Module Proxy (Go), and Crates.io (Rust). PHP and Swift continue to use GitHub tags as fallback. Additionally supports authenticated access to private package registries and GitHub repositories via environment variables: GITHUB_TOKEN for private repos and NPM_TOKEN for private npm packages.

3.93.4

(fix): Fix getExplodeForQueryParameter to treat deepObject style as having a default explode of true per the OpenAPI spec. Previously, deepObject was grouped with spaceDelimited and pipeDelimited (default explode: false), causing explode: true to be incorrectly preserved as non-default for deepObject parameters. The OpenAPI spec only defines deepObject with explode: true, so it should be treated as the default.

3.93.3

(fix): Move Fern definition validation into the per-generator generation loop so that it validates the exact definition used for generation (with generator-specific settings like detectGlobalHeaders and auth overrides applied).

(fix): Fix path-level servers with x-fern-server-name being ignored in OpenAPI 3.0 specs.

3.93.2

(chore): Update AI example enhancement to use fdr-lambda endpoint.

3.93.1

(fix): Revert cff292e8937b3c3ac66b1b6ebc6071b81860bbfd to resolve errors introduced

3.93.0

(feat): Add a —json flag to fern check that outputs structured validation results as JSON to stdout, with all other output redirected to stderr. This enables programmatic consumption of check results by CI pipelines, editor integrations, and other tooling.

(fix): Fix API naming in multi-API workspaces: both the JSON output and fern check now use the workspace directory name (e.g. atoms, unified, waves).

3.92.1

(fix): prefer default version slug when multiple versions share the same MDX file.

3.92.0

(feat): Add support for multiple override files in OpenAPI spec configuration. The overrides field now accepts either a single path or an array of paths. When multiple paths are provided, overrides are applied sequentially in order, allowing for layered customization of OpenAPI specs.

3.91.6

(fix): Treat all text/* content types (e.g. text/csv, text/xml, text/html) as text responses in the v1 OpenAPI parser, not just text/plain. Previously, endpoints returning content types like text/csv had their response silently dropped, causing generated SDK methods to return None.

3.91.4

(fix): Fix GET webhooks without a request body being skipped during OpenAPI parsing. Previously, webhooks using the GET method with query parameters instead of a request body were silently dropped with “Missing a request body”. The parser now synthesizes a payload from the query parameters for GET webhooks that lack a request body.

3.91.3

(chore): Remove noisy debug logs from IR version compatibility checking.

3.91.2

(fix): Fix x-fern-server-name extension being ignored on AsyncAPI server definitions. When an AsyncAPI spec uses x-fern-server-name to override a server’s name (e.g. renaming uat to market_data to avoid naming conflicts with another API), both the environment ID and channel base URL now use the overridden name. This fixes SDK generation errors like “Expected environment UAT to contain url for uat” when the generators.yml environment URLs reference the overridden server name.

3.91.1

(fix): Fix coerce-optional-schemas-to-nullable incorrectly making header parameters nullable. HTTP headers don’t have a “null” concept — they’re either present with a value or absent. The coerceOptionalSchemasToNullable option now only affects request/response body properties, not header parameters. Explicitly nullable header schemas (via nullable: true in the OpenAPI spec) are still respected.


3.91.5

(fix): Fix anyOf/oneOf response examples always using the first variant’s values. When an OpenAPI spec defines multiple anyOf variants with discriminating enum fields (e.g., status: “waiting”, “progress”, “success”), the example converter would short-circuit on the first valid variant even when the user’s explicit example matched a different variant. Each named example now correctly preserves its distinct field values.

3.91.0

(feat): Add support for nested generics in Fern Definition. Generic type properties that reference other generic types (e.g., data: list<Data<T>>) now correctly substitute generic parameters throughout the type reference string, not just when the entire property value matches a parameter name. This enables patterns like reusable request/response wrappers with nested generic attributes.

3.90.9

(fix): Propagate explode field from OpenAPI query parameters through the old importer pipeline (OpenAPI IR → Fern Definition → Fern IR). Previously, explode: false on array query parameters was silently dropped, causing generated SDKs to use repeated keys instead of comma-separated values.

3.90.8

(fix): Treat JSON Schema const values as literal types in the IR regardless of the coerceEnumsToLiterals setting. Previously, const was converted to a single-value enum, which meant generated SDKs (e.g. Python Pydantic models) did not auto-populate a default value for fields that can only ever be one value. Now const always produces a literal type, so generators can automatically set the default.

3.90.7

(fix): Resolve .mdx/.md file path links in OpenAPI descriptions at CLI build time. Previously, markdown links like [Order](/docs/pages/objects/Order.mdx) in OpenAPI endpoint and parameter descriptions passed through as raw file paths. Now these links are resolved to proper URL slugs, consistent with how they are already resolved in user-authored markdown pages.

3.90.6

(fix): Fix schema reference resolution when respect-readonly-schemas: true is enabled. Previously, when schemas containing readonly properties were renamed with “Read” suffixes (e.g., UserConfigUserConfigRead), other schemas that referenced them would still point to the original names, causing validation failures.

3.90.5

(fix): Fix per-spec settings being ignored in multi-spec API configurations. When respect-nullable-schemas (or other boolean settings) was set on only a subset of specs, the setting was incorrectly collapsed to false because specs.every() treated unset (undefined) the same as explicitly disabled (false). Now, specs that don’t define a setting are treated as neutral (“don’t care”) so enabling a setting on a subset of specs works correctly without affecting specs that don’t set it.

3.90.4

(fix): Pass CLI-computed semantic version to Fiddle when creating remote generation jobs. Previously the CLI computed the version via the FDR API but passed the raw user-provided version (typically undefined for AUTO mode) to Fiddle, causing Fiddle to independently re-resolve the version and fall back to an internal counter that produced incorrect low version numbers.

3.90.3

(fix): Fix AUTO versioning missing namespace changes in the git diff. When generated SDK files are copied without .fernignore (the copyGeneratedFilesNoFernIgnorePreservingGit path), new files created by namespace renames were untracked and invisible to git diff HEAD. The diff generator now runs git add -N . (intent-to-add) before diffing so that newly created files appear in the diff and are correctly analyzed by the AI as breaking changes.

3.90.2

(fix): Fix v3 OpenAPI importer to recognize format: date-time-rfc-2822 regardless of typeDatesAsStrings setting. Previously the check was inside a guard that defaults to undefined, so RFC 2822 date fields silently fell through to string.

(fix): Fix example validation for DATE_TIME_RFC_2822 fields to accept RFC 2822 formatted timestamps (e.g. “Wed, 02 Oct 2002 13:00:00 +0000”) instead of rejecting them as invalid ISO 8601.

3.90.1

(fix): Fix v2 OpenAPI importer support for format: date-time-rfc-2822 so the CLI emits DATE_TIME_RFC_2822 instead of falling back to string.

3.90.0

(feat): Add DATE_TIME_RFC_2822 primitive type to the IR. OpenAPI specs using format: date-time-rfc-2822 (e.g. Twilio) now produce typed date-time fields instead of plain strings. Generators that do not yet handle the new variant gracefully fall back to DATE_TIME behaviour.

3.89.2

(fix): Fix AI example enhancement for multi-spec API definitions. All OpenAPI sources are now combined into a single merged spec, with overrides applied per-spec, so endpoints from any spec are correctly matched during AI enhancement.


3.89.1

(fix): Fix wire test failures for APIs with both JSON and bytes endpoints at the same path. WireMock mappings are no longer generated for bytes request body endpoints, which prevents ambiguous matches that return empty response bodies.

3.89.0

(feat): Added collapsible and collapsed-by-default support for API reference layout section items in docs.yml.

3.88.4

(fix): Fix AsyncAPI v3 channel parameters ignoring their schema property, which caused types like oneOf: [string, string[]] to be flattened to string in generated WebSocket clients.

(fix): Fix oneOf: [primitive, array<primitive>] query parameter detection when the primitive appears before the array in the union, which caused the type to lose its allow-multiple representation.

3.88.3

(fix): Fix OpenAPI file upload detection for FastAPI UploadFile fields. OpenAPI schemas that use contentMediaType: application/octet-stream are now treated as format: binary so SDKs generate correct multipart upload code.

3.88.1

(fix): Fix boolean default values from OpenAPI specs being sent as strings to FDR, causing docs publish failures. The OpenAPI parser now properly coerces boolean defaults using getAsBoolean() instead of an unsafe type assertion.


3.88.2

(fix): Fix fern check validation for SSE streaming endpoints with protocol-level discrimination. Examples for SSE endpoints using context: protocol discriminated unions were rejected with “Missing discriminant property” because the validator looked for the discriminant inside the data payload instead of recognizing it at the SSE envelope level (event: field).

3.88.0

(feat): Add Replay support for preserving SDK customizations across regenerations. Replay detects user edits via .fern/replay.lock, applies them with 3-way merge, and creates PRs with conflict resolution guidance when needed.

New CLI commands: fern replay init, fern replay status, fern replay forget, fern replay reset. New --no-replay flag on fern generate to skip patch application. Gated behind replay: { enabled: true } in generators.yml.

3.87.0

(feat): Added collapsible and collapsed-by-default options for docs.yml navigation sections/folders, preserving the legacy collapsed behavior while adding validation to prevent invalid configurations.

3.86.1

(fix): Fall back to initial version 0.0.1 when AUTO versioning cannot extract the previous version instead of failing the entire generation. This handles new SDK repositories where all files are additions and no previous version lines exist in the diff.

3.86.0

(feat): Add support for x-fern-sdk-method-name extension on AsyncAPI WebSocket channels to customize the connection method name in generated SDKs. This field is now available in both AsyncAPI v2 and v3 specifications.

AsyncAPI example — use x-fern-sdk-method-name to customize the WebSocket connection method instead of the default “connect”:

1asyncapi: 3.0.0
2info:
3 title: Chat API
4 version: 1.0.0
5channels:
6 /chat:
7 x-fern-sdk-method-name: createChatConnection
8 messages:
9 userMessage:
10 payload:
11 type: object
12 properties:
13 content:
14 type: string

This generates client.createChatConnection() instead of client.connect(), avoiding confusing APIs where both wrapper creation and actual connection use “connect”.

3.85.6

(chore): Complete document-level webhook-signature configuration parsing. Adds validation for webhook signature configs (algorithms, encodings, timestamp settings, JWKS consistency).

3.85.5

(fix): Report broken AsyncAPI V3 message references as visible warnings instead of silently dropping entire specs. When an operation references a non-existent channel or message (e.g. $ref: "#/channels/auth/messages/authenticate" when no auth channel exists), the parser now logs a warning with the specific broken $ref and continues processing the remaining valid messages and channels.

3.85.4

(fix): Skip compatible IR version validation when running in local development mode (CLI version 0.0.0). This prevents noisy 404 errors from the FDR registry when the CLI version is not a real published release.

3.85.3

(fix): Remove unhelpful “Unable to analyze changes with AI” fallback message from changelog entries when AI analysis fails during AUTO versioning. The changelog now shows just the version header with no body instead.

3.85.1

(fix): Fix AUTO versioning failing for new SDK repositories. When generating an SDK into an empty or newly initialized repository, the version extraction would fail because all files are new additions with no previous version lines in the diff. Now returns 0.0.1 as the initial version instead of throwing an error.


3.85.2

(chore): Regenerate internal SDKs with the latest TypeScript SDK generator to pick up improvements and fixes.

3.85.0

(feat): Auto-correct incorrect fern-api/ Docker org prefix to fernapi/ in generator names. When a generator is specified with fern-api/ (the GitHub/npm org) instead of fernapi/ (the Docker Hub org), the CLI now automatically corrects it and prints a warning. This applies to CLI commands (--generator flag) and generators.yml configuration files.

3.84.0

(feat): Add workspace validation caching and skipValidation flag to improve toFernWorkspace() performance. A global validation cache eliminates redundant JSON schema validation and Zod parsing when the same files are processed by multiple workspace instances. The skipValidation option allows callers to bypass JSON schema validation for known-good files.

3.83.3

(fix): Preserve existing README.md during local SDK generation when the generator does not produce one. Previously, copyGeneratedFiles deleted all files before copying generator output, so if README generation failed silently the file was removed from the target repository. The file copy methods now skip deleting README.md when the generated output directory does not include it.

3.83.2

(chore): Improve CLI startup performance by loading workspace files concurrently.

3.83.1

(fix): Fix S3 signature mismatch for docs assets outside fern/ folder. Paths containing ”../” are now sanitized to prevent HTTP client URL normalization from breaking S3 presigned URLs.

3.83.0

(feat): Add webhook signature verification support. Webhooks can now declare a signature configuration with type: hmac or type: asymmetric, including algorithm, encoding, signature prefix parsing, payload format composition, and timestamp-based replay protection. Supported via Fern Definition signature field, OpenAPI x-fern-webhook-signature extension, and the IR WebhookSignatureVerification union.

OpenAPI example — set x-fern-webhook-signature at the document level so all webhooks inherit the same signature configuration:

1openapi: 3.1.0
2info:
3 title: My API
4 version: 1.0.0
5x-fern-webhook-signature:
6 type: hmac
7 header: x-webhook-signature
8 algorithm: sha256
9 encoding: hex
10 signature-prefix: "sha256="
11 payload-format:
12 components:
13 - timestamp
14 - body
15 delimiter: "."
16 timestamp:
17 header: x-webhook-timestamp
18 format: unix-seconds
19 tolerance: 300
20webhooks:
21 orderCreated:
22 post:
23 operationId: orderCreated
24 requestBody:
25 required: true
26 content:
27 application/json:
28 schema:
29 $ref: '#/components/schemas/OrderEvent'

Individual webhook operations can also override the document-level default by specifying their own x-fern-webhook-signature configuration inline.


3.82.0

(feat): Add webhook signature verification configuration to the IR. Webhooks can now specify a signature block (in Fern Definition) or x-fern-webhook-signature extension (in OpenAPI) with algorithm, encoding, header name, and payload format. SDK generators can use this to produce signature verification utilities.

(feat): Add terminator field support for SSE streaming throughout the OpenAPI to Fern pipeline. The field was already present in the Fern definition schema but missing from the OpenAPI extension parsing, OpenAPI-IR schema, and the OpenAPI-IR to Fern conversion layers.

3.81.1

(fix): Fix example object keys starting with $ (e.g. $ref) not being unescaped when generating the IR jsonExample. The Fern definition escapes $-prefixed keys with a backslash to avoid collision with example references, but the backslash was not removed when building the wire-format JSON example, causing generators to emit invalid code (e.g. "\$ref" in Go).

3.81.0

(feat): Add --skip-autorelease-disabled flag to fern generator upgrade. When passed, generators with autorelease: false in their configuration are skipped during the upgrade. Skipped generators are reported in the output summary.


3.80.0

(feat): Make fern init default to OpenAPI initialization with a sample Petstore spec. Previously, fern init created a Fern Definition workspace by default, and fern init --openapi <path> was needed for OpenAPI. Now fern init creates an OpenAPI workspace by default. Use fern init --fern-definition to get the previous Fern Definition initialization behavior.

3.79.3

(fix): Fix auto-generated examples for recursive types to include required non-leaf properties (e.g. nested objects) and empty containers in minimal stubs, preventing deserialization failures in generated mock server tests.


3.79.2

(fix): Fix fern check --strict-broken-links to resolve <Markdown src="..." /> snippets used inside link targets.

3.79.1

(fix): Fix AI example enhancement being silently skipped.