Releases
Changelog
Every release, newest first. Versions follow SemVer, and until 1.0 a minor version may change the sftp.json format. The .vsix for each version is attached to its GitHub release.
No release yet; the first is on its way.
Marketplace↗
Releases and .vsix downloads↗
CHANGELOG.md on main↗
Added
- Connections in
.vscode/sftp.json, validated by a schema, with comments allowed the way VS Code's own.vscodefiles allow them. A connection is a name, a server (aHostalias from ssh config, or a host and port), a user, an authentication mode, a root path and a host key policy. Secrets never go in the file: passwords and passphrases are kept in the OS keychain, keyed by connection, user and host, so changing the user or the host on a connection asks again rather than reusing the old secret. Heimdall: Forget Saved Password / Passphrase clears everything saved for a connection. ~/.ssh/configand the SSH agent. A connection that names aHostalias takesHostName,Port,User,IdentityFile,IdentityAgentandProxyJumpfrom the config, followingInclude, with multi-hop jump chains dialled in order and each hop's host key checked. Explicit fields on the connection override.Match execis never evaluated. The config read is the one Remote-SSH is pointed at (remote.SSH.configFile) unlessheimdall.sshConfigPathsays otherwise.- Key pair and password authentication. A passphrase-protected key prompts once and can be remembered; a rejected password or passphrase is asked again, up to three times, and cancelling leaves the connection idle rather than in error.
- Host key checking against
known_hosts, the same filesshuses, including hashed hosts, wildcards, negation and@revokedlines. Policies:strict(the key must already be known),accept-new(the default: unknown keys are added, changed keys refused),ask(a modal shows the key type and SHA256 fingerprint), andoff. A changed key is refused in every mode exceptoff. - The
sftp://file system. Every file under a connection issftp://<connection>/<absolute path>and opens, edits, saves, reverts and shows dirty state like a local file; other extensions read it through the provider. Directories list with symbolic links flagged; rename, delete (recursive) and create work from any surface that uses the file system API. - The Heimdall view in the activity bar: one node per connection with its state (idle, connecting, connected, error with the message, disabled), the server's directories beneath the root path, directories first. Refresh on a folder or a connection; a refresh on a broken connection reconnects. Connect, Reconnect, Disconnect and Test Connection on the node. Nothing dials until a node is expanded or a file is opened.
- Save conflicts. Saving a file someone else changed on the server since it was opened is refused: VS Code's own Compare and Overwrite notification appears, driven by the server mtime Heimdall reports, and the provider refuses stale writes that reach it by other routes. Heimdall: Show Diff with Server opens a diff against a fresh server read, Overwrite on Server writes the editor's copy and reloads it, and Reload from Server reverts to the server's copy.
- The connection editor, in its own compact floating window like Tablecloth's dialogs (or as an editor tab with
heimdall.dialogs.openIn): the connections on the left with Add, Remove, Duplicate and Import; a form on the right with theHostaliases from ssh config offered as you type and hints saying what the config will supply; Test Connection on the unsaved values; and a folder pick in multi-root workspaces. Saves editsftp.jsonin place and keep its comments. - Import Connections from SSH Config…: every concrete
Hostalias in the config in a multi-select pick, aliases already imported shown as such, each becoming a connection with root path/. - Open in Terminal on a connection, a folder or a file: an
sshsession using the connection's alias or host, port, user, key, config file, host key policy andknown_hosts, landed in that directory with the login shell. - Settings
heimdall.sshConfigPath,heimdall.knownHostsPath,heimdall.connectTimeoutandheimdall.dialogs.openIn.
Known limits
- SFTP has no change notifications, so a change on the server is noticed at save time, and mtimes are whole seconds.
- A file is read whole; there is no size guard yet.
- Find in Files does not see a connection that is not a workspace folder.