Settings

The Settings section is an admin-only area for configuring the code review platform: manage user accounts, create AI reviewer bots, set up Slack and Teams notifications, inspect webhook delivery history, and control licensing. Access it from the top navigation bar when logged in as an administrator.

Overview Free

Navigate to Settings in the top nav bar. All Settings pages share a tab bar at the top — Users / User Stats / AI Prompts / Webhook Deliveries / Review Templates / Notifications / Audit Log — so you can switch sections without going back to the Settings index. A breadcrumb above the tabs always shows where you are.

Only accounts with the admin flag set can access Settings. Regular users are redirected to the dashboard.

Users Free

There are two admin user-list pages:

Both pages show the same rich per-row detail: for AI bots — the model name and a trigger mode badge (auto or manual) and the assigned prompt (if any); for service accounts — a token active / no token badge and a Regenerate token link.

Trigger mode

Each AI reviewer bot has a trigger mode that controls when it runs:

ModeBehaviour
Auto (default) Runs automatically when assigned to a CR. Also re-runs automatically whenever new commits are added to that CR.
Manual Does not run automatically. An admin or the review author must click Run on the review page to start it.

Auto bots also have a Re-run button on the review page for on-demand re-execution at any time while the CR is open.

Autofix Extended+

Enable Autofix per bot when creating or editing it. When enabled, any inline suggestion the bot posts shows a purple Autofix button directly on the review page (both in the diff view and in the comments panel).

Clicking the button enqueues a background job (Sidekiq) that:

  1. Fetches the current file content from the platform API.
  2. Replaces the flagged line with the suggestion text.
  3. Pushes a new commit to the review's source branch via the platform API.
  4. Marks the original comment as resolved and posts a confirmation comment. On failure, posts an error comment instead.
PlatformCommit API used
GitHubOctokit update_contents
GitLabPUT /api/v4/projects/:id/repository/files/:path
Gitea / ForgejoPUT /api/v1/repos/:owner/:repo/contents/:path
Bitbucket CloudPOST /2.0/repositories/:ws/:repo/src (multipart)
Bitbucket ServerPUT /rest/api/1.0/projects/:key/repos/:slug/browse/:path
Azure DevOpsPOST /_apis/git/repositories/:repo/pushes
GerritNot supported

Autofix only appears on comments that have a single-line suggestion, were written by a bot with Autofix enabled, and have not yet been resolved.

