ConnectMyApps Canvas for VS Code
Build, debug, and manage ConnectMyApps Canvas workflows locally using VS Code's full development environment. This extension provides a headless iPaaS experience — leveraging Canvas's cloud infrastructure while giving you local editing, debugging, diffing, and API testing tools.
Compatible with VS Code and forks such as Cursor and Kiro.
Features
- Download workflows and edit block code locally with full IntelliSense
- Debug workflows block-by-block or end-to-end in VS Code's debugger
- Push code and configuration changes back to Canvas
- Compare local code against Canvas using the native diff editor
- Test application connector APIs without managing workflows
- Load run results and webhook data from Canvas for local inspection
- Search across workflow data (outputs, logs, sessions)
- Scaffold AI coding assistant instructions for your preferred tool (Copilot, Cursor, Claude Code, etc.)
Prerequisites
Node.js 22.14.0 or higher is required for debugging and running block scripts.
node -v
If you need to install or upgrade, download the latest version from nodejs.org.
Installation
Install ConnectMyApps from the VS Code Marketplace:
- Open the Extensions view (
Ctrl+Shift+X)
- Search for "ConnectMyApps"
- Click Install
Alternatively, install from a .vsix file: Extensions menu > ... > "Install from VSIX".
Getting Started
- Log in — Open the command palette (
Ctrl+Shift+P) and run cma: Log In. Enter your Canvas consumer key and secret key. Credentials are stored securely in your OS keychain.
- Initialize workspace — Run
cma: Init Workspace. Choose a folder (recommended: inside your user home directory to avoid permission issues). This creates the workspace structure, config files, and package.json.
- Install dependencies — Open a terminal in your workspace root and run:
npm install
- Download a workflow — Run
cma: Get Workflow, select an account and workflow. Local files are created for all blocks.
- Debug — Open a block
.mjs file and press F5 to launch the VS Code debugger.
Workspace Structure
After initialization your workspace contains:
workspace/
blocks/ — Standalone blocks you create locally
workflows/ — Workflows downloaded from Canvas accounts
requests/ — REST API request/response files for app connectors
proxy_modules/ — Runtime modules that emulate Canvas functions locally (do not edit)
package.json — Dependencies managed by the extension
.workspace-config.json — Configuration (see below)
.gitignore — Pre-configured ignore patterns
The package.json includes managed dependencies required for local execution: @cma/prism, @cma/util, axios, date-fns, jose, underscore, utf8, uuid, and xml-js. You can add your own dependencies — the extension will never remove them.
Commands
All commands are prefixed with cma: in the command palette (Ctrl+Shift+P / Cmd+Shift+P).
Setup & Authentication
| Command |
Description |
cma: Init Workspace |
Creates or upgrades the workspace. Safe to re-run: updates proxy modules, config, and dependencies without overwriting your code. Prompts for AI agent tool setup on first run. |
cma: Log In |
Authenticates with Canvas using your consumer key and secret key. |
cma: Log Out |
Removes stored credentials from the OS keychain. Does not delete workspace files. |
cma: Set Port Number |
Sets the port for the local credentials bridge server. Run Init Workspace after changing. |
cma: Help |
Opens this README in a read-only editor. |
Workflows
| Command |
Description |
cma: Get Workflow |
Downloads a workflow from Canvas. Select account and workflow from a picker. |
cma: Get Workflow (This Account) |
Same as above but auto-detects the account from the current file's path. |
cma: Refresh Workflow |
Re-downloads the current workflow without account/workflow selection. Uses ID-based matching to handle renames. |
cma: Run Workflow |
Runs all or selected blocks in sequence locally. Right-click a manifest.json to access. |
cma: Cancel Workflow |
Stops the currently running local workflow execution. |
cma: Deploy Workflow |
Deploys an undeployed workflow to Canvas (requires isDeployed: false in manifest). |
cma: Clear Workflows |
Deletes all files from the workflows folder. |
Pushing Changes to Canvas
| Command |
Description |
cma: Push Block Code |
Pushes the current block's user code to Canvas. Only code within the user-code markers is sent. Mapper blocks are rejected. |
cma: Push Block Config |
Pushes block metadata (name, variables, input links) to Canvas without affecting code. |
cma: Push Workflow Code |
Pushes code for all or selected blocks in a workflow to Canvas in one operation. |
cma: Push Workflow Config |
Pushes workflow metadata (name, description, workflow-level variables) to Canvas. |
Comparing with Canvas
| Command |
Description |
cma: Compare Block with Canvas |
Opens a diff view comparing local block code against the Canvas version. |
cma: Compare Workflow with Canvas |
Compares all blocks in a workflow, shows a status summary, and can open all diffs at once. |
Blocks
| Command |
Description |
cma: New Block |
Creates a new custom block template for prototyping. |
cma: Set Block Inputs |
Configure which preceding blocks feed into the current block's Datasource. |
cma: Copy My Code |
Copies user code from the current block to the clipboard, ready to paste into Canvas. |
cma: Clear Blocks |
Deletes all custom blocks from the workspace. |
Requests (API Testing)
| Command |
Description |
Shortcut |
cma: New Request |
Creates a new API request file for an application connector. |
|
cma: Execute Request |
Runs the current request file against the application API. |
Ctrl+Enter |
cma: Duplicate Request |
Creates a copy of the current request file. |
Ctrl+Alt+D |
cma: Clear Requests |
Deletes all files from the requests folder. |
|
Webhooks
| Command |
Description |
cma: Browse Webhooks |
Opens a picker to select from available webhooks for the current workflow. |
cma: Fetch Webhook by ID or Number |
Fetches a specific webhook by its ID or run number. |
cma: Fetch Last Processed Webhook |
Fetches the most recently processed webhook for the current workflow. |
cma: Refresh Pinned Webhook |
Re-fetches the pinned webhook data and updates the local webhook.json. |
Run Results & History
| Command |
Description |
cma: Load Last Run Result (All Blocks) |
Fetches the latest run result for all blocks from Canvas. |
cma: Load Last Run Result (This Block) |
Fetches the latest run result for the current block only. |
cma: Load Run Result by Number (All Blocks) |
Fetches a specific run result by number for all blocks. |
cma: Load Run Result by Number (This Block) |
Fetches a specific run result by number for the current block. |
cma: Save Run to History |
Archives a workflow run result to local history. |
cma: Save Block Run to History |
Archives a single block's run result to local history. |
cma: Save Run Range to History |
Archives a range of run results to local history (max 50 runs). |
Search & Utilities
| Command |
Description |
cma: Search Workflow Data |
Searches across workflow outputs, logs, and sessions. Results appear in the Explorer sidebar. |
cma: Update FX Functions |
Re-fetches all fx functions from Canvas and regenerates the local fx.js. |
cma: Pin/Unpin Account |
Toggles pinned state for an account (pinned accounts appear first in pickers). |
cma: Configure AI Agent Tools |
Scaffolds instructions and type definitions for AI coding assistants. |
cma: Restore Config Defaults |
Resets .workspace-config.json to defaults (preserves initialized timestamp). |
Workspace Configuration
The .workspace-config.json file in your workspace root controls extension behavior. It is created automatically during initialization and can be edited manually.
{
"version": "1.3.1",
"initialized": "2026-07-01T10:00:00.000Z",
"request": {
"defaultNamingMode": "smart",
"defaultBaseUrl": "https://canvas.connectmyapps.com/api/ApiSend",
"defaultResponseCodes": [200, 201, 404],
"requestBodyOverride": {},
"smartNaming": {
"maxPathLength": 20,
"preserveNumericIds": true
},
"archiveOrphanedFiles": true
},
"runtime": {
"outputCleanup": "canvas",
"sessionCleanup": "canvas",
"runResults": {
"onWorkflowGet": "prompt",
"includeOutput": true,
"includeLog": true,
"includeSession": true,
"archiveOnCleanup": true
}
},
"diff": {
"viewMode": "active"
}
}
Request Settings
| Setting |
Description |
Default |
request.defaultNamingMode |
Naming mode for new requests: single, new, or smart |
smart |
request.defaultBaseUrl |
Base URL for API requests |
Canvas API URL |
request.defaultResponseCodes |
Accepted HTTP response codes |
[200, 201, 404] |
request.requestBodyOverride |
Override default request body properties |
{} |
request.smartNaming.maxPathLength |
Maximum characters for URL path in filenames |
20 |
request.smartNaming.preserveNumericIds |
Keep numeric IDs in path or replace with "id" |
true |
request.archiveOrphanedFiles |
Archive orphaned responses (true) or delete them (false) |
true |
Runtime Settings
| Setting |
Description |
Default |
runtime.outputCleanup |
How to handle output files: canvas, none, or all |
canvas |
runtime.sessionCleanup |
How to handle session files: canvas, none, or all |
canvas |
runtime.runResults.onWorkflowGet |
Fetch run results on Get Workflow: none, prompt, or all |
prompt |
runtime.runResults.includeOutput |
Include block output in fetched results |
true |
runtime.runResults.includeLog |
Include block logs in fetched results |
true |
runtime.runResults.includeSession |
Include session data in fetched results |
true |
runtime.runResults.archiveOnCleanup |
Archive results before cleanup vs delete |
true |
Diff Settings
| Setting |
Description |
Default |
diff.viewMode |
Where diff tabs open: active (current group) or split (side-by-side group) |
active |
Other Settings
| Setting |
Description |
canvasApiBaseUrl |
Optional override to point at a different Canvas environment (e.g. test server) |
aiAgents |
Managed by the Configure AI Agent Tools command. Do not edit manually. |
Smart Request Naming
When using "resultsPage": "smart" in request files, the extension generates descriptive filenames based on request content.
{APP}_{verb}_{urlPath}_{hash}_req.json
{APP}_{verb}_{urlPath}_{hash}_res.json
Examples:
QUIN_get_employees_a1b2_req.json
MYST_post_orders_c3d4_res.json
FTP_get_files_documents_e5f6_req.json
How It Works
- On execute: The extension generates a filename from the request content (verb, URL path). If it differs from the current filename, the request file is renamed and any orphaned responses are archived.
- Duplicate detection: If the generated filename matches an existing file, the existing file is replaced and your editor tab stays open with the renamed file.
- Archiving: Orphaned responses are combined with their originating request into an
archive/ subfolder as a single { request, response } JSON file. A hidden archive/.pending/ record captures the request at execution time so pairing is always correct. Set archiveOrphanedFiles: false to delete instead.
URL Path Truncation
Long URL paths are intelligently truncated to fit within maxPathLength:
- First and last path segments are prioritized
- Middle segments are removed if needed
- Numeric IDs can be preserved or replaced with "id" based on settings
Important Concepts
dateLastRun
The dateLastRun variable represents the timestamp of the last successful workflow execution.
Local behavior:
- Updated in
manifest.json when a workflow run "completes" — either by running the last block, or by any block calling fx.stopAfterThisBlock(true).
- Loaded into the global
dateLastRun variable when blocks execute, enabling incremental sync patterns.
- You can manually edit the value in
manifest.json for testing.
Canvas sync (optional):
- By default, local runs do NOT update
dateLastRun on Canvas (prevents local debugging from affecting production).
- Set
"syncDateLastRun": true in manifest.json to enable syncing after successful local runs.
Renaming Blocks and Workflows
Edit names directly in manifest.json:
- Block name: Edit the
name property of the block in the blocks array.
- Workflow name: Edit the
name property at the root level.
When you push code or config, updated names are sent to Canvas and local folders are automatically renamed (sanitized for filesystem-safe characters).
Changing Block Order
Add or reorder blocks in the Canvas web UI, then use cma: Get Workflow to re-download. Local block order changes are not synced.
Known Limitations
Workflows
- Schedule management: No commands for changing or toggling a workflow's schedule. Use the Canvas web UI.
Workflow and Block Templates (Workbench)
- Workflow and block templates cannot be fetched or updated via the extension. Only registered (deployed) workflows are accessible.
- Pushing code to a block created from a workbench template will mark it as "customized" and it will no longer receive template updates.
Functions (fx)
- Functions cannot be created or modified through the extension. Use
cma: Update FX Functions to pull the latest function definitions from Canvas into your local fx.js.
Webhooks
- The extension cannot actively listen for incoming webhooks — they must be fetched manually.
- Only one webhook can be loaded at a time (not the full queue).
- Queue items cannot be moved to history via the extension.
Feedback
Send feedback and feature requests to support@connectmyapps.com.