revq guide

revq is a review queue for one maintainer. It watches the pull requests waiting on your review, has Claude Code draft inline comments for them, and lets you approve, edit or drop those comments before anything reaches GitHub.

The revq board: five lanes from Inbox to Done, with a card for each pull request

Set it up

revq needs two credentials. Both go in a .env file next to compose.yml.

A GitHub token

revq reads pull requests and posts reviews as the owner of this token, so use a token for your own account.

Put it in .env as GITHUB_TOKEN.

Claude Code access

The agent is the claude command-line tool, which the Docker image already contains. Give it one of these:

Deploy with Docker

git clone https://github.com/msyavuz/revq
cd revq
cp .env.example .env        # then fill in the two credentials
docker compose up -d

This pulls the published image ghcr.io/msyavuz/revq and starts it. revq now listens on port 8080 of the server. Open http://<server>:8080.

Images are built for Intel/AMD and ARM servers. compose.yml uses the latest tag; change it to a version such as ghcr.io/msyavuz/revq:v0.1.0 if you'd rather choose when to update.

To build from the source checkout instead of pulling, switch the image line in compose.yml for build: . as its comment describes, and run docker compose up -d --build.

Everything revq stores (settings, the board, drafts, your account) is one SQLite file in the revq-data Docker volume.

If you put revq behind a reverse proxy with HTTPS, have the proxy send the X-Forwarded-Proto header so the sign-in cookie is marked secure.

Run without Docker

revq is a single program. Each release has it ready-built for Linux and macOS, on Intel/AMD (amd64) and ARM (arm64).

It needs the Claude Code command-line tool on the same machine. Install that first, as the user revq will run as:

curl -fsSL https://claude.ai/install.sh | bash

Then download revq and start it:

curl -fsSLO https://github.com/msyavuz/revq/releases/download/v0.1.1/revq_v0.1.1_linux_amd64.tar.gz
tar -xzf revq_v0.1.1_linux_amd64.tar.gz
cd revq_v0.1.1_linux_amd64
GITHUB_TOKEN=<your token> ./revq

Without GITHUB_TOKEN set, revq uses the token from a signed-in gh. Without a Claude token set, it uses your existing claude sign-in.

By default this listens on 127.0.0.1:8080, reachable only from the same machine. To reach it from other devices, set REVQ_ADDR=:8080.

As a service on a Linux server

The download includes revq.service, a systemd unit that runs revq as its own user and keeps its data in /var/lib/revq.

sudo useradd --system --home-dir /var/lib/revq --create-home --shell /usr/sbin/nologin revq
sudo install -m 755 revq /usr/local/bin/revq
sudo install -m 644 revq.service /etc/systemd/system/revq.service
sudo install -d -m 750 -o root -g revq /etc/revq

Put the settings in /etc/revq/revq.env, readable only by root and the revq group:

GITHUB_TOKEN=<your token>
CLAUDE_CODE_OAUTH_TOKEN=<token from claude setup-token>
REVQ_ADDR=:8080
REVQ_CLAUDE_BIN=/var/lib/revq/.local/bin/claude

REVQ_CLAUDE_BIN is where the Claude Code installer puts the tool when run as the revq user:

sudo -u revq env HOME=/var/lib/revq bash -c 'curl -fsSL https://claude.ai/install.sh | bash'

Then start it:

sudo systemctl enable --now revq

To update, let revq replace itself with the latest release, then restart it:

sudo revq update
sudo systemctl restart revq

revq update downloads the release for your machine, checks it against the release's checksum, and swaps the binary in place. Your data is untouched. To build from source instead you need Go 1.25 or newer: go build -o revq ./cmd/revq.

Variable Default What it does
GITHUB_TOKEN token from gh GitHub access, as described above
CLAUDE_CODE_OAUTH_TOKEN local claude sign-in Agent access through your subscription
ANTHROPIC_API_KEY unset Agent access through API billing
REVQ_ADDR 127.0.0.1:8080 Address to listen on (:8080 in the Docker image)
REVQ_DB revq.db Where the SQLite file lives (/data/revq.db in the Docker image)
REVQ_CLAUDE_BIN claude Path to the Claude Code command
REVQ_CACHE checkouts next to the DB Where repositories are cloned for the agent to read (/data/checkouts in the Docker image)

First sign-in

  1. Sign in as admin with the password admin.
  2. revq sends you to the Account page. Set your own password; nothing else works until you do. The default stops working as soon as you save.
  3. Go to Settings and add a repository as owner/name.

When you add a repository you choose what revq tracks in it:

