Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
860e061
fix(jgit): implement safety checks for force-with-lease and push results
JamGmilk Apr 26, 2026
9457aa5
fix(jgit): use ResetType.MERGE to preserve uncommitted changes
JamGmilk Apr 26, 2026
50ed258
fix(jgit): auto-stash uncommitted changes before hard reset
JamGmilk Apr 26, 2026
c38b620
fix(jgit): add per-repository locks to prevent concurrent git operations
JamGmilk Apr 26, 2026
e440f2b
refactor(security): remove HMAC integrity protection from credential …
JamGmilk Apr 26, 2026
0eba309
fix(security): unify auto-lock timeout for password and biometric ses…
JamGmilk Apr 26, 2026
65e030a
refactor(repo): remove duplicate getSavedRepos function
JamGmilk Apr 26, 2026
a2d0ec2
fix: call MyReposViewModel.onCredentialUnlocked() after credential un…
JamGmilk Apr 26, 2026
23b0752
fix(credential): use exact or subdomain match for host credential res…
JamGmilk Apr 26, 2026
d49dbf0
fix(jgit): change clean to respect .gitignore settings
JamGmilk Apr 26, 2026
d4b84f2
fix(security): clear password from memory after master password setup
JamGmilk Apr 26, 2026
8048b87
fix(jgit): discardChanges now restores from HEAD instead of index
JamGmilk Apr 26, 2026
9b506d0
fix(jgit): properly return Result from unstageFile method
JamGmilk Apr 26, 2026
67c3a82
fix: resolve multiple security and performance issues
JamGmilk Apr 26, 2026
3b0ac16
feat(security): migrate to biometric-compose
JamGmilk Apr 27, 2026
da5ed86
feat(language): implement unified language switching
JamGmilk Apr 27, 2026
bdd2ad8
refactor(biometric): remove duplicate auth implementations
JamGmilk Apr 27, 2026
9e1316d
refactor(security): unify SSH fingerprint computation
JamGmilk Apr 27, 2026
0bb0215
fix(credentials): resolve import credentials button not working
JamGmilk Apr 27, 2026
254f8ae
refactor(security): centralize credential session and auto-lock manag…
JamGmilk Apr 27, 2026
8c25dbf
chore(deps): remove unused dependencies
JamGmilk Apr 27, 2026
8c3b705
fix(ui): show unlock dialog directly in StatusScreen and CredentialSc…
JamGmilk Apr 27, 2026
170be8a
refactor(ui): hoist string resources to composable scope
JamGmilk Apr 28, 2026
9fa897f
chore: fix various lint warnings and code style issues
JamGmilk Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions .idea/dictionaries/project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

172 changes: 44 additions & 128 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,148 +1,64 @@
<p align="center">
<img src="./app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp" width="200" alt="FuwaGit Logo" />
</p>
<div align="right">

# <p align="center">FuwaGit</p>

</br>

<p align="center">
<img alt="API" src="https://img.shields.io/badge/API%2026+-50f270?logo=android&logoColor=black&style=for-the-badge"/>
<img alt="Kotlin" src="https://img.shields.io/badge/Kotlin-a503fc?logo=kotlin&logoColor=white&style=for-the-badge"/>
<img alt="Jetpack Compose" src="https://img.shields.io/badge/Jetpack%20Compose-4285F4?logo=jetpackcompose&logoColor=white&style=for-the-badge"/>
<img alt="Material You" src="https://custom-icon-badges.demolab.com/badge/Material%20You-lightblue?logo=material-you&logoColor=333&style=for-the-badge"/>
</p>

</br>

<div align="center">

# Overview

FuwaGit is a lightweight and powerful Git client for Android that brings full Git operations to your mobile device. Whether you're managing repositories, committing changes, or collaborating with others, FuwaGit provides a smooth and intuitive experience with secure credential management.

Built with modern Android technologies including Jetpack Compose and Material Design 3, FuwaGit offers a beautiful interface while maintaining robust functionality for developers on the go.

Fuwa (ふわ): light and airy~
**English** | [简体中文](README.zh-Hans.md)

</div>

# Screenshots


<p align="center">
<img src="screenshots/Screenshot_1.jpg" width="300" />
<img src="screenshots/Screenshot_2.jpg" width="300" />
<img src="screenshots/Screenshot_6.jpg" width="300" />
</p>


# Download

