freshcrate
Home > Uncategorized > fabrikt

fabrikt

Generates Kotlin Code from OpenAPI 3 Specifications

Description

Generates Kotlin Code from OpenAPI 3 Specifications

README

fabrikt

Fabrikt /ˈfa-brikt/ - Kotlin code from OpenAPI 3

Introduction

This library was built to take advantage of the complex modeling features available in OpenAPI 3. It generates Kotlin data classes with advanced support for features such as:

  • Null Safety
  • Inlined schema definitions
  • Enumerations
  • Sealed Classes
  • Polymorphism (@JsonSubTypes)
  • Maps of Maps of Maps
  • GraalVM Native Reflection Registration
  • Json Merge Patch (via JsonNullable) (add x-json-merge-patch: true to schemas)
  • Override Jackson Include NonNull (via JsonInclude) (add x-jackson-include-non-null: true to schemas)

as well as HTTP clients and controllers for a number of popular frameworks (see Features).

More than just bootstrapping, this library can be permanently integrated into your build tool and will ensure contract and code always match, even as APIs evolve in complexity.

Try Fabrikt Online

Try Fabrikt with your own API spec in the Fabrikt Playground and see how it can help you generate code for your API clients and servers.

Screenshot of Fabrikt Playground

Coordinates

<dependency>
  <groupId>io.fabrikt</groupId>
  <artifactId>fabrikt</artifactId>
</dependency>

Features

The library currently has support for generating:

  • Models
    • Jackson annotated data classes
    • Kotlinx.serialization annotated data classes
  • Clients
    • OkHttp Client (w/ Jackson Models) - with the option for a resilience4j fault-tolerance wrapper
    • OpenFeign annotated client interfaces
    • Ktor Client (w/ Jackson & Kotlin Serialization models)
    • Spring HTTP Interface annotated client interfaces
  • Controllers
    • Spring MVC annotated controller interfaces
    • Micronaut HTTP annotated controller interfaces
    • Ktor server routes and controller interfaces

Examples

Consult test directory for OpenAPI code generation examples.

It forms a living documentation full of code examples generated from different OpenAPI 3 permutations.

Furthermore, the end-to-end tests demonstrate how to integrate the library using Gradle.

Usage Instructions

The library can be used in a variety of ways, including as a command line tool, a Gradle task, or a Maven plugin.

Please refer to Configuration Options section for a list of available parameters.

Command Line

Fabrikt is packaged as an executable jar, allowing it to be integrated into any build tool.

The CLI can be invoked as follows:

java -jar fabrikt.jar \
    --output-directory '/tmp' \
    --base-package 'com.example' \
    --api-file '/path-to-api/open-api.yaml' \
    --targets 'client' \
    --targets 'http_models' \
    --http-client-opts resilience4j

Gradle w/ custom task

Here is an example of a Gradle task with code generated to the build/generated directory, and execution linked to the compile task.

val fabrikt: Configuration by configurations.creating

val generationDir = "$buildDir/generated"
val apiFile = "$buildDir/path-to-api/open-api.yaml"

sourceSets {
    main { java.srcDirs("$generationDir/src/main/kotlin") }
    test { java.srcDirs("$generationDir/src/test/kotlin") }
    ...
}

tasks {   
    ...
    val generateCode by creating(JavaExec::class) {
        inputs.files(apiFile)
        outputs.dir(generationDir)
        outputs.cacheIf { true }
        classpath(fabrikt)
        mainClass.set("io.fabrikt.cli.CodeGen")
        args = listOf(
            "--output-directory", generationDir,
            "--base-package", "com.example",
            "--api-file", apiFile,
            "--targets", "http_models",
            "--targets", "client",
            "--http-client-opts", "resilience4j"
        )
    }
    withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions.jvmTarget = "17"
        dependsOn(generateCode)
    }
}

dependencies {
     fabrikt("io.fabrikt:fabrikt:+") // This should be pinned  
     ...
}

Gradle w/ plugin

The Fabrikt Gradle plugin serves as a convenient wrapper for Fabrikt, allowing seamless integration of code generation into a Gradle build.

Note: Since the plugin is maintained separately from the Fabrikt library, please refer to the Configuration section of the plugin's README for the most up-to-date information on how to use it.

Latest version of the plugin: Gradle Plugin Portal Version

plugins {
    // find latest version: https://github.com/acanda/fabrikt-gradle-plugin/releases
    id("ch.acanda.gradle.fabrikt") version "1.33.0"
}

fabrikt {
    generate("dog") {
        apiFile = file("src/main/openapi/dog.yaml")
        basePackage = "com.example.api"
    }
}

