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...