A git-native ticket tracker where tickets are Markdown files with YAML frontmatter, committed alongside your code. A local SQLite index enables fast queries across branches without any server or external service.
Full documentation: docs/README.md
feature/auth don't pollute main's listticketry commits — trace which commits belong to a ticket, with a
colour-coded git graph showing merged vs. unmerged workticketry thread show — read agent-to-agent design conversations
attributed by git author, directly in your terminalticketry update, and only when you
run it yourself: there is no background version check or telemetrymacOS / Linux:
curl -fsSL https://raw.githubusercontent.com/LoumTechnologies/ticketry/master/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/LoumTechnologies/ticketry/master/install.ps1 | iex
From source (needs a Rust toolchain):
cargo install --git https://github.com/LoumTechnologies/ticketry ticketry-cli ticketry-mcp
Both ticketry (CLI) and ticketry-mcp (MCP server) are installed to
~/.local/bin by default (%LOCALAPPDATA%\Programs\ticketry on Windows).
Every download is verified against the release's SHA256SUMS.
| Variable | Effect |
|---|---|
INSTALL_DIR=/usr/local/bin | install somewhere else |
VERSION=v0.1.0 | install a specific release instead of the latest |
SKIP_VERIFY=1 | skip checksum verification (not recommended) |
curl -fsSL https://raw.githubusercontent.com/LoumTechnologies/ticketry/master/install.sh | INSTALL_DIR=/usr/local/bin bash
On Windows, set $env:VERSION / $env:TICKETRY_INSTALL_DIR before piping to iex.
Prefer to read before you run? The installer is a single readable file:
install.sh / install.ps1. You can also grab a
binary straight from the releases page.
Supported platforms: Linux (x86_64, aarch64), macOS (Intel, Apple Silicon), and Windows (x86_64; ARM64 runs it under emulation).
PATH note: if
~/.local/binis not on your PATH, add it:echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # or ~/.bashrc
Verify it worked:
ticketry --version
ticketry update # install the latest release
ticketry update --check # just report whether one is available
update replaces both ticketry and ticketry-mcp in place, verifying each
download against the release's SHA256SUMS first — a failed check leaves your
existing install untouched. --tag v0.2.0 pins a specific release (including
downgrades) and --dry-run downloads and verifies without writing anything.
Ticketry never checks for updates on its own. It only talks to the network when
you run ticketry update yourself, so the offline guarantee above still holds.
If you installed with cargo install, re-run that instead.
A cloud coding session (Claude Code on the web, CI, any fresh container) clones
your repo but not the binary, so ticketry list fails until something installs
it. ticketry init offers to set up a Claude Code SessionStart hook that does
it for you:
ticketry init # prompts when run interactively
ticketry init --session-hook # install it without prompting
ticketry init --no-session-hook
It writes .claude/hooks/session-start.sh and registers it in
.claude/settings.json — commit both so everyone's sessions pick it up. The
hook installs ticketry, runs init and index, and persists PATH for the
session. It only runs in remote sessions (CLAUDE_CODE_REMOTE), so it never
touches the toolchain on your own machine, and it exits cleanly if the install
fails rather than blocking session startup.
If
.claude/is gitignored, the hook can't reach anyone else's session — git cannot re-include a file inside an ignored directory.initwarns when it detects this; narrow the rule to.claude/settings.local.jsoninstead.
Agents that read AGENTS.md also get manual install instructions from the
generated .instructions/ticketry.md, so the hook is a convenience, not a
requirement.
cd your-project
git init # if not already a git repo
ticketry init
ticketry new "Add user authentication"
ticketry new "Email notification service"
ticketry list
ticketry new "title" create a ticket
ticketry list list all tickets
ticketry list --status todo filter by status
ticketry list next unblocked tickets only
ticketry list blocked tickets waiting on deps
ticketry board kanban view
ticketry show <slug-or-id> show a ticket
ticketry status <slug> in-progress update status
ticketry commits <slug> trace commits for a ticket
ticketry thread <slug> show read the conversation
ticketry thread <slug> history view pre-refactor thread
ticketry update install the latest release
Append --help to any command for full flag reference.
ticketry commitsTraces every commit that mentions a ticket slug or UUID in its message, or touches the ticket file directly. The output overlays a git graph so you can see at a glance which work is merged and what's still on a feature branch.

