Curie: A fast, minimal build tool for Java, Kotlin, and Groovy, written in Rust

arto1 pts0 comments

Curie — a fast, minimal build tool for the JVM

# Everything Curie needs to build and containerise an app.<br>[application]<br>name = "greeter"<br>version = "0.1.0"

[docker]

[dependencies]<br>"com.fasterxml.jackson.core:jackson-databind" = "2.17.2"

[test-dependencies]<br>"org.junit.jupiter:junit-jupiter" = "5.11.0"

Building greeter v0.1.0<br>Resolve deps 3 JAR(s)<br>Compile 1 source file(s) [no class files]<br>Compile tests 1 source file(s)<br>Tests ✔ 4 tests successful<br>Package greeter-0.1.0.jar<br>Docker image greeter:0.1.0 (via target/Dockerfile)<br>Run docker run --rm greeter:0.1.0

Hello from greeter.

01 — conventions<br>New conventions for 202X.

Maven arrived in 2004 and brought convention over configuration and a centralized repository — genuinely transformative at the time. Twenty years later Curie brings it forward: one Curie.toml replaces hundreds of lines of POM XML, built-in code formatting & security audit, support for modern terminals & color output.

02 — correctness<br>Reproducible. Incremental. Parallel.

Outputs are deterministic — re-run a build with the same inputs, get a byte-identical JAR. Incremental compilation skips javac when nothing has changed. Workspace members build in parallel by default utilizing all available cores.

03 — accessible<br>Human and AI friendly.

A single Curie.toml file captures everything a build needs — no lifecycle phases, no task graph, no DSL. It is easy to read, easy to write, and easy to generate. An AI coding assistant can scaffold, update, and debug a Curie project without needing to understand a plugin ecosystem or a Groovy DSL.

04 — minimal<br>Less plugins.

Maven and Gradle solve every problem with a plugin. Curie builds the 80% case — compile, test, package, format, publish, audit, containerise — directly into the binary. Because those steps are built in rather than bolted on, they share one configuration — so there are no plugin versions to keep in sync. Your configuration stays small as the project grows.

Curie<br>Maven<br>Gradle

Configuration<br>Curie.toml (~20 lines) — declarative<br>pom.xml (100+ XML) — declarative<br>build.gradle — a step back to procedural DSL<br>(declarative syntax planned)

Startup<br>Native binary — instant<br>JVM cold start (~1–2 s)<br>Quick, but only if resource heavy daemon already started

Incremental builds<br>Built-in<br>Plugin-dependent<br>Built-in but complex

Reproducible output<br>Yes, default<br>Extra plugin<br>Extra plugin

Docker support<br>First-class<br>External plugin<br>External plugin

Maven publishing<br>curie publish<br>mvn deploy<br>publish task

Vulnerability scan<br>curie audit (built-in)<br>External plugin<br>External plugin

Checksum verification<br>SHA-256, default<br>Extra config<br>Extra config

01<br>Mvn<br>Resolver<br>Maven Central, BOM imports, transitive expansion

02<br>Rst<br>Rust<br>Native binary — no JVM warmup, no daemon, no GC pauses in the build itself

03<br>Kt<br>Kotlin<br>Auto-detected, two-phase compile, no config

04<br>Inc<br>Incremental<br>mtime + per-source class manifest + JDK fingerprint

05<br>Wks<br>Workspaces<br>Topo-sorted multi-module with inherited BOMs

06<br>Fmt<br>Formatter<br>palantir-java-format + ktfmt — Java and Kotlin in one command

07<br>Tst<br>Tests<br>JUnit 5 console runner, no Surefire ceremony

08<br>Dkr<br>Docker<br>Optimised Dockerfile, generated automatically

09<br>Grv<br>Groovy<br>Groovy + Spock, auto-detected, joint Java/Groovy compilation

10<br>Pub<br>Publish<br>POM generation, sources/javadoc jars, GPG signing, HTTP PUT to any Maven 2 repo

11<br>Dep<br>Deps<br>Dependency tree, --why conflict traces, --tests

12<br>Aud<br>Audit<br>CycloneDX 1.6 SBOM, OSV vulnerability scan

13<br>Nat<br>Native<br>GraalVM native-image via [native-image] config

14<br>New<br>Scaffold<br>curie new / curie init — project skeleton in one command

15<br>Mvs<br>Maven sync<br>Generate pom.xml from Curie.toml — keep Maven tooling working alongside Curie

[workspace]<br>members = ["app", "core", "utils"]

[java]<br>releaseVersion = "21"

[bom-imports]<br>"com.fasterxml.jackson:jackson-bom" = "2.17.2"

[test-bom-imports]<br>"org.junit:junit-bom" = "5.11.0"

Workspace . build (3 members)

[1/3] utils<br>[2/3] core<br>[3/3] app<br>Resolve deps 7 JAR(s)<br>Compile 12 source file(s)<br>Tests ✔ 27 tests successful<br>Done target/app-0.1.0.jar

Maria Skłodowska-Curie<br>Named after a scientist who worked at the atomic level.

Curie honours Maria Skłodowska-Curie (1867–1934), the Polish-born physicist and chemist who discovered polonium and radium, and remains the only person to have won Nobel Prizes in two different sciences. The element Curium (Cm, 96) — already the tool's symbol — was named in her honour. Like her work, Curie the build tool aims to operate at the atomic level: stripping away everything non-essential to expose the stable core underneath.

Cargo kinship<br>An intentional echo of Rust's build tool.

The name is also a deliberate nod to Cargo , Rust's package manager and build tool. Curie.toml mirrors Cargo.toml. The workspace model and CLI verbs (build, test, publish, new) are borrowed directly from Cargo's playbook. If you already know Cargo, Curie should feel like home — just with a JVM at the centre instead of LLVM.

Curiosity<br>The instinct...

curie build plugin maven tests tool

Related Articles