The missing CLI tool for Kotlin
Other ecosystems have rich CLI tools for starting projects and managing dependencies — npm and pip among them. Kotlin has had you hand-editing a version catalog and copying a build script from the last project. Kitten fills that gap.
npm
node
npm init · npm install
pip
python
pip install
cargo
rust
cargo new · cargo add
kitten
kotlin
kitten new · kitten install
Get it running
Install with Homebrew — needs Java 21, pulled in automatically via openjdk@21.
brew install tenet-theory/tap/kitten
Or build from source: invoke the app through Gradle, or install a local binary and call kitten directly.
./gradlew :app:run --args='<command> ...' ./gradlew :app:installDist ./app/build/install/kitten/bin/kitten <command> ...
Four commands, no fuss
Scaffolding and catalog work, covered. Dependency commands walk up from the working directory to find gradle/libs.versions.toml.
new — Create a project
Interactive prompts fill in anything you omit. Defaults: name my-project, package org.example, path ., type plain Kotlin. --type accepts plain / kotlin or ktor.
kitten new kitten new my-app --package com.example --path ~/Code --type plain kitten new api --package com.example.api --type ktor
install — Add a Maven Central library or Gradle plugin to the catalog
Looks up the latest release and writes it into the nearest libs.versions.toml. Prefer group:artifactId when several groups publish the same name. With --module, also adds implementation(libs…) to that module’s build script. Pass --source-set to target a Kotlin Multiplatform source set (defaults to commonMain when the module already has sourceSets). Pass --plugin for a Gradle plugin id (writes alias(libs.plugins…) when --module is set).
kitten install clikt kitten install com.github.ajalt.clikt:clikt kitten install clikt --module app kitten install clikt --module shared --source-set androidMain kitten install org.jetbrains.kotlin.jvm --plugin --module app
add — Wire an existing catalog library or plugin into a module
Does not fetch from Maven Central. Resolves from the local libs.versions.toml, or from the project’s published ktorLibs catalog when present. Pass --source-set to add a library to a Kotlin Multiplatform source set (commonMain, androidMain, iosMain, …). Pass --plugin to wire alias(…plugins…). If that plugin is then used in more than one module, it is also declared on the root build script with apply false.
kitten add app clikt kitten add :ktor server-core kitten add shared clikt --source-set androidMain kitten add lib kotlin-jvm --plugin
uninstall — Remove a library or plugin from the catalog
Removes the matching alias from libs.versions.toml. Does not edit module build scripts. Pass --plugin to remove a [plugins] entry.
kitten uninstall clikt kitten uninstall com.github.ajalt.clikt:clikt kitten uninstall kotlin-jvm --plugin
Roadmap, not built yet
Richer project init and creating modules first, then Phoenix-style generators that cut across the server, the website, and a Kotlin Multiplatform app.
Init
planned
Ktor library picker
When you run kitten new --type ktor, a checkbox menu lets you pick the Ktor libraries you actually want — auth, websockets, content negotiation, and so on — instead of always getting the same default template.
planned
Kotlin Multiplatform
A project type for KMP apps, so kitten new can scaffold a multiplatform project the same way it currently does plain Kotlin and Ktor.
planned
Creating modules
Add a Gradle module to an existing project — directory, build.gradle.kts, and settings.gradle.kts include — instead of wiring that by hand.
planned
Kotlin toolchain support
kitten new and the dependency commands currently assume a Gradle project. Support the plain Kotlin toolchain (kotlinc / kotlin CLI, no build tool) as a project type alongside Gradle-based ones, so both are first-class.
Phoenix-like scaffolding
Inspired by Phoenix generators: one command writes the boring layers, consistently, across the stack.
planned
CRUD generators
Scaffold a resource end to end — not only Ktor routes and HTML, but the matching pieces in the website and the KMP app: models, clients, screens.
planned
Feature packs
One command to drop auth into an application. Same shape for Stripe, RevenueCat, and further integrations later: wire dependencies, config, and the call sites instead of copying a gist.
Small print, few surprises
Modules & catalogs
Dependency commands require a gradle/libs.versions.toml somewhere above the working directory. Module paths can be app or :app (nested modules use : → /, e.g. :feature:auth → feature/auth). Pass --source-set on install / add to target a Kotlin Multiplatform source set. Pass --plugin on install / add / uninstall to work with Gradle plugins instead of libraries. When a plugin is applied in more than one module, Kitten declares it on the root build.gradle.kts with apply false.
Ktor version catalog
Ktor projects (including ones from kitten new --type ktor) declare a published catalog in settings.gradle.kts:
versionCatalogs {
create("ktorLibs") { from("io.ktor:ktor-version-catalog:3.5.2") }
}
kitten add resolves against that catalog when the library isn’t in the local libs.versions.toml, and writes implementation(ktorLibs…). Local catalog entries always win. Pass aliases (server-core), artifact ids (ktor-server-core), or coordinates (io.ktor:ktor-server-core). With --plugin, the same lookup writes alias(ktorLibs.plugins…).
AI-generated content
This site and much of the Kitten docs were generated by AI. Several parts of the project are also AI-generated; look for @ComprehensionDebt on classes and functions that have not yet been thoroughly reviewed by a human.