Skip to content

About

Salesforce development plugin for JetBrains IDEs — an Illuminated Cloud 2 alternative built on the sf CLI and Salesforce language servers

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

SF Cloud

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.

Install

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.

Updating to a new version

Download the new zip and repeat steps 3 and 4. The old version is replaced automatically.

Something went wrong?

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

Features

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.

Language servers

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.

Shortcuts

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

Development

Build the plugin from source

git clone https://github.com/Extrik808/sf-cloud-plugin.git
cd sf-cloud-plugin
./gradlew buildPlugin

The 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

Tasks

./gradlew test          # lexer, PSI, run configuration, CLI output parsing
./gradlew verifyPlugin  # JetBrains Plugin Verifier against the local IDE
./gradlew runIde        # sandbox IDE with the plugin

Feature gaps against Illuminated Cloud 2 are tracked in docs/ic2-gap-analysis.md.

Layout

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

About

Salesforce development plugin for JetBrains IDEs — an Illuminated Cloud 2 alternative built on the sf CLI and Salesforce language servers

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages