EditSyncSafe, backup-first remote server sync for VS Code and CLI. Stop worrying about accidental overwrites. EditSync is the only remote sync tool that automatically backs up server files before every upload, detects conflicts in real-time, and uses a recoverable trash system instead of permanent deletion. Why EditSync?Other remote sync tools silently overwrite server files, delete without undo, and ignore conflicts. One wrong save can destroy hours of work on a production server. EditSync was built on a single principle: the server file must never be lost.
Feature Comparison: Free vs Pro vs Team
Get Pro / Team14-day free trial included. No credit card required. Quick Start1. InstallSearch "EditSync" in VS Code Extensions sidebar, or:
2. Create ConfigOpen Command Palette (
If you have 3. Edit ConfigFill in your server details (password):
Or with private key:
4. ConnectClick the status bar item at the bottom, or:
5. Download Server FilesAfter connecting, you'll be prompted:
6. Start WorkingNow just save files normally. EditSync automatically:
Images, fonts, and other binary files are auto-uploaded when you copy them into the project. Status BarThe status bar at the bottom shows real-time sync status:
During downloads, the status bar shows real-time progress:
Configuration ReferenceFull
|
| Field | Type | Default | Description |
|---|---|---|---|
connection.type |
string | "sftp" |
sftp, docker, k8s, aws-ssm |
connection.host |
string | — | Server hostname or IP |
connection.port |
number | 22 |
SSH port |
connection.username |
string | — | SSH username |
connection.auth.method |
string | — | password, privateKey, agent, interactive |
connection.auth.password |
string | — | SSH password (if method is password) |
connection.auth.privateKeyPath |
string | — | Path to private key file (.pem, .ppk) |
connection.auth.passphrase |
string | — | Private key passphrase (if encrypted) |
connection.sshConfigPath |
string | ~/.ssh/config |
Custom SSH config file path |
Auth Methods
| Method | Use Case | Example |
|---|---|---|
password |
Simple password auth | "password": "mypassword" |
privateKey |
Most common — SSH key file | "privateKeyPath": "~/.ssh/id_rsa" |
agent |
SSH agent forwarding | No extra config needed |
interactive |
2FA, OTP, keyboard-interactive | Prompts appear in VS Code |
Sync Settings
| Field | Type | Default | Description |
|---|---|---|---|
remotePath |
string | — | Remote directory to sync (e.g. /var/www/html) |
uploadOnSave |
boolean | true |
Auto-upload when you save a file |
backup.enabled |
boolean | true |
Back up server file before overwrite (Pro) |
backup.maxCount |
number | 10 |
Max backups per file (oldest auto-deleted) |
backup.path |
string | ".vscode/editsync-backup" |
Local backup directory |
trash.enabled |
boolean | true |
Use trash instead of permanent delete (Pro) |
trash.retentionDays |
number | 7 |
Days before trash is permanently deleted |
conflict.action |
string | "warn" |
warn (show UI) or auto-backup (silent) |
conflict.showDiff |
boolean | true |
Show diff view on conflict (Pro) |
ignore |
string[] | [] |
Glob patterns to exclude from sync |
watcher.delay |
number | 300 |
Debounce delay in ms for upload-on-save |
Upload Hooks
| Field | Runs on | Example |
|---|---|---|
hooks.beforeUpload |
Local machine (before upload) | "npm run lint", "eslint --fix" |
hooks.afterUpload |
Server via SSH (after upload) | "pm2 restart app", "systemctl reload nginx" |
Environment variables available in hooks: EDITSYNC_FILE (local path), EDITSYNC_REMOTE (remote path).
Connection Types
SFTP with Password
{
"connection": {
"type": "sftp",
"host": "192.168.0.100",
"port": 22,
"username": "root",
"auth": { "method": "password", "password": "your-password" }
},
"remotePath": "/var/www/html"
}
SFTP with Private Key
{
"connection": {
"type": "sftp",
"host": "192.168.0.100",
"port": 22,
"username": "root",
"auth": { "method": "privateKey", "privateKeyPath": "~/.ssh/id_rsa" }
},
"remotePath": "/var/www/html"
}
With passphrase-protected key:
{
"auth": { "method": "privateKey", "privateKeyPath": "~/.ssh/id_rsa", "passphrase": "my-passphrase" }
}
SFTP with SSH Agent
{
"connection": {
"type": "sftp",
"host": "192.168.0.100",
"port": 22,
"username": "root",
"auth": { "method": "agent" }
},
"remotePath": "/var/www/html"
}
Uses your system's SSH agent. No key path needed.
SFTP with Interactive Auth (2FA / OTP)
{
"connection": {
"type": "sftp",
"host": "192.168.0.100",
"port": 22,
"username": "root",
"auth": { "method": "interactive" }
},
"remotePath": "/var/www/html"
}
Prompts appear in VS Code for each authentication step.
SFTP with SSH Config
{
"connection": {
"type": "sftp",
"host": "my-server-alias",
"port": 22,
"username": "root",
"auth": { "method": "privateKey", "privateKeyPath": "~/.ssh/id_rsa" },
"sshConfigPath": "~/.ssh/config"
},
"remotePath": "/var/www/html"
}
Automatically parses
~/.ssh/configfor host aliases, proxy settings, and identity files.
SFTP + Jump Host (Bastion)
For servers behind a firewall:
{
"connection": {
"type": "sftp",
"host": "10.0.0.5",
"port": 22,
"username": "deploy",
"auth": { "method": "privateKey", "privateKeyPath": "~/.ssh/id_rsa" },
"jumpHost": {
"host": "bastion.company.com",
"port": 22,
"username": "jump-user"
}
},
"remotePath": "/var/www/html"
}
Docker Container
{
"connection": {
"type": "docker",
"host": "my-container-name",
"username": "root"
},
"remotePath": "/app"
}
Kubernetes Pod
{
"connection": {
"type": "k8s",
"host": "my-pod-name",
"username": "default"
},
"remotePath": "/app"
}
host= pod name,username= namespace
AWS SSM Session Manager
{
"connection": {
"type": "aws-ssm",
"host": "i-0123456789abcdef0",
"username": "ec2-user"
},
"remotePath": "/var/www/html"
}
No SSH keys needed. Requires AWS CLI + SSM plugin configured locally.
Commands
| Command | Description | Tier |
|---|---|---|
EditSync: Connect |
Connect to configured server | Free |
EditSync: Disconnect |
Disconnect from server | Free |
EditSync: Upload Current File |
Upload the active editor file | Free |
EditSync: Download Current File |
Download file from server | Free |
EditSync: Download Folder |
Download folder from Remote Explorer (right-click) | Free |
EditSync: Initialize |
Download all server files (server -> local) | Free |
EditSync: Create Config |
Generate config (with SSH config import) | Free |
EditSync: Refresh Explorer |
Refresh the remote file tree | Free |
EditSync: Compare with Server |
Diff local vs server | Pro |
EditSync: Show File Backups |
Browse and restore backup history | Pro |
EditSync: Export Changes |
Export changed files list | Pro |
EditSync: Switch Server Profile |
Switch between server profiles | Pro |
EditSync: Save Current as Profile |
Save current config as profile | Pro |
EditSync: Activate Pro License |
Enter license key | — |
How It Works
Upload Flow (when you save a file)
You save a file
|
1. [hooks] Run beforeUpload command (if configured)
|
2. Check server file mtime (last modified time)
|
3. Compare with last synced mtime
|
4a. Match -> Back up server file (Pro) -> Upload via temp file -> Rename
4b. Mismatch -> CONFLICT
|
Show diff (Pro) -> You choose:
- Backup & Overwrite (safe -- keeps server version as backup)
- Overwrite Server (your file wins)
- Skip (do nothing)
|
5. [hooks] Run afterUpload command on server (if configured)
Open File Flow (sync on open)
You open a file
|
1. Check server mtime vs last synced mtime
|
2a. Same -> No action
2b. Different -> Server version is newer
|
3. Back up local file (Pro) -> Download server version
|
4. Reload editor with latest content
(If you have unsaved edits, asks "Reload or keep my edits?")
Delete Flow
You delete a local file
|
Pro: "Move to trash on server too?"
-> Yes: Server file -> .trash/ (recoverable for 7 days)
-> No: File kept on server
Free: File deleted locally only, server untouched
Backup Structure
.vscode/editsync-backup/
+-- init-2026-04-14T10-30-00/ <- initial download backup
| +-- src/
| +-- index.js
+-- sync/ <- sync-on-open backups
| +-- src/
| +-- index.js.2026-04-14T12-00-00.bak
+-- src/
| +-- index.js/ <- upload backups (per-file history)
| +-- 20260414_10-30-00-123.bak
| +-- 20260414_14-22-00-789.bak
+-- .trash/
+-- 2026-04-14_15-00-00/ <- deleted files (7-day retention)
+-- old-file.js
CLI
Install
npm install -g editsync
Usage
editsync init # Create .vscode/editsync.json
editsync connect # Test server connection
editsync pull # Download all files (server -> local)
editsync pull src/index.ts # Download specific file
editsync push src/index.ts # Upload specific file
editsync watch # Watch for changes & auto-upload
editsync status # Show sync status of all files
editsync diff src/app.js # Compare local vs server (Pro)
editsync backups src/app.js # List backups for a file (Pro)
editsync export today # Export today's changes (Pro)
editsync export 2026-04-01 # Export changes from specific date (Pro)
editsync export-files 3d # Copy changed files to folder (Pro)
editsync activate SEP-XXXX # Activate Pro license key
editsync --help # Show all commands
Watch Mode (any editor)
Not using VS Code? Run the CLI in your terminal alongside any editor:
editsync watch
This watches your project directory and auto-uploads changed files. Works with Neovim, JetBrains, Sublime, Emacs, or any editor.
Activating Pro
From VS Code
- Click "Get Pro" on any Pro feature prompt — checkout page opens
- Complete purchase — you'll receive a license key (e.g.
SEP-XXXX-XXXX-XXXX) - Paste the key in the input box that appears in VS Code
- Done — Pro features activate immediately and connection auto-refreshes
Or manually: Command Palette -> EditSync: Activate Pro License
From CLI
editsync activate SEP-XXXX-XXXX-XXXX
License Key Prefixes
| Prefix | Plan |
|---|---|
SEP- |
Pro |
SET- |
Team |
Pricing
| Plan | Monthly | Yearly | What you get |
|---|---|---|---|
| Free | $0 | $0 | Basic upload/download, 1 server, no safety net |
| Pro | $2.90 | $19 | Backup, conflict detection, trash, unlimited servers, diff, hooks, profiles |
| Team | $4.90/user | $39/user | Everything in Pro + team file locking + shared config |
All paid plans include a 14-day free trial. No credit card required for trial.
14-day money-back guarantee on all purchases.
FAQ
Is my data sent to EditSync servers?
No. Files travel directly between your machine and your server via encrypted SSH/SFTP. EditSync has no servers that receive your data. Only license validation calls go to Polar.sh (license key + hostname only). See PRIVACY.md.
What happens when the trial expires?
Pro features (backup, conflict detection, trash, multi-server) are locked. Basic upload/download continues to work on 1 server. No data is lost — your existing backups remain on disk.
Where are backups stored?
On your local machine only, in .vscode/editsync-backup/. Not in the cloud. If your machine is lost, backups are gone. Always maintain independent backups.
Why do I need Pro for a production server?
Free tier uploads without backup or conflict detection. If you accidentally overwrite a production file, it's gone. Pro automatically backs up every server file before upload and warns you when someone else changed the file.
Does it support .ppk files (PuTTY)?
Yes. Both .pem and .ppk key formats are supported.
Can I ignore certain files/folders?
Yes. Add glob patterns to the ignore array:
{
"ignore": [
"node_modules/**",
".git/**",
"*.log",
"dist/**"
]
}
What about ~/.ssh/config?
EditSync auto-parses your SSH config. When creating a config file, your saved hosts appear for one-click selection. Custom Include directives and ProxyJump are fully supported.
Can I run commands after upload?
Yes. Use the hooks setting:
{
"hooks": {
"beforeUpload": "npm run lint",
"afterUpload": "pm2 restart app"
}
}
beforeUpload runs locally, afterUpload runs on the server via SSH.
Does it work with Docker/Kubernetes?
Yes. Set connection.type to "docker" or "k8s". No SSH required — connects directly via docker exec / kubectl exec.
What if my connection drops mid-upload?
EditSync uses atomic writes (upload to temp file, then rename) so partial files never exist on the server. Failed uploads are automatically retried 3 times. If all retries fail, the file is queued and retried on next connection.
Important Notes
- Backups are local only — not cloud-backed. Always maintain independent backups.
- Free tier has no safety net — no backup, no conflict detection, no trash. Use Pro for production.
- Server is Source of Truth —
Initializealways downloads from server. Misconfiguration may overwrite local files. - See LICENSE.txt for full terms including limitation of liability.
- See PRIVACY.md for privacy policy.
License
Proprietary. See LICENSE.txt.
Copyright (c) 2025-2026 DkLib. All rights reserved.
Contact: eorud0713@gmail.com