{"id":48527773,"url":"https://github.com/dinisjcorreia/git-ftp-desktopapp","last_synced_at":"2026-04-07T23:02:16.901Z","repository":{"id":349851516,"uuid":"1202327521","full_name":"dinisjcorreia/git-ftp-desktopapp","owner":"dinisjcorreia","description":"Desktop GUI for git-ftp deployments with profile management, environment diagnostics, secure credential handling, and bundled git-ftp/lftp support.","archived":false,"fork":false,"pushed_at":"2026-04-07T21:24:19.000Z","size":3848,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T21:30:44.085Z","etag":null,"topics":["cross-platform","deployment","desktop-app","devtools","ftp","git-ftp","gui","react","rust","tauri","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dinisjcorreia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-05T22:35:04.000Z","updated_at":"2026-04-07T21:24:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dinisjcorreia/git-ftp-desktopapp","commit_stats":null,"previous_names":["dinisjcorreia/git-ftp-desktopapp"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/dinisjcorreia/git-ftp-desktopapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinisjcorreia%2Fgit-ftp-desktopapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinisjcorreia%2Fgit-ftp-desktopapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinisjcorreia%2Fgit-ftp-desktopapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinisjcorreia%2Fgit-ftp-desktopapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dinisjcorreia","download_url":"https://codeload.github.com/dinisjcorreia/git-ftp-desktopapp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dinisjcorreia%2Fgit-ftp-desktopapp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31532337,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cross-platform","deployment","desktop-app","devtools","ftp","git-ftp","gui","react","rust","tauri","typescript"],"created_at":"2026-04-07T23:02:16.204Z","updated_at":"2026-04-07T23:02:16.895Z","avatar_url":"https://github.com/dinisjcorreia.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Git FTP Desktop\n\nGit FTP Desktop is a cross-platform Tauri desktop app for teams that already rely on [`git-ftp`](https://github.com/git-ftp/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.\n\nCreated by [Dinis Correia](https://github.com/dinisjcorreia).\n\n## Current Status\n\n- Tauri v2 desktop app with React + TypeScript frontend and Rust backend\n- Release workflow scaffolded for:\n  - macOS Apple Silicon\n  - macOS Intel\n  - Windows x64\n  - Windows ARM64\n  - Ubuntu x64 and ARM64\n  - Debian x64 and ARM64\n  - Fedora x64 and ARM64\n- Release packaging keeps `git` external, bundles `git-ftp` and `lftp`, and includes third-party notices and license files\n\n## Key Features\n\n- Environment diagnostics for `git`, `git-ftp`, and `lftp`\n- Local repository selection, validation, and remembered repository list\n- Multiple deployment profiles per repository\n- Profile validation with command previews and optional remote probe feedback\n- Secure password storage via OS keychain / credential vault\n- Optional repo-local `git config` defaults for stable connection values\n- Tracked-change review with an in-app commit flow before deployment\n- Live stdout and stderr streaming from the backend into the UI\n- Support for `git ftp init`, `git ftp push`, `git ftp catchup`, and remote snapshot bootstrap flows\n- Destructive remote sync flow that discards local edits and downloads the current server state after confirmation\n- Remote snapshot recovery tooling, including remote `.git-ftp.log` cleanup support\n- Dry-run and verbose execution controls\n- Run history with redacted command previews and copyable debug reports\n- Repository removal controls, including optional folder deletion\n\n## Runtime Requirements\n\n### End-user requirements\n\n- `git` must be installed on the target machine\n- Release builds are designed to bundle:\n  - `git-ftp`\n  - `lftp`\n\n### Development requirements\n\n- Node.js 20+\n- npm 10+\n- Rust stable\n- Tauri v2 system prerequisites for your platform\n\n### Local development tooling notes\n\n- `git` is required for repository inspection, commits, and all deployment actions\n- `git-ftp` must be available either from a prepared bundled asset or from your local `PATH`\n- `lftp` is only required for snapshot download / remote bootstrap flows and remote cleanup operations\n- The repository ships placeholder bundled binaries for development, so fresh local clones usually rely on system-installed `git-ftp` and `lftp` until the release prep scripts are run\n\n### Typical `git` install examples\n\n#### macOS\n\n```bash\nbrew install git\n```\n\n#### Debian / Ubuntu\n\n```bash\nsudo apt install git\n```\n\n#### Fedora\n\n```bash\nsudo dnf install git\n```\n\n#### Windows\n\nInstall Git for Windows and make sure the final executable is available to GUI apps, not only one shell session.\n\n## Development\n\n### Install dependencies\n\n```bash\nnpm install\n```\n\n### Run the desktop app\n\n```bash\nnpm run tauri dev\n```\n\n### Build the frontend\n\n```bash\nnpm run build\n```\n\n### Check the Rust backend\n\n```bash\ncargo check --manifest-path src-tauri/Cargo.toml --color always\n```\n\n### Build the desktop bundle\n\n```bash\nnpm run tauri build\n```\n\n## Release Packaging\n\n### Tooling policy\n\n- `git` stays external\n- `git-ftp` is bundled from `src-tauri/resources/third-party/tools/git-ftp/git-ftp`\n- `lftp` is bundled from `src-tauri/binaries/`\n\n### Release prep scripts\n\n- [prepare-git-ftp.sh](scripts/prepare-git-ftp.sh)\n- [prepare-lftp-unix.sh](scripts/prepare-lftp-unix.sh)\n- [prepare-lftp-windows.sh](scripts/prepare-lftp-windows.sh)\n\nThese scripts fetch or copy the release-time bundled tools and their upstream license texts before public artifacts are built.\n\n### Release workflow\n\nThe GitHub Actions workflow lives at [release.yml](.github/workflows/release.yml).\n\nIt currently includes jobs for:\n\n- macOS `.dmg` bundles for Apple Silicon and Intel\n- Windows installer bundles for x64 and ARM64\n- Ubuntu `.deb` bundles for x64 and ARM64\n- Debian `.deb` bundles for x64 and ARM64\n- Fedora `.rpm` bundles for x64 and ARM64\n\n### Signing requirements\n\n#### macOS\n\nTo remove Gatekeeper warnings, configure these GitHub secrets:\n\n- `APPLE_CERTIFICATE`\n- `APPLE_CERTIFICATE_PASSWORD`\n- `APPLE_SIGNING_IDENTITY`\n- `APPLE_ID`\n- `APPLE_PASSWORD`\n- `APPLE_TEAM_ID`\n- `KEYCHAIN_PASSWORD`\n\nWithout those secrets, the workflow falls back to ad-hoc signing for macOS builds so the bundled app\nstill has a valid code signature, but Gatekeeper may still require a manual allow because the build is\nnot notarized.\n\n#### Windows\n\nTo sign installers and reduce SmartScreen warnings, configure:\n\n- `WINDOWS_CERTIFICATE_PFX`\n- `WINDOWS_CERTIFICATE_PASSWORD`\n\n### Known release caveat\n\n- Windows ARM64 currently assumes x64 `lftp.exe` may run under Windows-on-Arm x64 emulation unless a native ARM64 `lftp` package is supplied to the workflow\n\n## Licensing and Redistribution\n\nRelease packaging includes third-party notices and license files for bundled tools.\n\n- Notices file: [THIRD_PARTY_NOTICES.md](src-tauri/resources/third-party/THIRD_PARTY_NOTICES.md)\n- Release packaging guide: [release-packaging.md](docs/release-packaging.md)\n\nBundled third-party components currently documented:\n\n- `git-ftp`\n- `lftp`\n\n## App Behavior\n\n### Startup diagnostics\n\nOn launch, the app:\n\n1. Repairs the desktop process `PATH` where possible\n2. Resolves required tools from bundled resources, `PATH`, and common install locations\n3. Captures version and path information for diagnostics\n4. Loads remembered repositories and run history\n\n### Repository and profile behavior\n\n- Repositories can be opened, remembered, removed, or deleted from disk\n- Multiple deployment profiles can be stored per repository\n- Passwords are stored separately from profile metadata using the backend secret store\n- Profiles can be validated before saving, including redacted command previews and optional remote probe output\n- Profiles can persist stable connection settings into repo-local Git config before execution\n- Remembered repositories are sorted by most recently opened activity\n\n### Deployment actions\n\nSupported workflows include:\n\n- `git ftp init`\n- `git ftp push`\n- `git ftp catchup`\n- destructive remote sync into an existing local repository after confirmation\n- remote snapshot bootstrap into a local Git repository\n- remote `.git-ftp.log` cleanup when replacing an old source of truth\n\n### Commit and history behavior\n\n- The main changes view focuses on tracked files only and keeps untracked files out of the commit review list\n- Deployment actions are intended to run from a clean working tree after committing tracked changes\n- Run history stores redacted command previews, streamed logs, exit status, and changed-file summaries\n- The persisted run history is capped to the most recent 60 runs\n\n### Snapshot retry behavior\n\nIf snapshot bootstrap fails before completion, the backend removes partial local content so the same destination folder can be reused immediately on the next attempt.\n\n## Security Model\n\n- Passwords are not stored in tracked files\n- Secrets go through the Rust backend and OS credential store\n- Command execution uses argument vectors, not one giant shell string\n- Command previews redact sensitive values\n- Debug logs may still contain operationally sensitive hostnames, usernames, paths, and server responses\n\n## Project Structure\n\n```text\n.\n├── src\n│   ├── components\n│   ├── lib\n│   ├── store\n│   ├── App.tsx\n│   ├── main.tsx\n│   ├── styles.css\n│   └── types.ts\n├── src-tauri\n│   ├── binaries\n│   ├── capabilities\n│   ├── icons\n│   ├── resources\n│   ├── src\n│   ├── Cargo.toml\n│   └── tauri.conf.json\n├── scripts\n├── docs\n└── .github/workflows\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdinisjcorreia%2Fgit-ftp-desktopapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdinisjcorreia%2Fgit-ftp-desktopapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdinisjcorreia%2Fgit-ftp-desktopapp/lists"}