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)
Each developer authenticates with their own personal API token — sent from VS Code to the LSP server immediately after connection. The token is never shared between connections.
1

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.

2

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…

The extension requires VS Code 1.85 or later and the vsce / @vscode/vsce tool for packaging. Install it once with npm install -g @vscode/vsce.
3

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
}
SettingRequiredDescription
codeveira.urlYesPublic URL of your Codeveira instance
codeveira.apiTokenYesYour personal API token (see below)
codeveira.repositoryIdYesNumeric ID of the repository for this workspace
codeveira.lspHostRecommendedHostname of the global LSP server. When set, connects via TCP. When empty, spawns a local server.js (dev mode).
codeveira.lspPortOptionalTCP port of the LSP server. Default: 7777
codeveira.pollIntervalSecondsOptionalBackground 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.

4

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.

PrefixLSP severitySquiggle colourMeaning
🔴Error (1)RedCritical issue — must fix
🟡Warning (2)Yellow / orangeShould be addressed
🔵Info (3)BlueSuggestion or note
(none)Info (3)BlueGeneral 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:

"Apply AI suggestion" replaces the entire flagged line. Review the suggestion carefully before accepting — it is generated by an AI and may not be correct in all contexts.

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

CommandShortcut / locationDescription
Refresh ReviewsSidebar toolbarReload the CR list
Create Code ReviewSidebar toolbar (+ icon)Pick commits from a list, enter title and description, create CR
Open Review in BrowserRight-click on a CROpen the full review in Codeveira web UI
Approve ReviewRight-click on a CRApprove (you must be an assigned reviewer)
Reject ReviewRight-click on a CRRequest changes
Close ReviewRight-click on a CRClose (author or admin only)
Reopen ReviewRight-click on a CRReopen a closed review
Add CommentCtrl+Alt+C / editor right-clickAdd an inline comment on the current cursor line
Refresh DiagnosticsCommand paletteForce-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.

FeatureVS CodeJetBrainsNeovim
Go to DeclarationF12Ctrl+B / Cmd+Bgd (via nvim-lspconfig)
Find All ReferencesShift+F12Alt+F7gr
Go to Symbol in FileCtrl+Shift+OCtrl+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.

This is a syntactic index (tree-sitter), not a full semantic engine — it matches symbols by name within a repository/branch rather than resolved type. A common name like 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 {}).

Port 7777 is already mapped by Docker Compose (${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

  1. Download codeveira-jetbrains-1.0.1.zip from the Download page.
  2. In your IDE go to Settings → Plugins → ⚙ → Install Plugin from Disk…
  3. Select the downloaded .zip file and click OK.
  4. Restart the IDE when prompted.

Configure credentials

Go to Settings → Tools → Codeveira and fill in:

FieldValue
Codeveira URLYour Codeveira instance URL, e.g. https://codereview.company.com
API TokenYour personal API token (Settings → API token in the web UI)
Repository IDNumeric ID of the repository (visible in the URL: /repositories/3)
LSP Server HostHostname of the server running the LSP container (same host as Codeveira, or leave blank for localhost)
LSP Server Port7777 (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.

ActionHowDescription
Hover commentMouse over squiggleShows author, date, AI suggestion hint
Quick FixAlt+Enter on squiggleResolve comment or apply AI suggestion
CR tool windowRight panel → CodeveiraLists open reviews; right-click to approve / reject / close
Add commentEditor right-click → Codeveira → Add CommentAdd inline comment on current line
Refresh diagnosticsEditor right-click → Codeveira → Refresh DiagnosticsForce-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:

KeyAction
KHover — show full comment (author, date, AI suggestion hint)
<leader>caCode action — resolve comment or apply AI suggestion
<leader>cdOpen diagnostics float for current line
<leader>crRefresh diagnostics for current buffer

Diagnostics appear via vim.diagnostic. Use :lua vim.diagnostic.open_float() at any time to read the full comment text.