Skylift - Modern SFTP for VS Code
Push your code to remote servers in one click. SFTP without the friction.

Why Skylift
Existing SFTP extensions are powerful but heavy: dozens of settings, JSON-only config, no diff before push, no clue when something looks wrong on the server. Skylift starts from the opposite end:
- Point-and-click setup - a 4-step wizard writes a versionable config; no manual JSON.
- One-click push - sidebar button, keyboard shortcut, or right-click in the editor.
- Manifest-based incremental sync - Push code only sends what actually changed since last sync, with no remote walk needed.
- Review before send - see exactly what will go up, mark files / extensions / folders as always-ignore in one click.
- Diagnose anomalies - find orphan files on the server, leftover temp files, files that shouldn't be there. Decide per-file: delete, download, backup or ignore.
- Atomic uploads - write to a temp file then rename, so partial uploads never replace a working file.
- Secrets stay out of the repo - passwords live in the OS keychain, never in JSON.
Quick start
- Install Skylift from the VS Code Marketplace.
- Click the Skylift icon in the activity bar.
- Click Set up a target - the wizard walks you through:
- SFTP connection (host, port, user)
- Auth (password or SSH key - keys in
~/.ssh/ are auto-detected, .ppk supported)
- Test the connection
- Pick the remote folder by browsing the server
- Pick the local folder (defaults to your workspace)
- Click Push code - done.
That's it. No JSON to write.
Main commands
| Command |
Default shortcut |
What it does |
| Skylift: Push code |
- |
Upload everything that changed since last sync. |
| Skylift: Review & push |
- |
Scan both sides, pick what to upload row by row. |
| Skylift: Diagnose anomalies |
- |
Find files on the remote that shouldn't be there. |
| Skylift: Push current file |
Ctrl+Alt+P (⌘⌥P) |
Upload only the file you're editing. |
| Skylift: Compare with remote |
- |
Side-by-side diff of the active file vs its remote twin. |
| Skylift: Switch active target |
- |
Change which target sidebar buttons act on. |
| Skylift: Settings |
- |
Open the panel for exclusions, preferences, language, git trigger. |
All commands also live in the sidebar action cards.
Multi-target
Add more targets through the sidebar + button. The active target shows in the header; click another to switch. Skylift: Push to multiple targets lets you fan out a single push to several destinations (staging + production, two clusters, etc.).
Auto-push on git commit
Add a branch to Settings → Git push trigger (e.g. main). Every time you commit on it, Skylift fires Push code. Useful for staging environments tied to a branch.
Auto-upload on save
Toggle Settings → Auto-upload on save to push the current file every time you save it. Disabled by default; disabled outright in untrusted workspaces.
Configuration
All preferences are project-scoped and stored in .skylift/config.json - not in VS Code's settings. That means the config can be committed alongside your code (without secrets, which stay in the OS keychain).
The folder also holds:
manifest.<target>.json - last-known-synced state per target, used by Push code
.skylift_backup/ - backups created by Diagnose
The whole .skylift/ folder is gitignored automatically.
Languages
Skylift's panels are translated to French, Spanish, German, Italian, Brazilian Portuguese. By default it follows VS Code's display language; override per project in Settings → Language.
Security model
- Secrets: passwords and key passphrases live in VS Code
SecretStorage, which is backed by the OS keychain (DPAPI on Windows, Keychain on macOS, libsecret on Linux). Never written to disk in plaintext.
- Workspace trust: Skylift declares itself
limited - auto-upload-on-save and the git commit trigger are disabled in untrusted workspaces. Manual push commands still work.
- Atomic uploads: every upload writes to
.<file>.skylift_tmp.<random>, then renames over the target. A killed upload never corrupts the live file.
- No telemetry.
Working in a team
Skylift's sync model is designed to work the same way whether you're solo, in a team, with or without git:
Push code (and Review & push) walk both LOCAL and REMOTE on every run, then diff content directly. The per-target manifest in .skylift/manifest.<target>.json is purely a cache (skips redundant SFTP readdir calls when directories haven't changed) - it is no longer the source of truth for what's in sync. This makes Push code accurate regardless of mtime drift after git pull or other out-of-band changes.
Trust same-size (Settings → Preferences) is on by default. When local and remote sizes match, Skylift treats the file as in-sync even if mtimes drifted. Mirrors rclone/rsync defaults. Theoretical edge case "same size, different content" is essentially zero for code/text.
Skylift: Reset mtimes from git (command palette + Settings) is an optional helper for git users who want zero re-uploads after a git pull. It sets each tracked file's local mtime to the date of its last git commit. Files with uncommitted changes are preserved. Requires git on PATH; gracefully skipped otherwise.
Skylift: Verify against remote (deep check) (command palette + Settings) is the bulletproof option for the paranoid: hashes every file on both sides and reports mismatches. Slow because every same-size remote file is downloaded to compute its hash (v0.4 will add an OpenSSH [email protected] fast path). Manual command - never runs as part of routine pushes.
.skylift/ is a per-developer artefact and should be added to .gitignore. Skylift won't upload it to the server (built-in ignore pattern) but committing it would create merge conflicts on every push.
Requirements
- VS Code 1.85.0 or newer
- An SFTP-capable server (any standard SSH/SFTP service: OpenSSH, Bitvise, ProFTPD, Pure-FTPd with SFTP, AWS Transfer, etc.)
Known limitations
- Virtual workspaces (e.g. GitHub.dev) are not supported - Skylift needs direct filesystem access for SSH key reading and atomic uploads.
- Conflict detection is opt-in (one round-trip per file); leave it off when you're the only one deploying.
Issues & feedback
Bug reports and feature requests: https://github.com/idoexp/skylift/issues
License
MIT - see LICENSE.