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.



3.78.1

(fix): Fix endpoint example generation for global headers, nullable params, and recursive types. Global header example failures no longer drop all endpoint examples. Nullable/optional wrappers are now traversed in hasExample(). Recursive types produce minimal stub examples on cycle detection instead of cascading failures.

3.78.0

(feat): Improve library docs generation UI with clean spinner interface. Replace verbose polling logs with interactive task spinners for better UX. Enable parallel processing of multiple libraries with concurrent spinners. Verbose logs moved to debug level only for cleaner output.

3.77.1

(fix): Scope PR update feature for self-hosted GitHub generation to the current generator by including the generator name in the branch prefix (e.g. fern-bot/fernapi-fern-typescript-sdk/). This prevents concurrent generators targeting the same repository from racing on the same PR.


3.77.0

(feat): Add support for bytes request and response body types in the fern export command. Previously, exporting APIs with bytes endpoints would fail with “bytes is not supported”. Now bytes request bodies are exported as application/octet-stream with format: binary, and bytes/fileDownload/text/streaming response bodies are properly converted to their corresponding OpenAPI content types.

3.76.0

(feat): Add support for SSE discriminator context with discriminatorContext field in IR. Supports “data” (default) for discriminators within union data and “protocol” for SSE protocol-level discriminators, such as event.

“data”-context discrimination :

event: message
data: { "type": "completion", "content": "Hello!" }
event: message
data: { "type": "error", message: "Something went wrong!" }

“protocol”-context discrimination (use x-fern-discriminator-context: protocol):

event: completion
data: { "content": "Hello!" }
event: error
data: { "message": "Something went wrong!" }

Example OpenAPI usage:

1SseEvent:
2 oneOf:
3 - $ref: '#/components/schemas/CompletionEvent'
4 - $ref: '#/components/schemas/ErrorEvent'
5 discriminator:
6 propertyName: event
7 x-fern-discriminator-context: protocol

3.75.0

(chore): Remove deprecated V1 python-docs navigation item. Use the library navigation item with libraries config instead. See the library docs migration guide for details.