Weave it all together

A high-performance, local toolchain for managing monorepos. One command builds and tests every workspace in your repo, in any language. Lattice skips whatever you already built.

macOS and Linux ·

Less setup, faster builds

Lattice works out which tool each workspace already uses, runs your tasks in dependency order, and restores cached results instead of running them twice.

Builds finish sooner

Repeat a build and the parts that didn't change come straight from cache. Change one workspace and Lattice re-runs only that workspace and whatever depends on it.

One command for the whole repo

Build and test every workspace with the same command, whatever language each one uses. Lattice orders the runs by dependency and starts the independent ones together.

No build scripts to write

List your workspaces once. Lattice reads the manifest or lockfile already in each directory to work out the command to run.

The same tool versions everywhere

Pin the compilers, linters, and package managers a workspace needs, and Lattice checks or installs them before any task starts. A fresh clone builds the same on your laptop and in CI.

Skip work you already did

One file lists your workspaces and the tasks they share. Lattice runs the tasks that changed and restores the rest from cache.

lattice.json
{
  "workspaces": [
    { "name": "api", "path": "apps/api", "engines": { "go": ">=1.22" } },
    { "name": "web", "path": "apps/web", "engines": { "node": ">=20" } },
    { "name": "ml",  "path": "services/ml", "engines": { "python": ">=3.12" } }
  ],
  "tasks": {
    "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
    "test":  { "dependsOn": ["build"] }
  }
}
terminal
$ lattice run build
api:build: running
ml:build: running
web:build: cache hit [d97c6e8a]
ml:build: done (0.44s)
api:build: done (1.21s)
lattice: 3 tasks, 1 cached, 0 failed, 1.26s, 0.83s saved
lattice desktop

Run and inspect your repo in a desktop app

Lattice Desktop runs the same tasks the CLI runs. It also draws the task graph, edits lattice.json as a form, and tells you why a task ran again.

Every task in one list

Every workspace in the repo, with the tasks it can run. Start a task, watch its output stream in, and see which results came from cache.

Watch the graph fill in

The task graph is drawn in dependency order and fills in as the build moves through it. Click a task to isolate it with everything it depends on and everything that depends on it.

Edit the config without editing JSON

Workspaces, tasks, and tool versions as a form. The same parser a run uses checks every edit as you type, and a repo with no lattice.json gets a four-step walkthrough.

Find out why a task re-ran

When a task misses the cache because something changed, the app names what changed. You get the command, the inputs, the toolchain, or a task it depends on, instead of a bare hash.

Install and run

Run this in the root of your repo. Then ./.lattice/bin/lattice init writes a config, and lattice run build builds every workspace in it.

macOS and Linux ·