Git FTP Desktop is a cross-platform Tauri desktop app for teams that already rely on git-ftp and want a safer, more legible GUI around it. The app keeps git as a system prerequisite, bundles git-ftp and lftp in release builds, stores secrets in the OS credential store, and runs deployment commands through a Rust backend.
Created by Dinis Correia.
- Tauri v2 desktop app with React + TypeScript frontend and Rust backend
- Release workflow scaffolded for:
- macOS Apple Silicon
- macOS Intel
- Windows x64
- Windows ARM64
- Ubuntu x64 and ARM64
- Debian x64 and ARM64
- Fedora x64 and ARM64
- Release packaging keeps
gitexternal, bundlesgit-ftpandlftp, and includes third-party notices and license files
- Environment diagnostics for
git,git-ftp, andlftp - Local repository selection, validation, and remembered repository list
- Multiple deployment profiles per repository
- Profile validation with command previews and optional remote probe feedback
- Secure password storage via OS keychain / credential vault
- Optional repo-local
git configdefaults for stable connection values - Tracked-change review with an in-app commit flow before deployment
- Live stdout and stderr streaming from the backend into the UI
- Support for
git ftp init,git ftp push,git ftp catchup, and remote snapshot bootstrap flows - Destructive remote sync flow that discards local edits and downloads the current server state after confirmation
- Remote snapshot recovery tooling, including remote
.git-ftp.logcleanup support - Dry-run and verbose execution controls
- Run history with redacted command previews and copyable debug reports
- Repository removal controls, including optional folder deletion
gitmust be installed on the target machine- Release builds are designed to bundle:
git-ftplftp
- Node.js 20+
- npm 10+
- Rust stable
- Tauri v2 system prerequisites for your platform
gitis required for repository inspection, commits, and all deployment actionsgit-ftpmust be available either from a prepared bundled asset or from your localPATHlftpis only required for snapshot download / remote bootstrap flows and remote cleanup operations- The repository ships placeholder bundled binaries for development, so fresh local clones usually rely on system-installed
git-ftpandlftpuntil the release prep scripts are run
brew install gitsudo apt install gitsudo dnf install gitInstall Git for Windows and make sure the final executable is available to GUI apps, not only one shell session.
npm installnpm run tauri devnpm run buildcargo check --manifest-path src-tauri/Cargo.toml --color alwaysnpm run tauri buildgitstays externalgit-ftpis bundled fromsrc-tauri/resources/third-party/tools/git-ftp/git-ftplftpis bundled fromsrc-tauri/binaries/
These scripts fetch or copy the release-time bundled tools and their upstream license texts before public artifacts are built.
The GitHub Actions workflow lives at release.yml.
It currently includes jobs for:
- macOS
.dmgbundles for Apple Silicon and Intel - Windows installer bundles for x64 and ARM64
- Ubuntu
.debbundles for x64 and ARM64 - Debian
.debbundles for x64 and ARM64 - Fedora
.rpmbundles for x64 and ARM64
To remove Gatekeeper warnings, configure these GitHub secrets:
APPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORDAPPLE_SIGNING_IDENTITYAPPLE_IDAPPLE_PASSWORDAPPLE_TEAM_IDKEYCHAIN_PASSWORD
Without those secrets, the workflow falls back to ad-hoc signing for macOS builds so the bundled app still has a valid code signature, but Gatekeeper may still require a manual allow because the build is not notarized.
To sign installers and reduce SmartScreen warnings, configure:
WINDOWS_CERTIFICATE_PFXWINDOWS_CERTIFICATE_PASSWORD
- Windows ARM64 currently assumes x64
lftp.exemay run under Windows-on-Arm x64 emulation unless a native ARM64lftppackage is supplied to the workflow
Release packaging includes third-party notices and license files for bundled tools.
- Project license: GPL-3.0-only
- Notices file: THIRD_PARTY_NOTICES.md
- Release packaging guide: release-packaging.md
Bundled third-party components currently documented:
git-ftplftp
On launch, the app:
- Repairs the desktop process
PATHwhere possible - Resolves required tools from bundled resources,
PATH, and common install locations - Captures version and path information for diagnostics
- Loads remembered repositories and run history
- Repositories can be opened, remembered, removed, or deleted from disk
- Multiple deployment profiles can be stored per repository
- Passwords are stored separately from profile metadata using the backend secret store
- Profiles can be validated before saving, including redacted command previews and optional remote probe output
- Profiles can persist stable connection settings into repo-local Git config before execution
- Remembered repositories are sorted by most recently opened activity
Supported workflows include:
git ftp initgit ftp pushgit ftp catchup- destructive remote sync into an existing local repository after confirmation
- remote snapshot bootstrap into a local Git repository
- remote
.git-ftp.logcleanup when replacing an old source of truth
The repository includes a root .git-ftp-ignore file so large runtime and export artifacts do not get redeployed during git ftp init or git ftp push.
Current exclusions focus on deployment noise rather than source files:
sessions/*.logsync_state.jsonwc-product-export-*.csv*.WordPress.*.xml- desktop metadata such as
.DS_StoreandThumbs.db
- The main changes view focuses on tracked files only and keeps untracked files out of the commit review list
- Deployment actions are intended to run from a clean working tree after committing tracked changes
- Run history stores redacted command previews, streamed logs, exit status, and changed-file summaries
- The persisted run history is capped to the most recent 60 runs
If snapshot bootstrap fails before completion, the backend removes partial local content so the same destination folder can be reused immediately on the next attempt.
- Passwords are not stored in tracked files
- Secrets go through the Rust backend and OS credential store
- Command execution uses argument vectors, not one giant shell string
- Command previews redact sensitive values
- Debug logs may still contain operationally sensitive hostnames, usernames, paths, and server responses
.
├── src
│ ├── components
│ ├── lib
│ ├── store
│ ├── App.tsx
│ ├── main.tsx
│ ├── styles.css
│ └── types.ts
├── src-tauri
│ ├── binaries
│ ├── capabilities
│ ├── icons
│ ├── resources
│ ├── src
│ ├── Cargo.toml
│ └── tauri.conf.json
├── scripts
├── docs
└── .github/workflows