Skip to main content

Project status

Bleep exists because the existing JVM build tools couldn't keep up with the codebases we needed to ship. Maven, Gradle, and sbt all slow to a crawl on multi-hundred-thousand-line builds — import in IntelliJ takes minutes, incremental compiles stall on configuration overhead, and every CI run pays the JVM startup tax. Bleep is shaped for enormous codebases from the start: a flat YAML model, an in-process BSP server, native-image CLI startup, per-project locks, and an incremental compile loop tuned for projects with thousands of source files.

It self-hosts — bleep itself is built with bleep, including a multi-project Scala 3 codebase, several ported sbt plugins, and the GraalVM native-image release pipeline. It's also in production on private codebases with millions of lines of source, plus libraries published to Maven Central, generated-source projects with hundreds of thousands of lines, and backend services shipping to real users.

The workload bleep is developed against

The daily driver is a private repository of 12.9M lines across 57,941 files. Of that, bleep compiles 4.1M lines of Java and Scala across 11,896 files in 67 projects — and 3.7M of those Java lines (92%) are generated and checked in, a SQL parser and AST family spanning a dozen database dialects. Roughly 2,300 declared tests run against a corpus of 44,127 SQL files, and several suites are heavy enough to need their own heap.

It is never one build at a time. Development runs across a dozen or more git worktrees concurrently, each an independent client of the same shared compile server, often driven by several agents at once. A single diagnostic session on that setup caught the daemon serving 11 worktrees across 14 concurrent connections and 18 concurrent compiles.

That shape is why bleep is built the way it is, and it is where its bugs come from. A shared daemon that keeps a dozen worktrees warm is what parallel development at this scale needs; it is also the thing that has to stay correct under contention before it is worth anything.

The version is 1.0.0-M*, milestone, not GA. The build model is stable in practice; named features are tested by integration tests.

The bleep-bsp rewrite

The compile server (bleep-bsp) was rewritten with heavy Claude assistance — BSP protocol handling, Zinc invocation, the per-project lock model, the shared-daemon lifecycle, the test runner. Core paths are tested and the rewrite is what powers the bleep build itself today. The CLI surface above the BSP layer is unchanged.

1.0.0-M11 is largely the release that went and found those edge cases. Its 83 commits are dominated by exactly the areas flagged here as rough: concurrent workspaces (one client's disconnect no longer kills another's forks; locks and KSP mutexes are scoped correctly), scheduling under contention (one machine-wide governor, three reproduced deadlocks fixed, every fork bounded), heap retention (Zinc analyses interned and owned by their workspace), crash recovery (readiness by connect rather than by grepping a rotated log, idle self-shutdown, logs that survive the restart meant to diagnose them), and a family of bugs that let a broken build report success. See the M11 release notes.

Expect occasional rough spots still — this is milestone software and the surface is wide — but the specific failure modes that motivated this warning have mostly been closed rather than merely acknowledged.

If you hit a bleep-bsp issue, the server log at ~/Library/Caches/build.bleep/socket/<hash>/output (or the equivalent on Linux) is the first thing to attach to a bug report.

What's not yet covered

  • No BOM / dependencyManagement: every dependency declares its version explicitly. Spring Boot users feel this most.
  • No KAPT for Kotlin. KAPT is legacy; migrate to KSP1, which is supported (see annotation processing). KSP runs from scratch on every compile today; per-file change tracking for incremental mode is a planned follow-up.
  • No Gradle import: Maven and sbt are imported via bleep import / bleep import-maven.
  • Single-host caching only: remote cache works via bleep remote-cache pull / push; not transparent on every invocation.
  • Plugin ecosystem is small compared to Maven/Gradle/sbt, the ports that exist (sbt-ci-release, sbt-sonatype, sbt-pgp, sbt-dynver, sbt-native-image, sbt-scalafix, sbt-jni, mdoc) cover release workflows; one-off plugins are user-implemented as scripts.

Recommendation

Use bleep on greenfield projects without reservation. For migrating an existing build, run bleep import or bleep import-maven first , if the imported result compiles and tests, you're in a usable state.