Skip to content

The reviewer that remembers.

Open-source code review for GitHub that you run yourself. It learns from your team's replies and reactions, and with an embeddings endpoint, later reviews drop close repeats of findings you dismissed.

Self-hosted only: Docker Compose or Fly.io, Postgres with pgvector, a GitHub App and a Clerk app you create, your model keys and an embeddings endpoint.

Posts
One COMMENT review per run, with at most 10 inline comments. It never approves or requests changes.
Costs
$0 for Argus. You pay your model and embeddings providers, Clerk and your servers.
Platform
GitHub only.

backend/internal/config/config.go

Example · PR #1215

Lines 144 to 151 of backend/internal/config/config.go in pull request #1215
147 return nil, fmt.Errorf("invalid MAX_CONCURRENT_REVIEWS: %w", err)
148 }
149added staleSecs, err := strconv.Atoi(getEnv("RECOVERY_STALE_AFTER", "1800"))
150added if err != nil {
151added return nil, fmt.Errorf("invalid RECOVERY_STALE_AFTER: %w", err)
152added }
153added recoveryStaleAfter := time.Duration(staleSecs) (Argus finding on this line)

argus-eye bot

Blocking · Bug: Stale window of 1800 becomes 1.8µs, not 30 minutes

removed: recoveryStaleAfter := time.Duration(staleSecs)

added: recoveryStaleAfter := time.Duration(staleSecs) * time.Second

— Matches a prior fix in PR #1172.

154 embedDims, err := strconv.Atoi(getEnv("EMBEDDINGS_DIMENSIONS", "1024"))

Resolved by 3e9c1a7 — the flagged lines were modified in this push.

Written for this page in the format Argus posts; Argus did not post it. The unchanged lines are real Argus source. See the whole example

Your repo teaches it, one pull request at a time.

Replies and reactions from people with write access, findings the judge scores highly, and conventions read from your diffs are stored in your Postgres.

See the four threads in full

  1. #1164

    What happened: A maintainer dismissed a finding and said why.

    Stored: The dismissal, with the reply as the reason.

  2. #1172

    What happened: The judge scored a finding 94.

    Stored: A pattern, and a convention from the diff: duration settings are integer seconds.

  3. #1190

    What happened: Two conventions disagreed, and a maintainer picked one.

    Stored: The pick. The other convention is marked superseded.

  4. #1215

    What happened: The review cited the #1172 pattern and dropped a repeat of the #1164 finding.

    Stored: 1 pattern, 1 PR summary, 1 finding memory and 1 file memory.

Only people with write access change memory, and security findings are lowered one level at most, never dropped. Similarity search needs an embeddings endpoint.

How a review behaves

Zero findings is a valid review.

Twelve written rules in the review prompt say what not to post. With a scoring model set, a second model scores the findings, and only those over the bar for the PR's change class are posted.

Read the twelve rules (opens in a new tab)

Fixes are checked on push.

On each push, up to 20 open Argus threads with a change near their line go back to a model with the new code. A confirmed fix resolves the thread and the reply names the commit; anything else stays open. Each re-check is a model call on your key.

Read how it decides (opens in a new tab)

Each review shows its receipt.

The usage block at the end of each summary lists each stage's model and tokens, billed to your key, and the cost when your provider reports it or the model's price is known.

Estimate a month

You run it. Here is what that takes.

There is no hosted version. Create a GitHub App, fill in backend/.env, and start it with Docker Compose. Begin with one repository.

Before the host is reachable, change Compose's default Postgres password. On a public repository, turn auto-review off: any pull request, forks included, starts a review on your key.

git clone https://github.com/BeLazy167/argus
cd argus
cp backend/.env.example backend/.env
# fill in the App, Clerk, embeddings and encryption values
mkdir -p backend/secrets
cp ~/Downloads/<your-app>.*.private-key.pem \
  backend/secrets/github-app.pem
docker compose up