Run the local tool.

Single-user evaluation. No GitLab, PostgreSQL or model is needed for the offline rule.

Try the public example now

The before/after source and tests can run without installing Null. This replays the test cases from a recorded review; it does not call a model.

curl --fail --location https://null.review/examples/review-journey.zip --output review-journey.zip
unzip review-journey.zip -d review-journey
python3 -m unittest discover -s review-journey/after -p 'test_*.py'

Expected: 8 tests pass. See README.md in the archive for the original run and its limits.

Before you start

Obtain the source package first. These commands run from its extracted root. You need Python 3.12 and uv; dependency installation requires network access. The package is not currently on PyPI.

Get source and check release status

Install locked dependencies

./scripts/install
.venv/bin/tandem --help

Expected: a local .venv, a private .env and CLI help listing serve, index, propose, apply and test. No model call is made.

Open the isolated demo

./scripts/dev --port 3278

Open http://127.0.0.1:3278. The interface names the sample Orbit API. Index files, propose a final newline, inspect the diff and apply it with confirmation. Stop with Ctrl+C.

Use your own repository

./scripts/run --repo /absolute/path/to/project --port 3278

Replace the path with an existing local repository. Source files are read only when selected/indexed; proposals need a separate apply action. This single-user server binds to loopback and must stay private.

What this mode proves

Without a model the only edit rule adds a final newline. This is a real deterministic operation, not AI review. Local history uses SQLite. Corporate services use PostgreSQL and a different deployment path.

Continue to GitLab deployment

If the start fails

ProblemNext action
uv: command not foundInstall uv from docs.astral.sh/uv, then retry install.
Address already in useChoose another --port and open that same port.
No proposalSelect a text file missing its final newline. Arbitrary tasks require a configured model.