Curie, end to end.
Curie's surface area is intentionally small — a single binary, a single config file. The docs below cover each subsystem you'll hit as your project grows, from the first compile to publishing a release and auditing it for vulnerabilities.
Where to start
If you haven't built anything yet, run through Get started first. It takes about five minutes and leaves you with a working JAR you can run. Once that's clicking, the topics below dive into each piece.
Topics
Language support
01Java
Default language — no config needed. Two source layouts (flat-package and Maven), Java version via [java], main-class scanning, instance main methods, annotation processors.
Kotlin
Auto-detected .kt sources, two-phase Kotlin/Java compile, automatic Kotlin main-class detection, stale-class cleanup.
Groovy & Spock
Auto-detected .groovy sources, joint Java/Groovy compilation via FileSystemCompiler, Spock 2.x test specs discovered and run through JUnit Platform.
Project types
04Application
Compiles sources, runs tests, packages a JAR with embedded classpath manifest. Optional Docker image and GraalVM native binary. Full Curie.toml reference.
Library
Produces a plain JAR for use as a dependency. No main class, no Docker. Publishable to Maven repositories. Works as a workspace member with [workspace-dependencies].
Workspaces
Multi-module projects under one root Curie.toml. Topo-sorted builds, inherited BOM imports, shared Java version.
BOM projects
Author and publish a Maven Bill of Materials with [bom]. curie build produces a .pom with <packaging>pom</packaging> and a <dependencyManagement> block.
Build & test
08Incremental builds
The mtime check, the JDK fingerprint, the per-source class manifest the wrapper emits, and how all three combine into a precise rebuild gate.
09Adding dependencies
Declare [dependencies] and [bom-imports] by hand, or use curie add to resolve the latest version and write the entry automatically. curie remove cleans up.
Resolver & checksums
Breadth-first transitive resolution with nearest-wins conflict rules, parallel JAR downloads, .sha256 sidecar verification, offline mode, mirrors, and per-artifact repository routing.
Testing
JUnit 5 platform console runner with configurable version, co-located *Test.java/*Spec.java and top-level tests/ integration sources, optional filter argument.
Resource filtering
Opt-in variable substitution over resources with the collision-safe @var@ delimiter, independent [resources]/[test-resources] scopes, chained pluggable engines, per-file include/exclude, and binary safety.
Plugins
Extend the build with external source generators. Any binary named curie-<name> on PATH is activated via [plugin.<name>]. Curie handles staleness, artifact downloading, and source-root wiring.
Deploy
14Docker
Generated layer-friendly Dockerfile + .dockerignore, eclipse-temurin JRE base by default, configurable baseImage, dep JARs in their own cached layer.
Publishing
curie publish generates a POM, sources jar, javadoc jar, and GPG signatures, then uploads everything via HTTP PUT to any Maven 2-layout repository.
GraalVM native-image
curie native compiles the project to a standalone native binary using GraalVM's native-image tool. Configure reachability metadata, output name, and extra flags via [native-image].
Tools
17Formatter
curie fmt runs palantir-java-format (Java) and ktfmt (Kotlin) in one command. --check mode for CI; workspace fan-out shares one resolved classpath across all members.
Dependency tree
curie deps prints the full transitive tree. --why org.foo:bar explains which path introduced an artifact and why nearest-wins chose its version.
Audit (SBOM)
curie audit emits a CycloneDX 1.6 SBOM and cross-references every artifact against the OSV vulnerability database, printing findings grouped by artifact with ANSI-coloured severity.
Scaffolding
curie new app|lib|bom <name> generates a ready-to-build project skeleton in one command. curie init does the same in the current directory.
Build Inspect
Terminal UI for browsing build logs across an entire workspace. Drill into per-test output, grep log content with live highlights, filter by member name, and reload without restarting.
22Maven sync
curie maven sync generates a pom.xml from Curie.toml so mvn verify matches curie build — for IDEs, CI, and incremental migration. [maven] sync = true keeps it regenerated automatically.
Examples
All examples live in the examples/ directory and build end-to-end with curie build.
| Example | What it shows |
|---|---|
proto-greeter | Plugin framework — curie-protobuf generates Java stubs from .proto files before compilation |
openapi-greeter | Plugin framework — curie-openapi generates Java model classes from an OpenAPI 3 spec |
hello-world | Flat-package source layout — src/com.example/HelloWorld.java |
simplified-main | Instance main methods (Java 21+ preview) — bare void main() with no class or package |
json-greeter | Flat-package layout with a Jackson dependency |
string-utils | Library — flat-package, co-located unit tests and separate tests/ integration tests |
maven-string-utils | Library — Maven layout (src/main/java/ + src/test/java/) |
string-utils-cli | Application with [workspace-dependencies] on a sibling library |
jackson-bom-greeter | BOM imports inherited from the workspace root |
hello-kotlin | Kotlin sources — Maven layout, auto-detected main class |
hello-mixed | Mixed Java + Kotlin in a single flat-package directory |
groovy-greeter | Groovy language support — joint Java/Groovy compilation |
spock-demo | Spock 2.x test specs run through JUnit Platform |
lombok-greeter | Annotation processors — Lombok with on-compile-classpath = true |
auto-value-demo | Annotation processors — Google AutoValue generates immutable value classes |
graalvm-hello | GraalVM native-image compilation — [native-image] configuration |
spring-boot-demo | Production-quality Spring Boot 3 app — REST API, JPA, Spring Security |
google-mirror-demo | Repository mirror — route Maven Central downloads through a mirror |
shibboleth-demo | Per-dependency repository selection — artifact served from a custom registry |
add-remove-demo | curie add and curie remove — managing dependencies from the CLI |
publish-demo | curie publish — JAR + sources + javadoc + POM + GPG signatures via HTTP PUT |
my-platform-bom | BOM project — [bom] section produces a .pom with <dependencyManagement> |
nested-workspace-demo | Nested workspaces — three levels of workspace nesting |
verbose-test-demo | High-volume test output (~20k lines) — exercises curie inspect's virtualized log renderer |
Reference
The Resolver page lists every TOML key in the dependency section. Workspaces covers the inheritance rules. If something isn't documented, treat it as not yet stable — Curie is a research project and the surface area is intentionally small until each piece has had time to settle.
Source & issues
The codebase lives on GitHub. Issues, design discussions, and merge requests are all welcome.