Docs/Editors

Editors

Connect Nimbus to VS Code, JetBrains, or any editor that speaks LSP and DAP.

Commands

nimbus dev

Launch the interactive Dev UI in your default browser. Provides a visual interface for running tests, viewing coverage, exploring schema, and inspecting traces.

bash
nimbus dev           # Launch Dev UI on default port
nimbus dev --port 9000  # Launch on custom port

nimbus lsp

Start the Nimbus Language Server on stdio. Any editor that speaks LSP — VSCode, JetBrains IDEs, Neovim, Zed, Helix, Emacs — can launch this command to get Apex completion, hover, go-to-definition, inline coverage hints, mutation-score annotations, and live SOQL-column validation, all backed by the same parser, schema cache, and test data that powers nimbus test.

See the Language Server section for per-editor setup and a full capability list. This page covers only the CLI entry point.

bash
nimbus lsp                           # Start on stdio (what editors launch)
nimbus lsp --log /tmp/nimbus-lsp.log # Write a protocol trace to a file
nimbus lsp --stdio                   # Accepted for client compatibility (stdio is the default)
FlagDefaultDescription
--log-Write LSP protocol trace to this file. stderr-safe — stdout is reserved for JSON-RPC.
--stdiofalseAccepted for compatibility with clients that inject this flag. No-op; stdio is the only transport.

The server reads JSON-RPC 2.0 messages with Content-Length framing from stdin and writes responses to stdout. Never invoke this directly in an interactive shell — there is no TUI, just protocol bytes.

nimbus dap

Start a Debug Adapter Protocol server on stdio. Any editor that speaks DAP — VSCode, Neovim DAP, IntelliJ DAP — can launch this command to step through Apex tests with real breakpoints, a call stack view, and expandable local-variable inspection.

bash
nimbus dap   # Editors launch this; don't run in a shell

Supported DAP requests: initialize, launch, setBreakpoints, configurationDone, threads, stackTrace, scopes, variables, continue, next, stepIn, stepOut, stepBack, reverseContinue, disconnect, terminate. Emits initialized, stopped, thread, output, and terminated events.

Launch arguments (set in .vscode/launch.json or equivalent):

FlagDefaultDescription
program-Test pattern, e.g. "CalculatorTest.addsPositive" or "*Test" (live mode)
projectPathCWDProject root containing sfdx-project.json
orgAliasdefaultSalesforce org alias
stopOnEntryfalsePause at the first statement of the program
modelaunchSession kind: "launch" runs the test live; "replay" steps a recorded trace
traceFile-Path to a trace.jsonl (or its run dir); implies replay mode. Omit to use the newest trace

Trace replay (time-travel)

Replay mode steps through a recorded test run instead of executing anything. Record once with tracing on, then scrub through the captured execution — forwards and backwards — with the same breakpoints, call stack, and variable panels as a live session. Because nothing re-runs, a replay session is instant and perfectly deterministic.

First, record a trace at verbose (or higher) so statement-level steps are captured:

bash
nimbus test "CalculatorTest.*" --trace --trace-level verbose

Then point a DAP launch config at it:

bash
{
  "type": "nimbus",
  "request": "launch",
  "name": "Replay last trace",
  "mode": "replay",
  "traceFile": ".nimbus/traces/2026-07-03T02-11-09_da70fda6/trace.jsonl"
}

In replay mode the debugger advertises supportsStepBack, so stepBack and reverseContinue walk the timeline in reverse; breakpoints stop the cursor at the next matchingfile:line. next, stepIn, and stepOut each advance one recorded step (the trace is line-granular). Variable values come straight from the trace, so fidelity depends on the level you recorded at — verbose captures locals; a trace recorded below verbose has no steppable events and replay returns a clear error asking you to re-record.

Language Server (LSP)

Overview

Nimbus ships an LSP 3.17 server for Apex. Any editor that speaks the Language Server Protocol — VSCode, JetBrains IDEs, Neovim, Zed, Helix, Emacs — gets the same experience: schema-aware completion, hover documentation, go-to-definition, live SOQL column validation, per-line coverage hints, mutation score annotations, and code lenses that let you run or debug any @IsTest method inline.

