Running as a Netty-based server

Warning! This is an early development module, with important features missing.

To expose an endpoint using a Netty-based server, first add the following dependency:

"com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.0.0-RC1"

Then, use:

  • NettyFutureServer().addEndpoints to expose Future-based server endpoints.

  • NettyCatsServer().addEndpoints to expose F-based server endpoints, where F is any cats-effect supported effect.

These methods require a single, or a list of ServerEndpoints, which can be created by adding server logic to an endpoint.

For example:

import sttp.tapir._
import sttp.tapir.server.netty.NettyServerType.TCP
import sttp.tapir.server.netty.{NettyFutureServer, NettyFutureServerBinding}
import scala.concurrent.Future

val helloWorld = endpoint
  .serverLogic(name => Future.successful[Either[Unit, String]](Right(s"Hello, $name!")))

val binding: Future[NettyFutureServerBinding[TCP]] = 

Domain socket support

There is possibility to use Domain socket instead of TCP for handling traffic.

import sttp.tapir.server.netty.NettyServerType.DomainSocket
import sttp.tapir.server.netty.{NettyFutureServer, NettyFutureServerBinding}
import sttp.tapir.{endpoint, query, stringBody}

import java.nio.file.Paths
import java.util.UUID
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}

val serverBinding: Future[NettyFutureServerBinding[DomainSocket]] =
    .path(Paths.get(System.getProperty(""), UUID.randomUUID().toString))
    .addEndpoint("hello").in(query[String]("name")).out(stringBody).serverLogic(name =>
        Future.successful[Either[Unit, String]](Right(s"Hello, $name!")))


The interpreter can be configured by providing an NettyFutureServerOptions value, see server options for details.

Some options can be configured directly using a NettyFutureServer instance, such as the host and port. Others can be passed using the NettyFutureServer(options) methods. Options may also be overridden when adding endpoints.