Safe, backup-first remote server sync for VS Code and CLI.
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.
| Other sync tools | EditSync | |
|---|---|---|
| Upload overwrites server | Silently, no backup | Auto-backup before every upload |
| Someone else edited the file | Overwrites their changes | Conflict detection + diff comparison |
| Accidentally deleted a file | Gone forever | Trash system -- recoverable for 7 days |
| "Sync All" button | Can nuke entire server | No bulk overwrite -- file-by-file only |
| Upload interrupted | Broken partial file on server | Auto-retry 3 times with backoff |
| Connection drops mid-work | Uploads lost silently | Retry queue -- resend on reconnect |
| Server install required | Yes (agent/daemon) | Zero install -- pure SFTP/SSH |
| Offline work | Impossible | Full local copy -- work offline anytime |
| Connection methods | SFTP only | SFTP, Docker, K8s, AWS SSM |
| Team collaboration | No protection | File locking -- prevent simultaneous edits |
| Connection monitoring | None | 60s heartbeat -- auto-reconnect on drop |
Feature Comparison: Free vs Pro vs Team
| Feature | Free | Pro | Team |
|---|---|---|---|
| Upload on save | O | O | O |
| Remote file explorer | O | O | O |
| Auto-reconnect + heartbeat | O | O | O |
| File create/copy auto-upload | O | O | O |
| Sync on open (auto-fetch latest) | O | O | O |
| Parallel download (10 concurrent) | O | O | O |
| Auto-retry (3 retries on failure) | O | O | O |
| External file change detection | O | O | O |
| Built-in ignore (node_modules, .git) | O | O | O |
| Server connections | 1 | Unlimited | Unlimited |
| Auto backup before upload | -- | O | O |
| Backup on sync-on-open | -- | O | O |
| Conflict detection + diff view | -- | O | O |
| Trash recovery (7-day retention) | -- | O | O |
| Server file deletion | -- | O | O |
| File history viewer (timeline UI) | -- | O | O |
| Server diff comparison | -- | O | O |
| Change export (markdown/JSON/CSV) | -- | O | O |
| SSH Config auto-import | -- | O | O |
| Jump Host / Multi-hop SSH | -- | O | O |
| Docker container access | -- | O | O |
| Kubernetes Pod access | -- | O | O |
| AWS SSM Session Manager | -- | O | O |
| Multiple server profiles | -- | O | O |
| Upload hooks (before/after) | -- | O | O |
| tar fast initialize | -- | O | O |
CLI tool (editsync watch) |
-- | O | O |
| Team file locking | -- | -- | O |
| Shared team config (server-based) | -- | -- | O |
Get Pro / Team
14-day free trial included. No credit card required.
Quick Start
1. Install
Search "EditSync" in VS Code Extensions, or:
ext install Drangon-Knight.editsync-vscode
2. Create Config
Ctrl+Shift+P / Cmd+Shift+P:
EditSync: Create Config File
If you have ~/.ssh/config, your saved hosts appear for one-click setup.
3. Edit Config
Password:
{
"name": "my-server",
"connection": {
"type": "sftp",
"host": "your-server-ip",
"port": 22,
"username": "root",
"auth": {
"method": "password",
"password": "your-password"
}
},
"remotePath": "/var/www/html",
"uploadOnSave": true
}
Private key:
{
"connection": {
"type": "sftp",
"host": "your-server-ip",
"port": 22,
"username": "root",
"auth": {
"method": "privateKey",
"privateKeyPath": "~/.ssh/id_rsa"
}
},
"remotePath": "/var/www/html",
"uploadOnSave": true
}
4. Connect
Click the status bar at the bottom, or EditSync: Connect to Server.
5. Download Server Files
First connection prompts:
- Download All -- download all files from server
- Browse in Explorer -- download specific folders via right-click
- Skip -- start with local files, sync on open handles the rest
On reconnect, if you have sync history, this dialog is skipped automatically.
6. Start Working
Save files normally. EditSync automatically:
- Backs up the server version (Pro)
- Checks for conflicts (Pro)
- Uploads your saved file to the server
Images, fonts, and binary files are auto-uploaded when copied into the project.
Configuration
Full .vscode/editsync.json
{
"name": "my-server",
"connection": {
"type": "sftp",
"host": "192.168.0.100",
"port": 22,
"username": "user",
"auth": {
"method": "privateKey",
"privateKeyPath": "~/.ssh/id_rsa",
"passphrase": ""
},
"jumpHost": {
"host": "bastion.example.com",
"port": 22,
"username": "jump-user"
},
"sshConfigPath": "~/.ssh/config"
},
"remotePath": "/var/www/html",
"uploadOnSave": true,
"backup": { "enabled": true, "maxCount": 10, "path": ".vscode/editsync-backup" },
"trash": { "enabled": true, "retentionDays": 7 },
"conflict": { "action": "warn", "showDiff": true },
"ignore": ["dist/**", "*.log"],
"watcher": { "enabled": true, "delay": 300 },
"initialize": { "method": "sftp" },
"hooks": {
"beforeUpload": "npm run lint",
"afterUpload": "pm2 restart app"
}
}
Built-in Ignore (always excluded, no config needed)
.vscode/**, .git/**, node_modules/**, .trash/**, .DS_Store, Thumbs.db
Initialize Method
| Method | Use case |
|---|---|
sftp (default) |
Standard file-by-file download |
tar |
Fast bulk download via tar archive (large projects, requires tar on server) |
Upload Hooks
| Hook | Runs on | Example |
|---|---|---|
beforeUpload |
Local (before upload) | "npm run lint" |
afterUpload |
Server via SSH (after upload) | "pm2 restart app" |
Env vars: EDITSYNC_FILE (local path), EDITSYNC_REMOTE (remote path).
If beforeUpload fails (exit code != 0), upload is cancelled. If afterUpload fails, upload still succeeds (logged only).
Auth Methods
| Method | Use case |
|---|---|
password |
Simple password |
privateKey |
SSH key (.pem, .ppk, with optional passphrase) |
agent |
SSH agent forwarding |
interactive |
2FA, OTP |
Connection Types
SFTP (Standard)
{ "type": "sftp", "host": "192.168.0.100", "port": 22, "username": "root",
"auth": { "method": "password", "password": "your-password" } }
SFTP + Jump Host
{ "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" } }
Docker Container
{ "type": "docker", "host": "my-container-name", "username": "root" }
Kubernetes Pod
{ "type": "k8s", "host": "my-pod-name", "username": "default" }
host= pod name,username= namespace
AWS SSM Session Manager
{ "type": "aws-ssm", "host": "i-0123456789abcdef0", "username": "ec2-user" }
No SSH keys needed. Requires AWS CLI + SSM plugin.
Commands
| Command | Tier | Description |
|---|---|---|
EditSync: Connect |
Free | Connect to server |
EditSync: Disconnect |
Free | Disconnect |
EditSync: Upload Current File |
Free | Upload active file |
EditSync: Download Current File |
Free | Download from server |
EditSync: Download Folder |
Free | Right-click in Remote Explorer |
EditSync: Initialize |
Free | Download all server files |
EditSync: Create Config |
Free | Generate config (SSH config import) |
EditSync: Refresh Explorer |
Free | Refresh remote file tree |
EditSync: Compare with Server |
Pro | Diff local vs server |
EditSync: Show File History |
Pro | Timeline UI with restore |
EditSync: Show File Backups |
Pro | List backup versions |
EditSync: Export Changes |
Pro | Export changed files list |
EditSync: Switch Server Profile |
Pro | Switch between profiles |
EditSync: Save Current as Profile |
Pro | Save config as profile |
EditSync: Activate Pro License |
-- | Enter license key |
How It Works
Save -> Upload
Save file -> [hooks] beforeUpload -> mtime check -> conflict?
No -> backup server file (Pro) -> upload -> [hooks] afterUpload
Yes -> Show diff (Pro) / auto-overwrite (Free)
-> Backup All / Skip All for batch handling
Open File -> Sync
Open file -> check server mtime (30s cooldown)
Same -> no action
Changed -> backup local (Pro) -> download server version -> reload editor
Delete
Delete locally -> Pro: auto-move to server .trash/ (7-day recovery)
-> Free: server file untouched
Initialize
Connect -> first time? "Download All / Browse / Skip"
Download All -> clear state -> scan server -> skip unchanged files
-> backup changed files (Pro) -> parallel download (10x)
Reconnect (has history) -> skip dialog, ready to work
Status Bar
| State | Click action |
|---|---|
| Disconnected | Connect |
| Connected | Disconnect |
Syncing ↓ 35% (7/20) src/index.js |
-- |
| Conflict | Disconnect |
| Error | Connect |
CLI
npm install -g editsync
editsync init # Create config
editsync connect # Test connection
editsync pull # Download all (server -> local)
editsync pull src/app.js # Download specific file
editsync push src/app.js # Upload specific file
editsync watch # Watch + auto-upload
editsync status # Sync status
editsync diff src/app.js # Compare local vs server (Pro)
editsync backups src/app.js # List backups (Pro)
editsync export today # Export changes (Pro)
editsync activate SEP-XXXX # Activate license
Activating Pro
- Click "Get Pro" on any Pro feature prompt
- Complete purchase -- license key input box appears in VS Code
- Paste key -- Pro activates immediately, connection auto-refreshes
Or: Ctrl+Shift+P -> EditSync: Activate Pro License
| Key prefix | Plan |
|---|---|
SEP- |
Pro |
SET- |
Team |
Pricing
| Plan | Monthly | Yearly | Features |
|---|---|---|---|
| Free | $0 | $0 | Basic sync, 1 server, no safety net |
| Pro | $2.90 | $19 | Backup, conflict, trash, unlimited servers, hooks, profiles |
| Team | $4.90/user | $39/user | Pro + file locking + shared team config |
14-day free trial. 14-day money-back guarantee.
Team Features
File Locking
When a Team user uploads a file, it's automatically locked. Other team members see "Locked by {user}" and can't overwrite. Locks are released on disconnect.
Shared Config
Place .editsync-team.json on your server (in remotePath). Team members' ignore patterns and hooks are automatically merged on connect.
{
"ignore": ["*.log", "tmp/**"],
"hooks": { "afterUpload": "systemctl reload nginx" }
}
FAQ
Is my data sent to EditSync servers? No. Files travel directly between your machine and your server via SSH/SFTP. Only license validation calls go to Polar.sh. See PRIVACY.md.
What happens when the trial expires? Pro features lock. Basic sync continues on 1 server. Existing backups remain on disk.
Where are backups stored? Locally in .vscode/editsync-backup/. Not cloud-backed. Auto-cleaned: init backups keep last 3, per-file backups keep last 10, trash cleaned after 7 days.
Why Pro for production? Free uploads without backup. One accidental overwrite = permanent loss. Pro backs up every upload and warns on conflicts.
Can I run commands after upload? Yes. Use hooks.afterUpload -- runs on server via SSH.
Docker/Kubernetes? Yes. Set connection.type to "docker" or "k8s". No SSH needed.
Connection drops? 60-second heartbeat detects drops. Auto-reconnect attempts. Failed uploads queued and retried on reconnect.
Large project slow to initialize? Set "initialize": { "method": "tar" } for bulk download via tar archive. Requires tar on server.
Important
- Backups are local only. Always maintain independent backups.
- Free tier has no safety net. Use Pro for production.
- Server is Source of Truth. Initialize downloads from server.
- See LICENSE.txt for full terms.
- See PRIVACY.md for privacy policy.
License
Proprietary. See LICENSE.txt.
Copyright (c) 2025-2026 DkLib. All rights reserved.
Contact: [email protected]