The first sync runs straight away. After that revq checks GitHub every two minutes, or when you press "Sync now". It only makes outgoing requests, so it needs no public address.

The board

The board reads left to right.

Lane What's in it
Inbox Your review is requested and nothing has been drafted yet
Needs you A drafted review is waiting for you
Waiting on author You've reviewed, or the PR is a draft, has failing CI, or has changes requested
Ready to merge Approved, with CI not failing
Done Merged or closed in the last seven days

On a card:

Above the lanes you can filter the board by repository, by author, and by words in the title or a PR number. The filter is part of the page's address, so you can bookmark a filtered board, and it stays in place while the board refreshes.

Click a card to open it. Hover over a card for Draft review, which asks the agent to review that PR; the card moves to "Needs you" when the draft is ready.

Drag a card to another lane to pin it there. The pin lasts until the author pushes new commits, and you can remove it from the PR's page.

Reviewing a pull request

A PR's page shows the author's description first, then revq's draft in a blue block. The blue block is always the agent's writing. Nothing in it is on GitHub until you send it.

A pull request in revq: the author's description, then the agent's draft with each inline comment shown under the code it refers to

A draft is a list of inline comments. Each one shows the code it is about, with the commented line's number highlighted, a severity (blocker, major, minor), and the comment text. The severity is only for you; what gets posted is the comment text alone.

  1. Read each comment against its code. Edit the text if you want to say it differently.
  2. Untick any comment you don't want posted.
  3. If there is a "Decide before you post" list, those are judgement calls the agent can't make for you, such as scope or a breaking change. They are not posted. Decide, or press "Ask the author" to add one to your overall comment.
  4. Add an overall comment if you want one. It's optional.
  5. Choose Comment, Request changes or Approve, then send.

There are two ways to send:

After you post, the card moves to "Waiting on author". When the author pushes and asks for your review again, it comes back to Inbox.

"Redraft review" replaces the current draft, including your edits. If the draft says it was written before the latest commits, redraft it.

When the agent has read the whole change and found nothing, the draft opens with a Looks ready to merge block: a few bullets on what the change does and what's worth verifying after merge, plus CI, the number of unresolved review threads on GitHub, and the PR's review state. It is for you only and is never posted. It means the agent found nothing in the diff, not that the change is safe: the agent doesn't run the code. Approving is still your click, and revq never approves by itself. The card is marked "looks ready" on the board until the author pushes again.

A yellow "Partial review" line means the PR was too big to read whole and tells you how many files the agent read.

Automation

Everything is off by default, so the agent only runs when you press "Draft review". The switches are in Settings under "Default autonomy". Each repository's row has the same three switches: tick what you want for that repository and save. A repository whose switches match the defaults keeps following them; "Use the defaults" removes a repository's own settings.

Bot PRs and draft PRs are skipped by auto review unless you tick their boxes.

Trusted authors are auto reviewed even when the repository's switch is off. List their GitHub usernames in Settings, or press "Trust this author" on one of their PRs. It applies to all their pull requests in every repository revq tracks.

You can also decide per pull request. On a PR's page, the Auto review this PR switch turns it on for that PR while the repository's setting is off, or off for that PR while the repository's is on. Turning it on drafts a review straight away and again whenever the author pushes and your review is requested, including for bot and draft PRs. "Use the default" removes the exception. The board marks PRs that have one.

Keeping cost down

A review of a few hundred changed lines costs a few cents. These settings control it:

Notifications

revq can message you when a PR lands in "Needs you". Fill in either or both under Settings, then press "Send test notification".

Maintenance

Update: the bottom of every page says when a newer version is out. With Docker:

docker compose pull
docker compose up -d

Without Docker: sudo revq update, then sudo systemctl restart revq.

Updating keeps your board, drafts, settings and sign-in. revq upgrades its own data on start and syncs with GitHub straight away; nothing is reviewed again.

The running version is shown at the bottom of every page, and by docker compose run --rm revq version. To go back to an earlier version, set that version's tag on the image line in compose.yml and run docker compose up -d. Your data upgrades itself when a newer version starts; going back to an older one after that is not guaranteed to work, so take a backup first.

Back up: stop revq so the file is complete, copy it out of the volume, and start again.

docker compose stop
docker compose cp revq:/data/revq.db ./revq-backup.db
docker compose start

Change your password or username: the Account page. Changing the password signs out every other browser.

Forgot your password:

docker compose run --rm revq reset-password

Without Docker, run ./revq reset-password. This puts the account back to admin / admin, and you set a new password on the next sign-in. Nothing else is touched.

When something goes wrong

Limits