Unlike Salesforce's stock Apex Language Server, which makes network round-trips to an org for metadata, Nimbus's LSP runs fully offline against the local .nimbus/schemas/ cache and surfaces platform truth — coverage %, surviving mutants, test flakiness — from your last nimbus test run.

The server is a thin layer over the same parser, schema provider, and test-data infrastructure that powers the CLI. Reparsing a file takes a few milliseconds; diagnostics land before your hand leaves the keyboard.

bash
# Start the server (editors launch this for you)
nimbus lsp

# Debug: write every JSON-RPC message to a log
nimbus lsp --log /tmp/nimbus-lsp.log

Features

The server advertises these LSP capabilities at initialize. Exactly what shows up in your editor depends on the client — VSCode renders everything; leaner clients may render a subset.

Editing intelligence

CapabilityWhat you see
DiagnosticsRed squiggles on parse errors. Yellow squiggles on SOQL column typos ([SELECT Namee FROM Account]), including relationship fields (Owner.Namee) once the chain resolves to a synced object. Faded-text hints on dead code (methods with zero references and zero coverage). Source labels nimbus/parse, nimbus/soql, or nimbus/dead-code.
CompletionAfter a. where a is an Account: 71+ real fields from .nimbus/schemas/Account.json. Inside a SOQL literal: the target SObject's columns; relationship traversal — typing Owner. or Account.Parent. resolves the relationship chain and completes the related object's columns; child subqueries ((SELECT … FROM Contacts)) complete the child object's columns; and SOSL RETURNING Account(…) completes that object's fields. Also: stdlib (System.*, Test.*, Database.*, UserInfo.*, Limits.*, Assert.*), keywords, in-file classes, and 12 Apex snippets (test, debug, soql, trycatch, …) with Tab-through placeholders.
HoverMethod signatures with return types, SObject field metadata, class mutation scores, test flakiness rate.
Signature helpFloating parameter tooltip while typing a method call. Active parameter bolded, comma-counted even through generics like List<Map<String, Object>>.
Semantic tokensTheme-aware highlighting: annotations, keywords, stdlib namespaces, types, numbers, comments, strings. Custom required modifier reserved for <required>true</required> fields.
Document formattingConservative opinionated formatter: normalises indentation (4 spaces), trims trailing whitespace, collapses 3+ blank lines to 2. Preserves strings, SOQL, and comments verbatim. Idempotent on clean input.

Navigation & refactoring

CapabilityWhat you see
Go-to-definitionJumps from any identifier to its declaration. Cross-file lookup across force-app/, src/, and stubs/.
Type definitionJumps from a variable reference to the .cls of its declared type (Account aAccount.cls).
ImplementationFrom an interface or base class name, returns every class that extends/implements it across the workspace.
Find all referencesWorkspace-wide caller lookup for any symbol. Powered by a reference index rebuilt incrementally on every keystroke.
RenameWorkspace-wide rename applied as a single atomic WorkspaceEdit. Keyword guard prevents renaming to reserved words.
Workspace symbol searchCmd+T finds any class, method, field, or enum across the repo. Ranks exact match → prefix → substring, capped at 500 results.
Document symbolsFull outline tree: classes → methods, fields, properties, inner classes, enums. Powers the editor's sidebar outline and sticky scroll.
Document highlightSame-symbol highlighting of every occurrence of the identifier under the cursor.
Folding rangesBrace-based code folds for classes, methods, and block comments.
Selection rangesExpand-selection (Ctrl+W in JetBrains, Shift+Alt+→ in VSCode): word → line → file.
Call hierarchyMethod-level caller tree. Incoming and outgoing calls resolved through the workspace symbol index.

Code actions (quick fixes and refactors)

