capabilities.guide
Gitvora capabilities
Product reference — GitHub integration, AI routing, Model Lab, streaming, merge controls, multi-commit reviews, and every dashboard page.
You are viewing the in-app guide. Share the public docs with teammates who are not logged in.
Overview
Gitvora is AI code governance for GitHub pull requests. When a PR opens or someone runs a bot command, Gitvora fetches the cumulative diff (all commits vs base), routes it through Ollama or OpenRouter, scores risk, and posts findings back to GitHub.
- Webhook, bot command, or dashboard triggers a review job
- PR refreshed from GitHub — latest HEAD, files, and commits
- AI routed local vs cloud; findings parsed and validated against the diff
- Formatted PR comment + optional GitHub Check Run (open PRs only)
- Dashboard shows live progress, findings (open/fixed), timestamps, audit trail
GitHub & bot
Install the GitHub App on your org or account. PR comments use @gitvora-bot.
| Command | Type |
|---|---|
| @gitvora-bot review | standard |
| @gitvora-bot review security | security |
| @gitvora-bot review deep | deep |
| @gitvora-bot explain | explain |
| @gitvora-bot risk | risk |
| @gitvora-bot test | test |
| @gitvora-bot override <token> | admin merge override (open PRs) |
| @gitvora-bot help | command list |
When commands work
| PR status | Bot / dashboard review | Check run |
|---|---|---|
| Open | Yes | Yes (merge gate) |
| Merged | Yes — comment only | Skipped |
| Closed (not merged) | No | No |
On-demand reviews always use the full PR diff at current HEAD — not a single commit. New pushes on an open PR are included when you re-run a review.
Review types
| Type | Focus | Routing (hybrid) |
|---|---|---|
| standard | Bugs, style, performance | Local on small PRs |
| security | Injection, secrets, auth gaps | Cloud |
| deep | Architecture, cross-file impact | Cloud |
| explain | Plain-English summary | Local |
| risk | Score breakdown | Local |
| test | Missing tests, edge cases | Local |
Enable/disable each type and assign models in Infrastructure. Trigger from GitHub comments or the PR detail page.
Bot comment format
- Summary table — verdict, risk, lines, files, commits, HEAD SHA, model, runtime, tokens
- Findings as markdown headings (severity · type · file:line)
- Collapsible review metadata block
- Note when hallucinated findings were dropped (wrong file/line)
Context-aware reviews (roadmap)
Today Gitvora reviews are diff-first: the model sees patches, commits, and repo name. It infers framework from file extensions — not from package.json, path rules, or related files.
Gap vs CodeRabbit-style context
Competitors detect stack (Next.js, Prisma, Vitest), pull linked issues, fetch callers/tests, run linters, and apply per-path instructions. Full gap analysis and phased plan: docs/CONTEXT_AWARE_REVIEWS.md.
| Phase | Deliverable |
|---|---|
| 0 (quick) | PR title/body, branches, prior findings in prompt |
| 1 | Project context profile — package.json, frameworks, test runner |
| 2 | Path-based review rules + optional gitvora.yaml |
| 3 | Related files (callers, tests) for deep reviews |
| 4 | Linters, verification agents, team learnings |
AI & routing
Reviews run in a background worker (BullMQ). The webhook returns immediately; inference is async so proxy timeouts do not block reviews.
Inference modes
| Mode | Behavior |
|---|---|
| local | All reviews use Ollama — fails clearly if offline (no silent cloud fallback) |
| cloud | All reviews use the configured cloud model (Groq or OpenRouter) |
| hybrid | Heuristics pick tier per PR (recommended) |
Auto routing — decision order
When a review action's tier is Auto, conditions are evaluated top to bottom; first match wins:
| # | Condition | Route |
|---|---|---|
| 1 | Per-action tier override = local or cloud | Force that tier |
| 2 | inference_mode = cloud | Cloud |
| 3 | inference_mode = local | Local (Ollama) |
| 4 | Review type security or deep | Cloud |
| 5 | Diff > escalation threshold (default 400 lines) | Cloud |
| 6 | Sensitive file path (auth, payment, .env, secret, token…) | Cloud |
| 7 | Everything else | Local (Ollama) |
Groq free-tier models
Full catalog with RPM / RPD / TPM / TPD lives in Infrastructure → model-catalog (DB-backed, refreshed on seed).
| Model | TPD | TPM | Best for |
|---|---|---|---|
| llama-3.1-8b-instant | 500K | 6K | Default routine reviews (recommended) |
| qwen/qwen3-32b | 500K | 6K | 60 RPM — burst throughput |
| openai/gpt-oss-120b | 200K | 8K | Deep PRs only — not default (slower, lower TPD) |
| openai/gpt-oss-20b | 200K | 8K | Mid-tier quality |
| qwen/qwen3.6-27b | 200K | 8K | Medium PRs |
| llama-3.3-70b-versatile | 100K | 6K | Security / deep |
Cloud provider routing
| Model name | Provider | API key |
|---|---|---|
| llama-3.1-8b-instant | Groq | GROQ_API_KEY |
| openai/gpt-oss-120b | Groq (catalog) | GROQ_API_KEY |
| qwen/qwen3-32b | Groq (catalog) | GROQ_API_KEY |
| anthropic/claude-3.5-sonnet | OpenRouter | OPENROUTER_API_KEY |
Quality safeguards
- Findings validated against the diff — bogus line numbers dropped
- Temperature 0.1 for consistent JSON output
- Webhook dedup: same PR + type + HEAD SHA skips duplicate auto-review
- Pending duplicate review jobs cancelled when a newer one is queued
- Groq 429 rate limits retried up to 3× with Retry-After header
Model overrides
All models are configurable in Infrastructure. Nothing is hardcoded at runtime — use dropdowns or type any slug.
| Setting | Where | Effect |
|---|---|---|
| ollama_model_default | Default models section | Global local (Ollama) default |
| openrouter_model | Default models section | Global cloud primary (quality) |
| cloud_model_fast | Default models section | Global cloud fast model for small routine PRs |
| cloud_fast_threshold | System config | Lines at or below which cloud may use fast model |
| cloud_fast_routing | System config | Toggle smart primary/fast cloud routing |
| model_local_{type} | Review actions table | Per-action local model override |
| model_cloud_{type} | Review actions table | Per-action cloud primary override |
| model_cloud_fast_{type} | Review actions table | Per-action cloud fast override |
| model_tier_{type} | Review actions table | auto / local / cloud per review type |
Smart cloud routing (primary + fast)
Set Cloud primary (e.g. llama-3.3-70b-versatile) and Cloud fast (e.g. llama-3.1-8b-instant). On the cloud tier, routine PRs ≤ cloud_fast_threshold lines use the fast model; security/deep and large diffs always use primary. Toggle with Cloud fast routing in system config.
Ollama local (self-hosted)
| Model | Compute | VRAM | Use case |
|---|---|---|---|
| qwen2.5-coder:3b | CPU / hybrid | ~2.5GB | Default local (recommended) |
| qwen2.5-coder:7b-instruct-q4_k_m | GPU / hybrid | ~4.5GB | Best local quality |
| qwen2.5-coder:1.5b | CPU | ~1.2GB | Tiny PRs only |
Switching to Claude
Set the cloud model to anthropic/claude-3.5-sonnet and add OPENROUTER_API_KEY. The slash in the name routes to OpenRouter automatically.
Chunked reviews
Large PRs are split into multiple inference calls so each stays within model context and completes before proxy timeouts.
| Setting | Default | Purpose |
|---|---|---|
| chunk_threshold | 300 | Changed lines above which chunking starts |
| chunk_max_lines | 250 | Max changed lines per chunk (files batched together) |
| chunk_max_chars | 15000 | Max diff chars per chunk (Groq free tier ~6K token cap) |
| REVIEW_WORKER_CONCURRENCY | 1 | Max parallel review jobs (env var on API) |
Multiple small files are batched into one chunk until the line/char budget is reached (avoids one API call per file). Large hunks split by class/function boundaries. Findings merge into one GitHub comment.
Groq free tier
Use llama-3.1-8b-instant for routine PRs (fast, ~500K TPD). Use llama-3.3-70b-versatile for security/deep only (~100K TPD). Each request must stay under ~6K tokens on free tier — keep chunk_max_chars at 15000 or lower.
Ollama streaming
Long Ollama runs behind Cloudflare can hit 524 timeout when the origin sends no bytes until generation finishes. Gitvora avoids this with streaming.
| Layer | Behavior |
|---|---|
| Production PR reviews | Ollama always uses server-side stream: true — chunks keep the proxy alive |
| Model Lab — live tokens | SSE pushes tokens to the browser as they generate |
| Model Lab — fallback | If SSE fails, server-side stream still runs; full text returned when done |
| Cloud fallback | Removed — local tier fails clearly if Ollama is down; configure cloud mode or hybrid instead |
| Groq rate limits | HTTP 429 retried up to 3× with Retry-After; job fails if still limited |
Infra tip — Cloudflare + Ollama
Point OLLAMA_HOST / dashboard Ollama URL at a DNS-only (grey-cloud) subdomain, e.g. ollama-internal.yourdomain.com.
Do not proxy Ollama through orange-cloud ai.* hosts unless you accept 100s proxy limits.
Model Lab
Model Lab is a chat-style sandbox for testing inference without opening a PR. Power user role required.
| Control | Options |
|---|---|
| Review type | standard · security · deep · explain · risk · test |
| Tier | Auto (hybrid router) · Local (force Ollama) · Cloud (force Groq or OpenRouter by model name) |
| Model | Dropdown of Ollama / Groq / OpenRouter models, or type any slug |
| Stream tokens | Live SSE in UI; auto-fallback to server stream if SSE blocked |
- Auto — same routing logic as production reviews
- Local — pick any pulled Ollama model; compare 3b vs 7b quality
- Cloud — Groq models have no slash; OpenRouter models use provider/model format
- Stream off — single blocking response (still streams Ollama server-side when tier is Local)
Disabling a repository
Power users can toggle a repo off on the Repositories page. This pauses automatic reviews without uninstalling the GitHub App.
| While disabled | Behavior |
|---|---|
| Webhooks | Still received — PRs sync to dashboard |
| Auto-review on open / push | Skipped — no job queued |
| Welcome comment | Skipped |
| Backlog | Nothing stored — missed reviews are not queued |
Admins can Remove a repo to fully deactivate it in Gitvora (reviews, bot commands, scans). Use Restore to re-enable after adding it back on GitHub.
Admin removal
Admins can deactivate resources from Gitvora. GitHub App install is unchanged until you also update GitHub settings. The dashboard shows next steps after each action.
| Action | Where | Effect |
|---|---|---|
| Remove repo | Repositories → Remove | removedAt set — no reviews, triggers, or bot commands |
| Disconnect org | Repos (group) or Access → Installations | All repos deactivated; grants cleared |
| Reconnect org | Same as Disconnect | Link again + sync repos from GitHub |
| Sync repos | Repos or Access → Sync repos | Pull GitHub App repo selection |
| Purge installation | Access → Show inactive → Purge | Delete disconnected record + repos |
| Revoke user | Access or Team → Revoke | Blocked; sessions ended; grants cleared |
| Restore repo | Repositories → Restore | Re-enable when org is connected |
Slack & notifications
Use Channels only — each Slack webhook has scope (global, org, repo, or pattern) and event checkboxes. Routing rules are for AI model routing, not Slack.
| Event | When |
|---|---|
| Review triggered | Job queued (webhook, bot, dashboard) |
| Review completed | Verdict ready — PASS / WARN / BLOCK |
| Review failed | Worker error after retries |
Channel Test sends immediately; live review events use the notify queue. If Test works but reviews do not alert, check Observability → notifications log. See docs: Slack Workflows (escalation, digests) and GitHub CI vs Gitvora checks.
Review time estimates
Gitvora shows estimated review duration from model + diff size + recent audit history. Estimates refine as more reviews complete.
| Where | What you see |
|---|---|
| PR detail → Run buttons | est. per review type for this PR’s line count |
| Infrastructure → review actions | est. per type for ~100 lines |
| Model Lab sidebar | est. for current prompt size and review type |
| Bot ack comment | est. when you run @gitvora-bot review |
| Completed PR comment | actual time vs estimate in Runtime row |
Heuristic baselines: 3b on CPU, 7b on GPU, Groq/OpenRouter vary by model. Large PRs are chunked — estimates account for chunk count.
Prompt templates
Active prompts live in the database (PromptVersion). Package defaults are in packages/prompts/src/templates.ts.
| Action | Where |
|---|---|
| Edit prompt | Dashboard → Prompts — creates new active version |
| Sync from package | Prompts → Sync all from package (or per-type reset) |
| Deploy overwrite | PROMPT_SYNC_ON_SEED=true pnpm db:seed |
| Status badges | in sync with package vs customized per review type |
Production reviews always use the active DB prompt, not the file directly.
Finding follow-up
After a review, developers may push fixes. Gitvora tracks whether prior findings were acted on when a re-review runs (auto on push if Re-review on push is enabled, or manual trigger).
| Status | Meaning |
|---|---|
| OPEN | Current finding from the latest review |
| ADDRESSED | Prior finding — likely fixed (not re-flagged, or line left diff) |
| SUPERSEDED | Same issue flagged again — replaced by a new OPEN row |
What you see
| Surface | Details |
|---|---|
| PR list | 2 open · 1 fixed · Opened / Updated / Reviewed timestamps |
| PR detail → Findings | Open / Fixed / All filter; status badge; reported/fixed times |
| Latest review card | N new finding(s) · M prior fixed |
| Activity log | PR_PUSHED (sha change), PR_REVIEWED (duration, model, addressed count) |
| Observability → Audit | Details column with model, findings, duration |
“Fixed” is a heuristic from diff + re-review — not GitHub thread resolution. Existing findings default to OPEN until the next re-review reconciles them.
Merge gate
Without GitHub Team branch protection, a failed Gitvora Review check still signals blockers on free orgs. Optionally submits REQUEST_CHANGES on GitHub.
| Setting | Default | Effect |
|---|---|---|
| Merge gate | on | Publish check run on each open-PR review |
| Block on BLOCK | on | Check fails |
| Block severities | CRITICAL, HIGH | Fail if finding at threshold |
| Request changes on fail | on | GitHub review requests changes |
Admins issue a one-time override token from the PR detail page; developer posts @gitvora-bot override <token> (open PRs only).
Dashboard pages
| Page | Role | Purpose |
|---|---|---|
| Overview | Developer+ | Stats; recent PRs with risk, findings, reviewed time |
| Pull requests | Developer+ | List — open/fixed findings, Opened/Updated/Reviewed, repo filter |
| PR detail | Developer+ | Findings filter, activity log (exact time + trigger info), files/commits, trigger reviews |
| Repositories | Developer+ | Sync, enable/disable, scan, Add on GitHub, org admin actions |
| Risk & reports | Developer+ | Risk scores tab + Author activity (trends, by @author, review log) |
| Infrastructure | Developer+ | Primary/fast cloud models, inference mode, merge gate, chunking |
| Model Lab | Power user+ | Tier, model, stream — interactive AI test |
| Observability | Developer+ | Webhooks, audit (details + timestamps), AI health, live stream |
| Prompts | Power user+ | Versioned prompts; sync from packages/prompts templates |
| Routing rules | Power user+ | AI model routing (local vs cloud) — not Slack |
| Channels | Power user+ | Slack, email, webhook destinations |
| Guide | Developer+ | This page — product capabilities reference |
| Access control | Admin | Approve users/installs, sidebar-by-role |
| Team | Admin | Invites and roles |
| Account | Developer+ | Profile and password |
Legacy redirects: /dashboard/ai → Infrastructure, /dashboard/audit → Observability.
Roles
| Role | Access |
|---|---|
| DEVELOPER | PRs, repos, infrastructure, observability, guide |
| POWER_USER | + prompts, routing, channels, model lab |
| ADMIN | + access control, team, per-role sidebar config |
GitHub App installers can be auto-approved and granted dashboard access so org admins see repos without manual contributor setup.
Repository docs
Full technical reference in the monorepo docs/ folder (same content as this guide, plus setup/deploy detail):
- SYSTEM.md— Master guide — how everything works (current + planned)
- CAPABILITIES.md— Product guide (markdown source)
- CONTEXT_AWARE_REVIEWS.md— Context gap & roadmap vs competitors
- SETUP.md— Install and first run
- ARCHITECTURE.md— Data flow and deployment
- GITHUB_APP.md— Permissions and webhooks
- BOT_COMMANDS.md— Bot reference
- ACCESS_CONTROL.md— Approvals and blocking
- ENV.md— Environment variables
- OBSERVABILITY.md— Health checks and logs
Where this guide lives
| URL | Audience |
|---|---|
| / | Landing — marketing highlights + install CTA |
| /docs | Public — shareable, no login required |
| /dashboard/docs | In-app — operators configuring Gitvora |