riptsk
A plaintext, git-backed issue tracker that lives in your terminal.
Issues are Markdown files with YAML frontmatter, stored in a local Git repository and optionally synced with GitHub or GitLab. Everything works offline; AI features are available but never required.
Features
- Plaintext-first -- issues are readable Markdown files you can grep, edit, and version-control with standard tools
- Git-backed -- every change is committed; sync across machines with
git push/pull - Offline by default -- no network needed for day-to-day work
- Multi-remote sync -- pull/push issues to GitHub and GitLab projects with conflict detection and resolution
- Kanban board -- terminal tree view grouped by state
- Recurring tasks -- schedule daily/weekly/monthly/yearly issues from templates
- Sessions -- one-command start/end workflow for multi-host setups
- AI-optional -- generate issue bodies, auto-triage, summarize, and ask
questions about your backlog (requires
claudeorllmCLI)
Quick start
Installation
# Install to ~/.cargo/bin
# Equivalent cargo command
# Remove
Note: After installing, run
tsk initto create the issue repository before using any other command.
make install installs the Rust binary to ~/.cargo/bin/tsk.
Shell completions are generated on demand:
Usage
Issue lifecycle
When fzf is installed, omitting <ID> opens an interactive picker.
Branching & pull requests
Each issue carries an id-slug field (e.g., 42-fix-login-bug) that doubles
as the branch name. The workflow enforces a strict chain:
task → branch → PR/MR.
# ... work on the branch, commit, push ...
tsk branch must be run from within the project's git working directory (not
$RIPTSK_REPO). It creates the branch locally and pushes it to origin.
tsk pr detects the current branch, finds the matching issue (by branch or
id-slug frontmatter field), and creates a pull request (GitHub) or merge
request (GitLab) with:
- Title:
Resolve "<issue title>" - Body:
Closes #<issue_number>followed by the issue body
The issue is automatically moved to in-progress if it was in backlog or
todo. The PR/MR URL is stored in the issue's pr_url frontmatter field.
Kanban board
The default board lanes are: todo, in-progress, and done. Custom
boards and states can be defined in the boards section of riptsk.yaml.
To open the board in nvim, set ui.opener in riptsk.yaml:
Move issues between lanes (states) and reorder within a lane:
Sync with GitHub / GitLab
Requires a configured remote in riptsk.yaml and an API token
(GITHUB_TOKEN/GH_TOKEN for GitHub, GITLAB_TOKEN for GitLab).
Templates
Built-in templates: task, bug, feature, weekly-review.
Recurring tasks
Recurring definitions live in riptsk.yaml and support daily, weekly (with
day_of_week), monthly (with day_of_month), and yearly frequencies.
Sessions
For multi-host workflows where $RIPTSK_REPO is a Git repository:
AI features
Requires ai.enabled: true in riptsk.yaml and the claude or llm CLI with
an Anthropic API key.
Configuration
Git hooks
Issue format
Issues are Markdown files stored in $RIPTSK_REPO/issues/. Each file has YAML
frontmatter followed by a Markdown body:
id: WHL-042
title: Fix wormhole stabilizer retry logic
state: in-progress
board: personal
project: wormhole-router
priority: high
labels: [bug, temporal-drift]
assignee: ppuffin
cycle: 2026-Q1
order: 1
due: 2026-03-20
The stabilizer retry logic does not back off correctly...
Key frontmatter fields: id, title, state, board, project, org,
priority (low/medium/high/urgent), labels, assignee, milestone,
cycle, order, due, recurring.
Local issues get a provisional LOCAL-<hex> ID until first sync, when they
receive a project-prefixed ID (e.g., WHL-042).
Dependencies
Required
- git
- Rust toolchain (for building from source)
Optional
| Tool | Used for |
|---|---|
fzf |
Interactive issue selection |
claude or llm |
AI features |
bash |
Managed hook script execution after tsk hooks install |
yq, jq |
Managed hook validation after tsk hooks install |
Configuration
riptsk follows the XDG Base Directory Specification:
| Variable | Default | Contents |
|---|---|---|
$RIPTSK_REPO ($XDG_DATA_HOME/riptsk) |
~/.local/share/riptsk |
Issues, templates, riptsk.yaml |
$XDG_CONFIG_HOME/riptsk |
~/.config/riptsk |
config.env |
$XDG_CACHE_HOME/riptsk |
~/.cache/riptsk |
View cache, ID map |
The main configuration file is riptsk.yaml in $RIPTSK_REPO. Run tsk init to
generate one with sensible defaults. Key sections:
- defaults -- default board, state, priority, template for new issues
- remotes -- GitHub/GitLab project connections
- boards -- kanban board definitions with custom state lists
- ui -- opener command, tree depth, fzf options
- ai -- model, enabled features
- sync -- conflict detection toggle
- recurring -- recurring task definitions
Development
Pre-commit hooks enforce formatting, linting, and security checks on commit and
push. See .pre-commit-config.yaml for the full hook list.