The exec-maven-plugin is capable of downloading the Fabrikt library from Maven Central and executing its main method with defined arguments.

Docker

Fabrikt is also available as a Docker image, which can be convenient for CI/CD pipelines or environments where you prefer not to install Java directly.

The Docker image can be invoked as follows:

docker run --rm -v $(pwd):/workspace ghcr.io/fabrikt-io/fabrikt:latest \
  --output-directory '.' \
  --base-package 'com.example' \
  --api-file 'openapi.yaml' \
  --targets 'http_models'

The command mounts your current directory to /workspace in the container, where Fabrikt will read the OpenAPI specification and write the generated code.

Getting the Most from Fabrikt

1. Prefer components to inline schemas

While inline schemas are perfectly valid they are not supported by Fabrikt in all circumstances. This is especially true for request bodies and non-trivial parameters. Instead, define your schemas in the components section of the OpenAPI spec (components.parameters & components.requestBodies). #20, #187

2. Use oneOf with discriminator for polymorphism

oneOf along with the flag SEALED_INTERFACES_FOR_ONE_OF will generate polymorphic models with sealed interfaces. The discriminator property is used by Fabrikt to determine the subtypes to be generated.

Configuration Options

This section documents the available CLI parameters for controlling what gets generated. This documentation is generated using: ./gradlew printCodeGenUsage

