Documentation
Install Sift, connect GitHub, and tune how reviews show up in your pull requests. Follow the managed path for the fastest setup, or run Sift yourself with Docker.
1. Overview
What is automated PR review with Sift? Sift runs on your pull requests to deliver focused, logic-aware review feedback inside GitHub without replacing your team's judgment. It integrates with GitHub Actions so every PR can get consistent checks tied to your repo and branch policies.
How it works — at a high level:
The workflow file triggers on pull request activity. It passes your repository context and secrets into the Sift runtime, which performs the review and reports back through the GitHub API.
Two setup paths
- Managed (recommended) — Sign in with GitHub, install the GitHub App, configure settings in the Sift UI at Profile. Secrets are injected into each connected repository automatically when you save.
- Self-hosted (Docker via GHCR) — Pull the image from GHCR, provide environment variables and secrets yourself, and point your workflow at your own Sift endpoint or image.
2. Prerequisites
GitHub account — You need a GitHub user or organization that can install GitHub Apps and enable GitHub Actions on the repositories where Sift should run.
Supported GitHub plans— Sift runs via GitHub Actions, so your plan's Actions allowances apply. Free accounts include Actions minutes with monthly limits while paid GitHub Team and Enterprise plans offer higher limits and policy controls. For org-wide rollout, confirm Actions are enabled and billing/policy rules allow workflow runs on target repos.
Permissions overview — The GitHub App needs access to repository contents and pull requests to read diffs and post feedback. Typical permissions include Contents, Pull requests, and Metadata (always required for Apps). Your OAuth login authorizes the Sift application to act on your behalf for setup and dashboard access.
Privacy: User LLM keys, database URLs, and similar secrets are not stored on Sift servers—they are forwarded to your repositories as GitHub Actions secrets via the GitHub API when you save configuration. The only long-lived credential we issue for API access is your Sift application API key (shown on your profile).
3. Quick Start — Managed Setup (Recommended)
Complete the steps below in order. Subsections link from the table of contents on the right.
3.1 Create an Account
- Open the app and Sign in with GitHub using OAuth.
- On the GitHub authorization screen, authorize the Sift application so we can associate your account and show your profile and settings.
3.2 Install the GitHub App
From your profile, use Configurenext to Installation ID (or your onboarding flow) to open GitHub's App installation UI.
- Choose All repositories or only Selected repositories / org-wide access, depending on where you want Sift to run.
- Required GitHub App permissions typically include: Contents (read) for code and diffs, Pull requests (read/write as needed for review comments), and Metadata (read). Approve the permission screen GitHub shows for your installation.
3.3 Configure OAuth App
If you manage the GitHub OAuth App for your own deployment, register these details in your OAuth App settings on GitHub:
- OAuth scopes — Grant the scopes requested by the Sift app so it can verify identity and complete installation flows (exact scopes are shown during authorization).
- Authorization callback URL— Set to your deployment's callback route (for example
https://<your-app>/api/auth/github/callback). This must match the URL configured in your environment.
3.4 Configure via UI
Open Profileafter signing in. The page is organized into the same areas you'll use in production:
- Authentication — Copy your API key for programmatic access; keep it secret.
- LLM configuration — Choose an LLM model and enter your LLM API key. Keys are not stored on our servers, they are pushed to repository secrets when you save.
- Installation — Confirm your Installation ID after installing the GitHub App. Download the sample workflows from GitHub Actions workflow and add them under
.github/workflows/. Set Database URL (PostgreSQL) if required. Pick a Docker image variant (Slim vs Full) for the runner image size/feature set. - Target repositories — Choose which repositories under your installation should receive Sift configuration (including secret injection when you save). If you leave none selected, configuration applies to all repositories in the installation by default.
- Feature flags — Toggle Smart routing, Vector DB (with embedding model, API base, and dimension when enabled).
- Tools — Enable Semgrep and/or CodeQL when you want those analyses in the pipeline.
3.5 Save & Deploy
Click Save Configuration on your profile. The backend updates your settings and, for each repository covered by your GitHub App installation, injects or updates GitHub Actions secrets (such as API keys, model name, database URL, installation ID, and related values) via the GitHub API so workflows can read them without you pasting secrets into each repo by hand.
If secret injection is skipped for some repos, the UI may show a reason (for example permissions). Fix repository access or installation scope, then save again.
Verify — Commit the workflow files to your default or configured branch, then open a pull request (or push updates) on that branch. In the Actions tab you should see the Sift workflow runs and on the PR you should see review output from Sift.
4. Workflow File Setup
Download sift-workflows.zip. It contains sift-review-workflow.yml (Runs on PR opened, reopened and synchronize actions) and sift-feedback-workflow.yml (Optional, Runs on PR closed action). Unzip and place them under:
.github/workflows/sift-review-workflow.yml
.github/workflows/sift-feedback-workflow.ymlYou can rename the files as long as they stay under .github/workflows/. After managed setup, you do not need to edit the YAML to add secrets as they are injected into the repo when you save from the profile UI.
You can optionally choose to skip the feedback workflow and only use the review workflow.
5. Quick Start — Self-Hosted (Docker via GHCR)
5.1 Pull the Image
Pull the Sift image from GitHub Container Registry:
docker pull ghcr.io/sahilsaleem2907/sift:slim
docker pull ghcr.io/sahilsaleem2907/sift:fullThe slim tag pulls a lightweight version of the Sift service, including just the core service features and basic linters suited for faster startup and lower resource usage. This is ideal for most users who want efficient automated reviews without extra analysis overhead.
If your team needs advanced security analysis or all supported linters, use the full tag. This image comes with CodeQL and Sift’s full suite of recommended linter scripts preinstalled, providing deep code analysis in addition to the standard checks. Choose full if you require comprehensive code scanning or must satisfy strict policy requirements.
5.2 Environment Variables
Self-hosted runs need the same logical configuration as the managed UI, supplied by you. Typical variables include:
SIFT_API_KEY— Your Sift application API keySIFT_LLM_MODEL,SIFT_LLM_API_KEYSIFT_DATABASE_URL— PostgreSQL connection stringSIFT_INSTALLATION_ID— GitHub App installation ID- Optional:
SIFT_EMBEDDING_*, feature flags, backend base URL, etc., matching your workflow
Example .env (adjust names to match your deployment):
SIFT_API_KEY=sk-...
SIFT_LLM_MODEL=gpt-4o
SIFT_LLM_API_KEY=sk-...
SIFT_DATABASE_URL=postgresql://user:pass@host:5432/db
SIFT_INSTALLATION_ID=12345678
# Optional
# SIFT_EMBEDDING_MODEL=text-embedding-3-small
# SIFT_EMBEDDING_API_BASE=https://api.openai.com/v1
# SIFT_EMBEDDING_DIMENSION=1536
# SWIFT_API_BACKEND_BASE_URL=https://api.example.com5.3 Run the Container
Run the container with env vars from a file or your shell:
docker run --rm -it \
--env-file .env \
-p 8080:8080 \
ghcr.io/sahilsaleem2907/sift:slimDocker Compose example:
services:
sift:
image: ghcr.io/sahilsaleem2907/sift:slim
env_file: .env
ports:
- "8080:8080"
restart: unless-stopped5.4 Manual Workflow Setup
Add sift-review-workflow.yml (or sift-feedback-workflow.yml) under .github/workflows/ in each repository. Base it on the downloaded workflows.
Point the workflow at your self-hosted image or API: set the image reference, secrets, and any SWIFT_API_BACKEND_BASE_URL(or equivalent) to your infrastructure. Add the same secret names in each repo's GitHub Settings → Secrets and variables → Actions manually, since automatic injection is tied to the managed app flow.
6. Feedback (optional)
6.1 Purpose & optional setup
Add sift-feedback-workflow.yml under .github/workflows/ when you want Sift to ingest signals after a pull request finishes. It complements the review workflow when the PR closes (merged or not), so reactions, slash commands, and outcome line up with the end of the thread.
6.2 What gets captured
Sift can record several kinds of feedback tied to a review:
- PR lifecycle — whether the pull request was closed and whether it was merged.
- Reactions — emoji reactions on Sift's summary comment and on inline review comments (see Emoji reactions).
- Slash feedback commands — structured
/feedbacklines in the relevant thread (see Slash commands). Captured alongside reactions.
6.3 Emoji reactions
GitHub lets anyone add emoji reactions to issue and pull-request comments.
The feedback workflow records reactions on both the top-level summary comment (overall review) and each inline comment (file/line findings). Each event keeps which reaction was added or removed, which comment it belongs to, and runs alongside slash commands and PR outcome.
Those signals roll into the same repository-level aggregates and prompt conditioning as other feedback: 👍 reactions nudge “helpful”, 👎 nudge “not helpful”.
6.4 Slash commands
Pattern: /feedback, followed by whitespace and then a single verb consisting of word characters and hyphens. Parsing is case-insensitive.
Examples: /feedback helpful, /FEEDBACK not-helpful.
Verbs that map to helpful
helpfulgoodyes
Verbs that map to not_helpful
not-helpful— hyphenated form is normalized tonot_helpfulnot_helpfulbadno
6.5 Storage, deduplication & review conditioning
Ingested events are stored with deduplication so duplicate deliveries or retried workflow runs do not skew counts. Each signal carries metadata (for example which comment or thread it belongs to) so aggregates stay tied to the right context.
Over time, Sift builds repository-level aggregates from this feedback and derives a simple quality score. Those summaries are fed back into later review prompts and prompt conditioning so new reviews can reflect how prior output landed with your team, without you managing a separate analytics pipeline.
6.6 Scope on GitHub
GitHub surface area: The feedback workflow is ingestion, analytics, and prompt conditioning. It does not change GitHub beyond what the review workflow has already posted(for example it does not open new PRs, rewrite history, or post additional review comments solely for analytics). It reads reactions, commands, and PR outcome, then uses that signal inside Sift's side of the loop.