AI-first · zero-dependency · file-based

Your tickets are just files. The board is a bonus.

An AI-first ticket system for Claude Code. Claude authors and grooms markdown tickets right in your repo; you watch them move on a neon board. Every change is a file edit, so your git history is the audit log.

/ plugin marketplace add chadfurman/ticket-kit
/ plugin install ticket-kit@ticket-kit
  tickets/TD-0001.md
---
id: TD-0001
title: Set up ticket-kit
status: in-progress
priority: P0
area: web
---
a view
TD-0001P0
Set up ticket-kit
1 / 3 done web
scaffold tickets/
pick a view mode
add the badge

the loop

You talk. The agents write the files.

There's no form to fill out and no app to switch to. You describe the work; ticket-kit's agents keep tickets/*.md in sync.

you ▸ "add a ticket to add dark mode"
ticket-author writes TD-0007
you ▸ "add a subtask: the toggle UI"
a child ticket, nested under TD-0007
you ▸ "what should I work on next?"
ticket-groomer triages, re-ranks, and unblocks

the board

A neon board you read, not edit.

A zero-dependency CLI serves it — static dashboard or a live server with ~3s updates. Cards nest subtasks and carry a [done/total] badge. It's read-only on purpose: changes happen in the files.

localhost:4317
ticket-kit's board running on its own tickets — columns of cards with nested subtasks and a done badge

why it's different

Tracking that lives where your code does.

*.md

Plain markdown

Every ticket is a markdown file with YAML frontmatter. Grep it, diff it, edit it in your editor — no database, no export.

git log

Git is the audit log

Tickets change by editing files, so every status move, re-rank, and edit is a commit. Your history already answers "who, when, why".

0 deps

Zero dependencies

The CLI is Node built-ins only — nothing to npm install to run the board. It drops into any repo and stays out of your lockfile.

read-only

The board never lies

The board is a view, not an editor. Every move is a file edit you or the AI made, sitting right there in the diff — nothing changes behind your back.

the format

One file. Nothing you can't read.

Add a parent: and a ticket nests as a subtask; leave it off and it's a top-level card. That's the whole schema.

tickets/TD-0002.md
---
id: TD-0002              # PREFIX-NNNN, matches the filename
title: Add the toggle UI
status: open          # a column key, or "icebox"
priority: P1           # P0 = most urgent
rank: 20               # tie-breaker; lower floats higher
area: web
parent: TD-0007         # OPTIONAL — makes this a subtask
created: 2026-06-21
---