kitten
$ kitten new api --type ktor
$ kitten install clikt --module app
$ kitten add :ktor server-core
$ kitten uninstall clikt

small CLI, sharp claws

Kitten.

Scaffold Kotlin. Wrangle catalogs. Skip the yak shaving.

A CLI for new Kotlin projects and Gradle version-catalog dependencies — pounce on Maven Central, wire up modules, and speak fluent ktorLibs.

01 — the gap

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

02 — feed it

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> ...
03 — the litter

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
04 — next

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.

05 — house rules

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:authfeature/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.