The Ktor framework ships with very few setting-up constraints, such as logging, templating, messaging, persistence, serializing, dependency injection, and so on, for projects.
The features are installed into an application using a unified interception mechanism, which allows for the building of arbitrary pipelines. Thanks to this, it can be hosted in any servlet container with Servlet 3.0+ API support such as Tomcat, or as a standalone using Netty or Jetty.
The application's composition is unopinionated, which means it's entirely the developer's choice whether to use dependency injection framework or to do it manually; or to use functions or classes.