Features

Features of genhttp-kt, the Kotlin port of the GenHTTP web server: frameworks, standards, its engines and how it is verified.

Frameworks

genhttp-kt provides several frameworks to develop and host web services (service classes, controllers or functional handlers). Additionally, you can easily host static websites or a single page application. Besides this, the framework comes with a rich set of features:

  • Automatically generated Open API specifications, with Scalar, Redoc or Swagger UI to browse them
  • Various authentication methods (API keys, JWT, client certificates or basic authentication)
  • Support for Websockets and Server Sent Events (SSE)
  • Automatic response compression (Brotli, Zstandard, gzip) and request decompression
  • Client caching directives and automatic ETag handling
  • Range support to fetch byte ranges
  • Security relevant features, such as CORS policies and an automatic redirection to HTTPS
  • JSON, XML, YAML, form and Protobuf serialization, dependency injection with Koin

All of them are documented in the documentation.

Server Performance

According to HTTP Arena, genhttp-kt is among the fastest Kotlin web servers for HTTP/1.1. The following excerpt shows how it compares to the Java and Kotlin frameworks in the field, each without tuning:

FrameworkLanguageScore (Composite H1)
ktronKotlin7711
genhttp-kt-nettyKotlin5648
vertxJava4874
micronautJava3989
genhttp-ktKotlin3869
helidonJava3516
ktorKotlin2796
netonKotlin2100
joobyJava1993
http4kKotlin1633
spring-bootJava1509

As the leaderboard showed them on October 24, 2026.

With the Netty engine, genhttp-kt ranks second of all the Java and Kotlin frameworks in the field. The internal engine is 1.4 times faster than Ktor and 2.6 times faster than Spring Boot in a mixed challenge with different use cases and usage scenarios.

Made for Kotlin

genhttp-kt is not a wrapper around a Java server - it is GenHTTP, written in Kotlin:

  • Coroutines all the way. Handlers, concerns and operations are suspend functions. Suspend whenever you like - wait for a database, a delay or a channel - without holding a thread.
  • Virtual threads or event loops. On the internal engine, every connection runs as a coroutine on a dispatcher backed by virtual threads, reading and writing through NIO - blocking code is fine as well, a blocking call only parks a virtual thread. On the Netty engine, every connection runs as a coroutine on the event loop that accepted it, for handlers that suspend rather than block.
  • Kotlin types. Data classes are serialized as they are, nullability is respected when requests are mapped, kotlin.time.Duration and java.time are used where GenHTTP uses TimeSpan and DateTime.
  • Few dependencies. The internal engine and the core modules need the Kotlin standard library, kotlinx.coroutines and the SLF4J API. A module that needs more - Jackson, swagger-core, Pebble, Nimbus - brings it along.

Engines

genhttp-kt has two HTTP/1.1 engines: the port of the internal engine of GenHTTP, with TLS through the SSLEngine of the JDK, and the Netty engine - the counterpart of GenHTTP’s ioxide engine - with one event loop per CPU core on epoll or io_uring and TLS through OpenSSL. Both select certificates per host name (SNI) and parse requests with a port of Glyph11, a hardened parser for HTTP/1.1, and your application runs on either without changes. See Engines for how they work and which one to choose.

Verified Against GenHTTP

The port is checked against GenHTTP on every build: more than 1,000 tests mirrored one to one from GenHTTP and Glyph11, a comparison of the public API, reviewed API dumps, at least 90 % line coverage, on Linux, Windows and macOS. About the Port tells how it is made and kept in sync.

Last updated on