Remote Development with the Snowflake Extension for Visual Studio Code

Remote Development lets you create a Snowflake-backed development environment, connect to it from Visual Studio Code over Remote - SSH, and run Python notebooks, scripts, and terminals on Snowflake-managed compute. The environment is backed by Snowflake Notebook and includes Python, Jupyter, and Snowflake libraries.

You can use these capabilities in Visual Studio Code or in Cursor. Cursor uses the same Visual Studio Code extension model, and you can install and run the Snowflake Extension for Visual Studio Code there the same way you install other compatible extensions.

Remote Development is available in Private Preview. Your Snowflake account must be enrolled in the preview before the Remote Environments panel appears. If you complete the steps in this topic and still do not see the panel, contact your Snowflake account team.

Prerequisites

Before you start, make sure you have:

RequirementDetails
Snowflake Extension for Visual Studio CodeInstall the Snowflake extension from the Visual Studio Code Marketplace (or the extensions UI in Cursor).
Visual Studio CodeVersion 1.88 or later is recommended for the best Jupyter kernel picker experience.
Remote - SSH extensionInstall ms-vscode-remote.remote-ssh from the Visual Studio Code Marketplace.
Snowflake account accessYour account must be enrolled in the Remote Development Private Preview.
Snowflake privilegesYour role must be able to use the target compute pool and any external access integrations you select for the service.
Local SSH toolsThe extension uses your local OpenSSH client and nc (netcat). nc is preinstalled on macOS and many Linux distributions. On Windows, install a netcat-compatible executable named nc and make sure it is on your PATH.

Enable Remote Development

Remote Development is hidden until Private Preview features are enabled in Visual Studio Code.

  1. Open the Command Palette.
  2. Run Preferences: Open User Settings (JSON).
  3. Add the following setting (merge with existing keys; keep valid JSON):
{
  "snowflake.enablePrivatePreviewFeatures": true
}
  1. Reload Visual Studio Code if prompted.
  2. Sign in to your Snowflake account from the Snowflake extension.

After you sign in, expand Remote Environments in the Snowflake sidebar. The panel appears only when both the Visual Studio Code setting and your account enrollment are enabled.

Create a remote environment

  1. In the Remote Environments panel, select Create Remote Development Environment.
  2. Enter a Service name. Use a Snowflake-compatible identifier and choose a name that does not conflict with an existing local SSH host alias.
  3. Select a Workspace to associate with the remote service. During SSH setup, you are prompted separately to mount a workspace into the running environment.
  4. Optional: select External access integrations if your notebooks need outbound network access, for example to install packages from PyPI.
  5. Optional: expand Service settings and adjust the compute and runtime settings.
  6. Select Create.

The service appears in the Remote Environments panel. Creation can take a few minutes while Snowflake provisions the service and starts the container.

Service settings

SettingDescription
Compute typeSelect CPU or GPU. GPU requires an available GPU compute pool.
Python versionSelect the Python version for the remote environment.
Runtime versionSelect the Snowflake Container Runtime version, when runtime choices are available for your account.
Compute poolSelect an available compute pool. If no pools are listed, enter a compute pool name manually.
Idle timeoutSelect how long the service can remain idle before Snowflake suspends it. The default is 24 hours.

Python version and Runtime version appear only when Snowflake Container Runtimes are available for your account.

Manage remote environments

The Remote Environments panel lists your remote development services and refreshes every 30 seconds while the panel is visible. You can also refresh it manually.

StatusMeaning
RUNNINGThe service is active and can accept Remote - SSH connections.
SUSPENDEDThe service is stopped and can be resumed.
PENDINGSnowflake is creating or starting the service.
SUSPENDINGSnowflake is stopping the service.
FAILEDThe service failed. Open the details panel to view the error.
UNKNOWNThe extension could not map the service status. Refresh the panel or open details.

Use the inline actions in the panel to manage each service:

