Skip to content

Code navigation

nittle can talk to a language server for the languages in your diff. It is optional. With no server installed everything else works the same, and nothing prints an error.

Servers start lazily. Opening a review starts nothing. A server for a language starts the first time something asks it a question, and only for languages that appear in the diff. Servers stay warm for the rest of the run and shut down when nittle exits. A normal review keeps running until you press ctrl+c or run nittle cleanup, and closing the last browser tab does not end it. With --wait, closing the last tab ends the process, and so do its other exit paths.

Pass --no-lsp to start none at all. The flag works on the default command and on nittle show.

Terminal window
nittle --no-lsp
nittle show HEAD~2 --no-lsp

Language servers are programs you install yourself. nittle runs the binary it finds on your PATH, with your user rights, in the repository root, and talks to it over stdio. It never downloads one for you, and nothing listens beyond nittle’s existing localhost server. Treat a language server like any other tool you run in a checkout: only install ones you trust.

nittle does not write into your checkout. Server logs and caches go to a temp directory that is removed on exit. For C#, nittle asks the Roslyn server not to run automatic restore, which would otherwise create obj/ folders.

Language Extensions Server (first found on PATH wins) Install
TypeScript / JavaScript ts, tsx, mts, cts, js, jsx, mjs, cjs typescript-language-server --stdio npm install -g typescript-language-server typescript
C# cs roslyn-language-server, then csharp-ls dotnet tool install -g roslyn-language-server --prerelease or dotnet tool install -g csharp-ls

The TypeScript server needs a typescript package it can resolve, either in the project’s node_modules or installed globally next to the server. TypeScript 7 (the native port) has no tsserver.js, so use TypeScript 5.x with this server.

GET /api/lsp/status reports a state for each language in the diff. Asking for status never starts a server.

  • missing: no server found on PATH. The response includes an install hint.
  • idle: installed, not started yet.
  • starting: launched, finishing the initialize handshake.
  • indexing: the server reports progress while it loads the project.
  • ready: answering requests.
  • failed: crashed twice (a crashed server is restarted once). The last stderr output is included.

Under --no-lsp the response is { "enabled": false, "languages": [] }.

Language servers read your checkout from disk. For a branch, range or commit review, answers that point into other files can reflect the checked-out files instead of the reviewed revision. The old side of a diff can’t be navigated at all. Both limits stay until nittle can serve those revisions from a detached worktree (tracked in issue 186), and it will never switch your checkout to do it.

The server side for go-to-definition, hover and references is in. The review UI doesn’t use it yet, so there are no keys to press. They land in a later release, and this page will list them when they do.