trx is a minimal, git-native issue tracker focused on simplicity and low overhead.
Philosophy: Pure data layer. No daemon. No SQLite. Just JSONL files in git.
curl -fsSL https://raw.githubusercontent.com/byteowlz/trx/master/install.sh | bash# Homebrew (macOS/Linux)
brew tap byteowlz/tap
brew install trx
# Arch Linux (AUR)
yay -S trx-bingit clone https://github.com/byteowlz/trx.git
cd trx
cargo build --release- Minimal footprint with ~20 fields per issue
- Git-native: all data tracked in version control
- Simple JSONL storage with transparent legacy migration support
- Easy to understand and extend
trx/
├── crates/
│ ├── trx-core/ # Core library: Issue model, Store, Graph
│ ├── trx-cli/ # CLI binary: trx command
│ └── trx-tui/ # TUI binary: trx-tui viewer
└── .trx/ # Per-repo issue storage
├── config.toml # Repo configuration
├── ISSUES.md # Human-readable issue summary (auto-generated)
└── issues.jsonl # Canonical store: all issues, one per line
trx uses a single canonical JSONL store:
.trx/issues.jsonlis the source of truth- Git tracks normal text diffs/merges
- No active CRDT write path
Legacy note: if an old .trx/crdt/*.automerge layout is detected, trx loads it for compatibility and transparently materializes JSONL on the next mutation.
struct Issue {
id: String, // trx-xxxx (hash-based, conflict-free)
title: String,
description: Option<String>,
status: Status, // open, in_progress, blocked, closed, tombstone
priority: u8, // 0-4
issue_type: IssueType, // bug, feature, task, epic, chore
labels: Vec<String>,
created_at: DateTime,
updated_at: DateTime,
closed_at: Option<DateTime>,
deleted_at: Option<DateTime>,
dependencies: Vec<Dependency>,
// ... a few more
}trx init [--prefix PREFIX] # Initialize .trx/ directory
trx create TITLE [-t TYPE] [-p PRIORITY] [-d DESC] [--parent ID]
trx list [--status S] [--type T] [--all]
trx show ID
trx update ID [--status S] [--priority P] [--title T]
trx close ID [-r REASON] [--verification-override REASON]
trx ready # Show unblocked work
trx dep add ID --blocks OTHER
trx dep rm ID --blocks OTHER
trx verify add ID [--run-id R] --status S [--revision SHA] [--artifact URI]...
trx verify list ID
trx verify show ID RUN_ID
trx sync [-m MESSAGE] # Git add + commit .trx/
# Migration
trx import .beads/issues.jsonl [--prefix PREFIX]
trx purge-beads [--force]trx-tui # Interactive TUI
trx-tui robot triage # JSON: prioritized issues
trx-tui robot next # JSON: next recommended issue
trx-tui robot insights # JSON: graph analytics
trx-tui --workspace config.yaml # Multi-repo viewtrx supports importing from beads and uses a compatible JSONL format:
- Compatible field names:
id,title,status,priority,issue_type - Compatible dependency format:
[{issue_id, depends_on_id, type}] - Compatible workspace.yaml format for multi-repo
trx relies on normal git text merge behavior for .trx/issues.jsonl.
If merge conflicts occur, resolve them in the JSONL file and run trx sync.
# Build all crates
cargo build
# Run CLI
cargo run -p trx-cli -- list
# Run TUI
cargo run -p trx-tui
# Run tests
cargo test# 1. Initialize trx in repo
trx init --prefix myproject
# 2. Import beads issues
trx import .beads/issues.jsonl
# 3. Verify import
trx list --all
# 4. Remove beads (optional)
trx purge-beads
# 5. Commit
git add .trx/ && git commit -m "Add trx issue tracking"