ActionAvailable whenDescription
ResumeService is SUSPENDEDStarts the service again.
StopService is RUNNINGSuspends the service.
DeleteAny service statusPermanently deletes the service.
InfoAny service statusOpens service details, including status, compute pool, runtime, endpoints, timestamps, and error messages.
Setup SSHService is RUNNING and no proxy is activeStarts the local SSH proxy and opens the remote environment in a new Visual Studio Code window.
Stop ProxyA proxy is active for the serviceStops the local SSH proxy and removes the generated SSH config entry.

Suspending a service stops the running remote environment but keeps the service definition so it can be resumed later. Compute pool billing and auto-suspend behavior depend on your Snowflake compute pool configuration.

Deleting a service is permanent. The extension also stops any active local proxy for that service.

Connect to a remote environment

  1. In the Remote Environments panel, find a service with status RUNNING.
  2. Select Setup SSH.
  3. When prompted, choose a workspace to mount, or press Escape to skip mounting.
  4. Visual Studio Code opens a new window connected to the remote environment at /root.

You do not need to create SSH keys or configure port forwarding manually.

Mount a workspace during connection

During SSH setup, the extension prompts you to mount a workspace. This mount step is separate from the workspace you selected when creating the service.

If you choose a workspace, the extension mounts it into the running service and creates a link under:

/root/workspaces/<workspace_name>

If you press Escape, the extension skips mounting and continues opening the remote Visual Studio Code window. You can still use the remote environment, but workspace files are not linked under /root/workspaces.

If workspace mounting fails, the extension shows a warning and still opens the remote environment. You can retry Setup SSH later after confirming that your role has access to the workspace.

First connection

The first connection can take a few minutes because Visual Studio Code installs extensions on the remote host. If the Extensions view shows Reload Required or Reload Window, reload the remote Visual Studio Code window before opening notebooks.

If the remote window opens before the Python or Jupyter extension finishes installing, wait for installation to finish and reload the window.

Optional reading — how the SSH connection works

You can skip this section if you only need the standard connection workflow.

When you connect, the extension:

  1. Starts a local proxy on 127.0.0.1 that forwards SSH traffic to Snowflake over a secure WebSocket connection.
  2. Writes a generated Host <service-name> entry to your user SSH config file (for example ~/.ssh/config on macOS and Linux).
  3. Installs required Visual Studio Code extensions on the remote host.
  4. Configures the remote Python and Jupyter settings.
  5. Opens the remote folder /root in a new Visual Studio Code window.

The generated SSH host entry uses the remote service name. If your SSH config already contains a Host entry with the same name, the extension replaces that entry. Choose service names that do not collide with SSH hosts you manage manually.

The local proxy uses the Snowflake session token that is active when you connect. Session tokens are not refreshed automatically by the proxy. If the remote connection becomes unresponsive after a long session, stop the proxy, sign in again if needed, and run Setup SSH again.

Work with notebooks

After the remote Visual Studio Code window opens, create or open a Jupyter notebook:

  1. Run Create: New Jupyter Notebook from the Command Palette, or create a file ending in .ipynb.
  2. Open the notebook kernel picker.
  3. Select the Python kernel from the Snowflake remote Jupyter server. In the picker, look for labels such as Snowflake Remote Dev or Snowflake Remote Jupyter Server.

The extension preconfigures the Python interpreter and registers the remote Jupyter server at http://localhost:8888.

Run a test cell:

from snowflake.snowpark.context import get_active_session

session = get_active_session()
print(session.sql("SELECT CURRENT_VERSION()").collect())

If you mounted a workspace during SSH setup, its files are available under:

/root/workspaces/<workspace_name>

Use mounted workspaces for files you want to keep across remote sessions. Do not rely on files stored only in local container paths such as /root or /tmp to persist after service lifecycle changes.

Disconnect

To end your editor session, close the remote Visual Studio Code window.

To stop the local SSH tunnel, return to the local Visual Studio Code window and select Stop Proxy for the service. This closes the local proxy and removes the generated Host <service-name> entry from your SSH config.

If you stop or delete a service, the extension also stops any active local proxy for that service.

