EditSyncSafe, 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.
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, or:
2. Create Config
If you have 3. Edit ConfigPassword:
Private key:
4. ConnectClick the status bar at the bottom, or 5. Download Server FilesFirst connection prompts:
On reconnect, if you have sync history, this dialog is skipped automatically. 6. Start WorkingSave files normally. EditSync automatically:
Images, fonts, and binary files are auto-uploaded when copied into the project. ConfigurationFull
|
| 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: eorud0713@gmail.com