One binary · in Rust · v0.1.7

Your product lives in 10 repos.
Which commits go together?

haw pins your whole multi-repo stack to one lockfile — so you, your CI, and your teammate check out the identical tree, every time. One binary, in Rust.

No submodules · no detached HEADs · no symlinks · no Python runtime.

What is hawser

haw is a multi-repo platform for teams that ship a product spread across many Git repositories. Five capabilities, one binary — each solving a slice of the multi-repo problem.

🧱

Compose

A reproducible stack from many repos: a haw.toml manifest and a committed haw.lock pin every repo to an exact SHA. Stacks & overlays, shallow and partial clone.

⚙️

Orchestrate

Run work across the whole fleet: parallel run/build/test, a fleet-wide grep, and a verify gate that exits 3 on drift — drop it straight into CI.

🔀

Collaborate

Cross-repo, cross-forge change flow: one feature = one branch across N repos, with linked PR/MRs on GitHub, GitLab & Bitbucket, and land to merge in dependency order.

🚁

Operate

A k9s-style TUI cockpit (bare haw): read → drill → act. Live fleet grid, PR checks, CI progress — then merge, approve, or checkout from the keyboard.

🛡️

Govern

Supply-chain & audit, built in: plugins, SBOM (CycloneDX + SPDX), SLSA/in-toto provenance, cosign/minisign signing, and evidence bundles for qualification.

It's not a git wrapper. It's the layer above git: the manifest, the lockfile, the fleet-wide build/test/CI, the cross-forge change flow, and the audit trail.

Quick start

Three commands from install to cockpit.

# install the one binary
$ cargo install hawser
# clone every repo, write haw.lock
$ haw sync
# open the cockpit
$ haw

New here? Start the guided course below, or explore runnable manifests in examples/.

Learn hawser

A guided course, from zero to productive. Nine short chapters — read them in order.

  1. 00 What is hawserThe problem, the model, and where haw fits above git.
  2. 01 Install & first runGet the binary, run haw, and see the cockpit.
  3. 02 The manifestDeclare repos and compose them into stacks with haw.toml.
  4. 03 Sync & the lockfilePin every repo to an exact SHA for a reproducible tree.
  5. 04 The TUI cockpitRead → drill → act across the whole fleet, keyboard-first.
  6. 05 Changesets across reposOne feature, one branch across N repos, linked PR/MRs.
  7. 06 Build, test & verifyRun the fleet in parallel and gate drift in CI.
  8. 07 Going to productionGovernance, signing, evidence, and CI/CD integration.
  9. 08 Build a plugin (MCP for Claude)Ship a haw plugin that doubles as an MCP server so Claude writes your commits & PRs.
Start the course →

Why hawser · who it's for

Splitting a product across repositories is routine — and domain-agnostic. The manifest, lockfile, changeset flow, fleet build/test, and governance hooks are the same in every domain; only the repos and commands differ.

Embedded & automotive

Shared HAL/BSP/MCAL reused across many ECUs; AUTOSAR/ARXML config repos pinned beside the code.

Backend microservices

One feature spanning N services plus a shared proto/lib — branched, PR'd, and landed together.

ML / data platforms

Model repo + data-pipeline repo + serving infra, pinned as one reproducible baseline.

Platform / infra

Terraform, Helm, and reusable module repos composed and versioned as a unit.

Mobile

An app repo and its SDK repo(s), changed in lockstep across a single changeset.

“It's not a git wrapper. haw orchestrates Git and the forge APIs — it does not reimplement Git's merge engine, replace a forge, or replace your toolchain.”

A git submodules alternative — and a fleet orchestrator

If you manage multiple git repositories and need a reproducible multi-repo build, submodules and hand-rolled scripts both fall short. haw pins every repo to an exact SHA in one lockfile, then builds, tests, and ships changes across the whole fleet.

vs git submodules

No detached HEADs, no fragile .gitmodules, no nested-checkout surprises. Each repo stays a plain, autonomous git clone; reproducibility comes from haw.lock.

vs manual clone scripts

Stop maintaining a bash script that clones N repos. One manifest declares the stack; haw sync writes exact SHAs so you, CI, and teammates get the identical tree.

vs a monorepo

Keep independent repos, histories, and access control — get monorepo-style "one coherent version" without merging everything into a single tree.

+ fleet orchestration

Beyond composition: run haw build / haw test in parallel across every repo, and open cross-repo pull/merge requests as one changeset.

FAQ

What's a good alternative to git submodules?

hawser. It pins many git repos to exact SHAs in a single lockfile without the detached-HEAD and nested-checkout pain of submodules — one static binary, no Python.

How do I manage multiple git repositories?

Declare them in a haw.toml manifest, run haw sync to clone and pin every repo, then drive builds, tests, and cross-repo changes from one TUI cockpit.

How do I make a multi-repo build reproducible?

haw sync writes haw.lock with the exact commit SHA of every repo, so any machine checks out the identical tree — reproducible by construction.

hawser vs git submodules — what's the difference?

Submodules embed pinned pointers inside one repo and detach HEADs. hawser keeps each repo autonomous, adds a shared lockfile, and layers parallel build/test plus cross-repo PR flow on top.

Documentation

Everything, published as an mdBook under /hawser/docs/.

Getting started →

The guided learning course, chapter by chapter.

Examples →

Runnable manifests per domain + real embedded fleets you can build.

Integration recipes →

Docker cross-compile, QEMU/FreeRTOS, tresos/Vector/IAR wiring.

CLI & TUI keymap →

The full verb lexicon and the cockpit keymap.

Plugins →

Writing haw-<name> plugins and the dispatch contract.

Extending →

Plugins, hooks, auth, and CI/CD integration.

Architecture →

Crate layout, concurrency model, forge abstraction, data flows.

Domains →

How the manifest/lock/changeset loop maps onto each domain.

Install →

Full install matrix + signature verification.

Distribution →

Release channels and packaging.

Compliance →

Tool qualification, SBOM/CRA, crypto/signing, GDPR.

Security →

The trust model — what haw executes, plugin trust, tokens.

Install

Pick a package manager — all install the same haw binary v0.1.3.

# Rust / crates.io (canonical)
$ cargo install hawser
# macOS + Linux (Homebrew)
$ brew install nastwinns/tap/hawser
# Windows (Scoop)
$ scoop bucket add nastwinns https://github.com/Nastwinns/scoop-bucket
$ scoop install hawser
# Fully static — no glibc, no runtime; ideal for servers, containers, air-gap
$ curl -sSL https://github.com/Nastwinns/hawser/releases/download/v0.1.3/\
haw-0.1.3-x86_64-unknown-linux-musl.tar.gz | tar xz \
  && sudo install haw /usr/local/bin/

Every release is signed (cosign .sig/.pem + .sha256). Full matrix & verification: docs/INSTALL.