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., UserConfig → UserConfigRead), 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”:
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:
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.79.0
(feat): Support GraphQL origins that serve JSON schema directly.