Reviews on demand
Mention Steep in a pull-request comment and get an AI review streamed back to the PR. No CI hook to wire, no pipeline to learn.
AI code review · built for Gitea
Steep explores pull requests inside an isolated Dev Container, then leaves focused, line-by-line feedback right where your team works.
Thoughtful by design
Bring an AI reviewer into your Gitea workflow with a single comment.
Mention Steep in a pull-request comment and get an AI review streamed back to the PR. No CI hook to wire, no pipeline to learn.
Every review runs in an ephemeral Dev Container with read-only tools. The network is cut after setup, and the container is removed when the review ends.
A lean Rust service designed for fast reviews, with Prometheus metrics and Sentry error tracking.
From comment to context
Steep gives the model tools to inspect the repository instead of sending the source code in the prompt.
A Gitea pull-request comment triggers a review when you mention the bot.
Steep clones the pull-request head and starts the repository's Dev Container—or a safe default when none is configured.
It can inspect files with tools such as ls, read_file, and grep. Setup hooks run first; then network access is removed.
Steep posts actionable findings with severity labels, plus a concise summary of what the PR does well.
What’s brewing
From safer reviews to an assistant that can help move work forward.
AGENTS.md and separate review/implementation models.A few minutes to get steeping
Follow these steps in order. You will need a Rust toolchain, a reachable Docker or Podman daemon, an OpenRouter API key, and a Gitea account for Steep.
git clone https://gitea.qpismont.fr/qpismont/herald.git cd herald
Create a token for the account Steep should act as. Give it access to the repositories it will review, including permission to read pull requests and publish comments/reviews. Steep uses this token to identify the account; you will use that account's username when asking for a review.
cp .env.example .env $EDITOR .env
Set all nine required variables:
GITEA_URL — base URL, e.g. https://gitea.example.com (no /api/v1)GITEA_TOKEN — the token created aboveGITEA_TIMEOUT — API timeout in secondsOPEN_ROUTER_API_KEY — your OpenRouter keyOPEN_ROUTER_MODEL — an available OpenRouter model IDOPEN_ROUTER_TIMEOUT — request timeout in secondsBOT_MAX_CONCURRENT — maximum simultaneous reviewsHTTP_PORT — web server port; use 3001 for the commands belowWEBHOOK_SIG_HEADER_SECRET — generate this in the next stepKeep the example's numeric values for the timeouts and concurrency, or replace them with positive integers. Do not commit your completed .env.
openssl rand -hex 32
Copy the output into WEBHOOK_SIG_HEADER_SECRET in .env. You will enter the exact same value in Gitea in the next step.
podman system service --time=0 & export DOCKER_HOST=unix:///run/user/$(id -u)/podman/podman.sock cargo build --release -p steep-server ./target/release/steep-server
Keep this process running. With Docker, omit the Podman command and use its socket; the default is unix:///var/run/docker.sock. Optional settings such as metrics and Sentry can be added later.
In the repository's Settings → Webhooks, add a Gitea webhook. Set the target to Steep's public/reachable address and port:
http://steep.example.com:3001/webhooklocalhost unless Gitea and Steep share that network.Enable at least Pull Request Comment. Paste the generated value into Gitea's Secret field; it must exactly match WEBHOOK_SIG_HEADER_SECRET.
Make sure Gitea can connect to Steep on port 3001 (or your configured HTTP_PORT), including through any firewall or reverse proxy. Steep must also be able to reach Gitea's API, OpenRouter, and the container daemon.
Open a pull request and add a comment that starts with @username, using the username of the Gitea account behind GITEA_TOKEN. For example:
@steep review this PR
The mention must be at the very start of the comment. If nothing happens, check the webhook's delivery history in Gitea and Steep's logs.