* — commit is merged into the mainline* — commit is on an unmerged branch... (N unrelated commits)ticketry commits task-1
ticketry commits task-1 task-3 # multiple tickets at once
ticketry commits task-1 --plain # machine-readable output for scripts
ticketry threadThread Mode turns ticket bodies into a multi-voice conversation backed by git blame. Each participant edits the ticket file directly and commits with their identity. No signatures or special syntax — git blame is the attribution layer.

│ — another participant's words┊ — your own words (dimmed)→ needs your response flags when the assignee has unanswered messages# View the conversation
ticketry thread task-2 show
# See how the thread evolved over time (pre-refactor snapshots)
ticketry thread task-2 history
# Participate: edit the ticket file, then commit with your identity
export GIT_AUTHOR_NAME="Opus (PM)"
export GIT_AUTHOR_EMAIL="opus@yourproject.com"
git add work/task-2.task.md
git commit -m "task-2: thread reply"
ticketry-mcp exposes your ticket tracker to AI coding agents (Claude, Cursor,
etc.) via the Model Context Protocol.
ticketry mcp-setup # interactive setup for Claude Desktop / Claude Code
Or add manually to your claude_desktop_config.json:
{
"mcpServers": {
"ticketry": { "command": "/path/to/ticketry-mcp" }
}
}
See docs/mcp-setup.md for full configuration details.
Tickets are plain Markdown files with YAML frontmatter. Any extra frontmatter
fields survive round-trips and are queryable with -f key=value:
---
id: 3f2c1a4b-...
slug: task-7
status: in-progress
title: Add rate limiting
assignee: nate
priority: high
effort: 3
labels: [backend, security]
depends_on: [task-5]
---
Implement token-bucket rate limiting on the login endpoint.
Max 5 attempts per minute per IP, 429 response on breach.
ticketry list -f "effort<=3" -f "priority=high"
ticketry list -S -priority # sort by priority descending
ticketry list -c slug,title,effort # custom columns
BSD 2-Clause. See LICENSE.
Rust
88.8%
Python
2.9%
HTML
2.4%
C++
2.2%
Shell
1.9%
A git-native ticket tracker where tickets are Markdown files with YAML frontmatter, committed alongside your code. A local SQLite index enables fast queries across branches without any server or external service.
Full documentation: docs/README.md
feature/auth don't pollute main's listticketry commits — trace which commits belong to a ticket, with a
colour-coded git graph showing merged vs. unmerged workticketry thread show — read agent-to-agent design conversations
attributed by git author, directly in your terminalticketry update, and only when you
run it yourself: there is no background version check or telemetrymacOS / Linux:
curl -fsSL https://raw.githubusercontent.com/LoumTechnologies/ticketry/master/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/LoumTechnologies/ticketry/master/install.ps1 | iex
From source (needs a Rust toolchain):
cargo install --git https://github.com/LoumTechnologies/ticketry ticketry-cli ticketry-mcp
Both ticketry (CLI) and ticketry-mcp (MCP server) are installed to
~/.local/bin by default (%LOCALAPPDATA%\Programs\ticketry on Windows).
Every download is verified against the release's SHA256SUMS.
| Variable | Effect |
|---|---|
INSTALL_DIR=/usr/local/bin | install somewhere else |
VERSION=v0.1.0 | install a specific release instead of the latest |
SKIP_VERIFY=1 | skip checksum verification (not recommended) |
curl -fsSL https://raw.githubusercontent.com/LoumTechnologies/ticketry/master/install.sh | INSTALL_DIR=/usr/local/bin bash
On Windows, set $env:VERSION / $env:TICKETRY_INSTALL_DIR before piping to iex.
Prefer to read before you run? The installer is a single readable file:
install.sh / install.ps1. You can also grab a
binary straight from the releases page.
Supported platforms: Linux (x86_64, aarch64), macOS (Intel, Apple Silicon), and Windows (x86_64; ARM64 runs it under emulation).
PATH note: if
~/.local/binis not on your PATH, add it:echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # or ~/.bashrc
Verify it worked:
ticketry --version
ticketry update # install the latest release
ticketry update --check # just report whether one is available
update replaces both ticketry and ticketry-mcp in place, verifying each
download against the release's SHA256SUMS first — a failed check leaves your
existing install untouched. --tag v0.2.0 pins a specific release (including
downgrades) and --dry-run downloads and verifies without writing anything.
Ticketry never checks for updates on its own. It only talks to the network when
you run ticketry update yourself, so the offline guarantee above still holds.
If you installed with cargo install, re-run that instead.
A cloud coding session (Claude Code on the web, CI, any fresh container) clones
your repo but not the binary, so ticketry list fails until something installs
it. ticketry init offers to set up a Claude Code SessionStart hook that does
it for you:
ticketry init # prompts when run interactively
ticketry init --session-hook # install it without prompting
ticketry init --no-session-hook
It writes .claude/hooks/session-start.sh and registers it in
.claude/settings.json — commit both so everyone's sessions pick it up. The
hook installs ticketry, runs init and index, and persists PATH for the
session. It only runs in remote sessions (CLAUDE_CODE_REMOTE), so it never
touches the toolchain on your own machine, and it exits cleanly if the install
fails rather than blocking session startup.
If
.claude/is gitignored, the hook can't reach anyone else's session — git cannot re-include a file inside an ignored directory.initwarns when it detects this; narrow the rule to.claude/settings.local.jsoninstead.
Agents that read AGENTS.md also get manual install instructions from the
generated .instructions/ticketry.md, so the hook is a convenience, not a
requirement.
cd your-project
git init # if not already a git repo
ticketry init
ticketry new "Add user authentication"
ticketry new "Email notification service"
ticketry list
ticketry new "title" create a ticket
ticketry list list all tickets
ticketry list --status todo filter by status
ticketry list next unblocked tickets only
ticketry list blocked tickets waiting on deps
ticketry board kanban view
ticketry show <slug-or-id> show a ticket
ticketry status <slug> in-progress update status
ticketry commits <slug> trace commits for a ticket
ticketry thread <slug> show read the conversation
ticketry thread <slug> history view pre-refactor thread
ticketry update install the latest release
Append --help to any command for full flag reference.
ticketry commitsTraces every commit that mentions a ticket slug or UUID in its message, or touches the ticket file directly. The output overlays a git graph so you can see at a glance which work is merged and what's still on a feature branch.