ActionWhere it shows
SOQL column auto-fixYellow bulb next to an unknown-field diagnostic — offers up to 3 Levenshtein-ranked candidates. Fix: 'Namee' → 'Name'.
Run nimbus syncOffered as the fix for an unknown-sobject diagnostic.
Generate test stubOn any non-test method: scaffolds ClassNameTest.test_method() with schema-aware constructor calls (new Account(Name='Test') from the real required-fields set).
Extract to @TestSetupOn insert statements inside a test method.
Add @IsTest annotationOn classes whose name ends in Test but lack the annotation.
Generate constructorOn a class declaration line: emits a constructor assigning every uninitialised instance field from a like-named parameter.
Generate getters and settersOn a class declaration line: accessor methods for the instance fields that lack them (skips existing accessors and final-field setters).
Implement interface methodsOn a class declaration line with an implements clause: stubs every not-yet-implemented method. Resolves interfaces same-file, workspace-wide, and for common system interfaces (Queueable, Schedulable, Comparable, Database.Batchable).
Override superclass methodsOn a class declaration line with an extends clause: override stubs for the superclass's virtual/abstract methods not yet overridden (virtual delegates to super.x(), abstract gets a TODO).

Platform-data overlays (Nimbus-exclusive)

CapabilityWhat you see
Inlay hintsGhost text next to each method: hit count from coverage (, not covered), surviving mutant descriptions (☠ survived: Shifted loop bound +1), flaky-test warnings (⚠ flaky (12%)), per-class mutation score.
Code lensesInline buttons above every class and method: ▶ Run test, ◉ Debug, 🪄 Coverage, ≡ View Trace on @IsTest methods; ▶ Run class, ⏱ Bench class on test classes; ☣ Mutate on production classes.
Dead code detectorHint-severity diagnostic on methods with zero workspace references and zero coverage hits. Skips global, virtual, abstract to avoid false positives on public APIs.

Still on the roadmap: inline values while debugging (blocked on LSP ↔ DAP co-hosting), coverage-filtered call hierarchy, extract- variable / inline-variable / inline-method refactors, and long- tail protocol polish (pull-model diagnostics, completion resolve, cross-workspace monikers). See LSP_ROADMAP.md in the source for the full plan.

VSCode

The Nimbus VSCode extension auto-starts the LSP when the extension activates on a Salesforce project. No extra configuration needed. Toggle it off with the nimbus.lsp.enabled setting if you want to fall back to Salesforce's stock Apex LSP.

json
// .vscode/settings.json
{
  "nimbus.lsp.enabled": true,      // default
  "nimbus.binaryPath": "nimbus"    // if 'nimbus' is not on PATH, point here
}

Check that the server is running: View → Output, pick Nimbus Apex Language Server from the dropdown. You should see JSON-RPC messages for each keystroke. The Nimbus LSP Trace channel has the protocol-level detail if you need to debug further.

Neovim

Neovim 0.11+ has native LSP support. Drop this into your config:

lua
-- ~/.config/nvim/init.lua (or any loaded file)
vim.lsp.config.nimbus = {
  cmd = { 'nimbus', 'lsp' },
  filetypes = { 'apex', 'apexcode' },
  root_markers = { 'sfdx-project.json' },
  -- Optional: write a protocol trace for debugging
  -- cmd = { 'nimbus', 'lsp', '--log', '/tmp/nimbus-lsp.log' },
}
vim.lsp.enable('nimbus')

-- .cls and .trigger don't have a built-in filetype; teach Neovim:
vim.filetype.add({
  extension = {
    cls = 'apex',
    trigger = 'apex',
  },
})

For older Neovim (0.8–0.10) using nvim-lspconfig:

lua
require('lspconfig.configs').nimbus = {
  default_config = {
    cmd = { 'nimbus', 'lsp' },
    filetypes = { 'apex' },
    root_dir = require('lspconfig.util').root_pattern('sfdx-project.json'),
    settings = {},
  },
}
require('lspconfig').nimbus.setup({})

Zed

Zed uses per-language server configuration in settings.json:

json
// ~/.config/zed/settings.json
{
  "lsp": {
    "nimbus": {
      "binary": { "path": "nimbus", "arguments": ["lsp"] }
    }
  },
  "languages": {
    "Apex": { "language_servers": ["nimbus"] }
  },
  "file_types": {
    "Apex": ["cls", "trigger"]
  }
}

Helix

Helix wires LSP via languages.toml:

toml
# ~/.config/helix/languages.toml
[language-server.nimbus-lsp]
command = "nimbus"
args = ["lsp"]

