Free and open source · Linux

A control tower for your coding agents.

Not an IDE. Agents write the code now; you supervise it. Difftower shows every change they make as they make it, guards the files they must not touch, and runs your tests — on your machine or on a server over SSH.

$curl -fsSL https://difftower.com/install.sh | sh

Rust + GPUI · native and GPU-rendered · no telemetry · macOS soon

billingme@devboxvs HEAD ▶ Run testsUnified
Changes 4FilesProtectedTests
invoice.tssrc/billing/+9−3
tax.tssrc/billing/+4−1
rounding.tssrc/money/+22
invoice.test.tstests/🛡
src/billing/invoice.ts+9 −3
12 import { roundHalfEven } from "../money/rounding";
13
14 export function total(lines: Line[]): Money {
15− const sum = lines.reduce((a, l) => a + l.price * l.qty, 0);
16− return Math.round(sum * 100) / 100;
15+ const cents = lines.map((l) => toCents(l.price) * l.qty);
16+ const sum = cents.reduce((a, c) => a + c, 0);
17+ return fromCents(roundHalfEven(sum));
18 }
19
20 // Taxes apply per line, before the total.
21 export function withTax(line: Line, rate: number) {
22+ if (rate < 0) throw new RangeError("negative tax rate");
23 return { ...line, price: line.price * (1 + rate) };
24 }
me@devbox:~/billing$ claude
> totals are off by a cent sometimes,
  fix the rounding
● Reading src/billing/invoice.ts
● Editing src/billing/invoice.ts
● Creating src/money/rounding.ts
● Editing tests/invoice.test.ts
● Running the tests…
🛡 1 protected file modified↺ Revert ✕ 2 tests failed4 files +35 −4

The agent edited a test it was not supposed to touch. You see it the moment it happens.

Why

You are not editing code anymore. You are reviewing it.

Editors were built for typing. When an agent writes the code, what you need is to see what it changed, stop it from touching what it must not, and know whether the tests still pass.

See everything

Every file that differs from HEAD, live, with the whole file around each change.

Guard what matters

Protect tests, migrations or lockfiles. The status bar turns red the moment an agent touches one.

Trust, then commit

Run the tests the change affects. There is nothing to approve: you accept a change by committing it.

Features

Small, fast, and only what supervision needs.

Live diff against HEAD

Untracked files included, updated as the agent writes. Unified or split, syntax highlighted, with a minimap to find your way.

Protected files

Shield a file or folder from the tree. Rules live in .difftower.toml, so the team shares them. Revert in one click.

Your tests, one click away

pytest, vitest and Rails, found on their own. Run all, a folder, a file, the failed ones or the ones the change affects.

A terminal for the agent

Run Claude Code, Codex or any CLI agent right next to its diff, in the repository, local or remote.

Many repositories, one window

Open a folder of repositories and see all of them together, each with its own rules and tests.

Native and fast

Written in Rust on GPUI, the framework behind Zed. Rendered on the GPU, starts at once, no Electron.

Over SSH

Your agents run on a server. So does Difftower.

Point it at user@host:path. It installs a tiny static agent there on first connection, watches the repository on the host and sends only diffs. Your keys and ~/.ssh/config work as usual, and it reconnects on its own.

3 MBagent on the host
~5 MBof RAM, idle at 0% CPU
1SSH connection for everything
$ difftower me@devbox:~/billing
$ difftower devbox:~/repos # a folder of repos
$ difftower ~/code/app
Install

One line, no root.

Any Linux

Installs into ~/.local, with a launcher entry.

curl -fsSL https://difftower.com/install.sh | sh

Arch, Omarchy

From the AUR.

yay -S difftower-bin

From source

Rust, git, clang and lld.

git clone https://github.com/a-gracia/difftower
cd difftower && cargo dt

Needs Linux x86_64 with glibc 2.35 or newer (Ubuntu 22.04, Debian 12, Fedora 36, Arch) and git. macOS is next.