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. .
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.