Changelog

5.98.2

(fix): Preserve explicit null values when generating examples from OpenAPI. A null routed through an unknown schema (for instance a declared property on an object with additionalProperties: true) was replaced with the {"key": "value"} placeholder, which made generated SDK wire tests mock an object where the model expects a nullable scalar.

5.98.1

(fix): Render per-endpoint auth in docs when api.auth is endpoint-security. The declared auth-schemes and each operation’s security were both dropped while importing OpenAPI, so every endpoint published with no auth section, no auth headers in copied snippets, and no credential inputs in the API Explorer. Endpoints now document exactly the schemes they declare: either-scheme endpoints render each option separately, single-scheme endpoints render only that scheme, and security: [] endpoints render none.

5.98.0

(feat): Add support for the x-fern-explorer extension in AsyncAPI specs. It controls whether the API Explorer is available for a generated WebSocket channel. It can be set globally at the document root and overridden per channel, with the per-channel value taking precedence.

5.97.0

(internal): Send IR v67 to the Rust SDK generator from 0.46.0 and the Rust model generator from 0.6.0-rc.0, which is where they start reading whether an endpoint’s request body is required. Earlier Rust generator versions keep receiving v66.

5.96.0

(feat): Add success-redirect-url and error-redirect-url to the OAuth authorization-code auth scheme. Both are absolute http(s) URLs a generated CLI redirects the browser to from its loopback callback listener — on success once the authorization code is captured, and on failure with the error / error_description query parameters appended — so a hosted page can own the branding of the last screen of auth login. Neither is the OAuth redirect_uri, so neither needs registering with the authorization server.

5.95.1

(fix): Keep endpoint examples that omit a request body the API does not require. They were dropped while converting OpenAPI, so an x-fern-examples entry with no request produced no example and no snippet. The example now reaches the IR, and each generator decides how to render it based on whether it respects the optional request body.

(chore): Show fern docs theme delete in the fern docs theme --help output.

5.95.0

(feat): Add a way to model an omittable request body separately from its type. HttpRequestBodyReference gains an optional required, and HttpReferencedRequestBodySchema gains an optional flag that maps to required: false. This is distinct from body: optional<Foo>, which says the body’s value may be null; optional: true says the call may omit the body entirely, so the request carries neither content nor a Content-Type header.

5.94.0

(fix): Skip test files (*.test.*, *.spec.*, __tests__/) and node builtin imports when bundling experimental.mdx-components, so a component folder containing tests no longer fails docs generation.

(feat): Cache custom MDX component bundles in FERN_MDX_BUNDLE_CACHE_DIR when it is set, and populate that cache from fern install-dependencies. This lets air-gapped deployments bundle components ahead of time, during a phase that has network access, instead of at generation time.

5.93.0

(feat): Add the FERN_JAVA_SKIP_FORMATTING environment variable, which skips the Gradle spotlessApply pass that runs after Java SDK generation. The CLI forwards the variable from the host into generator containers, so FERN_JAVA_SKIP_FORMATTING=true fern generate --local produces unformatted (but otherwise identical) Java output. Useful on networks that cannot reach the Gradle distribution or plugin repositories, and to cut generation time.

5.92.4

(fix): Resolve image and link destinations delimited by angle brackets, e.g. ![alt](<path/to/image.png>).

5.92.3

(fix): Fix local images being published as build-machine filesystem paths when the alt text contains brackets, e.g. ![Filter [Top N] menu](./assets/image.png). The markdown scanner ended the label at the first ], so the destination was never resolved. Link text with brackets is handled the same way, including an escaped pair in prose (\[Sum of Quantity\]), which previously consumed the next image on the page.

5.92.2

(fix): Fix a oneOf with a discriminator and inline (non-$ref) variants converting to a union with no variants, which made the field render with no variants in the API reference. An inline variant’s discriminant value is now inferred from its own literal discriminant property, and a oneOf whose variants cannot be resolved falls back to an undiscriminated union.

5.92.1

(fix): Resolve the Java generator’s kebab-case package-name config key when computing the package name for local-file-system output. Previously configs using package-name (without group/artifact) logged a misleading “package-prefix configured but packageName is missing” warning even though the name was set.

5.92.0

(fix): Allow endpoint examples to omit the request body when the body is a reference to a shared schema. Previously only inlined request bodies supported omitting request, so endpoints whose request schema was reused elsewhere still failed with Expected example to be an object. Example is: undefined.

(feat): Add the OpenAPI setting respect-optional-request-body. When enabled, a JSON request body that OpenAPI does not mark as required (requestBody.required absent or false) becomes an optional request body in the generated Fern Definition, so generated SDKs accept a call without a body and snippets for examples that omit request match the generated method signature. Defaults to false, which preserves the current behavior where the optionality is only used to validate examples.

5.91.0

(feat): Add fern mcp install, which connects Claude Code, Cursor, and Codex to the Fern MCP server using your existing fern login token instead of a separate OAuth flow. By default it configures every one of those agents found on the machine; pass --client to pick, and --org to override the organization from fern.config.json.

(fix): Fix fern check failing with “Expected example to be an object. Example is: undefined” when an endpoint example omits request for an endpoint whose inlined request body has no required properties. Omitting request now produces an example with no request body instead of a validation error, and such examples are no longer dropped from the generated IR. Examples that omit a body with required properties are still rejected.

5.90.1

(fix): Thread the PHP SDK’s Composer package identity (name + --version) into the IR’s filesystem publish target for local-file-system output, so the PHP generator can stamp the real version into composer.json instead of defaulting to 0.0.0.

5.90.0

(feat): Add ref field to the git library input in docs.yml, allowing users to generate SDK reference documentation from a specific branch, tag, or commit SHA instead of only the default branch.

(fix): Merge an operation’s parameters from overrides.yml by parameter name instead of by array position, so an override no longer renames or drops whichever parameter happens to sit at that index. When several parameters share a name, in disambiguates them, and an override matching no parameter is appended.

5.89.6

(fix): fern generate --local no longer bumps the magic placeholder version as if it were a real previous version, which produced versions such as 0.0.0-fern-placeholder.0. Placeholder candidates from the diff, .fern/metadata.json and git tags are skipped so the next resolution source is used instead.

5.89.5

(fix): Improve fern generate --package artifacts: TypeScript tarballs are compiled before packing so they ship runnable JavaScript (falling back to tsc when the package has no build script), Java packaging emits a POM with dependency metadata next to the JAR, and Python host-mode packaging retries in an isolated venv (python -m build) when pip wheel fails on the host toolchain.

5.89.4

(fix): Fix local images and links being published as build-machine filesystem paths (e.g. /home/runner/work/.../assets/image.png) when an earlier line on the page contains a literal < in prose or inline code. The markdown scanner treated any < as the start of a tag and skipped ahead to the next >, dropping every image and link substitution in between.