Skip to content

headwater is designed, not built. Its design book holds the design whole.

headwater

headwater tells your repository which releases of what it depends on are newer than what it runs, in upstream’s own words.

headwater: the pin decides what is newA repository declares serde ^1.0 in Cargo.toml, pinned at 1.0.227; fastapi ~=0.118.0 in pyproject.toml, pinned at 0.118.0; and react ^19.1.0 in package.json, pinned at 19.1.0. headwater reads the declarations and asks each package manager first, npm, uv and cargo, read-only in the repository’s own shell, with deps.dev, GitHub, ecosyste.ms and OSV after them. Each answer is a line of releases in version order with the pin marked, and every release past the pin is newer: serde 1.0.228, fastapi 0.119.0, react 19.2.0 and 19.2.1, four in the report. fastapi 0.119.0 is outside its declared range, so taking it moves the manifest; the others move only the lockfile. A fixer bumps react to 19.2.1 and sluice lands it. The pin in package.json moves to 19.2.1, the ring on react’s line moves with it, and react’s two releases leave the report, which now holds two.THE REPOSITORYLOOKUPSRELEASES IN VERSION ORDERTHE REPORTnpm · uv · cargoin its own shelldeps.devGitHubecosyste.msOSVCargo.tomlserde^1.0pin1.0.227pyproject.tomlfastapi~=0.118.0pin0.118.0package.jsonreact^19.1.0pin19.1.019.2.1newer1.0.2191.0.2251.0.2261.0.2271.0.228pinnewer0.116.10.117.00.117.10.118.00.119.0pinnewer18.3.119.0.019.1.019.2.019.2.1pinpkg:cargo/serdepkg:pypi/fastapipkg:npm/react4 newer than their pins2 newer than their pinsa fixer moves react’s pin to 19.2.1sluice lands itserde1.0.228fastapioutside its range0.119.0react19.2.0react19.2.1inside its range: the lockfile movesoutside it: the manifest moves1headwater reads whatthe repository declares.2It asks each package managerfirst, then the lookups.3Every release newer thanits pin is reported.4A bump lands, the pin moves,and its releases leave.
headwater: the pin decides what is newA repository declares serde ^1.0 in Cargo.toml, pinned at 1.0.227; fastapi ~=0.118.0 in pyproject.toml, pinned at 0.118.0; and react ^19.1.0 in package.json, pinned at 19.1.0. headwater reads the declarations and asks each package manager first, npm, uv and cargo, read-only in the repository’s own shell, with deps.dev, GitHub, ecosyste.ms and OSV after them. Each answer is a line of releases in version order with the pin marked, and every release past the pin is newer: serde 1.0.228, fastapi 0.119.0, react 19.2.0 and 19.2.1, four in the report. fastapi 0.119.0 is outside its declared range, so taking it moves the manifest; the others move only the lockfile. A fixer bumps react to 19.2.1 and sluice lands it. The pin in package.json moves to 19.2.1, the ring on react’s line moves with it, and react’s two releases leave the report, which now holds two.THE REPOSITORYLOOKUPSRELEASES IN VERSION ORDERTHE REPORTnpm · uv · cargo, in the repository’s own shellthen deps.dev · GitHub · ecosyste.ms · OSVCargo.tomlserdepin1.0.227pyproject.tomlfastapipin0.118.0package.jsonreactpin19.1.019.2.1serde^1.0newer1.0.2191.0.2251.0.2261.0.2271.0.228pinfastapi~=0.118.0newer0.116.10.117.00.117.10.118.00.119.0pinreact^19.1.0newer18.3.119.0.019.1.019.2.019.2.1pinpkg:cargo/serdepkg:pypi/fastapipkg:npm/react4 newer than their pins2 newer than their pinsa fixer moves react’s pin to 19.2.1sluice lands itserde1.0.228fastapi0.119.0react19.2.0react19.2.1inside its range: the lockfile movesoutside it: the manifest moves1headwater reads what the repository declares.2It asks each package manager first, then the lookups.3Every release newer than its pin is reported.4A bump lands, the pin moves, and its releases leave.

headwater reads what a repository declares, asks each ecosystem’s package manager first, in the repository’s own shell, and reports every release newer than the pin. The pin alone decides what is new, so headwater keeps no list of what it reported: when a bump lands, the pin moves and the release leaves the report.

The roadmap orders the work of building it.

Every newer release

Each release past the pin, marked inside or outside the declared range, with its date, its link and its notes whole, as upstream wrote them. No model reads the notes inside headwater.

Advisories that name the pin

Reported apart from the notes. A dependency an advisory names stays marked affected, whatever anyone dismissed.

What it could not read

A declaration headwater cannot read, or a source it cannot reach, is reported unread with the reason. Nothing drops out of a report.

A brief for each release

Everything a fixer needs to make the bump: the release, its notes, its advisories, every declaration of the dependency with its pin, and the ecosystem’s own command for the move.

headwater never changes a repository, never rewords or ranks a release, and never acts on one. It runs a package manager only to read, and never runs the command that moves a pin. A person or a coding agent decides whether to move it, and the change is theirs. A lookup learns the identities and versions headwater asks about and nothing else of the repository, and headwater keeps no credential.

One core answers every surface the same way, so a person at the command line, an agent in its session and a pane beside the agents all see one report.

Command line

A scan, a report, a brief for one release, and every answer as JSON on request.

Claude Code

New releases noted at a session’s start, and a release handed to a background agent in a worktree of its own.

herdr

A sidebar row of unread releases, a popup with the brief, and a key that starts an agent in a worktree to make the bump and submit it to sluice.

Flywheel

An adapter that hands every release newer than its pin to millpond, the inbox, which records each one once. How it fits.

swancloud, a NixOS fleet, runs headwater first. Its watch list, generated from the versions the fleet pins, names each tool’s upstream repository and tag pattern, and headwater takes over from the release adapter the fleet runs today.