In 2007, Linus Torvalds challenged the open source community with a simple idea: "A 'git for bugs', where you can track bugs locally and without a web interface." Nearly two decades later, we're proud to announce git-native-issue v1.0.2 — the first distributed issue tracker to deliver not just a tool, but a standalone, implementable format specification.
Every previous distributed issue tracker produced a tool whose "format" was simply whatever the code happened to generate. git-bug uses JSON blobs with CRDTs. Fossil uses SQLite artifacts. git-appraise uses git-notes. Each approach is locked to its implementation.
git-issue is different. The real deliverable is ISSUE-FORMAT.md — a specification that defines how to store issues using only Git's native primitives: commits, refs, and trailers. Any implementation that produces conforming refs is valid. Multiple tools can read and write the same issue data. This is the foundation for ecosystem adoption.
If the Git community blesses this format, platforms like GitHub, GitLab, and Forgejo could adopt native support for refs/issues/*, making issue portability as natural as code portability. Your issues would finally travel with your code.
Most issue trackers are centralized tools with offline modes bolted on. git-issue is distributed-first, with field-specific merge rules designed for conflict-free collaboration:
- Comments: Append-only union merge (all comments from both sides preserved)
- State: Last-writer-wins by timestamp
- Labels: Three-way set merge (additions from both sides honored, removals respected)
- Scalar fields (assignee, priority, milestone): Last-writer-wins
No central coordinator. No Lamport clocks. No CRDTs. Just deterministic, predictable merge semantics that work offline and sync anywhere.
Issues are stored as chains of commits under refs/issues/<uuid>. Each commit uses Git's standard trailer format for metadata. The issue title is the commit subject line. The description is the commit body. Everything is queryable with standard Git plumbing commands:
git for-each-ref \
--format='%(refname:short) %(contents:subject) %(trailers:key=State,valueonly)' \
refs/issues/No external database. No JSON. No custom binary formats. Just commits, trailers, and refs — the same primitives Git has used for two decades.
git-issue tracks its own development using itself. Want to see real-world usage? Clone the repo and run:
git issue ls --all
git issue show a7f3b2cOur issues are in refs/issues/*, synced via git push and git fetch like code. When you report a bug, you're creating a commit. When we close it, we're updating metadata with Git trailers. This isn't a demo — it's production.
AI coding agents need better issue tracking than TODO comments. git-native-issue provides structured, versioned, Git-native issue tracking that agents can work with directly:
Why better than TODO comments:
- Structured metadata - Priority, labels, assignee (not scattered text)
- Full history -
git log refs/issues/xyzshows issue evolution - No API limits - Everything local, no rate limits
- Async workflow - Agent creates, human triages later
Example: Code review agent
# Agent finds issues during code review
git issue create "Potential race condition in auth" \
-l security -l concurrency -p critical \
-m "Two threads can modify user.session simultaneously at line 42"
# Human reviews agent's findings
git issue ls --priority critical
git issue show abc123
git issue state abc123 --close -m "False positive - mutex exists"Your agent's work is now tracked, versioned, and synced with your code.
The Problem: Companies spend weeks building fragile scripts to migrate issues between platforms. History gets lost. Timestamps break. Comments lose formatting. GitHub's official "import issues" API is rate-limited and lossy. GitLab's importer drops metadata. There's no universal solution.
Our Solution: Git is the universal format.
# Migrate 1000+ issues from GitHub to GitLab in 2 commands
git issue import github:oldorg/oldrepo
git issue export gitlab:neworg/newrepoWhat gets preserved:
- ✅ Full comment history with original timestamps
- ✅ Issue state (open/closed)
- ✅ Labels and metadata
- ✅ Markdown formatting
- ✅ Author attribution
Real-world scenarios:
- Compliance migrations: GitHub Enterprise → GitLab self-hosted
- Cost optimization: GitHub Teams → Gitea (open source)
- Vendor independence: Any platform → Git → any other platform
- Backup & archival: Export to Git refs, sync to any Git host
Because issues live in Git, they're portable by default. Your issues travel with your code, forever.
- 153 tests covering core functionality (76), GitHub bridge (36), merge rules (20), and quality-of-life features (21)
- POSIX-compliant shell scripts (works on Linux, macOS, BSD)
- Multiple installation methods: Homebrew, asdf, install script, Makefile
- Security audited with validation against trailer injection, command injection, and input sanitization
- Performance tested on repositories with 10,000+ issues
- CI/CD validated across 9 platforms (Ubuntu, macOS, Debian, Alpine, Arch)
# Install (Homebrew)
brew install remenoscodes/git-native-issue/git-native-issue
# Or use install script
curl -sSL https://raw.githubusercontent.com/remenoscodes/git-native-issue/main/install.sh | sh
# Create an issue
git issue create "Add dark mode support" -m "Users have requested this feature"
# List issues
git issue ls
# Comment and close
git issue comment a7f3b2c -m "Implemented in commit abc123"
git issue state a7f3b2c --close --fixed-by abc123
# Push issues to your remote
git push origin 'refs/issues/*'Your issues now travel with your code. No API. No web interface. Just Git.
See also: QUICKSTART.md for a complete 5-minute tutorial.
Since v1.0.0, we've added:
- Quality-of-life improvements:
--sort,--assignee,--priorityfilters,searchcommand - Enhanced testing: 153 tests (up from 117), all platforms validated
- Better packaging: Homebrew tap, asdf plugin, AUR PKGBUILD
- Improved GitHub bridge: Bidirectional sync with duplicate detection
- Documentation polish: QUICKSTART.md, CONTRIBUTING.md, better examples
This is v1.0.2 — a production-ready implementation with a stable format specification. Our roadmap:
- Submit ISSUE-FORMAT.md to the Git community for review and potential inclusion in official Git documentation
- C or Rust implementation — validates the format spec and provides a path to
contrib/git-issue/in git.git - Contribute to git.git — submit as a contrib tool (following the path of git-subtree, git-worktree)
- Ecosystem adoption — work with hosting platforms to add native
refs/issues/*support - Graduate to builtin — eventual integration as a core Git command
We're starting with a standalone tool and a solid spec. The end goal: make distributed issue tracking as foundational as distributed version control, integrated directly into Git itself.
- Repository: github.com/remenoscodes/git-native-issue
- Format Specification: ISSUE-FORMAT.md
- Quick Start: QUICKSTART.md
- Contributing: CONTRIBUTING.md
- Release v1.0.2: github.com/remenoscodes/git-native-issue/releases/tag/v1.0.2
- Homebrew tap: github.com/remenoscodes/homebrew-git-native-issue
- asdf plugin: github.com/remenoscodes/git-native-issue-asdf
- Report issues (dogfooding!):
git issue createin your clone
Clone the repo. Read the spec. Create an issue (using git-issue itself). Tell us what you think.
After 18 years, Linus's vision is finally becoming reality — not because we built a better centralized tracker, but because we built a format that makes issues as portable as code.
Let's make distributed issue tracking the default.
License: GPL-2.0 (same as Git) Author: Emerson Soares (@remenoscodes)