Automated, paranoid git backups for students and casual coding.
Project description
🔭 Git Pulsar (v0.3.0)
Automated, paranoid git backups for students and casual coding.
Git Pulsar is a background daemon that wakes up every 15 minutes, commits your work to a secluded wip/pulsar branch, and pushes it to your remote. It ensures that even if your laptop dies, your uncommitted work is safe on the server—without polluting your main history.
⚡ Features
- Set & Forget: Runs silently in the background via
launchd(macOS) orsystemd(Linux). - Non-Intrusive: Commits are pushed to a separate branch (
wip/pulsar). Yourmainbranch stays clean. - Smart Checks:
- Detects if the repo is busy (merging/rebasing) and yields.
- Prevents accidental upload of large files (>100MB).
- Auto-generates
.gitignorefor Python/LaTeX projects if missing.
- System Integration: Native desktop notifications on success or failure.
📦 Installation
macOS (Recommended)
Install via Homebrew to handle the daemon registration automatically.
brew tap jacksonfergusondev/tap
brew install git-pulsar
brew services start git-pulsar
Linux / Generic
Install via uv (or pipx) to isolate the environment, then register the systemd service.
uv tool install git-pulsar
git-pulsar install-service
🚀 Usage
1. Activate a Repository
Navigate to any project you want to back up and initialize Pulsar.
cd ~/University/Astro401
git-pulsar
This registers the path in the local registry (~/.git_pulsar_registry) and ensures the wip/pulsar branch exists.
2. Work Normally
You do not need to do anything else. Pulsar wakes up every 15 minutes to:
- Check for changes.
- Commit them to
wip/pulsar. - Push to
origin.
3. Retrieve Your Work
When you are ready to finalize your work, you can squash the backup history into your main branch:
git checkout main
git merge --squash wip/pulsar
git commit -m "Finalized assignment submission"
🛑 Stopping the Service
To deregister the background daemon and stop all backups:
git-pulsar uninstall-service
🔧 Requirements
- Python 3.12+
- Headless Auth: Your git authentication must be non-interactive (SSH keys or a cached Credential Helper). Pulsar runs in the background and cannot prompt for passwords.
🛠️ Development
This project uses modern Python tooling.
-
Clone and Install Dependencies:
git clone [https://github.com/jacksonferguson/git-pulsar.git](https://github.com/jacksonferguson/git-pulsar.git) cd git-pulsar uv sync
-
Setup Pre-commit Hooks:
pre-commit install -
Run Tests: We use
pytestfor testing andhypothesisfor property-based testing.pytest
📂 Project Structure
.
├── LICENSE
├── pyproject.toml
├── README.md
├── uv.lock
├── src
│ ├── __init__.py
│ ├── cli.py # Entry point & repo setup logic
│ ├── daemon.py # Core backup loop & git operations
│ └── service.py # Background service installer (launchd/systemd)
└── tests
├── test_cli.py
├── test_daemon.py
└── test_properties.py
📄 License
This project is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file git_pulsar-0.3.0.tar.gz.
File metadata
- Download URL: git_pulsar-0.3.0.tar.gz
- Upload date:
- Size: 3.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
002d9412bcc00f31dec955d54d545ed6d42b7dc147d9eaa3487099cf21d69de5
|
|
| MD5 |
e3c453c1706604697911b74bab0f6db7
|
|
| BLAKE2b-256 |
65149b05cca9ed1c8965bea703760010007b06f2564b5f4217c6e13f4b0dc455
|
File details
Details for the file git_pulsar-0.3.0-py3-none-any.whl.
File metadata
- Download URL: git_pulsar-0.3.0-py3-none-any.whl
- Upload date:
- Size: 3.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30d443f943fb6c0355b895fdcb6eabab09dd7cef0bfc2123f53ac53594857a70
|
|
| MD5 |
6d28da541237d32b7da121ffe5b43ab8
|
|
| BLAKE2b-256 |
80aefe5de3e85c19f43e7b980dc292cab8c9bcfabbb163cc1d8799ce73dbcda3
|