A visual FTP/SFTP/FTPS sync client with diff comparison and a built-in conflict merge editor.
Grid Transit scans a local folder against a remote one, shows you exactly what changed — new, modified, deleted, or in conflict — lets you inspect real line-by-line diffs before transferring anything, and gives you a proper merge editor when both sides genuinely disagree, instead of silently overwriting one side.
- 🌐 Website: see the
Website/folder for the landing page and documentation - 📦 Download: prebuilt Windows installer/portable builds are published from Releases
- 📄 License: MIT
- Side-by-side diff viewer — Monaco-powered diff editor for comparing local vs. remote file contents before syncing.
- Conflict merge editor — a git-style
<<<<<<< / ======= / >>>>>>>editor for resolving files changed on both sides. - SFTP, FTP & FTPS — connect over SSH-based SFTP, plain FTP, or encrypted FTPS.
- Two-phase scan engine — instant directory listing, followed by a background content comparison so the UI never blocks.
- Smart exclusion filters — wildcard patterns (
node_modules,*.log,.git, …) applied to every scan. - Selective bulk sync — filter by changed/conflicting/synced files, select what you want, and execute uploads, downloads and deletions in one batch with real transfer progress.
- Transfer history — a full audit log of every upload, download and deletion, with size, speed and result.
- Local & remote explorers — browse both directory trees side by side.
- Desktop app — packaged with Electron for Windows (portable
.exeor installer).
| Layer | Technology |
|---|---|
| Frontend | React 19, Vite 6, Tailwind CSS, Zustand |
| Editor | Monaco Editor (@monaco-editor/react) |
| Backend | Node.js, Express |
| Transfer protocols | ssh2-sftp-client (SFTP), basic-ftp (FTP/FTPS) |
| Desktop packaging | Electron + electron-builder |
├── src/
│ ├── pages/MainDashboard.tsx # Main application UI
│ ├── components/ # Shared UI components (context menu, etc.)
│ ├── stores/sync-store.ts # Zustand store — all client-side state & API calls
│ └── server/api-router.ts # Express API: scanning, diffing, transfers, history
├── electron/
│ └── main.cjs # Electron main process (desktop packaging)
├── server.ts # Standalone Express server (serves built frontend + API)
├── ftp_sync_workspace/ # Local workspace: demo files, cache, history (gitignored where sensitive)
└── Website/ # Marketing landing page + documentation site
Prerequisites: Node.js 18+
# 1. Install dependencies
npm install
# 2. Start the dev server (frontend + API on http://localhost:3000)
npm run devVite serves the frontend and mounts the same Express API router used in production, so npm run dev is a fully working environment on its own — no separate backend process needed.
| Script | Purpose |
|---|---|
npm run build |
Production build of the frontend (dist/) |
npm run start |
Run the standalone Express server against a production build |
npm run lint |
Type-check the project with tsc --noEmit |
npm run electron:dev |
Run the app inside an Electron window (dev mode) |
npm run electron:build |
Build the frontend, bundle the server, and package a Windows .exe/installer with electron-builder |
npm run electron:buildThis produces two artifacts in release/:
Grid Transit <version>.exe— portable, no installation requiredGrid Transit Setup <version>.exe— guided installer with a Start Menu shortcut
You can point a connection profile's Host field at another local folder on your machine instead of a real server address — Grid Transit will treat it as the "remote" side using plain file copies. This is useful for trying the full compare/sync/merge workflow risk-free before connecting to a live server. The ftp_sync_workspace/local_dir and ftp_sync_workspace/remote_dir folders in this repo are a ready-made example for this.
- Connection credentials entered in the UI are encrypted before being stored in local browser storage and never leave your machine.
- File operations are guarded against path traversal — every local and remote path is resolved and validated against its configured root before any read, write or delete.
- This is a young open-source project: review the source before pointing it at production credentials, and please open an issue if you find a security concern.
Issues and pull requests are welcome. Please open an issue describing the change before submitting a large PR.
Released under the MIT License.
A project by Devignitor · Founded by Azmat Ali Khan