Thank you for your interest in contributing to kitcat! We are building an educational reimplementation of Git in Go, and we welcome contributors of all experience levels.
Whether you are a student looking for your first open-source contribution or a systems engineer wanting to solve complex algorithmic challenges, there is a place for you here.
Have questions? Want to discuss ideas or get help? Join our Discord server: https://discord.gg/x6henXZs
We have organized contributions into three tracks. Please choose one that matches your interest:
Note: These tracks describe issue difficulty and learning scope only. They do not define Pull Request structure, review standards, or change risk. PR review is based on the type of change (feature, fix, test, chore), not the issue difficulty label.
Labels: Easy documentation good first issue
Generally suitable if you are new to Go or Open Source
- What you do: Fix typos, add simple CLI commands, update
README.md - Example: "Fix the help message for
rm"
Labels: Medium bug core
Great if you know some Go and want to build features.
- What you do: Add new logic, fix standard bugs, handle flags.
- Example: "Implement
kitcat log -n 5"
Labels: Hard core
For contributors comfortable reasoning about complex behavior
- What you do: Graph traversal, file locking, hashing, binary formats
- Example: "Implement
reset --hardwith tree traversal"
Note: This is not applied everytime
- Go to the Issues tab or click this. Look for a label (Easy, Medium, etc)
- Comment: "/assign"
- You will be automatically assigned the issue by a bot
- You cant be working on multiple issue at a time
- When your pr is merged only then you may work on a new issue
- Go 1.24+ installed (Check
go.modfor the exact version) - A text editor (VS Code and vim recommended)
- Make sure you have Go 1.24+.
- Check with:
go version
git clone https://github.com/username/kitcat.git
cd kitcatTo keep your fork synchronized with the main repository, add the original repository as an upstream remote:
git remote add upstream https://github.com/LeeFred3042U/kitcat.gitVerify your remotes:
git remote -vYou should see:
origin https://github.com/username/kitcat.git (fetch)
origin https://github.com/username/kitcat.git (push)
upstream https://github.com/LeeFred3042U/kitcat.git (fetch)
upstream https://github.com/LeeFred3042U/kitcat.git (push)
Before starting work on a new feature, always sync your fork with upstream:
# Switch to your main branch
git checkout main
# Pull latest changes from upstream
git pull upstream main
# Push updates to your fork
git push origin mainPro Tip: Run these commands regularly to stay up to date and avoid merge conflicts!
- Use a descriptive name for your branch
- Do not work on main
- Make a new branch from the updated main
git checkout -b feat/implement-rm-command
# or
git checkout -b docs/add-status-diagramgo build -o kitcat ./cmd/main.go./kitcat init
./kitcat helpFor code:
- Write clean, idiomatic Go code
- If you are new to Go, feel free to ask for help in the PR or on our Discord server!
For documentation:
- Work as stated in the issue
- Keep check for typos
Manual testing is required
- Please include (if code changes were made, else no need) a screenshot or terminal output or screen recording in your Pull Request description proving the command works as expected
- Run
go fmt ./...before you commit, else we have issues
Before you open a PR, do these two things
-
Sync with
main:- Run:
git fetch originthen either:git rebase origin/main(preferred) orgit merge origin/main
- Confirm:
git rev-parse --abbrev-ref HEADshows your feature branch andgit rev-list --left-right --count origin/main...HEADshows your branch is up to date with or ahead oforigin/main. - If you do not sync with
main, your PR will be closed with the instruction to rebase/merge first.
- Run:
-
Squash commits for PRs targeting
main:- If your PR targets
main, it must contain exactly one commit- Squash locally:
git rebase -i origin/mainand squash into one commit - Force-push:
git push --force-with-lease origin main
- Squash locally:
- If your PR targets
NOTE: We enforce this manually - do not open a PR to
mainwith multiple commits
- Push your branch to your fork:
git push origin feat/implement-rm-command- Go to GitHub and open a Pull Request
- Keep the description concise, and reference the issue number (e.g.,
Fixes #1) - The title should be named as the issue title which is fixed by you
We require Proof of Work for every Pull Request "It works on my machine" is not enough You must include a Screenshot or Terminal Output in your PR description showing the command running successfully.
Acceptable Example (Terminal Output):
I tested the
helpcommand. Here is the output of terminal showing it
[terminal@terminal kitcat] $ ./kitcat help
usage: kitcat <command> [arguments]
These are the common KitCat commands:
tag Create a new tag for a commit
merge Merge a branch into the current branch.
ls-files Show information about files in the index
config Get and set repository or global options.
commit Record changes to the repository.
log Show the commit history
clean Remove untracked files from the working directory
init Initialize a new KitCat repository
add Add file contents to the index.
diff Show changes between the last commit and staging area
Use 'kitcat help <command>' for more information about a commandOR
I tested
addandcommitcommand(since both go together). Here is the output of terminal shown in a screenshot
KitCat's architecture diagrams are stored in .puml format and exported as .png.
If you are creating new diagrams, follow the same workflow used for editing existing ones.
All source files live under:
docs/architecture/<section>/
Each diagram should always consist of:
diagram-name.puml (source file)
diagram-name.png (exported image checked into the repo)
We use the following extension so contributors can preview and export diagrams:
- Name: PlantUML Viewer
- ID:
BenkoSoftware.plantumlviewer - Publisher: BenkoSoftware
- Version: 1.1.0
- Install the extension
- Press
Ctrl + Shift + P, search PlantUML - Add keybindings for(because it makes it easier):
- Open Preview
- Export as PNG
- Create or edit the
.pumlfile - Open the preview to confirm the diagram renders correctly
- Export to PNG
- Commit both files inside the architecture directory following this structure:
docs/
└── architecture/
└── <section-name>/
├── <diagram-name>.puml
└── <diagram-name>.png
Pull Requests missing the PNG export will be rejected.
Please refer to SECURITY.md for details. Issues involving data loss, repository corruption, or checkout/reset overwrites must be reported privately via the email listed in SECURITY.md and must NOT be reported via public GitHub issues or Pull Requests
Please note that this project is released with a Code of Conduct. By participating in this project you agree to abide by its terms.
By contributing, you agree that your contributions will be licensed under the project's MIT License.

