Coalesce Local UIRun Coalesce directly on your local repo. This extension opens the Coalesce UI in a VS Code tab, working on the pipeline files in your checkout instead of a cloud workspace — perfect when working with AI agents. WhyWhen an AI agent (Claude Code, Copilot, Cursor, …) edits your Coalesce nodes, it changes files on disk. With the Coalesce UI running against that same checkout, you see each change in the graph as it lands, and can review, tweak and run it, without pushing anything first. You, the agent and Git all work on one copy of the pipeline. Features
Requirements
Getting started
The rest of this page describes the details. The workspace must be initialisedThe local UI only starts in a folder that has a
and pressing the run button explains the same thing with a Run coa init
button, which opens a terminal in that folder ( ProfilesThe selected profile is recorded in the repo's
The sidebar shows:
The Coalesce Cloud settings come from The circles are radio buttons: click a row to select that profile, which
writes Safety rules the code follows:
Platform fields come from Snowflake OAuth
Sign-in saves the profile first, because Because How the tab finds the server
The extension reads that line — the URL carries the auth nonce in its fragment — and loads the URL into a webview itself. Which
|
| Value | Resolution order |
|---|---|
auto (default) |
the shim Desktop publishes while it is running, else coa from PATH, else the CLI inside an installed Desktop |
desktop |
Desktop's CLI, running or not — no separate CLI install needed |
path |
coa from PATH, and nothing else |
coalesceServe.coaPath overrides all of it.
auto reaches for the app only when there is no CLI at all, so installing
Desktop never displaces a coa you installed on purpose. It still prefers the
running-Desktop shim over PATH, because while the app is up its CLI build is
the one matching the UI being served.
Desktop only publishes ~/.coalesce/desktop/agent.json and its coa shim
while it is running — it deletes both on quit. So desktop does not use the
shim; it goes to the installed app and runs the CLI the way the app's own shim
does:
| macOS | Windows | |
|---|---|---|
| App | /Applications/Coalesce.app, ~/Applications/Coalesce.app |
%LOCALAPPDATA%\Programs\Coalesce, %PROGRAMFILES%\Coalesce |
| Node | Contents/MacOS/Coalesce |
Coalesce.exe |
| CLI | Contents/Resources/coa/coa.js |
resources\coa\coa.js |
The app is Electron, and Electron started with ELECTRON_RUN_AS_NODE=1 is a
plain Node — which is the trick that runs coa.js without a Node on PATH.
That matters: coa.js has a #!/usr/bin/env node shebang and the app ships no
node of its own, so the app's own binary is the only interpreter guaranteed to
be there. The extension therefore spawns two words rather than one, which is why
coa is resolved to a launcher (command + leading arguments + environment)
instead of a path.
Settings
| Setting | Default | Meaning |
|---|---|---|
coalesceServe.coaSource |
"auto" |
Which coa to run: auto, desktop (the copy inside Coalesce Desktop), or path. See above. |
coalesceServe.coaPath |
"" |
Path to coa. Overrides coaSource. Empty lets that setting choose. |
coalesceServe.port |
8082 |
Preferred port. If taken, the next free port up to +49 is used. |
coalesceServe.workspaceFolder |
"" |
Folder to serve. Empty picks the folder containing workspace.yml, else data.yml, else the first folder. |
coalesceServe.showStatusBarItem |
true |
Show a status bar item while the server runs. |
Commands
Coalesce: Open Local UI— start + show the tabCoalesce: Stop Local UI ServerCoalesce: Restart Local UI ServerCoalesce: Show Local UI Server LogCoalesce: New Profile…Coalesce: Reload ProfilesCoalesce: Initialise Workspace (coa init)Coalesce: Open ~/.coa/configCoalesce: Open workspace.yml
Select / edit / delete act on a sidebar row: selecting is the row click, edit and delete are inline buttons, so none of them are palette entries.
Notes and limits
- Uses activity-bar container id
coalesceServe, so it coexists with the separatecoalesce-vscode-extension(which claimscoalesce). - Coalesce Desktop installs its shim on launch, and the CLI behind it reports
version
0.0.0-ci. Run on its own it tries to downloadcoa-ui-0.0.0-ci.zip, gets an HTTP 404 and exits — socoa servebreaks once Desktop has been started. The app ships the matching UI next to its CLI entry point, so the extension setsCOALESCE_UI_PATHto that directory whenever it resolves to Desktop's CLI — by the shim or by the app. That override is also what makescoaSource: "desktop"work at all. If the app has no usable copy, the notification suggests quitting Coalesce Desktop and the log has the detail. - The extension builds its own webview rather than calling the built-in
simpleBrowser.show: it needs the panel'sonDidDisposeevent to know when to kill the server. - The UI is framed in a webview. That works because
coa servesends noX-Frame-Optionsand no CSPframe-ancestors. If a future CLI build adds either, the frame will go blank and you would needsimpleBrowser/external browser instead. asExternalUri+portMappingare used so the tab also works over Remote SSH / Codespaces; the#nonce=fragment is re-attached if the rewrite drops it.- If the server exits on its own, the tab is closed and the error is surfaced with a link to the log.
Windows
coainstalls ascoa.cmd. Node's shell-less spawn reachesCreateProcess, which appends.exebut never.cmd, and since Node 20.12 spawning a batch file without a shell throwsEINVALoutright — whileshell: truewould hand cmd.exe its arguments unescaped. So the extension walksPATHEXTitself and builds thecmd.exe /d /s /c "…"line with its own quoting, which carries a workspace path likeC:\R&D\my repothrough intact. A%in the path is the one thing cmd.exe cannot be stopped from expanding.- The server is stopped with
taskkill /T /F:SIGTERMdoes not reach the node process behind the.cmdshim, and there is a cmd.exe parent in the tree too. - The Desktop shim is looked for as
coa.cmd,coa.exe,coa.batorcoa, and paths are compared case-insensitively, so a hand-typedcoalesceServe.coaPathstill registers as the shim. ~/.coa/configandworkspace.ymlkeep whichever line ending they already have, so changing one key in a CRLF checkout is a one-line diff rather than a whole-file one. The atomic rename retries for a moment: on Windows it fails while a search indexer or virus scanner still holds the target open.- POSIX file modes are advisory there —
chmod 0600only clears the read-only bit — so%USERPROFILE%\.coais as protected as its NTFS ACL makes it and no more. coa initis handed to a terminal quoted for PowerShell, cmd.exe or a POSIX shell, whichevervscode.env.shellreports.
Development
No build step — it is plain JavaScript with no dependencies. To run a checkout instead of the Marketplace build, link the folder into the extensions directory:
# macOS / Linux
ln -s ~/GitHub/coalesce-local-vscode ~/.vscode/extensions/coalesce-local-vscode
# Windows — needs Developer Mode on, or an elevated prompt
New-Item -ItemType SymbolicLink `
-Path "$env:USERPROFILE\.vscode\extensions\coalesce-local-vscode" `
-Target "$env:USERPROFILE\GitHub\coalesce-local-vscode"
Then reload the window (Developer: Reload Window). For VS Code Insiders use
.vscode-insiders/extensions/.
To hack on it instead, open this folder in VS Code and press F5 for an
Extension Development Host.
Tests
npm test # ~/.coa/config and workspace.yml models, coa resolution, failure messages
npm run test:e2e # spawns a real `coa serve`, asserts the handshake and the kill
The suite runs on macOS, Linux and Windows. The Windows-only helpers (PATHEXT
resolution, cmd.exe quoting) are pure functions and are asserted on every host,
so a Mac catches a regression in them; the mode and case-sensitivity
assertions ask the host for its own answer.
Icons
The Coalesce mark in media/ is borrowed from
coalesce-vscode-extension
(MIT, Jesse Marshall):
| File | Source | Used for |
|---|---|---|
icon.svg |
media/icons/coalesce.svg |
activity bar (fill="currentColor", VS Code masks it) |
logo-light-theme.svg |
media/icons/coalesce-icon-dark.svg |
editor tab icon, light themes (#1B1B1F ink) |
logo-dark-theme.svg |
media/icons/coalesce-icon-light.svg |
editor tab icon, dark themes (white ink) |
icon.png |
media/icon.png |
extension gallery icon (256×256) |
Note the swap in the two tab icons: upstream names them after the ink colour,
VS Code's iconPath names them after the theme they are shown in.
License
MIT