Salesforce development plugin for WebStorm and other JetBrains IDEs (2026.1+). It wraps the Salesforce CLI (sf) and Salesforce's own language servers, and adds the IDE UI on top.
Takes about two minutes. You need WebStorm (or another JetBrains IDE) 2026.1 or newer and the Salesforce CLI (sf).
1. Download the plugin file
Open Releases → v0.1.0 and under Assets click sf-cloud-plugin-0.1.0.zip. Keep it as a zip — do not unpack it.
2. Turn off Illuminated Cloud 2 — skip this step if you never installed it
Settings (Cmd+, on macOS, Ctrl+Alt+S on Windows/Linux) → Plugins → Installed tab → find Illuminated Cloud 2 → untick it. The two plugins cannot work at the same time.
3. Install the zip
Still in Settings → Plugins, click the ⚙ gear at the top → Install Plugin from Disk… → choose the downloaded sf-cloud-plugin-0.1.0.zip → OK.
4. Restart the IDE
Click Restart IDE when it asks.
5. Pick your org
Open your Salesforce project. In the bottom-right corner of the window (status bar) click the connection widget and choose an org. That's it — the first time, SF Cloud downloads the Apex language server and builds the Apex/SObject index for completion by itself; this takes a minute or two.
Download the new zip and repeat steps 3 and 4. The old version is replaced automatically.
| Problem | Fix |
|---|---|
| "Plugin is incompatible" on install | The IDE is older than 2026.1 — update it (Help → Check for Updates) |
.cls files open with the wrong highlighting |
Illuminated Cloud 2 is still enabled — do step 2 and restart |
| No orgs in the status bar widget | The Salesforce CLI is not found — install sf, or set its path in Settings → Tools → SF Cloud |
No completion for Account., String. and so on |
Run Tools → SF Cloud → Generate Offline Symbol Table once the org is selected |
| LWC completion does not start | Node.js and npm are missing — they are needed only for the LWC language server |
The UI follows Illuminated Cloud 2: the same tool windows, toolbars, dialogs, menu entries and shortcuts, drawn with SF Cloud's own icons.
| Area | What you get |
|---|---|
| Connections | Status bar connection widget (type icon, name, speed-search popup with Project / Recent / Global Connections and a per-connection submenu), connection combo in every tool window and dialog, OAuth authorization dialog, Create Scratch Org dialog (Dev Hub, alias suggested from the branch ticket, definition file from config/, duration, no namespace / no ancestors, PlatformCLI signup app for Dev Hubs authorized through an External Client App; after creation: use as project connection, push source, assign permission sets, generate a password, open in the browser) and Delete Scratch Org; scratch orgs show their expiration date in the popup |
| Apex language | .cls / .trigger / .apex file types, highlighting with inline SOQL, commenting, brace matching, color settings; Structure view and File Structure popup, previous/next method navigation |
| Apex completion | Completion from the Apex language server merged with SF Cloud's own index, without duplicates: locals, class members and inherited members, project classes, SObjects and their fields (offline symbol table plus local objects/ metadata, so undeployed custom fields show up too), System types and keywords. Where the server does not run — the Anonymous Apex tool window, a stopped or missing server — SF Cloud's index completes alone. Inside inline [ ... ] SOQL, SOQL completion takes over and :bind variables complete to Apex locals |
| Apex hints | Quick Documentation (Ctrl+Q, hover) shows the owner type, the full declaration, the /** */ comment and whether the symbol comes from the project or the offline symbol table; Parameter Info (Cmd+P / Ctrl+P) lists every overload and highlights the current argument. Both come from the offline index wherever the Apex language server does not serve the file |
| Offline symbol table | Tools | SF Cloud | Generate Offline Symbol Table builds Apex stubs for the whole system library (Tooling API completions?type=apex) and every SObject of the project org (describe in composite batches) into the IDE system directory, and attaches them as the Salesforce Offline Symbol Table external library. SF Cloud's resolver and completion then know the members of String, Database.SaveResult, Schema.DescribeFieldResult, enums, Trigger and SObject fields and relationships, including chains like account.Owner.Name. The table is generated automatically the first time a project opens with an org that has none; regenerate it after schema changes |
| Apex navigation and usages | Works without the language server: go to declaration for types, members, inherited members, inner types and members reached through a local variable or field type; Find Usages (Alt+F7, Ctrl+Click on a declaration, Show Usages) across Apex code, SOQL bind variables, @salesforce/apex imports in LWC JavaScript and class names in metadata XML (flows, Aura, pages); usage counts above every declaration; Ctrl+Click on a @salesforce/apex/Class.method import jumps to the Apex method |
| LWC import navigation | import … from 'c/dateUtils' resolves to lwc/dateUtils/dateUtils.js in any package directory, so Ctrl+Click on the module string opens the file and Ctrl+Click on an imported function, constant or class — or on a method inherited from an imported base component — goes to its declaration. Ctrl+Click on a @salesforce/* import, or on the variable it binds (getRows(), LABEL), goes to the Apex method, the <fullName> of the custom label, the object or field (following __r relationships), the static resource file, the message channel or the custom permission |
| Bundle file tabs | Tabs below the editor for the files of an LWC or Aura bundle and for a source file and its -meta.xml, as in Illuminated Cloud 2. The bundle lives in a single editor tab: picking a tab swaps the shown file inside it, leaving the editor tab row untouched; turn the tabs off in Settings | Languages & Frameworks | SF Cloud | UI Frameworks |
| LWC editing | Template completion for c-* components of the project, lightning-* base components, LWC directives (lwc:if, for:each, key, …), @api attributes of the component under the caret and {member} expressions from the bundle's JavaScript; lwc:*, for:*, if:* and component tags stop being reported as unknown HTML; c/* imports complete to every component and service module of the project, and @salesforce/* imports complete to Apex classes and @AuraEnabled methods, labels, static resources, content assets, message channels, and objects, fields and relationship paths from the offline symbol table and local metadata (an import of an object that exists only in the org jumps to its offline stub) |
| Live templates | Apex abbreviations in the SF Cloud Apex group — sd → System.debug('');, sdv, sde, soql, sosl, fore, forq, fori, ife, ifn, ifnn, tryc, list, set, map, mapq, psv, prop, aem, tm, tc, ae, tss, runas, mock, sav, dbi, dbu, ade — and LWC abbreviations in SF Cloud LWC, active only inside an lwc bundle: sd → console.log('');, apex, wire, wirem, api, track, label, toast, event, call for JavaScript and lif, lfor, card, btn, input, spinner for the markup. Edit them in Settings | Editor | Live Templates |
| New Salesforce files | New | Salesforce in the project view creates Apex Class, Apex Test Class, Apex Trigger (SObject + event checkboxes), Lightning Web Component (optional stylesheet, Jest test, App Builder targets), Aura Component (controller / helper / stylesheet), Visualforce Page and Visualforce Component — each with its -meta.xml, in the right folder of the package directory the selection belongs to, with the sourceApiVersion from sfdx-project.json |
| SOQL / SOSL files | .soql / .sosl file types with highlighting and completion: objects after FROM / RETURNING, fields and relationships of the queried object, relationship paths such as Owner.Profile.Name, child relationships in subqueries, SOSL RETURNING Account(…) field lists; the same completion works in the query tool windows and in inline Apex SOQL |
| Running code from the editor | A ▶ gutter icon on .apex, .soql and .sosl files and on every inline [SELECT …] / [FIND …] in Apex runs it in the matching tool window; Alt+Enter offers Execute query on an inline query or a query string literal (Database.query('SELECT …'), JavaScript strings) and Execute selection as anonymous Apex; the editor and project context menus run a selection from any file. FIND queries go to the SOSL window, and a query with Apex bind variables opens without executing |
| Apex language server | Completion, go to definition, hover, rename and code actions from Salesforce's Apex language server (apex-jorje-lsp.jar, BSD-3, downloaded from Open VSX on first use) |
| Language server lifecycle | Both servers install themselves on first use (switch it off with Install language servers automatically), a server that dies is reported with its last output instead of failing silently, and the LWC workspace is checked up front for the metadata XML its indexer refuses to parse |
| LWC language server | @salesforce/lwc-language-server, installed with npm on first use |
| Deploy / retrieve / delete | Select Deployment / Retrieval / Delete Scope dialog: connection, Project / Context / Custom scope, metadata tree with Local Only / Local + Server / Server Only colors and filters (new fields and other server-only components can be retrieved), cached org metadata with Update now, Retrieve for Merge opens every changed file in one diff editor tab — the org version on the left, the editable local file on the right — so changes are taken over chunk by chunk as in Illuminated Cloud 2; files with no local copy are written into the project and reported in a notification; check-only deploys, test levels, purge on delete. Force Save / Force Validate, Deploy Modified Metadata, Refresh Metadata, Compare With Server / Compare With…, Push / Pull, deploy on save (never to production), .forceignore actions |
| Problems | SF Cloud tool window with Problems for {connection} tabs, Failure / Transitive failure / Unexpected error groups, previous/next problem, inline deploy errors |
| Apex tests | Apex Unit Tests run configurations (All Tests, Changed Only, test class/method tree, connection, log levels), gutter run icons, standard test tree, per-test Apex logs, Debug Only and Show in Log Analyzer in the test console |
| Code coverage | Only Run with Coverage collects coverage; a plain Run or Debug neither collects it nor touches the last coverage result. When a coverage run finishes, the Code Coverage tool window opens by itself: covered and uncovered lines are highlighted in the editor, and the window lists every Apex class and trigger of the project with its percentage and covered/total lines, the org value for files the run did not touch, a project total and the org-wide figure; double-click opens the file. Until the first coverage run the window stays empty |
| Anonymous Apex / SOQL Query / SOSL Query | Tabbed documents with New / Close / Load / Save / Rename, connection combo, log levels (Anonymous Apex), results as a log (Raw / Tree) or as Table / Tree plus console, Export, Explain, Copy Results, Tooling API, Query All, query validation, Open in Salesforce; record Ids in the Table and Tree results are links that open the record in the query's org on a click |
| Log Analyzer | Opening the tool window turns on a 24-hour DEVELOPER_LOG trace flag for the connected user (renewed when less than an hour is left) and refreshes the log list; log list with server-side filter, log levels, Raw view (regex filter, Debug Only, highlighting, clickable stack traces and record Ids), Tree view with 12 views (profiling, database, cumulative usage, callers / callees analysis), Configure Logging dialog for debug levels and trace flags, external and pasted logs, Save Log(s), Delete / Delete All |
| Debug log files | Apex Debug Log file type with highlighting, execution tree in the Structure view, previous/next code unit navigation |
| AI Assistant | When the JetBrains AI Assistant plugin is installed, Apex, SOQL and SOSL join its Next Edit Suggestions language settings, so next-edit predictions work in Salesforce files |
| Settings | Languages & Frameworks | SF Cloud with Connections, Deployment, Salesforce DX, Apex and UI Frameworks tabs |
Write operations ask for confirmation when the target org is a production org.
On the first Apex file the Apex language server is downloaded, on the first LWC file the npm package is installed. Both are also under Tools | SF Cloud and in Settings | Languages & Frameworks | SF Cloud | Apex.
The LWC language server parses CustomLabels.labels-meta.xml and the staticresources, contentassets and messageChannels -meta.xml files as strict XML and exits when one of them is malformed (an unescaped &, for example). SF Cloud checks those files when it starts the server and names the offending file; SF Cloud's own LWC completion keeps working either way.
| Action | Shortcut |
|---|---|
| Execute Anonymous Apex (tool window) | Shift+Ctrl+Alt+A |
| Execute SOQL Query (tool window) | Shift+Ctrl+Alt+Q |
| Execute SOSL Query (tool window) | Shift+Ctrl+Alt+X |
| View Salesforce Logs | Shift+Ctrl+Alt+Z |
| Force Save | Shift+Ctrl+Alt+F12 |
| Deploy Modified Metadata… | Shift+Ctrl+Alt+F9 |
| Deploy All Metadata… | Shift+Ctrl+Alt+F10 |
| Retrieve Metadata… | Shift+Ctrl+Alt+Y |
| Refresh Metadata… | Shift+Ctrl+Alt+R |
| Compare With Server / Compare With… | Shift+Ctrl+Alt+= / Shift+Ctrl+Alt+- |
| Delete Metadata… | Shift+Ctrl+Alt+D |
| Open Connection | Shift+Ctrl+Alt+O |
| Configure Project… | Shift+Ctrl+Alt+, |
| Execute in a query tool window | Alt+X, Cmd/Ctrl+Enter |
| New Tab / Close Tab / Load / Save / Rename | Alt+Insert / Ctrl+Shift+F4 / Alt+L / Alt+S / Alt+R |
git clone https://github.com/Extrik808/sf-cloud-plugin.git
cd sf-cloud-plugin
./gradlew buildPluginThe zip lands in build/distributions/sf-cloud-plugin-<version>.zip; install it as in step 3 of Install.
Before the first build, adjust gradle.properties to your machine:
| Property | Points at |
|---|---|
platformPath |
The IDE install the plugin compiles against, e.g. /Applications/WebStorm.app or /Applications/IntelliJ IDEA.app |
org.gradle.java.home, org.gradle.java.installations.paths |
The JetBrains Runtime bundled with that IDE: <platformPath>/Contents/jbr/Contents/Home on macOS |
aiAssistantPath (optional) |
The AI Assistant plugin directory; defaults to ~/Library/Application Support/JetBrains/WebStorm2026.1/plugins/ml-llm |
./gradlew test # lexer, PSI, run configuration, CLI output parsing
./gradlew verifyPlugin # JetBrains Plugin Verifier against the local IDE
./gradlew runIde # sandbox IDE with the pluginFeature gaps against Illuminated Cloud 2 are tracked in docs/ic2-gap-analysis.md.
| Package | Responsibility |
|---|---|
api |
REST and SOAP client on top of sf org display sessions, anonymous Apex over the Apex SOAP API |
core |
sf process runner and JSON helpers, sfdx project model, notifications |
settings |
Application, project and tool window settings, settings page |
org |
Org list, connection combo and status bar widget, org actions |
lang |
Apex, SOQL and SOSL languages, lexer, highlighting, structure view, reference resolution and usage search |
editor |
Bundle file tabs below the editor |
lsp |
Apex and LWC language server integration and installers |
metadata |
Org metadata listing and cache, scope dialog, retrieve / deploy / delete / compare operations and actions |
deploy |
Deploy service, deploy on save, inline problems, Problems tool window |
tests |
Apex Unit Tests run configuration, runner, locator, gutter icons, coverage |
log |
Debug log parser, language, Log Analyzer tool window, log levels, trace flags and debug levels |
repl |
Anonymous Apex, SOQL Query and SOSL Query tool windows |
ui |
Shared tool window, toolbar and notification helpers |