IDE Integration — VS Code Extension & Global LSP Server
Codeveira integrates directly into VS Code, JetBrains, and Neovim via the Language Server Protocol. Open code review comments appear as inline squiggles in the relevant files. A single Docker container (the global LSP server) serves all developers — no Node.js installation required on developer machines.
Inline diagnostics
Review comments as squiggles in the editor — Error 🔴, Warning 🟡, Info 🔵.
Quick Fix
Resolve a comment or apply an AI-generated code suggestion with one click.
CR sidebar
List of open code reviews, create new CRs, approve / reject / close from the editor.
Global server
One Docker container for all 30 developers. Each connection gets an isolated child process.
Find Usages & Go to Declaration
F12, Shift+F12, and Ctrl+Shift+O work natively across 8 languages — Standard+.
How it works
The LSP proxy (lsp container) listens on TCP port 7777. When a developer's VS Code connects, the proxy spawns an isolated server.js --stdio child process for that connection. The child holds the developer's personal API token and diagnostic cache — completely separate from other connections.
Developer 1 VS Code ─┐
Developer 2 VS Code ─┤ TCP :7777 ──→ lsp container (proxy.js)
Developer N VS Code ─┘ │
┌──────────┴──────────┐
│ per-connection │
├─ server.js (dev 1) │
├─ server.js (dev 2) │
└─ server.js (dev N) │
│ HTTP :3000
Rails API (app container)
Start the LSP server
The lsp service is included in docker-compose.yml and starts automatically with the rest of the stack:
docker compose up -d
Verify it's running:
docker logs codereview-lsp-1
# Expected output:
# [Codeveira LSP proxy] listening on 0.0.0.0:7777
# [Codeveira LSP proxy] CODEVEIRA_URL=http://app:3000
The LSP container's port is mapped in .env via LSP_PORT=7777. If you need a different host port, change that variable — the container always listens internally on 7777.
Install the VS Code extension
The extension source lives in extensions/vscode/ in the Codeveira repository. Build and package it:
cd extensions/vscode
npm install
npm run build
npx vsce package
# Produces: codeveira-1.0.1.vsix
Install in VS Code:
code --install-extension codeveira-1.0.1.vsix
Or: open VS Code → Extensions panel → ⋯ menu → Install from VSIX…
vsce / @vscode/vsce tool for packaging. Install it once with npm install -g @vscode/vsce.Configure VS Code settings
Open File → Preferences → Settings and search for Codeveira, or add to settings.json:
{
"codeveira.url": "https://codereview.company.com",
"codeveira.apiToken": "<your-api-token>",
"codeveira.repositoryId": "3",
// Global LSP server (recommended for teams)
"codeveira.lspHost": "codereview.company.com",
"codeveira.lspPort": 7777,
// Optional: how often to poll for new diagnostics (seconds)
"codeveira.pollIntervalSeconds": 60
}
| Setting | Required | Description |
|---|---|---|
codeveira.url | Yes | Public URL of your Codeveira instance |
codeveira.apiToken | Yes | Your personal API token (see below) |
codeveira.repositoryId | Yes | Numeric ID of the repository for this workspace |
codeveira.lspHost | Recommended | Hostname of the global LSP server. When set, connects via TCP. When empty, spawns a local server.js (dev mode). |
codeveira.lspPort | Optional | TCP port of the LSP server. Default: 7777 |
codeveira.pollIntervalSeconds | Optional | Background poll interval for fresh diagnostics. Default: 60 |
Getting your API token
In Codeveira: click your avatar → Profile → copy the API Token. Each developer uses their own token. Tokens can be regenerated at any time.
Finding the repository ID
Open the repository in Codeveira — the numeric ID appears in the URL: /repositories/3/commits.
Open a file and see diagnostics
Open any source file in the workspace. Within a few seconds, review comments for that file appear as coloured underlines (squiggles). The Problems panel also lists all diagnostics for the current workspace.
The extension polls for fresh diagnostics every pollIntervalSeconds seconds in the background. Use Codeveira: Refresh Diagnostics (Ctrl+Alt+C → command palette) to refresh immediately.
Diagnostic severity
AI reviewer comments include an emoji prefix that maps to LSP severity. Human comments without a prefix default to Info.
| Prefix | LSP severity | Squiggle colour | Meaning |
|---|---|---|---|
| 🔴 | Error (1) | Red | Critical issue — must fix |
| 🟡 | Warning (2) | Yellow / orange | Should be addressed |
| 🔵 | Info (3) | Blue | Suggestion or note |
| (none) | Info (3) | Blue | General inline comment |
Hover over a squiggle to see the full comment: reviewer name, date, CR identifier, reply count, and AI suggestion hint if one is available.
Quick Fix actions
Click the lightbulb icon (or press Ctrl+. / Cmd+.) on a squiggle line to open Quick Fix:
- Resolve comment — marks the comment as resolved in Codeveira via the API. The squiggle disappears.
- Apply AI suggestion — replaces the flagged line with the AI-generated single-line fix, then resolves the comment automatically. Only shown when the AI reviewer provided a
suggestionfield.
CR sidebar
Click the Codeveira icon in the VS Code Activity Bar (left panel) to open the Code Reviews sidebar. It shows all open reviews for the configured repository.
Available commands
| Command | Shortcut / location | Description |
|---|---|---|
| Refresh Reviews | Sidebar toolbar | Reload the CR list |
| Create Code Review | Sidebar toolbar (+ icon) | Pick commits from a list, enter title and description, create CR |
| Open Review in Browser | Right-click on a CR | Open the full review in Codeveira web UI |
| Approve Review | Right-click on a CR | Approve (you must be an assigned reviewer) |
| Reject Review | Right-click on a CR | Request changes |
| Close Review | Right-click on a CR | Close (author or admin only) |
| Reopen Review | Right-click on a CR | Reopen a closed review |
| Add Comment | Ctrl+Alt+C / editor right-click | Add an inline comment on the current cursor line |
| Refresh Diagnostics | Command palette | Force-refresh squiggles for the active file |
Find Usages, Go to Declaration & Go to Symbol
Standard+. The same LSP server that delivers review diagnostics also backs three standard LSP requests — textDocument/definition, textDocument/references, and textDocument/documentSymbol — so every LSP-compatible editor gets native UI for free. No extension update is required to use them.
| Feature | VS Code | JetBrains | Neovim |
|---|---|---|---|
| Go to Declaration | F12 | Ctrl+B / Cmd+B | gd (via nvim-lspconfig) |
| Find All References | Shift+F12 | Alt+F7 | gr |
| Go to Symbol in File | Ctrl+Shift+O | Ctrl+F12 | :lua vim.lsp.buf.document_symbol() |
Behind this, a dedicated indexer Docker container — separate from app, sidekiq, and lsp — parses every changed file with tree-sitter on each push and writes a symbol index to Postgres. Only files touched by the new commit(s) are re-parsed, so browsing stays fast without a full-repo re-index on every push.
Supported languages: JavaScript, TypeScript/TSX, Ruby, Python, Go, Java, Kotlin, PHP. Files in any other language are simply skipped — everything else continues to work normally.
render can return more than one declaration. Dynamic dispatch (e.g. Ruby's .send) is not tracked.The indexer container runs in isolation on purpose: a parsing failure there never affects review creation, comments, or notifications, and its memory/CPU limits (INDEXER_MEM_LIMIT, INDEXER_CPUS) are configured independently so a large indexing backlog can't starve the rest of the stack. See Settings for the full environment variable reference.
New commits are indexed automatically. If a repository was added before this feature existed, or results look stale, trigger a full rebuild from the repository's Edit page → Rebuild symbol index (admin only).
This same index also powers Ctrl+click (declaration) and Alt+click (Find Usages) directly in the web Repository Browser — no editor required.
Port and firewall
The LSP server uses raw TCP on port 7777 — not HTTP. Open it in your server's firewall:
# UFW (Ubuntu / Debian)
ufw allow 7777/tcp
# firewalld (RHEL / CentOS / Fedora)
firewall-cmd --add-port=7777/tcp --permanent
firewall-cmd --reload
The bundled nginx container (see Domain & HTTPS) already proxies this TCP connection with no configuration needed. If you're running your own reverse proxy instead, nginx's stream module can do the same — see the nginx.conf.example in the repository root for the stream {} block, which must be added to /etc/nginx/nginx.conf at the top level (not inside http {}).
${LSP_PORT:-7777}:7777). You only need to open it in the host firewall so external connections from developer machines can reach it.JetBrains (IntelliJ IDEA, PyCharm, WebStorm, GoLand, Rider)
The Codeveira JetBrains plugin is available for download. It connects to the same global LSP server on TCP port 7777 using IntelliJ's built-in LSP client (requires IntelliJ 2024.2+).
Install the plugin
- Download
codeveira-jetbrains-1.0.1.zipfrom the Download page. - In your IDE go to Settings → Plugins → ⚙ → Install Plugin from Disk…
- Select the downloaded
.zipfile and click OK. - Restart the IDE when prompted.
Configure credentials
Go to Settings → Tools → Codeveira and fill in:
| Field | Value |
|---|---|
| Codeveira URL | Your Codeveira instance URL, e.g. https://codereview.company.com |
| API Token | Your personal API token (Settings → API token in the web UI) |
| Repository ID | Numeric ID of the repository (visible in the URL: /repositories/3) |
| LSP Server Host | Hostname of the server running the LSP container (same host as Codeveira, or leave blank for localhost) |
| LSP Server Port | 7777 (default) |
Using the plugin
Open any file in the project — the LSP connection is made lazily on first file open. Diagnostics appear as squiggles within a few seconds.
| Action | How | Description |
|---|---|---|
| Hover comment | Mouse over squiggle | Shows author, date, AI suggestion hint |
| Quick Fix | Alt+Enter on squiggle | Resolve comment or apply AI suggestion |
| CR tool window | Right panel → Codeveira | Lists open reviews; right-click to approve / reject / close |
| Add comment | Editor right-click → Codeveira → Add Comment | Add inline comment on current line |
| Refresh diagnostics | Editor right-click → Codeveira → Refresh Diagnostics | Force-pull latest comments from server |
Neovim
Neovim supports LSP natively via nvim-lspconfig. Copy extensions/neovim/codeveira.lua from the repository (or the snippet below) to your Neovim config and call setup():
-- init.lua (or after/plugin/codeveira.lua)
require('codeveira').setup({
host = 'codereview.company.com',
port = 7777,
token = 'YOUR_API_TOKEN',
repository_id = '3',
})
The plugin auto-detects nc, ncat, or socat for the TCP connection (install any one of them). Default keymaps on attach:
| Key | Action |
|---|---|
K | Hover — show full comment (author, date, AI suggestion hint) |
<leader>ca | Code action — resolve comment or apply AI suggestion |
<leader>cd | Open diagnostics float for current line |
<leader>cr | Refresh diagnostics for current buffer |
Diagnostics appear via vim.diagnostic. Use :lua vim.diagnostic.open_float() at any time to read the full comment text.