Creating an AI Reviewer bot Free — 1st bot Extended+ — multiple bots

  1. Click 🤖 New AI Reviewer.
  2. Enter a bot name (e.g. Claude Reviewer). Username and email are auto-generated if left blank.
  3. Choose AI Provider:
    • OpenAI-compatible (local) — available on all tiers. Enter the base URL (e.g. http://localhost:11434/v1 for Ollama) and model name.
    • Anthropic Claude Standard+ — enter your Anthropic API key (sk-ant-…) and select a Claude model.
    • OpenAI Standard+ — enter your OpenAI API key (sk-…) and select a GPT model.
    • DeepSeek Standard+ — enter your DeepSeek API key and select a model (e.g. deepseek-chat).
    • Google Gemini Standard+ — enter your Gemini API key (AIza…) and select a Gemini model.
    • Qwen / Tongyi Standard+ — enter your DashScope API key and select a Qwen model.
  4. Choose Trigger mode: Auto (recommended for most bots) or Manual (useful for expensive models you want to run selectively).
  5. Optionally select a Review Prompt from the dropdown (see Per-bot assignment below).
  6. Click Create AI Reviewer. The bot is ready to be assigned to any code review.
The bot cannot sign in interactively — it is given a random irreversible password on creation. It only acts when assigned as a reviewer on a code review.

AI Prompts Free

AI Prompts are named system prompt templates stored in the database. Each AI reviewer bot can be assigned one prompt; if none is assigned, the default prompt is used.

Managing prompts

Go to Settings → AI Prompts. From here you can:

Prompt variables Free

Two special placeholders can be used anywhere in the system prompt text. They are substituted at review time, just before the prompt is sent to the AI:

Example prompt using both variables:

You are a senior software engineer performing a thorough code review.
Primary languages: {{languages}}.

{{guidelines}}

## Universal rules
- Flag security vulnerabilities: injection, XSS, CSRF, auth bypass
- Identify logic bugs and unhandled edge cases
- Note performance problems

## Response format
Reply ONLY with a valid JSON array.
Each element: { "file_path", "line_number", "severity", "body" }
If there are no issues, return exactly: []
The Response format section is critical — the AI reviewer parses the JSON array to create inline comments. If the model returns free text instead of JSON, no comments will be posted.

Built-in prompt Free

A Default Review Prompt is seeded automatically when the app first starts. It is marked as built-in and carries the same language-specific guidelines that Codeveira used before the prompt management feature was added.

The built-in prompt:

If you want to tweak the default guidelines, create a new prompt, copy the built-in text as a starting point, make your changes, and set the new prompt as default. The built-in one remains as a safe fallback reference.

Per-bot prompt assignment Free

Each AI reviewer bot can have its own prompt assigned independently. This lets you run multiple bots with different review styles — for example a strict security-focused bot and a more lenient style-only bot.

To assign a prompt to a bot (or change its trigger mode):

  1. Go to Settings → Users and click Edit next to the AI reviewer bot.
  2. In the AI Reviewer Settings section, choose a prompt from the Review Prompt dropdown and adjust the Trigger mode if needed.
  3. Save. The bot will use the selected prompt and trigger mode for all future reviews.

You can also assign the prompt when creating a new bot — the dropdown appears in the creation form if at least one prompt exists.

Priority order:

Notifications Standard+

Go to Settings → Notifications to configure all notification channels for code review events. Each channel has independent event toggles and fully customisable message templates. Template variables: {{cr_id}}, {{title}}, {{status}}, {{repository}}, {{author}}, {{url}}.

Supported events

Slack

  1. In your Slack workspace go to Apps → Incoming Webhooks → Add New Webhook to Workspace.
  2. Choose the target channel and copy the webhook URL.
  3. Paste it in Settings → Notifications → Slack and save.

Microsoft Teams

  1. Open the Teams channel, click ⋯ → Connectors → Incoming Webhook → Configure.
  2. Copy the generated URL and paste it in Settings → Notifications → Teams.

Email

Configure SMTP credentials via environment variables (SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_FROM). In Settings → Notifications → Email set the sender display name, choose which events send emails, and customise subject templates ({{cr_id}}, {{title}} supported).

Global Outgoing Webhook

In Settings → Notifications → Webhook configure a global HTTPS endpoint that receives a signed JSON payload on selected events. Set an optional secret — each request includes X-Codeveira-Signature: sha256=… (HMAC-SHA256) for verification.

SMS

In Settings → Notifications → SMS configure any HTTP-based SMS provider (SMSAPI, Twilio, Vonage, MessageBird, Infobip…). Set the API URL, authentication token, sender name/number, recipient phone numbers (comma-separated, international format), and the JSON field names the provider expects. Quick-fill presets auto-populate these fields for the most popular providers.

A green dot on each tab indicates that channel is active. All settings are stored in the database and take effect immediately — no restart needed.

Webhook Deliveries Free

Go to Settings → Webhook Deliveries to see the last 200 incoming webhook events from all connected Git platforms.

Webhook secrets are required for every platform. GitLab, GitHub, Gitea/Forgejo, and Bitbucket use HMAC payload signing (*_WEBHOOK_SECRET). Azure DevOps, Gerrit, and SVN don't support HMAC signing on their webhook mechanisms, so AZURE_WEBHOOK_SECRET/GERRIT_WEBHOOK_SECRET/SVN_WEBHOOK_SECRET are instead checked via HTTP Basic Authentication. Either way, leaving the corresponding environment variable blank rejects every request from that platform with 401 Unauthorized rather than accepting it unauthenticated.

Columns

Retrying a delivery

Click Retry next to any delivery. This creates a new delivery record and re-enqueues ProcessPushJob with the original payload. The new record goes through the same received → processed / failed lifecycle as a live delivery.

Retrying a processed delivery is safe — ProcessPushJob deduplicates commits by SHA, so no duplicate CRs or commits are created.

Audit Log Extended+

Available at Settings → Audit Log. Records every significant action performed in the code review platform — append-only, never editable.

What is logged

ActionTrigger
Reviews
review.createdManual CR creation
review.approved / rejectedReviewer decision
review.closed / reopenedAuthor or admin changes status
review.mergedTwo or more CRs merged into one new CR
review.reviewers_updatedReviewers added or removed; details list added/removed names
review.commits_addedFollow-up commits added to an open CR
review.ai_triggeredAI bot review manually started
review.deletedReview destroyed
Comments
comment.createdGeneral or inline comment posted
comment.resolvedComment marked resolved or unresolved
comment.label_added / label_removedLabel toggled on a comment
comment.labels_clearedAll labels removed from a comment at once
Users
user.createdNew user created by admin
user.updated / deletedUser profile saved or account removed
user.password_changedPassword changed from profile
user.api_token_regeneratedAPI token regenerated
user.ai_bot_createdNew AI bot account created
user.service_account_createdNew service account created
Repositories
repository.created / updated / deletedRepository management
repository.member_addedMember granted access to a repository
repository.member_role_changedMember role changed (viewer / reviewer / admin)
repository.member_removedMember removed from a repository
AI Prompts
ai_prompt.created / updated / deletedPrompt template created, edited, or removed
ai_prompt.set_defaultA prompt template set as the default
Settings & Webhooks
settings.notifications_updatedChat webhook URLs saved
webhook.retriedWebhook delivery manually retried

Each entry contains

Filtering

Use the Actor dropdown to filter by a specific user, and the Action dropdown to filter by category: review, user, repository, settings, webhook, ai_prompt, or comment. Each category is colour-coded in the table. Shows up to 500 most recent events.

Export Enterprise

Use the CSV and JSON buttons in the top-right corner of the Audit Log page to download the currently filtered view. Exports up to 10 000 events (no 500-event cap). Both formats include all fields: id, timestamp, actor, action, target, details, and IP address.

Webhook forwarding Enterprise

Every audit event can be forwarded in real-time to an external HTTP endpoint. Configure the URL in Settings → Audit Log → Webhook Forwarding. Codeveira POSTs a JSON payload for each event asynchronously — the webhook call never blocks the original user action.

The payload includes a "source": "codeveira" field so you can filter Codeveira events when multiple systems share the same endpoint.

Compatible receivers

Timeout: 5 s connect, 10 s read. Failed deliveries are logged to Rails.logger (not retried automatically). Remove the URL to disable forwarding.

Audit log failures never interrupt requests — if a write fails, the error is logged to Rails.logger and the original action completes normally.

Two-Factor Authentication Standard+

Two-factor authentication (2FA) adds a second verification step after password login using a TOTP authenticator app (Google Authenticator, Authy, 1Password, etc.). AI bots and service accounts are exempt.

Global enforcement (admin)

Go to Settings → Users. A panel at the top of the page lets you enable or disable the global 2FA requirement:

The Users list shows a green 2FA badge next to every account that has 2FA configured.

User self-enrollment

  1. Go to Profile → Two-Factor Authentication.
  2. Click Set up 2FA.
  3. Scan the QR code with your authenticator app, or type the key manually.
  4. Enter the 6-digit code shown in the app and click Enable 2FA.

Login flow

After entering the password, a verification screen prompts for the current 6-digit TOTP code. Codes are valid for 30 seconds with a ±30 s drift window to account for clock skew.

If a user loses access to their authenticator app, an admin can disable 2FA for them by temporarily turning off the global requirement — the user can then log in and reconfigure 2FA from their profile.

Outgoing Webhooks Free

Not to be confused with the single Global Outgoing Webhook above (Settings → Notifications → Webhook), which is a chat-style notification channel alongside Slack/Teams/SMS. This section is a separate system, purpose-built for task-tracker/automation integration:

Events

review.opened, review.approved, review.rejected, review.closed, review.reopened, comment.created, symbol.changed (fires when a watched symbol's signature changes on the default branch — no review/actor in this payload, it uses its own envelope with a symbol key instead). An optional secret token enables X-Codeveira-Signature: sha256=… (HMAC-SHA256) on every delivery.

Task tracker integration (do-it-yourself, or see native Task Trackers below)

For any tracker without a native connector — Linear, Azure Boards, or anything else — this is the standardized, vendor-neutral way to connect Codeveira to it. Every payload includes:

Wiring a tracker up is a config change on its side, not a Codeveira feature request: an incoming-webhook rule or a Zapier/Make "Webhooks" recipe — the payload shape never changes.

{
  "event": "review.opened",
  "review": { "id": 42, "cr_id": "CR-REPO-42", "title": "[PROJ-123] Fix the thing", "status": "open", "url": "https://codereview.example.com/repositories/1/reviews/42" },
  "repository": { "id": 1, "name": "my-repo" },
  "actor": { "id": 7, "name": "Jane Doe" },
  "ticket_keys": ["PROJ-123"]
}

Task Trackers Standard+

Unlike Outgoing Webhooks above, which only sends data out and needs the tracker's own automation to act on it, Task Trackers actually transitions the ticket and posts a comment back — no receiving script to write on YouTrack/Jira/Mantis/Bugzilla's side. Same global/override shape as Outgoing Webhooks:

Configuration

An event with no status mapping is skipped for the transition but still gets a comment (if enabled). Use Test Connection on the index page to verify the base URL and credentials before relying on it.

Per-tracker behavior

Mantis and Bugzilla both key issues by a bare number (12345), not a PROJECT-123-style key — set a matching ticket-key-pattern override on the repository (the same setting ticket_keys extraction above uses) so Codeveira can find them in review titles/branches.

Sync is asynchronous and best-effort — a tracker-side failure is logged, never blocks or fails the review action that triggered it. Inbound direction (tracker → Codeveira) is not supported.

Service Accounts Standard+

Service accounts are machine users with no password login — they authenticate exclusively via a Bearer token. They are designed for external tools such as Grafana, Prometheus, or monitoring scripts that need read access to the /metrics endpoint.

Creating a service account

  1. Go to Settings → Users and click 🔑 New Service Account.
  2. Enter a display name (e.g. Grafana) and click Create Service Account.
  3. The API token is shown once in a green banner with a Copy button. Save it somewhere safe — it cannot be retrieved again.

Managing tokens

Service accounts appear in the Users list with a 🔑 icon and a token active / no token badge. To rotate the token, click Regenerate token — the old token stops working immediately.

Service account tokens have access to the /metrics endpoint only. They cannot log in to the web UI or access any other part of the API.

Prometheus Metrics Extended+

Codeveira exposes a Prometheus-compatible metrics endpoint at GET /metrics. It returns plain text in Prometheus exposition format 0.0.4 and requires a valid service account Bearer token.

Authentication

Pass the service account token in the Authorization header:

Authorization: Bearer <service-account-token>

Requests without a valid token receive 401 Unauthorized with a WWW-Authenticate: Bearer challenge.

Grafana datasource setup

In Grafana, add a Prometheus data source:

  1. Set URL to your Codeveira instance, e.g. https://codeveira.example.com
  2. Under Custom HTTP Headers, add:
    Header: Authorization   Value: Bearer <token>
  3. Set Scrape interval to 60s or longer — metrics are live queries, not pre-aggregated.
You can also use Grafana Agent or a standalone Prometheus server to scrape the endpoint and feed the data to Grafana. Any Prometheus-compatible scraper works.

Available metrics

MetricTypeDescription
codeveira_reviews_total{status}gaugeAll-time review count by status (open, approved, closed, rejected)
codeveira_reviews_opengaugeCurrently open reviews (all repos)
codeveira_reviews_stalegaugeOpen reviews older than 7 days
codeveira_repository_reviews_open{repository}gaugeOpen reviews per repository
codeveira_reviews_created_24hgaugeReviews created in the last 24 hours
codeveira_cycle_time_p50_seconds{repository}gaugeMedian cycle time in seconds, last 30 days
codeveira_cycle_time_p90_seconds{repository}gaugep90 cycle time in seconds, last 30 days
codeveira_webhook_deliveries_total{status}gaugeAll-time webhook deliveries by status
codeveira_webhook_failures_24hgaugeFailed webhook deliveries in the last 24 hours
codeveira_comments_24hgaugeComments posted in the last 24 hours
codeveira_users_total{type}gaugeUsers by type: human, ai_bot, service_account
codeveira_audit_events_24h{category}gaugeAudit events in the last 24 hours by category
codeveira_reviewer_pending_assignments{reviewer}gaugeOpen reviews currently awaiting each human reviewer (bots/service accounts excluded)
codeveira_reviewer_stale_assignments{reviewer}gaugeAssignments still pending after 7 days — the clearest "who's blocking things" signal
codeveira_reviewer_decision_time_p50_seconds{reviewer}gaugeMedian time from assignment to approve/reject, last 30 days
codeveira_reviewer_decision_time_p90_seconds{reviewer}gaugep90 time from assignment to approve/reject, last 30 days
codeveira_scrape_duration_secondsgaugeTime taken to collect all metrics
Skip the manual Grafana setup above entirely: docker-compose.monitoring.yml is a ready-made, opt-in Prometheus + Grafana + Loki overlay (docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d) with two dashboards already provisioned — Review Health & Bottlenecks (the metrics above) and Nginx — Connections & Security (who's connecting, and any failed/suspicious requests by IP, sourced from nginx's own access log rather than a Prometheus label). See the deploy repo's README for setup.

nginx requirement

If Codeveira runs behind nginx, include X-Forwarded-For in your proxy config so the Audit Log records real client IPs (not the proxy address):

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

The bundled nginx container already sets this by default. If you're running your own reverse proxy instead, see the installation guide for a full nginx config example.

Backup & Restore Standard+

The Backup & Restore tab lets you protect your PostgreSQL database without any external tooling. Backups are stored in a dedicated Docker volume (backup_data:/backups) that is mounted in both the app and sidekiq containers.

Scheduled backups

Select a preset schedule or enter a custom cron expression. Available presets: Hourly, Every 6 h, Daily at 2 am, Weekly on Sunday at 2 am. The schedule is stored in the database and loaded into sidekiq-cron at startup. To disable automatic backups, select Disabled.

Set a Retention count (default 7). After each successful backup the oldest files beyond the retention limit are automatically deleted.

Manual backup

Click Run backup now to enqueue an immediate DatabaseBackupJob. The job runs in the backup Sidekiq queue and does not block the web process. A live spinner banner appears while the backup is running; it turns green with the filename when complete and the page reloads automatically.

Upload backup

Drag and drop a .dump file onto the upload zone, or click Choose file to pick one from disk. The file is streamed to the backup volume and appears in the list immediately, ready to restore. Maximum upload size is 512 MB (set by client_max_body_size in nginx).

Backup list

All .dump files in the backup volume are listed with filename, size, and creation date. For each file you can:

Environment variables

VariableDefaultDescription
BACKUP_DIR/backupsPath inside the container where dump files are written
DATABASE_URLrequiredPostgreSQL connection string used by pg_dump and pg_restore

Domain & HTTPS Free

Codeveira ships with a built-in nginx reverse-proxy container fronting the app on ports 80/443 — no separate reverse proxy to install. It boots with a zero-config self-signed certificate, so this page's job is entirely about switching to a real domain and certificate; unlike most other Settings pages, it's available on every license tier, since it's core self-hosting infrastructure rather than a paid feature.

Modes

Renewal

Certificates issued via either Let's Encrypt mode renew automatically — a background job runs twice a day and only actually re-issues when the current certificate is within its renewal window, so this needs no attention after initial setup. An Issue / renew now button is available for forcing an immediate attempt (useful right after first configuring DNS-01 credentials, to confirm they work without waiting for the next scheduled run).

Removing a domain

Remove domain clears the configured domain, mode, and any saved DNS credentials, and reverts nginx to its self-signed default — useful if you're moving the instance to a different domain or tearing down a test configuration.

See the installation guide for how the underlying nginx container and volumes fit together, and how to run your own reverse proxy in front of Codeveira instead if you'd rather do that.

Smart Reviewer Suggestions Standard+

Codeveira analyses the git history it has already stored in its database to identify the developers who know each changed file best. No extra Git platform API calls are made — everything is derived from the commits table diffs that were ingested when reviews were created.

How it works

  1. When a review is processed, UpdateOwnershipStatsJob parses the stored diffs and upserts per-(repository, file path, author email) commit counts into the file_ownership_stats table.
  2. When a review page loads, CodeOwnershipService queries the stats for all files in the review, aggregates by author (sum of commit counts × number of files touched), matches emails to Codeveira users, excludes bots, service accounts, and already-assigned reviewers, and returns the top 5.
  3. Suggestions are shown below the reviewer list as a "Suggested by code history" panel with name, file count, commit count, and an Add button.
  4. Clicking Add assigns the reviewer instantly via Turbo Stream — no full page reload.

Notes

Upsource Import Enterprise

The Upsource Import tab provides a 5-step migration wizard that imports code reviews, reviewer assignments, and comments from a JetBrains Upsource server into Codeveira.

Step 1 — Connect

Enter the base URL of your Upsource server (e.g. https://upsource.yourcompany.com) and authentication credentials.

Test connection

Before entering credentials, click Test connection next to the URL field. Codeveira sends an HTTP probe from the application server (not your browser) to /~rpc/ on the provided URL and returns an immediate result:

This is especially important when the admin accesses the panel remotely via VPN while the Codeveira server has a different network path to the Upsource host.

SSRF protection: The connection URL is validated server-side before any request is made. Only HTTPS URLs are accepted. The resolved IP is checked against private ranges (10.x, 172.16–31.x, 192.168.x), loopback (127.x), link-local (169.254.x), and IPv6 private blocks — connections to these addresses are blocked.

Credentials

Two authentication formats are accepted:

On submit, the button disables and shows a spinner (large instances may take 5–10 s). Codeveira calls /~rpc/getProjects and /hub/api/rest/users to fetch the full project and user lists.

Step 2 — Map Projects

Each Upsource project is listed with a dropdown to select the target Codeveira repository. Projects are pre-matched by name similarity (normalized, case-insensitive, ignores hyphens and underscores). Select Skip to exclude a project from the import.

Step 3 — Map Users

Each Upsource Hub user is listed with their name, login, and email. Codeveira pre-fills the dropdown for users whose email address exactly matches a Codeveira account (marked ★). Users mapped to Skip are imported without author attribution (shown as "Deleted user").

Step 4 — Options

OptionValuesDefault
Review statesAll / Open only / Closed onlyAll
Date rangeFrom / To (optional)Unlimited
Inline code commentsCheckboxOff

Clicking Start import enqueues a UpsourceImportJob in Sidekiq and redirects to the progress page.

Step 5 — Progress

The page polls GET /settings/upsource_import/progress every 3 seconds and updates the progress bar and counter in real time. Per-review errors (e.g. missing data, API timeout) are collected and shown without stopping the overall import. When the job finishes (or fails fatally), the page reloads automatically and shows a summary with links to view the imported repositories.

Idempotency

Each imported review stores the original Upsource review ID in the source_id column. Re-running the wizard skips reviews that are already present. This means the import is safe to run multiple times — useful if the first run encountered errors or if new reviews were created in Upsource after the initial migration.

Limitations

Teams Standard+

A Team groups users across every repository — closing a gap where reviews could only be scoped per-individual or per-repo, with no way to ask "what does my team own that's stuck, across every repo it touches."

Managing teams

Under Settings → Teams (global admin), create, rename, or delete a team, then open it to add or remove members and set each member's role — member or lead. Every membership change is recorded in the audit log.

The team rollup

Any team member or lead — no admin access required — gets a Teams link in the top navigation pointing at that team's cross-repo rollup: open, stale, and needs-response reviews and pending assignments across every member's repositories, plus per-member stats (reviews authored, approvals given, comments posted, last active). A global admin can open any team's rollup without being a member of it.

Review Watchers Standard+

Any user can watch a code review without being assigned as a reviewer. Watchers receive all notifications (new comments, status changes) but are not required to approve. The Watch button appears in the action bar on the review page.

Useful for: team leads who want visibility without being in the approval chain; authors of related code who want context; QA engineers tracking a feature branch.

CI Integration Enterprise

Connect your CI system to Codeveira so build results appear directly on review pages as live status badges — updated in real-time via Turbo Streams.

Setup

  1. Go to Settings → CI Integration and generate a secret token.
  2. Add the token to your CI system as a secret (e.g. CODEVEIRA_CI_TOKEN).
  3. At the end of each CI job, POST the build result to POST /webhooks/ci.

Payload

{
  "commit_sha":    "abc1234...",   // required
  "status":        "success",     // pending | running | success | failed | canceled
  "pipeline_name": "Build",       // optional, defaults to "CI"
  "build_url":     "https://...", // optional — shown as "View" link
  "provider":      "jenkins"      // optional — informational
}

Codeveira looks up the commit SHA, finds the associated review, upserts the status, and broadcasts the badge update to any connected browsers.

Compatible CI systems

Any system that can run a shell command or HTTP request: Jenkins, GitHub Actions, GitLab CI, CircleCI, Buildkite, TeamCity, Woodpecker CI, Drone CI, and more. See the Settings → CI Integration page for ready-to-paste examples.

Code Coverage Enterprise

Upload a coverage report from your CI test run and Codeveira overlays it directly on the diff view — a green stripe on covered lines, red on uncovered, in both combined and side-by-side views. Codeveira never runs your tests or compiles anything itself here — it's pure ingest and display of a report CI already produced.

Setup

Uses the same secret token as CI Integration above. POST to /webhooks/ci/coverage as a multipart form with commit_sha, optional pipeline_name/format, and the report file.

Supported formats

Auto-detected from content, or passed explicitly via the format field:

A summary card on the review page shows the coverage percentage, lines covered/total, format, and pipeline name — with a warning if the report predates the review's current HEAD commit.

SAST Findings Enterprise

Generic ingestion of SARIF 2.1.0 reports — the JSON standard emitted by Semgrep, CodeQL, Bandit, Brakeman, Trivy, Checkov, and effectively every modern SAST/security scanner — instead of a bespoke adapter per vendor.

Setup

Uses the same secret token as CI Integration above. POST to /webhooks/ci/sast as a multipart form with commit_sha, optional pipeline_name, and the report file.

How findings are shown

Each finding is posted as a real inline review comment from a dedicated sast-bot account, at the exact file/line SARIF reports — 🔴 error, 🟡 warning, 🔵 note — deduped so re-uploading the same report doesn't repost. A summary card on the review page shows total findings by severity, tool name, and pipeline name, with a staleness warning if the report predates the review's current HEAD commit.

Architectural Lint & Duplicate Code Detection Standard+

Two independent checks, both off by default, both configured on the same Settings → Architectural Lint page (one toggle each), both posting inline review comments from a dedicated bot account.

Architectural Lint

Runs a small, fixed set of structural rules against every changed file on push. Ruby and TypeScript's own checks use the same tree-sitter parse the symbol indexer already does — no extra pass, no LLM call: string interpolation passed into where/execute/find_by_sql (SQL injection risk) for Ruby, an explicit any annotation for TypeScript. Go, Python, PHP, Java, Kotlin, Ruby, and JavaScript are additionally checked by real external linters — golangci-lint, Pylint, PHP_CodeSniffer (running the phpcs-security-audit standard: SQL injection, eval()/exec(), remote file inclusion, weak crypto, and more), PMD, detekt, RuboCop (its whole Security department), and ESLint (no-eval, no-implied-eval, and more, run against our own bundled config, never the target's) — running in a dedicated, isolated lint-runner container. All run fully offline: only checks confirmed not to need the target repository's own dependencies installed are enabled, so nothing is fetched over the network and no target code is ever executed — same trust model as the tree-sitter rules next to them. Posts as Lint Bot.

Duplicate Code Detection

Flags a changed method that's near-identical to another method anywhere else in the repository. Every function/method-sized definition (4+ lines) the tree-sitter indexer already extracts gets fingerprinted — a hash of the body only, with whitespace normalized — so a duplicate is simply another definition sharing that fingerprint in the same repository and branch. No separate scan, no external tool: it reuses data the indexer is already producing. Catches exact-after-formatting duplicates, not a version with renamed variables throughout. Posts as Duplicate Bot.

Natural-language code search — type "where do we handle JWT tokens" into ⌘K/Ctrl+K and get back matching functions, not just repos/reviews/commits by exact substring. An upgrade to Cmd+K search, not a replacement for Find Usages/Go to Declaration (those stay exact and name-based).

Setup

Configure under Settings → Semantic Search: point it at a self-hosted Ollama instance (or any Ollama-compatible /api/embeddings endpoint) and an embedding model (default mxbai-embed-large, must already be pulled). No code ever leaves your infrastructure — the URL is validated against the same SSRF rules as other admin-configured provider URLs. Off by default until configured.

How it works

Every function/method-sized definition the tree-sitter indexer already extracts gets embedded asynchronously after each push, so a slow or unreachable embeddings API never blocks push processing. Search results rank by cosine similarity, computed in application code against the existing symbol index — no pgvector extension or separate vector database required.

License All tiers

Codeveira is free for unlimited users with local AI models — no license key required. A license key unlocks cloud AI providers and advanced features.

Tiers

Tier Price Users License key Included features
Free$0UnlimitedNot requiredCore review, 1 AI bot (local model only), email notifications, IDE diagnostics
Standard$10/user/moUnlimitedRequired+ cloud AI providers (Claude, OpenAI, DeepSeek, Gemini, Qwen), Compare, Teams, Slack/Teams, REST API, service accounts, IDE plugins, Backup & Restore, Upsource Import, 2FA
Extended$14/user/moUnlimitedRequired+ multiple AI bots, Autofix, LDAP/AD, Audit log, Prometheus metrics
Enterprise$16/user/moUnlimitedRequiredAll features, including Code Coverage overlay and SAST findings (SARIF)

Entering a license key

  1. Go to Settings → License (admin only).
  2. Paste the license key into the text field and click Activate License.
  3. The current tier, paid seat count, customer name, and expiry date are shown immediately after activation.

The key is verified offline — no internet connection is required. If the key is invalid or expired, an error is shown and the previous license remains active.

Removing a license

Click Remove License on the License settings page. The instance reverts to the Free tier. All users remain active; only the unlocked features become unavailable until a valid license is applied again.

User limit enforcement

The limit is enforced at registration time. If the current number of human users equals or exceeds the tier's limit, creating new users (via the admin panel, LDAP sync, or API) is blocked with an error message explaining which tier is active.