Your First Bleep Project (Kotlin)
This tutorial walks you through scaffolding a small Kotlin project with bleep, running it, running its tests with Kotest, and importing the project into IntelliJ IDEA.
Prerequisites
- Bleep installed
- A terminal
- IntelliJ IDEA (or any BSP-aware IDE)
Step 1: Create the project
mkdir my-first-bleep-project
cd my-first-bleep-project
bleep new myapp --lang kotlin
bleep new writes a complete, ready-to-run workspace: a bleep.yaml, a
myapp project with a hello-world Main.kt, and a myapp-test project
wired up with Kotest.
The Kotlin compiler and standard library are downloaded by Coursier on
first compile; you don't need a separate kotlinc install.
Step 2: What got generated
The build file:
$schema: https://raw.githubusercontent.com/oyvindberg/bleep/master/schema.json
$version: 1.0.0-M9
jvm:
name: graalvm-community:25.0.1
projects:
myapp:
extends: template-common
platform:
mainClass: com.example.MainKt
myapp-test:
dependencies:
- io.kotest:kotest-runner-junit5-jvm:5.8.0
- org.junit.jupiter:junit-jupiter:5.10.1
dependsOn: myapp
extends: template-common
isTestProject: true
templates:
template-common:
kotlin:
jvmTarget: '25'
version: 2.3.0
platform:
name: jvm
The kotlin block under template-common tells bleep to invoke
kotlinc for .kt sources and produces JVM bytecode targeting the JVM
the build runs on. Both myapp and myapp-test extend the template, so
they share kotlin.version, kotlin.jvmTarget, and platform.name.
The main source, myapp/src/kotlin/com/example/Main.kt:
package com.example
object Main {
fun greet(name: String): String = "Hello, $name!"
}
fun main() {
println(Main.greet("World"))
}
Note: Kotlin's compiler generates a JVM class named
MainKtfor a top-levelmainfunction inMain.kt— that's themainClassset inbleep.yaml.
The test, myapp-test/src/kotlin/com/example/MainTest.kt:
package com.example
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
class MainTest : FunSpec({
test("greets by name") {
Main.greet("World") shouldBe "Hello, World!"
}
})
Step 3: Run it
bleep run myapp
Hello, World!
Step 4: Run the tests
bleep test myapp-test
Step 5: Add a dependency
Java/Kotlin dependencies use a single colon :. To add a logging
library, edit bleep.yaml:
projects:
myapp:
extends: template-common
dependencies:
- io.github.microutils:kotlin-logging-jvm:3.0.5
- org.slf4j:slf4j-simple:2.0.9
platform:
mainClass: com.example.MainKt
Step 6: Open it in your IDE
bleep setup-ide
setup-ide writes a BSP configuration any BSP-aware editor can consume.
IntelliJ IDEA
Open → select the project directory. The bundled Kotlin plugin
handles .kt files automatically once BSP has imported the project.
This is the smoothest path for Kotlin projects.
VS Code with Metals
Install the Metals extension and open the project folder. Metals detects the BSP server. Metals is Scala-focused; for full Kotlin language features you'll usually pair it with the Kotlin extension, which provides syntax + completion. IntelliJ remains the more polished choice for Kotlin.
Compiler plugins
Bleep ships first-class support for the standard Kotlin compiler plugins
(spring, jpa, allopen, noarg, serialization):
projects:
myapp:
extends: template-common
kotlin:
compilerPlugins:
- spring
- jpa
KSP / KAPT? Kotlin Symbol Processing and KAPT processors are not yet supported. If your project uses Spring Modulith, Koin's KSP verifier, Room, Hilt, or any other
ksp(...)/kapt(...)-based dependency, see the Kotlin section of Annotation processing for status, what works today, and what doesn't.
Project structure
my-first-bleep-project/
├── bleep.yaml
├── myapp/
│ └── src/
│ └── kotlin/
│ └── com/
│ └── example/
│ └── Main.kt
└── myapp-test/
└── src/
└── kotlin/
└── com/
└── example/
└── MainTest.kt
Coming from Gradle? Bleep uses
src/kotlin/rather thansrc/main/kotlin/because there is nosrc/test/kotlin/to contrast with — tests live in their own sibling project (myapp-test) rather than under atest/subtree. Same files, shorter paths.
Next steps
- Write your first script — custom build logic
- Dependency management
- Coming from Gradle?