* — commit is merged into the mainline* — commit is on an unmerged branch... (N unrelated commits)ticketry commits task-1
ticketry commits task-1 task-3 # multiple tickets at once
ticketry commits task-1 --plain # machine-readable output for scripts
ticketry threadThread Mode turns ticket bodies into a multi-voice conversation backed by git blame. Each participant edits the ticket file directly and commits with their identity. No signatures or special syntax — git blame is the attribution layer.

│ — another participant's words┊ — your own words (dimmed)→ needs your response flags when the assignee has unanswered messages# View the conversation
ticketry thread task-2 show
# See how the thread evolved over time (pre-refactor snapshots)
ticketry thread task-2 history
# Participate: edit the ticket file, then commit with your identity
export GIT_AUTHOR_NAME="Opus (PM)"
export GIT_AUTHOR_EMAIL="opus@yourproject.com"
git add work/task-2.task.md
git commit -m "task-2: thread reply"
ticketry-mcp exposes your ticket tracker to AI coding agents (Claude, Cursor,
etc.) via the Model Context Protocol.
ticketry mcp-setup # interactive setup for Claude Desktop / Claude Code
Or add manually to your claude_desktop_config.json:
{
"mcpServers": {
"ticketry": { "command": "/path/to/ticketry-mcp" }
}
}
See docs/mcp-setup.md for full configuration details.
Tickets are plain Markdown files with YAML frontmatter. Any extra frontmatter
fields survive round-trips and are queryable with -f key=value:
---
id: 3f2c1a4b-...
slug: task-7
status: in-progress
title: Add rate limiting
assignee: nate
priority: high
effort: 3
labels: [backend, security]
depends_on: [task-5]
---
Implement token-bucket rate limiting on the login endpoint.
Max 5 attempts per minute per IP, 429 response on breach.
ticketry list -f "effort<=3" -f "priority=high"
ticketry list -S -priority # sort by priority descending
ticketry list -c slug,title,effort # custom columns
BSD 2-Clause. See LICENSE.
Rust
88.8%
Python
2.9%
HTML
2.4%
C++
2.2%
Shell
1.9%