Parameter Description
--api-file This must be a valid Open API v3 spec. All code generation will be based off this input.
--api-fragment A partial Open API v3 fragment, to be combined with the primary API for code generation purposes.
* --base-package The base package which all code will be generated under.
--external-ref-resolution Specify to which degree referenced schemas from external files are included in model generation. Default: TARGETED
CHOOSE ONE OF:
TARGETED - Generate models only for directly referenced schemas in external API files.
AGGRESSIVE - Referencing any schema in an external API file triggers generation of every external schema in that file.
--http-client-opts Select the options for the http client code that you want to be generated.
CHOOSE ANY OF:
RESILIENCE4J - Generates a fault tolerance service for the client using the following library "io.github.resilience4j:resilience4j-all:+" (only for OkHttp clients)
SUSPEND_MODIFIER - This option adds the suspend modifier to the generated client functions (only for OpenFeign clients)
SPRING_RESPONSE_ENTITY_WRAPPER - This option adds the Spring-ResponseEntity generic around the response to be able to get response headers and status (only for OpenFeign clients).
SPRING_CLOUD_OPENFEIGN_STARTER_ANNOTATION - This option adds the @FeignClient annotation to generated client interface
--http-client-target Optionally select the target client that you want to be generated. Defaults to OK_HTTP
CHOOSE ONE OF:
OK_HTTP - Generate OkHttp client.
OPEN_FEIGN - Generate OpenFeign client.
SPRING_HTTP_INTERFACE - Generate Spring HTTP Interface.
KTOR - Generate Ktor client.
--http-controller-opts Select the options for the controllers that you want to be generated.
CHOOSE ANY OF:
SUSPEND_MODIFIER - This option adds the suspend modifier to the generated controller functions
AUTHENTICATION - This option adds the authentication parameter to the generated controller functions
GROUP_BY_TAG - This option groups controllers based on the first tag rather than paths
COMPLETION_STAGE - This option makes generated controller functions have Type CompletionStage (works only with Spring Controller generator). Can be overridden per operation using the OpenAPI extension `x-async-support: true
SSE_EMITTER - This option makes generated controller functions have Type SseEmitter (works only with Spring Controller generator)
--http-controller-target Optionally select the target framework for the controllers that you want to be generated. Defaults to Spring Controllers
CHOOSE ONE OF:
SPRING - Generate for Spring framework.
MICRONAUT - Generate for Micronaut framework.
KTOR - Generate for Ktor server.
--http-model-opts Select the options for the http models that you want to be generated.
CHOOSE ANY OF:
X_EXTENSIBLE_ENUMS - This option treats x-extensible-enums as enums
JAVA_SERIALIZATION - This option adds Java Serializable interface to the generated models
QUARKUS_REFLECTION - This option adds @RegisterForReflection to the generated models. Requires dependency "'io.quarkus:quarkus-core:+"
MICRONAUT_INTROSPECTION - This option adds @Introspected to the generated models. Requires dependency "'io.micronaut:micronaut-core:+"
MICRONAUT_REFLECTION - This option adds @ReflectiveAccess to the generated models. Requires dependency "'io.micronaut:micronaut-core:+"
MICRONAUT_SERDEABLE - This option adds @Serdeable to the generated models. Requires dependency "'io.micronaut.serde:micronaut-serde-jackson:+"
INCLUDE_COMPANION_OBJECT - This option adds a companion object to the generated models.
SEALED_INTERFACES_FOR_ONE_OF - This option is deprecated. Sealed interfaces are enabled by default in v26+. Use DISABLE_SEALED_INTERFACES_FOR_ONE_OF to disable.
DISABLE_SEALED_INTERFACES_FOR_ONE_OF - This option disables the default sealed interfaces for oneOf behavior in v26+
NON_NULL_MAP_VALUES - This option makes map values non-null. The default (since v15) and most spec compliant is make map values nullable
FAULT_TOLERANT_ENUMS - This option adds an UNRECOGNIZED enum entry as a fallback for unmapped values, preventing deserialization exceptions. If jackson is used, the deserialization option READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE will need to be enabled as well
--http-model-suffix Specify custom suffix for all generated model classes. Defaults to no suffix.
--instant-library Specify which Instant library to use in generated model classes for kotlinx.serialization. Default: KOTLINX_INSTANT
CHOOSE ONE OF:
KOTLINX_INSTANT - Use kotlinx.datetime Instant in generated classes (default)
KOTLIN_TIME_INSTANT - Use kotlin.time Instant in generated classes
--jackson-nullability-mode Configure advanced handling when serializing null values with Jackson. Default: NONE
CHOOSE ONE OF:
NONE - Default Jackson behaviour
ENFORCE_OPTIONAL_NON_NULL - Omit null values for optional non-null fields
ENFORCE_REQUIRED_NULLABLE - Include null values for required nullable fields
STRICT - Combines ENFORCE_OPTIONAL_NON_NULL and ENFORCE_REQUIRED_NULLABLE for strictest contract enforcement
--openfeign-client-name Specify openfeign client name for spring-cloud-starter-openfeign. Defaults to 'fabrikt-client'.
--output-directory Allows the generation dir to be overridden. Defaults to current dir
--output-opts Select options for the output.
CHOOSE ANY OF:
ADD_FILE_DISCLAIMER - This option adds a disclaimer to the generated files.
--resources-path Allows the path for generated resources to be overridden. Defaults to src/main/resources
--serialization-library Specify which serialization library to use for annotations in generated model classes. Default: JACKSON
CHOOSE ONE OF:
JACKSON - Use Jackson for serialization and deserialization
KOTLINX_SERIALIZATION - Use kotlinx.serialization for serialization and deserialization
--src-path Allows the path for generated source files to be overridden. Defaults to src/main/kotlin
--targets Targets are the parts of the application that you want to be generated.
CHOOSE ANY OF:
HTTP_MODELS - Jackson annotated data classes to represent the schema objects defined in the input.
CONTROLLERS - Spring / Micronaut / Ktor HTTP controllers for each of the endpoints defined in the input.
CLIENT - Simple http rest client.
QUARKUS_REFLECTION_CONFIG - This options generates the reflection-config.json file for quarkus integration projects
--type-overrides Specify non-default kotlin types for certain OAS types. For example, generate Instant instead of OffsetDateTime
CHOOSE ANY OF:
DATETIME_AS_INSTANT - Use Instant as the datetime type. Defaults to OffsetDateTime
DATETIME_AS_LOCALDATETIME - Use LocalDateTime as the datetime type. Defaults to OffsetDateTime
BYTE_AS_STRING - Ignore string format byte and use String as the type
BINARY_AS_STRING - Ignore string format binary and use String as the type
URI_AS_STRING - Ignore string format uri and use String as the type
UUID_AS_STRING - Ignore string format uuid and use String as the type
DATE_AS_STRING - Ignore string format date and use String as the type
DATETIME_AS_STRING - Ignore string format date-time and use String as the type
BYTEARRAY_AS_INPUTSTREAM - Use InputStream as ByteArray type. Defaults to ByteArray
--validation-library Specify which validation library to use for annotations in generated model classes. Default: JAKARTA_VALIDATION
CHOOSE ONE OF:
JAVAX_VALIDATION - Use javax.validation annotations in generated model classes
JAKARTA_VALIDATION - Use jakarta.validation annotations in generated model classes (default)
NO_VALIDATION - Use no validation annotations in generated model classes

Original Motivation

The team that built the first version of this tool initially contributed to the Kotlin code generation ability in OpenApiTools, but reached the limits of what could be achieved with template-based generation. This library leverages the rich OpenAPI 3 model provided by KaiZen-OpenApi-Parser and uses Kotlin Poet to programmatically construct Kotlin classes for maximum flexibility.

This project was started by engineers from Zalando Tech and is battle-tested heavily in production there.

Specific Features

Polymorphism via allOf

The following example shows how allOf can be used to generate polymorphic Kotlin data classes. It does the following:

  • A ChildDefinition schema defines both the discriminator mapping details and the schema for the discriminator property. In this case the discriminator property is an enumeration
  • In each child schema, allOf is used to merge the ChildDefinition with the child's custom schema. This guarantees that each child schema inherits the correct discriminator property.
  • In the Responses schema a oneOf lists only child schemas. This will be detected by Fabrikt and it will generate the list of parent types: List<ChildDefinition>

NOTE: A new feature has been added that allows Polymorphism to be achieved using only a discriminated oneOf. This feature makes use of Kotlin sealed interface and must be explicitly enabled via --http-model-opts, SEALED_INTERFACES_FOR_ONE_OF

openapi: 3.0.0
components:
  schemas:
    ChildDefinition:
      type: object
      discriminator:
        propertyName: some_enum
        mapping:
          obj_one_only: '#/components/schemas/DiscriminatedChild1'
          obj_two_first: '#/components/schemas/DiscriminatedChild2'
          obj_two_second: '#/components/schemas/DiscriminatedChild2'
          obj_three: '#/components/schemas/discriminated_child_3'
      properties:
        discriminating_property:
          $ref: '#/components/schemas/ChildDiscriminator'

    ChildDiscriminator:
      type: string
      enum:
        - obj_one_only
        - obj_two_first
        - obj_two_second
        - obj_three

    DiscriminatedChild1:
      allOf:
        - $ref: '#/components/schemas/ChildDefinition'
        - type: object
          properties:
            some_prop:
              type: string

    DiscriminatedChild2:
      allOf:
        - $ref: '#/components/schemas/ChildDefinition'
        - type: object
          properties:
            some_prop:
              type: string

    discriminated_child_3:
      allOf:
        - $ref: '#/components/schemas/ChildDefinition'

    Responses:
      type: "object"
      properties:
        entries:
          type: "array"
          items:
            oneOf:
              - $ref: "#/components/schemas/DiscriminatedChild2"
              - $ref: "#/components/schemas/DiscriminatedChild2"
              - $ref: "#/components/schemas/discriminated_child_3"
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "some_enum",
    visible = true
)
@JsonSubTypes(
    JsonSubTypes.Type(
        value = DiscriminatedChild1::class,
        name =
        "obj_one_only"
    ),
    JsonSubTypes.Type(
        value = DiscriminatedChild2::class,
        name =
        "obj_two_first"
    ),
    JsonSubTypes.Type(
        value = DiscriminatedChild2::class,
        name =
        "obj_two_second"
    ),
    JsonSubTypes.Type(value = DiscriminatedChild3::class, name = "obj_three")
)
sealed class ChildDefinition() {
    abstract val someEnum: ChildDiscriminator
}

enum class ChildDiscriminator(
    @JsonValue
    val value: String
) {
    OBJ_ONE_ONLY("obj_one_only"),

    OBJ_TWO_FIRST("obj_two_first"),

    OBJ_TWO_SECOND("obj_two_second"),

    OBJ_THREE("obj_three");

    companion object {
        private val mapping: Map<String, ChildDiscriminator> =
            values().associateBy(ChildDiscriminator::value)

        fun fromValue(value: String): ChildDiscriminator? = mapping[value]
    }
}

data class DiscriminatedChild1(
    @param:JsonProperty("some_prop")
    @get:JsonProperty("some_prop")
    val someProp: String? = null,
    @get:JsonProperty("some_enum")
    @get:NotNull
    override val someEnum: ChildDiscriminator = ChildDiscriminator.OBJ_ONE_ONLY
) : ChildDefinition()

data class DiscriminatedChild2(
    @get:JsonProperty("some_enum")
    @get:NotNull
    override val someEnum: ChildDiscriminator,
    @param:JsonProperty("some_prop")
    @get:JsonProperty("some_prop")
    val someProp: String? = null
) : ChildDefinition()

data class DiscriminatedChild3(
    @get:JsonProperty("some_enum")
    @get:NotNull
    override val someEnum: ChildDiscriminator = ChildDiscriminator.OBJ_THREE
) : ChildDefinition()

data class Responses(
    @param:JsonProperty("entries")
    @get:JsonProperty("entries")
    @get:Valid
    val entries: List<ChildDefinition>? = null
)

Contributing

Building Locally

Fabrikt is built with Gradle and requires an initialised git repository. The easiest way to build it is to clone the repo locally before executing the build command:

git clone git@github.com:fabrikt-io/fabrikt.git
cd fabrikt/
./gradlew clean build

Adjusting Test Examples

A utility function is available in GeneratedCodeAsserter.kt to mass change all of the code generation examples in the test resources folder. This is useful when a global change is made to the code generation logic and all of the examples need to be updated.

Publishing

  1. Go to Release Tab
  2. Select Draft a new release.
  3. Set tag to a version greater than current using symantic versioning, anticipating whether the changes made could break builds.
  4. Click Generate release notes. Ensure that the tag and release version match.
  5. Click Publish release buttom at the bottom.

Github Actions will publish the deployment to Sonatype Central. You must then log in to Sonatype and decide to either release or drop that deployment. After 30 minutes or so, Maven Central will have indexed the promoted release.

Release History

VersionChangesUrgencyDate
27.0.0Given there have been some breaking changes to model names, I am cutting a major release for these changes. ## What's Changed * Add OG meta tags to playground and fix stale org references in README by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/576 * Add CONTRIBUTING, CODE_OF_CONDUCT, and SECURITY docs by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/577 * Update version of fabrikt-gradle-plugin in README.md to 1.32.0 by @acanda in https://github.com/fabrikt-io/fabrikt/High4/21/2026
26.3.0## What's Changed * fix: extend oneOf redundancy check to non-discriminated allOf hierarchies by @thejeff77 in https://github.com/fabrikt-io/fabrikt/pull/574 * Implement tag grouping by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/575 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/26.2.2...26.3.0High4/14/2026
26.2.2## What's Changed * fix: use LF line endings in Quarkus reflection config output by @veliezbm in https://github.com/fabrikt-io/fabrikt/pull/569 * fix: empty enum generation when YAML anchors and aliases are used by @veliezbm in https://github.com/fabrikt-io/fabrikt/pull/568 * fix: handle inline enum parameters in array-typed query params by @thejeff77 in https://github.com/fabrikt-io/fabrikt/pull/570 ## New Contributors * @veliezbm made their first contribution in https://github.com/fabriMedium4/1/2026
26.2.1## What's Changed * fix: prevent phantom sealed interface for oneOf with shared discriminated parent by @thejeff77 in https://github.com/fabrikt-io/fabrikt/pull/562 * fix: oneOf sealed interface superinterface name ignores --http-model-suffix by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/565 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/26.2.0...26.2.1Low3/19/2026
26.2.0## What's Changed * chore: use gradle version catalog by @nickcaballero in https://github.com/fabrikt-io/fabrikt/pull/555 * Minor dependency cleanup by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/557 * fix: generate proper enum types for inline enum parameters by @thejeff77 in https://github.com/fabrikt-io/fabrikt/pull/558 ## New Contributors * @nickcaballero made their first contribution in https://github.com/fabrikt-io/fabrikt/pull/555 * @thejeff77 made their first contributLow3/12/2026
26.1.0## What's Changed * Republish fabrikt under io.fabrikt group id. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/552 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/26.0.1...26.1.0Low3/3/2026
26.0.1## What's Changed * Fix OAS 3.1 nullable properties with a non-camelCase name being serialized as non-null by @fourls in https://github.com/fabrikt-io/fabrikt/pull/543 * fix(model): preserve leading and trailing underscores in property names by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/546 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/26.0.0...26.0.1Low3/3/2026
26.0.0## What's Changed * Write OkHttp Request.Builder() with proper class name by @celloman in https://github.com/fabrikt-io/fabrikt/pull/541 * Jakarta Validation Migration * Changed default validation library from javax.validation to jakarta.validation All validation annotations now use jakarta.validation.constraints.* by default Users requiring javax can override via configuration * Sealed Interfaces for OneOf * Enabled SEALED_INTERFACES_FOR_ONE_OF by default for discriminated Low2/25/2026
25.9.2## What's Changed * fix(generators): deduplicate @SerialName for multi-parent oneOf in kotlinx by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/537 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.9.1...25.9.2Low2/18/2026
25.9.1## What's Changed * Docker multi architecture publishing by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/535 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.9.0...25.9.1Low2/17/2026
25.9.0## What's Changed * Take ownership of kaizen openapi-parser. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/527 * fix(generators): add jackson enum default value annotation by @beiertu-mms in https://github.com/fabrikt-io/fabrikt/pull/532 * Implement ApiConfiguration for Ktor client by @vekunz in https://github.com/fabrikt-io/fabrikt/pull/516 * Modify header function to handle generic values by @trevorschadt in https://github.com/fabrikt-io/fabrikt/pull/525 ## New Contributors Low2/16/2026
25.8.0## What's Changed * Fix nested oneOf generating Any instead of sealed interfaces by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/522 * Fix generation bug with classes implementing multiple oneOf. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/523 * Feat/spring sse by @nickcaballero in https://github.com/fabrikt-io/fabrikt/pull/524 * Adds support for generating fault tolerant enums. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/526 **Full Changelog**: httLow2/12/2026
25.7.0## What's Changed * Fix nullable $ref in OpenAPI 3.1 documents being serialized as optional by @fourls in https://github.com/fabrikt-io/fabrikt/pull/518 * Improve handling of multiple successful return types. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/519 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.6.1...25.7.0Low2/3/2026
25.6.1## What's Changed * Ensure Openapi 3.0 downgrade functionality is future-proofed by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/512 * Guard against similar schema interfaces being added. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/515 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.6.0...25.6.1Low1/29/2026
25.6.0## What's Changed * Fix bug with inlined allOf as Items schema in array by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/506 * Reduce opinionated validations of OpenApi3 specs. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/507 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.5.0...25.6.0Low1/18/2026
25.5.0## What's Changed * Handle outer required section with allOf declaration. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/503 * Install OpenJDK 17 in Dockerfile by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/504 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.4.0...25.5.0Low1/16/2026
25.4.0## What's Changed * Generation Bug With OneOf containing allOf by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/501 * Add option to control @JsonInclude annotations by @fourls in https://github.com/fabrikt-io/fabrikt/pull/502 ## New Contributors * @fourls made their first contribution in https://github.com/fabrikt-io/fabrikt/pull/502 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.3.1...25.4.0Low1/16/2026
25.3.1## What's Changed * Fix Ktor client operationId with special characters (#498) by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/499 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.3.0...25.3.1Low1/15/2026
25.3.0## What's Changed * Add required=true to `@JsonProperty` for required primitive fields by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/491 * Add NetworkResult/NetworkError sealed types to Ktor client by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/492 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/25.2.0...25.3.0Low1/10/2026
25.2.0## What's Changed * Upgrade to gradle 9.0 by @y-marion in https://github.com/fabrikt-io/fabrikt/pull/481 * Upgrade to latest jackson 2.x variant, use jackson-bom for jackson versions by @y-marion in https://github.com/fabrikt-io/fabrikt/pull/482 * Preserve JSON array input order when `"uniqueItems": true` by @danmanirl in https://github.com/fabrikt-io/fabrikt/pull/483 ## New Contributors * @danmanirl made their first contribution in https://github.com/fabrikt-io/fabrikt/pull/483 **FullLow12/3/2025
25.1.0## What's Changed * Update readme with docker usage by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/471 * Option to add Serdeable to generated models by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/473 * Make polymorphic allOf detection more targeted. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/476 * Support additionalProperties: false by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/478 **Full Changelog**: https://github.com/Low11/11/2025
25.0.0## What's Changed * Update version of fabrikt-gradle-plugin in README.md to 1.22.0 by @acanda in https://github.com/fabrikt-io/fabrikt/pull/467 * Docker GitHub packages by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/468 * Add support to okhttp client code generation for getting raw byte content by @averabaq in https://github.com/fabrikt-io/fabrikt/pull/469 * Add Ktor client generator by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/454 **Full Changelog**:Low10/31/2025
24.2.0## What's Changed * File disclaimer option by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/406 * Clients: Test enum as query param by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/460 * Add output options to Playground by @ulrikandersen in https://github.com/fabrikt-io/fabrikt/pull/464 * Fix enum tostring by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/466 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/24.1.3...24.2.0Low10/23/2025
24.1.3## What's Changed * Expand support for OpenAPI 3.1. by @cjbooms in https://github.com/fabrikt-io/fabrikt/pull/462 **Full Changelog**: https://github.com/fabrikt-io/fabrikt/compare/24.1.2...24.1.3Low10/9/2025
24.1.2## What's Changed * Fix kotlinx_serialization to respect datetime type overrides by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/455 * Add `@Contextual` annotations to array elements for kotlinx_serialization by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/456 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/24.1.1...24.1.2Low10/6/2025
24.1.1## What's Changed * fix spring http interface path param name by @mirror-kt in https://github.com/cjbooms/fabrikt/pull/429 * Bump kotlin and ktlint versions. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/446 * Add a configuration option to change the Instant type used for kotlinx serialization. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/445 * Minor cleanup by @cjbooms in https://github.com/cjbooms/fabrikt/pull/447 * fix: default value for floating numbers by @cjbooms inLow9/18/2025
24.0.0## What's Changed * fix: remove property from 'required' if it's a nullable ref by @rvinzent in https://github.com/cjbooms/fabrikt/pull/426 * fix(kdoc): fix error when description contains % sign by @beiertu-mms in https://github.com/cjbooms/fabrikt/pull/428 ## New Contributors * @rvinzent made their first contribution in https://github.com/cjbooms/fabrikt/pull/426 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/23.0.0...24.0.0Low7/30/2025
23.0.0## What's Changed * fix SpringBoot http client parameter names by @mirror-kt in https://github.com/cjbooms/fabrikt/pull/423 * add kdoc to models by @mirror-kt in https://github.com/cjbooms/fabrikt/pull/384 * Rename 'client' variable so it doesn't clash with other params by @davwil00 in https://github.com/cjbooms/fabrikt/pull/421 ## New Contributors * @davwil00 made their first contribution in https://github.com/cjbooms/fabrikt/pull/421 **Full Changelog**: https://github.com/cjbooms/fabLow6/29/2025
22.5.0## What's Changed * Polymorphic suffixed models bug fix by @lazfilor in https://github.com/cjbooms/fabrikt/pull/418 ## New Contributors * @lazfilor made their first contribution in https://github.com/cjbooms/fabrikt/pull/418 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/22.4.0...22.5.0Low6/16/2025
22.4.0## What's Changed * feat: support http status code ranges by @Stefanqn in https://github.com/cjbooms/fabrikt/pull/416 ## New Contributors * @Stefanqn made their first contribution in https://github.com/cjbooms/fabrikt/pull/416 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/22.3.0...22.4.0Low6/5/2025
22.3.0## What's Changed * Support long enum values by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/413 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/22.2.0...22.3.0Low5/12/2025
22.2.0## What's Changed * Fix #408 by doing distinct on body parameters by schema by @dscham in https://github.com/cjbooms/fabrikt/pull/409 * Fix oneof mappings issue by @cjbooms in https://github.com/cjbooms/fabrikt/pull/407 ## New Contributors * @dscham made their first contribution in https://github.com/cjbooms/fabrikt/pull/409 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/22.1.0...22.2.0Low4/28/2025
22.1.0## What's Changed * Fix inline handling of aggregations using anyOf allOf under arrays by @cjbooms in https://github.com/cjbooms/fabrikt/pull/403 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/22.0.1...22.1.0Low4/24/2025
22.0.1## What's Changed * BUG: Fix issue with inlined oneOf generation under arrays introduced in v 22.0.0. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/401 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/22.0.0...22.0.1Low4/23/2025
22.0.0## What's Changed * returns Unit when any successful response not exists by @mirror-kt in https://github.com/cjbooms/fabrikt/pull/385 * add springboot's http interface generator by @mirror-kt in https://github.com/cjbooms/fabrikt/pull/383 * Unique items support by @AlexanderKomi in https://github.com/cjbooms/fabrikt/pull/389 * Fix NPE on empty type. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/391 * Improve logging message when something goes wrong with type analysis … by @cjboomsLow4/21/2025
21.2.0## What's Changed * Fix inheritance of array properties by @mkostrzeba in https://github.com/cjbooms/fabrikt/pull/378 * relocate old guava libs to prevent conflicts by @ethanmdavidson in https://github.com/cjbooms/fabrikt/pull/380 ## New Contributors * @mkostrzeba made their first contribution in https://github.com/cjbooms/fabrikt/pull/378 * @ethanmdavidson made their first contribution in https://github.com/cjbooms/fabrikt/pull/380 **Full Changelog**: https://github.com/cjbooms/fabrikLow3/2/2025
21.1.0## What's Changed * Update version of fabrikt-gradle-plugin in README.md by @acanda in https://github.com/cjbooms/fabrikt/pull/371 * String format type overrides by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/368 * Handle query params with non primitive type in Ktor controller by @nsprod in https://github.com/cjbooms/fabrikt/pull/373 * Ktor server: Use DataConversion plugin for non-primitive path param types by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/375 * KtLow2/20/2025
21.0.0## What's Changed * Fixed query parameters with type List<Int> for OkHttp client by @xehmer in https://github.com/cjbooms/fabrikt/pull/361 * Kotlin serialization: Numbers by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/364 * Fix correctly defined nullable enums causing a NPE by @xehmer in https://github.com/cjbooms/fabrikt/pull/360 * Add option to add spring-cloud-openfeign-starter annotation by @cjbooms in https://github.com/cjbooms/fabrikt/pull/365 ## New Contributors * @xLow2/10/2025
20.0.0## What's Changed * Fix issue with generation of inlined items schema in arrays. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/353 * Inlined schemas under paths should default to Any. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/354 * Minor improvement to handle String enums as Strings. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/355 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/19.2.0...20.0.0Low1/29/2025
19.2.0## What's Changed * Interactive Playground by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/348 * Add support for additional properties with simple types. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/350 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/19.1.0...19.2.0Low1/27/2025
19.1.0## What's Changed * Update version of fabrikt-gradle-plugin in README.md by @acanda in https://github.com/cjbooms/fabrikt/pull/339 * Replace values() with entries() with in enums by @Palleas in https://github.com/cjbooms/fabrikt/pull/340 * Omit discriminator property for Kotlin serialization by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/342 * Kotlin serialization custom discriminator name by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/343 ## New Contributors Low12/20/2024
19.0.0## What's Changed * Update version of fabrikt-gradle-plugin in README.md by @acanda in https://github.com/cjbooms/fabrikt/pull/331 * JacksonModelGenerator is now simply ModelGenerator by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/330 * Add example controllers for model suffix by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/335 * Add usage tips to README by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/334 * Upgrade to Kotlin 2.0.20 by @ulrikandersen iLow12/10/2024
18.0.0## What's Changed * Support for Kotlin Serialization by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/327 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/17.4.0...18.0.0Low11/18/2024
17.4.0## What's Changed * Fix under-/overflow in min/max validation for controller parameters by @y-marion in https://github.com/cjbooms/fabrikt/pull/324 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/17.3.0...17.4.0Low10/9/2024
17.3.0## What's Changed * Update version of fabrikt-gradle-plugin in README.md by @acanda in https://github.com/cjbooms/fabrikt/pull/320 * Allow having multiple authentication alternatives in Ktor controllers by @lunakoly in https://github.com/cjbooms/fabrikt/pull/321 * Add Ulrik's code improvement suggestion by @cjbooms in https://github.com/cjbooms/fabrikt/pull/322 ## New Contributors * @lunakoly made their first contribution in https://github.com/cjbooms/fabrikt/pull/321 **Full Changelog*Low10/7/2024
17.2.0## What's Changed * Restructures and refreshes the README by @ulrikandersen in https://github.com/cjbooms/fabrikt/pull/316 * Update version of fabrikt-gradle-plugin in README.md by @acanda in https://github.com/cjbooms/fabrikt/pull/317 * Add option to specify custom model suffix by @shanio in https://github.com/cjbooms/fabrikt/pull/319 ## New Contributors * @shanio made their first contribution in https://github.com/cjbooms/fabrikt/pull/319 **Full Changelog**: https://github.com/cjboomLow10/2/2024
17.1.0## What's Changed * Add support for InputStream by @ctasada in https://github.com/cjbooms/fabrikt/pull/292 * Add client streaming flag protection by @averabaq in https://github.com/cjbooms/fabrikt/pull/314 * Fix default array issue. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/315 ## New Contributors * @ctasada made their first contribution in https://github.com/cjbooms/fabrikt/pull/292 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/17.0.0...17.1.0Low9/19/2024
17.0.0## What's Changed * Feature: Add dynamic query parameters to client calls by @hyperschwartz in https://github.com/cjbooms/fabrikt/pull/311 ## New Contributors * @hyperschwartz made their first contribution in https://github.com/cjbooms/fabrikt/pull/311 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/16.9.0...17.0.0Low9/5/2024
16.9.0## What's Changed * Fix BigDecimal defaults. by @cjbooms in https://github.com/cjbooms/fabrikt/pull/307 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/16.8.0...16.9.0Low8/22/2024
16.8.0## What's Changed * Add new `x-async-support` extension for generating async controllers by @jeet23 in https://github.com/cjbooms/fabrikt/pull/305 ## New Contributors * @jeet23 made their first contribution in https://github.com/cjbooms/fabrikt/pull/305 **Full Changelog**: https://github.com/cjbooms/fabrikt/compare/16.7.0...16.8.0Low7/31/2024

Dependencies & License Audit

Loading dependencies...

Similar Packages

kotlinx-schemaKotlin Multiplatform library that generates JSON Schemas from your methods and classes both at compile-time via Kotlin Symbol Processing(KSP) and at runtime via reflection or kotlinx.serialization.v0.5.0
kotlinpoetA Kotlin API for generating .kt source files.2.3.0
codegenA code generator to output type definitions from JSON Schema in a growing amount of programming languages0.0.0
uipath-ai-skillsAI skills that turns coding agents into UiPath experts.0.0.0
ZibStack.NETZero-reflection .NET source generators: [Log] structured logging, [Trace] OpenTelemetry spans, [Aop] aspects (Retry/Cache/Metrics), Dto/CrudApi, TypeGen (TypeScript + OpenAPI from C# DTOs). Compile-tiv3.2.4