Go to the [Releases](https://github.com/JamGmilk/FuwaGit/releases/latest) and download the latest APK.

# Installation Instructions

1. Clone the repository:
```bash
git clone https://github.com/JamGmilk/FuwaGit.git
```
2. Install dependencies using Gradle:
```bash
./gradlew build
```
3. The debug APK will be generated at:
```bash
app/build/outputs/apk/debug/app-debug.apk
```

# Tech Stack

| Component | Technology |
|:----------|:----------|
| Language | Kotlin |
| UI Framework | Jetpack Compose |
| Design System | Material Design 3 |
| Git Library | Eclipse JGit 6.8.0 |
| SSH | JSch |
| DI | Hilt |
| Min SDK | 26 (Android 8.0) |
| Target SDK | 36 |

# ✨ Features
<div align="center">

## Git Operations
<img src="./app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp" width="192" alt="FuwaGit Logo" />

- **Clone** - Clone remote repositories via HTTPS or SSH
- **Commit** - Stage changes and create commits with custom messages
- **Push** - Push commits to remote repositories
- **Pull** - Pull changes from remote with merge/rebase support
- **Fetch** - Fetch updates without merging
- **Branch Management** - Create, delete, rename, checkout branches
- **Merge** - Merge branches with conflict detection
- **Rebase** - Interactive rebase support
- **Tags** - Create, delete, and push tags (lightweight and annotated)
- **Reset** - Soft, mixed, and hard reset support
- **Diff** - View file differences with syntax highlighting
# FuwaGit

## Repository Management
![API](https://img.shields.io/badge/API%2026+-50f270?logo=android&logoColor=black&style=for-the-badge)
![Kotlin](https://img.shields.io/badge/Kotlin-a503fc?logo=kotlin&logoColor=white&style=for-the-badge)
![Jetpack Compose](https://img.shields.io/badge/Jetpack%20Compose-4285F4?logo=jetpackcompose&logoColor=white&style=for-the-badge)
![Material You](https://custom-icon-badges.demolab.com/badge/Material%20You-lightblue?logo=material-you&logoColor=333&style=for-the-badge)

- **Multi-Repo Support** - Manage multiple repositories simultaneously
- **Local Repos** - Add existing local Git repositories
- **Remote Cloning** - Clone from GitHub, GitLab, Bitbucket, or any Git server
- **Repository Info** - View detailed repository information
- **Clean** - Remove untracked files with preview
FuwaGit is a lightweight and powerful Git client for Android. Built with modern technologies like Jetpack Compose and Material Design 3, it offers a beautiful interface for developers on the go.

## Security
*Fuwa (ふわ): light and airy~*

- **Master Password** - Encrypt all stored credentials with AES-256
- **Biometric Unlock** - Use fingerprint to quickly unlock credentials
- **Secure Storage** - Android Keystore-backed credential encryption
- **SSH Key Management** - Generate and store Ed25519/RSA SSH keys
- **HTTPS Credentials** - Securely store usernames and personal access tokens
- **Auto-Lock** - Configurable automatic vault locking
---
</div>

## User Experience
## Screenshots

- **Material Design 3** - Modern and beautiful UI with dynamic theming
- **Dark/Light Mode** - System-following or manual theme selection
- **Multi-language** - English and Simplified Chinese support
| | | |
|:------------------------------------------------------:|:------------------------------------------------------:|:------------------------------------------------------:|
| <img src="screenshots/Screenshot_1.jpg" width="300" /> | <img src="screenshots/Screenshot_2.jpg" width="300" /> | <img src="screenshots/Screenshot_6.jpg" width="300" /> |

## Download

# Dependencies
Grab the latest APK from the [Releases](https://github.com/JamGmilk/FuwaGit/releases/latest) page.

- [Eclipse JGit](https://www.eclipse.org/jgit/) - Pure Java implementation of Git
- [JSch](https://github.com/mwiede/jsch) - SSH2 protocol implementation
- [Bouncy Castle](https://www.bouncycastle.org/) - Cryptographic algorithms
- [Jetpack Compose](https://developer.android.com/jetpack/compose) - Modern declarative UI
- [Material 3](https://developer.android.com/compose/material3) - Material Design components
- [Hilt](https://dagger.dev/hilt/) - Dependency injection
- [Kotlinx Serialization](https://kotlinlang.org/docs/serialization.html) - JSON parsing
## Tech Stack

| Component | Technology |
|:------------------|:------------------|
| **Language** | Kotlin |
| **UI Framework** | Jetpack Compose |
| **Design System** | Material Design 3 |
| **Git Library** | Eclipse JGit |
| **SSH** | JSch |
| **DI** | Hilt |
| **Min SDK** | 26 (Android 8.0) |

# License
## Features

```xml
MIT License
### Git Operations
- **Full Lifecycle**: Clone (HTTPS/SSH), Commit, Push, Pull, and Fetch.
- **Branching**: Create, delete, rename, and checkout branches easily.
- **Advanced**: Merge with conflict detection, interactive rebase, and tags support.
- **Resets**: Support for Soft, Mixed, and Hard resets.
- **Diff View**: Built-in syntax highlighting for viewing changes.

Copyright (c) 2026 JamGmilk
### Security & UX
- **Biometric Lock**: Protect your Git credentials with fingerprint/face unlock.
- **AES-256 Encryption**: Secure storage backed by the Android Keystore.
- **SSH Key Gen**: Generate Ed25519 or RSA keys directly in the app.
- **Dynamic Theming**: Full support for Material You and Dark Mode.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
</div>
## License
Copyright 2026 JamGmilk
MIT License
64 changes: 64 additions & 0 deletions README.zh-Hans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<div align="right">

[English](README.md) | **简体中文**

</div>

<div align="center">

<img src="./app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp" width="192" alt="FuwaGit 图标" />

# FuwaGit

![API](https://img.shields.io/badge/API%2026+-50f270?logo=android&logoColor=black&style=for-the-badge)
![Kotlin](https://img.shields.io/badge/Kotlin-a503fc?logo=kotlin&logoColor=white&style=for-the-badge)
![Jetpack Compose](https://img.shields.io/badge/Jetpack%20Compose-4285F4?logo=jetpackcompose&logoColor=white&style=for-the-badge)
![Material You](https://custom-icon-badges.demolab.com/badge/Material%20You-lightblue?logo=material-you&logoColor=333&style=for-the-badge)

FuwaGit 是一款轻量且强大的 Android 端 Git 客户端。基于 Jetpack Compose 和 Material Design 3 等现代技术构建,致力于为移动端的开发者提供优雅且流畅的交互体验。

*Fuwa (ふわ): 轻盈、蓬松 ~*

---
</div>

## 截图

| | | |
|:------------------------------------------------------:|:------------------------------------------------------:|:------------------------------------------------------:|
| <img src="screenshots/Screenshot_1.jpg" width="300" /> | <img src="screenshots/Screenshot_2.jpg" width="300" /> | <img src="screenshots/Screenshot_6.jpg" width="300" /> |

## 下载

这里喵~ [Releases](https://github.com/JamGmilk/FuwaGit/releases/latest)

## 🛠技术栈

| 组件 | 技术 |
|:----------|:----------|
| **编程语言** | Kotlin |
| **UI 框架** | Jetpack Compose |
| **设计系统** | Material Design 3 |
| **Git 核心库** | Eclipse JGit |
| **SSH 协议** | JSch |
| **依赖注入** | Hilt |
| **最低支持版本** | API 26 (Android 8.0) |

## 功能特性

### Git 操作
- **完整生命周期**: 支持 Clone (HTTPS/SSH)、Commit、Push、Pull 和 Fetch。
- **分支管理**: 轻松创建、删除、重命名及切换分支。
- **高级功能**: 支持带有冲突检测的 Merge (合并)、交互式 Rebase (变基) 及 Tag (标签) 管理。
- **重置功能**: 支持 Soft、Mixed 和 Hard Reset (回退)。
- **差异查看**: 内置支持语法高亮的代码 Diff 查看器。

### 安全与体验
- **生物识别锁定**: 支持通过指纹或面部识别保护您的 Git 凭据。
- **AES-256 加密**: 存储凭据均通过 Android Keystore 支持的加密算法加密。
- **SSH 密钥生成**: 支持直接在应用内生成 Ed25519 或 RSA 密钥。
- **动态配色**: 完美适配 Material You 动态主题及深色模式。

## 许可协议
Copyright 2026 JamGmilk
MIT License
6 changes: 1 addition & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,13 @@ dependencies {
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.material.icons.extended)
implementation(libs.androidx.compose.foundation.layout)

// Other AndroidX
implementation(libs.androidx.documentfile)
implementation(libs.androidx.security.crypto)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.navigation.runtime.ktx)
implementation(libs.androidx.biometric)
implementation(libs.androidx.biometric.compose)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.datastore.preferences)

Expand All @@ -121,16 +120,13 @@ dependencies {
// Hilt
implementation(libs.hilt.android)
implementation(libs.hilt.navigation.compose)
implementation(libs.androidx.uiautomator)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.foundation.layout)
ksp(libs.hilt.compiler)

// Test Dependencies
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(libs.androidx.uiautomator)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.tooling)
Expand Down
Loading
Loading