Troubleshooting

Remote Environments panel is not visible

Possible causeResolution
Private Preview setting is disabledAdd "snowflake.enablePrivatePreviewFeatures": true to your Visual Studio Code user settings JSON.
Account is not enabledContact your Snowflake account team to confirm your account is enrolled in the Private Preview.
You are not signed inSign in to Snowflake from the Snowflake extension.

Panel is visible but empty

You might not have any remote services yet. Select Create Remote Development Environment to create one.

If you expect to see existing services, refresh the panel and confirm that you are signed in with the expected role and account.

Create fails

Possible causeResolution
Service name already existsChoose a different service name, or use the panel actions to resume, stop, or delete the existing service.
Invalid compute poolSelect a listed compute pool or confirm the manually entered compute pool name.
Missing privilegesAsk your Snowflake administrator to grant access to the compute pool, workspace, or external access integration.
GPU selected without GPU capacitySelect CPU or choose an available GPU compute pool.

SSH connection fails

Possible causeResolution
Service is not runningResume the service first. If the status is PENDING, wait and refresh the panel.
nc is not installedInstall netcat and make sure nc is on your local PATH.
Local proxy stoppedSelect Setup SSH again.
Network blocks WebSocket trafficAllow outbound wss:// connections to your Snowflake account endpoint.
Corporate proxy blocks WebSocketConfigure your network to allow WebSocket upgrade traffic to Snowflake, or bypass the proxy for Snowflake hosts.
Snowflake session expiredSelect Stop Proxy, sign in again if needed, and run Setup SSH again.
Older service without SSH supportCreate a new remote environment, or delete and recreate the existing service. Older services might not expose the required SSH endpoint.
Existing SSH host alias conflictsRename the remote service or update your local SSH config to avoid a Host <service-name> collision.

Notebook kernel does not appear

Possible causeResolution
Remote extensions are still installingWait for the Snowflake, Python, and Jupyter extensions to finish installing, then reload the remote window.
Visual Studio Code window needs reloadUse Developer: Reload Window in the remote Visual Studio Code window.
Older Visual Studio Code versionUpgrade to Visual Studio Code 1.88 or later. As a fallback, manually select an existing Jupyter server at http://localhost:8888.

Terminal file listings are slow

Mounted workspaces use a remote filesystem. Commands that read many file attributes can be slower than on a local disk. The extension adds an interactive shell alias that disables colorized ls output because color detection can trigger extra metadata calls.

Service is stuck in PENDING or FAILED

If a service remains PENDING for several minutes, the compute pool might still be provisioning or might not have available capacity. Refresh the panel and check the service details.

If a service is FAILED, open the Info panel and review the error message. Common causes include invalid compute pools, missing privileges, unavailable runtime images, quota limits, or insufficient compute capacity.

Best practices

Use shorter idle timeouts for temporary development sessions to reduce unnecessary compute usage.

Select external access integrations only when your workload needs outbound network access.

Mount a workspace when you need files to persist across sessions or be shared with other Snowflake notebook workflows.

Stop the proxy when you are done using the remote window so stale SSH entries and local proxy processes do not remain active.

Reconnect after long breaks. If the Snowflake session used by the local proxy expires, stop the proxy and run Setup SSH again.

FAQ

Do I need to manage SSH keys?
No. The extension manages the SSH connection through a local proxy and Snowflake authentication.

Can I open a terminal on the remote environment?
Yes. In the remote Visual Studio Code window, use Terminal: Create New Terminal.

Can multiple users share one remote service?
Yes, if each user has the required Snowflake privileges to access the notebook service. Remote Development uses SSH access and the Snowflake notebook service privilege model, so multiple authorized users can connect to and operate on the same service in parallel.

What packages are installed?
The selected Snowflake Container Runtime determines the base Python version and preinstalled packages. For runtime details, see Snowflake Container Runtime for ML.

Can I install additional packages?
Yes, if the environment has outbound network access through an external access integration or another approved package source.