[[language]]
name = "apex"
scope = "source.apex"
file-types = ["cls", "trigger"]
roots = ["sfdx-project.json"]
language-servers = ["nimbus-lsp"]

JetBrains (IntelliJ, WebStorm, etc.)

The simplest path is the dedicated Nimbus JetBrains plugin — it wires up the language server, test running, debugging, coverage, and tool windows for you. Install Nimbus — Local Apex Runtime from the Marketplace and you’re done.

If you’d rather wire the language server by hand, JetBrains 2023.2+ supports generic LSP servers via the LSP4IJ plugin (or built-in LSP support in paid editions). After installing LSP4IJ:

  1. Settings → Languages & Frameworks → Language Servers → +
  2. Name: Nimbus Apex
  3. Command: nimbus lsp
  4. Mappings: file type *.cls and *.trigger

Code lenses, inlay hints, completion, and hover all render natively in the JetBrains UI. Go-to-definition uses the standard Cmd+B / Ctrl+B shortcut.

Emacs

With lsp-mode:

lisp
(use-package lsp-mode
  :hook ((apex-mode . lsp)))

(with-eval-after-load 'lsp-mode
  (lsp-register-client
    (make-lsp-client :new-connection (lsp-stdio-connection '("nimbus" "lsp"))
                     :major-modes '(apex-mode)
                     :server-id 'nimbus-lsp)))

With eglot (built-in since Emacs 29):

lisp
(with-eval-after-load 'eglot
  (add-to-list 'eglot-server-programs
               '(apex-mode . ("nimbus" "lsp"))))

Troubleshooting

The server fails to start

  • Run nimbus --version in a terminal to confirm the binary is on PATH.
  • Start the server manually: nimbus lsp --log /tmp/nimbus-lsp.log. Type a few characters and hit Ctrl+C. The log should show JSON-RPC messages; if the file is empty, the binary isn't being found by the editor.

Diagnostics don't appear

  • Check the editor's LSP status — most editors surface a connection indicator. In VSCode, View → Output → Nimbus Apex Language Server.
  • Verify the file extension is mapped to apex language. Neovim in particular doesn't auto-detect .cls.

Completion is empty after `a.`

  • The LSP needs the variable's declared type. If a is declared in a different file, cross-file type resolution isn't wired yet — declare it locally, or use the fully-qualified class name: Account.Name instead ofa.Name.
  • Custom SObjects appear after running nimbus sync once to populate .nimbus/schemas/.

Coverage / mutation inlay hints don't show

  • Inlay hints require a recent nimbus test --coverage run so .nimbus/coverage/latest.json exists. Mutation hints need nimbus mutate to have populated .nimbus/mutations/latest.json.
  • Some editors hide inlay hints by default — check the "Editor: Inlay Hints" toggle in your settings.

The Salesforce LSP and Nimbus LSP are both running in VSCode

The Salesforce Apex extension and the Nimbus extension can coexist, but you'll get duplicate completion entries. Set nimbus.lsp.enabled: false to fall back to Salesforce's LSP, or disable the Salesforce Apex extension to use only Nimbus.

VSCode Extension

Overview

The Nimbus VSCode extension brings the full test runner into your editor — inline results, coverage gutters, a debugger, execution traces, governor limit tracking, and more. It communicates with the nimbus daemon over a local JSON-RPC connection, so test runs feel instant: no cold-start, no reloading metadata on every run.

The extension also auto-starts the Nimbus Language Server for editing intelligence — completion, hover, go-to-definition, SOQL column validation, and coverage inlay hints. The LSP is a sibling subsystem to the test runner, independent of the daemon socket. Toggle it with nimbus.lsp.enabled in settings.

The extension activates automatically when it detects a Salesforce project (sfdx-project.json, force-app/, or any .cls file). Check the status bar — a Nimbus indicator shows whether the daemon is connected. If it shows a slash through it, run Nimbus: Restart Daemon from the command palette and check the Nimbus output channel for details.

New install? Open Help → Welcome → Get Started with Nimbus for a seven-step walkthrough covering the test runner, watch mode, coverage, the dependency graph, and the sidebar views. Common actions — run tests in file, validate, execute anonymous, dependency graph — are also on the right-click menu in any Apex file, and the dependency graph has a dedicated hierarchy icon in the editor title bar.

The daemon requires a Pro license. Free-tier users can still run tests from the CLI with full coverage and governor limit support, but the live editor integration (inline results, trace viewer, history) requires Pro.

Running Tests

Inline buttons (CodeLens)

Every @isTest class shows action buttons directly above the code — no menus needed.

LocationActions
Class declarationRun All Tests, Validate
Each @isTest methodRun Test, Debug Test, View Trace
Non-test class declarationValidate
Non-test public methodRun, Debug

Test Explorer

Nimbus integrates with VSCode's native Test Explorer. Tests are discovered automatically when the daemon connects — no configuration needed. Run, debug, and filter tests from the standard VSCode testing UI.

Understanding results

After a test run:

  • A notification shows the pass/fail summary and total time
  • The Nimbus output channel shows results grouped by class and method
  • Inline pass/fail decorations appear on executed lines in the editor
  • The status bar shows live progress during the run (3/10 tests...)

Debugging

Nimbus supports the full VSCode debug protocol — breakpoints, stepping, variable inspection, call stack.

Debug a test method

  1. Open a test class
  2. Set breakpoints by clicking the gutter on any line
  3. Click Debug Test above an @isTest method
  4. Use the debug toolbar: Step Over (F10), Step In (F11), Step Out (Shift+F11), Continue (F5)
  5. Inspect locals in the Variables panel; view the call stack in Call Stack

Debug any public method

Not limited to tests. Click Debug above any public method in a non-test class. If the method has parameters, Nimbus prompts you to enter values before starting.

Launch configurations

You can also configure debug targets in .vscode/launch.json:

json
{
  "type": "nimbus-apex",
  "request": "launch",
  "name": "Debug My Test",
  "test": "MyTestClass.myTestMethod",
  "stopOnEntry": false
}

Coverage

Enable coverage collection by setting nimbus.coverage.enabled to true, or pass --coverage from the CLI. After a test run with coverage enabled:

Gutter icons

Colored icons appear in the editor gutter next to each line:

IconMeaning
Green circleLine was executed during the test
Red circleLine was not executed
Yellow circleBranch partially covered (e.g. only the true path of an if)

Toggle gutter icons with the nimbus.coverage.showGutterIcons setting.

Method coverage annotations

An inline annotation appears after each method signature:

apex
public static void processRecords(List<Account> accounts)  // 75% (3/4 lines)

Run Nimbus: Show Coverage from the command palette for the full coverage report in the output channel.

Trace Viewer Pro

The trace viewer shows a detailed execution trace for every method call, branch decision, and variable assignment during a test run. Click View Trace above any test method after running it, or run Nimbus: View Execution Trace from the command palette.

The trace viewer opens as a side panel with three tabs:

TabWhat it shows
Call TreeIndented tree of all method invocations. Each node shows name, duration, and pass/fail status. Click any node to inspect it.
TimelineHorizontal waterfall chart. Wider bars = slower methods. Useful for spotting bottlenecks at a glance.
LogFilterable list of all trace events with timestamps. Use the search box to filter by method name or event type.

Selecting any span in any tab updates the right sidebar with the captured local variables,System.debug() output, and span metadata (source file, line number, status).

Sidebar Views

Click the Nimbus icon in the activity bar to open the dedicated views.

Tools

A launcher at the top of the panel. One click opens the dependency graph, coverage, history trends, execute anonymous, or toggles watch mode — no command palette needed.

Test History

Shows past test runs sorted newest first. Each run shows a pass/fail icon and summary (e.g. 3/3 passed (250ms)). Expand any run to see results by class, then by method.

From the view title bar, Show History Trends opens a chart of pass rate over the last 30 days plus a flaky test table — tests that flip between pass and fail across runs.

Right-click any run and choose Compare With... to open a side-by-side diff of two runs. The diff highlights flipped tests, duration changes, and new or removed methods.

Governor Limits

Shows Salesforce governor limit consumption per test method, updated automatically after each run. Expand any method to see individual limits:

LimitColor coding
SOQL Queries, SOQL Query Rows, DML Statements, DML Rows, CPU Time, Heap Size, HTTP Callouts, Future Calls, Queueable Jobs, Email InvocationsGreen (<50%), Yellow (50–80%), Red (>80%)

Governor limit annotations also appear inline in the editor as CodeLens above each method. Toggle with the nimbus.governor.showCodeLens setting.

Schema Explorer

Browse the local PostgreSQL schema that Nimbus uses to store SObject data. Expand any table to see columns (name, type, constraints), outgoing foreign keys, and incoming references from other tables. Use the refresh button after importing new metadata.

Watch Mode Pro

Automatically re-run tests whenever Apex files change.

  1. Click the Watch: off button in the status bar, or run Nimbus: Toggle Watch Mode
  2. If your project has multiple package directories, choose All Packages or a specific package
  3. The status bar updates to show the active scope (e.g. Watch: force-app)
  4. Save any .cls or .trigger file — tests re-run automatically
  5. After each watch-triggered run the status bar briefly shows the result (Watch: all passed or Watch: 2 failed)
  6. Click the button again to disable

Diagnostics & Validation

Nimbus validates Apex syntax in real time and surfaces errors in the Problems panel (Cmd+Shift+M).

  • On save — when nimbus.validateOnSave is enabled (default: true), every .cls and .trigger file is checked automatically
  • Manual — run Nimbus: Validate Current File to check the active file
  • Quick fixes — some parse errors offer a lightbulb with suggested fixes (e.g. adding a missing semicolon)

Errors appear as red squiggles in the editor and as entries in the Problems panel.

Execute Anonymous & Run Any Method

Execute Anonymous Apex

Run arbitrary Apex without creating a class. Run Nimbus: Execute Anonymous Apexfrom the command palette. If text is selected, only the selection runs — otherwise the entire file runs. Output (including System.debug()) appears in theNimbus output channel.

Run any public method

Click Run above any public method in a non-test class. If the method has parameters, input boxes appear for each one with type hints. The return value and execution time appear as an inline annotation next to the method signature.

Auto-retrieve missing metadata

When tests fail due to missing SObjects, fields, or other metadata not in your local project, Nimbus detects what's missing and shows a warning notification. Choose:

OptionWhat happens
Fetch & Re-runRetrieves the missing metadata from your connected org and re-runs the failed tests
Show DetailsOpens the output channel with the missing items and the sf CLI commands to retrieve them manually
DismissIgnores for now

You can also trigger this manually with Nimbus: Fetch Missing Metadata & Re-run.

Commands

All commands are available from the command palette (Cmd+Shift+P) with the Nimbus: prefix.

CommandDescription
Run All TestsRun every @isTest class in the project
Run Tests in Current FileRun all tests in the active editor file
Run Test ClassRun all tests in a specific class by name
Run Test MethodRun a specific test method
Debug Test MethodStart a debug session for a test method
Cancel Test RunStop the currently running tests
Validate Current FileCheck Apex syntax, report errors to Problems panel
Execute Anonymous ApexRun selected or all Apex code in the active file
Show CoverageDisplay the full coverage report in the output channel
Toggle Watch ModeEnable or disable auto-run on file save
Show StatusShow daemon version, uptime, and database status
Restart DaemonRestart the background daemon process
View Execution TraceOpen the trace viewer for a test method
Show History TrendsOpen pass rate chart and flaky test table
Compare Test RunsDiff two historical runs side by side
Refresh SchemaReload the Schema Explorer
Fetch Missing Metadata & Re-runRetrieve missing metadata from the org and re-run failed tests

Settings

All settings are under the nimbus.* namespace in VSCode settings.

FlagDefaultDescription
nimbus.binaryPath"nimbus"Path to the nimbus CLI binary
nimbus.parallel4Number of parallel test workers
nimbus.lsp.enabledtrueRun the Nimbus Language Server for Apex editing (completion, hover, inlay hints, SOQL validation). Disable to fall back to Salesforce’s stock Apex LSP.
nimbus.coverage.enabledfalseCollect coverage data on test runs
nimbus.coverage.showGutterIconstrueShow green/red/yellow coverage icons in the editor gutter
nimbus.validateOnSavetrueValidate Apex syntax automatically on save
nimbus.autoRun.onOpenfalseAuto-run tests when a test file is opened
nimbus.autoRun.onSavefalseAuto-run tests when a test file is saved
nimbus.performance.showInlineTimingstrueShow method execution time annotations in the editor
nimbus.governor.showCodeLenstrueShow governor limit CodeLens above methods

JetBrains Plugin

Feature overview: Nimbus for JetBrains.

The Nimbus plugin brings the full local Apex runtime to IntelliJ IDEA and every other JetBrains IDE — both Community and the paid editions. It shares the same two engines as the VSCode extension: the nimbus lsp language server (completion, hover, navigation, rename, diagnostics, code lenses, inlay hints) and the nimbus daemon JSON-RPC server (test running, debugging, coverage, traces, history, schema, governor limits).

Editor intelligence is delivered through LSP4IJ, which the plugin pulls in automatically from the JetBrains Marketplace.

The plugin also bundles native Apex/SOQL live templates — type an abbreviation and press Tab to expand, then Tab through the placeholders. A few: sysdSystem.debug(), tm → an @IsTest method, tc → a test class, soqlf → a bulk-safe SOQL for-loop, bulkt → a 200-record test-data block, mapidMap<Id, SObject> from a list. The full set lives under Settings → Editor → Live Templates → Nimbus Apex.

Install

Install Nimbus — Local Apex Runtime from Settings → Plugins → Marketplace. The Marketplace resolves the LSP4IJ dependency for you. You also need the nimbus CLI on your PATH:

bash
curl -fsSL https://install.testnimbus.dev | sh

On first open of a Salesforce project the plugin starts the daemon and warms the language server. If the CLI isn’t found, set its location in Settings → Tools → Nimbus.

Running & Debugging

Code lenses appear above @IsTest classes and methods — Run, Debug, Coverage, Trace, Bench, and Mutate. Results stream live into the standard IntelliJ test runner tree, with inline ✔ passed / ✖ failed markers and timings on each test method, return values, and coverage gutter bars in the editor.

The debugger is a native IntelliJ debug session: set line breakpoints in.cls/.trigger files, then Debug a test — step over/into/out, inspect variables and the call stack, all driven by the local runtime (no org, no replay log).

Coverage delta. Run a coverage pass, then Set Coverage Baseline(Nimbus menu) to snapshot it. Toggle Coverage Delta overlays the change vs that baseline in the gutter — green for newly-covered lines, orange for regressions. The same overlay and commands ship in the VSCode extension.

You can also create a Nimbus Apex Test run configuration directly (Run → Edit Configurations) to run a glob pattern or an explicitClass.method list.

Tool Window

The Nimbus tool window (right dock) has six tabs:

  • Tests — every discovered @IsTest class → method; double-click to jump to source, or run/debug the selection from the toolbar.
  • Coverage — per-class line coverage from the last coverage-enabled run.
  • History — past runs → classes → methods, with a Trends chart and run comparison.
  • Schema — the local PostgreSQL tables, columns, and PK/FK relationships.
  • Releases — validation receipts and the deploy queue for nimbus release workflows.
  • Governor — per-method SOQL/DML usage vs. limits from the last run.

A graph button on the tool-window header opens the interactive dependency graph — also available from the Apex editor right-click menu and Nimbus → Show Dependency Graph.

Graph, trace, Trends, and run-diff visualizations open in embedded browser panels (JCEF), the same views shipped in the VSCode extension.

Settings

Settings live under Settings → Tools → Nimbus (stored per project).

FlagDefaultDescription
Nimbus binary path"nimbus"Path to the nimbus CLI binary
Parallel test workers4Number of parallel test workers
Run the Nimbus Language ServertrueCompletion, hover, inlay hints, diagnostics via nimbus lsp
Collect coverage on test runsfalseCollect coverage data on test runs
Show coverage gutter iconstrueShow covered/uncovered bars in the editor gutter
Validate Apex on savetrueValidate Apex syntax automatically on save
Show inline method timingstrueShow method execution annotations after runs
Show governor usage inlinetrueShow SOQL/DML usage after test runs
Run tests when a test file is openedfalseAuto-run on open
Run tests when a test file is savedfalseAuto-run on save