A fast, lightweight GitHub Desktop–style GUI for Git on desktop, written in Python with Qt (PySide6).
No Electron runtime. Uses your system git for performance and compatibility.
- Open an existing local Git repository
- Clone a repository
- Initialize a new local repository
- Show working tree changes (status)
- View diffs (staged + unstaged)
- Stage all / unstage all
- Commit
- Pull (fast-forward only)
- Push
- Login using a GitHub token (PAT / fine-grained token)
- Create a GitHub repository from the app (via GitHub REST API)
This is an MVP. It does not yet include:
- Branch/checkout UI, merge/rebase UI
- Commit history log, blame, tags
- Partial staging (hunks/lines)
- PR/issue UI
- Submodules / LFS UI
- SSH key management
- Python 3.9+ recommended
gitinstalled and available onPATH- Packages:
PySide6requestskeyring(optional but recommended; falls back to a local file if unavailable)
Install dependencies:
pip install PySide6 requests keyringSave the app as litehub.py and run:
python litehub.py- Use File → Open repo… and select a folder that is a Git working tree.
- Use File → Clone…
- Enter a URL like
https://github.com/owner/repo.git - Choose a destination folder
- Select a repo
- Click Stage all
- Write a commit message
- Click Commit
- Click Push
- Use GitHub → Login token…
- Paste a GitHub token (PAT or fine-grained token)
Token is used for:
- GitHub API calls (e.g., “Who am I?”, create repo)
- HTTPS push/pull authentication using a temporary
GIT_ASKPASShelper (token is not embedded into the remote URL)
Your token must allow whatever you want to do:
- To create repos: permissions to create repositories for your account
- To push/pull over HTTPS: permissions for that repository
Exact permissions vary between classic PATs and fine-grained tokens; configure it in GitHub settings accordingly.
-
If
keyringis available, the token is stored in the OS keychain. -
If
keyringis not available, LiteHub stores the token at:- Linux/macOS:
~/.config/litehub/token.json(attempts to set0600permissions)
- Linux/macOS:
-
Push/pull uses
GIT_ASKPASSwith a temporary script in your temp directory to provide credentials non-interactively. -
Do not share logs/screenshots containing token values.
Make sure the folder you opened is a Git working tree (contains .git/ or is inside one).
- Ensure your remote is HTTPS (starts with
https://github.com/...) - Ensure you saved a token (GitHub → Login token…)
- Some environments may have credential helpers interfering. You can try clearing cached credentials:
- Check
git config --global credential.helper
- Check
This MVP uses git pull --ff-only to stay safe. If your branch diverged, you must resolve via merge/rebase using CLI for now.
Single-file MVP:
litehub.py— GUI, git subprocess wrapper, GitHub REST client, token storage
- Branch selector (switch/create/delete)
- Fetch button + ahead/behind indicator
- Commit history view
- Inline staging (hunks/lines)
- PR creation and listing via GitHub API
- Better clone/init flows (auto-add remote, initial commit)
- GitHub REST API auth: https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api
- Get authenticated user: https://docs.github.com/en/rest/users/users?apiVersion=2022-11-28#get-the-authenticated-user
- Create repo endpoint: https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#create-a-repository-for-the-authenticated-user
git status --porcelain: https://git-scm.com/docs/git-statusGIT_ASKPASS/GIT_TERMINAL_PROMPT: https://git-scm.com/docs/git