Skip to main content

Redmine CLI/TUI tool that wraps the Redmine REST API

Project description

redi

PyPI

redi is a Redmine CLI/TUI tool that wraps the Redmine REST API.

Demo

TUI demo

Quickstart

redi init                # interactive: enter Redmine URL and API key
redi --tui               # launch the TUI
redi issue               # or list issues

See Setup for profile / environment variable details and Usage (examples) for the full command reference.

Install

I recommend installation via uv.

uv tool install redtile  # name on PyPI is redtile, NOT redi

Setup

Config

To use redi, you need to set the Redmine URL and API key in one of the ways below.

redi init (interactive, recommended for first time)

redi init

Then, profile will be created in ~/.config/redi/config.toml like below format. You can also create profile by redi config create, and update profile by redi config update (and also by manual edit).

default_profile = "default"

["default"]
redmine_url = "https://redmine.example.com"
redmine_api_key = "<your_api_key>"
default_project_id = "1"
wiki_project_id = "2"
editor = "nvim"
language = "en"  # "en" (default) or "ja"

["sub"]
redmine_url = "https://redmine.example.com"
redmine_api_key = "<your_api_key>"
default_project_id = "2"
wiki_project_id = "3"
editor = "code"

environment variable

export REDMINE_URL=https://redmine.example.com
export REDMINE_API_KEY=<your_api_key>

Shell completion

uv tool install argcomplete
echo 'eval "$(register-python-argcomplete redi)"' >> ~/.zshrc

Usage (examples)

Most commands follow the form:

redi <resource> <action> [<resource_id>] [options]
  • <resource>issue, project, time_entry, ... (almost every resource has a short alias such as i / p / te; init / me / relation have no alias)
  • <action>list / view / create / update / delete / comment (also has aliases: v / c / u / d / co)
    • redi <resource> alone is shorthand for redi <resource> list
  • <resource_id> — required for actions that target a specific item (view, update, delete, comment)
# init
redi init # interactive

# run TUI
redi --tui

# config (alias: c)
redi config
redi config create <profile_name> --url <url> --api_key <key> # create new profile
redi config create <profile_name> --url <url> --api_key <key> --set_default
redi config update --default_profile <profile_name> # switch profile
redi config update <profile_name> --editor nvim # update profile
redi config update --language ja # switch language ("en" or "ja")
redi --profile <profile_name> issue # temporarily switch profile for this command

# project (alias: p)
redi project # list projects
redi project list # same as above (`redi project l` / `redi p list` / `redi p l` / `redi p` also work)
redi project view <project_id> # view project
redi project view <project_id> --include trackers,issue_categories
redi project create <name> <identifier>
redi project create <name> <identifier> -d "description" --is_public true
redi project update <project_id> --name renamed_project

# issue (alias: i)
redi issue # list issues
redi issue -p <project_id> -a me -s open
redi issue -q <query_id>
redi issue view <issue_id>
redi issue view <issue_id> --web # view issue with web browser
redi issue view <issue_id> --include journals,attachments,relations
redi issue create # (interactive)
redi issue create "subject" -p <project_id> -t <tracker_id> -a <user_id> -d "description"
redi issue update <issue_id> # (interactive)
redi issue update <issue_id> --status_id <status_id> -n "notes"
redi issue update <issue_id> --start_date 2026-04-26 --due_date 2026-05-31 --estimated_hours 1.5
redi issue update <issue_id> --done_ratio 70
redi issue update <issue_id> --assigned_to_id <user_id>
redi issue update <issue_id> --assigned_to_id "" # unset assignee
redi issue update <issue_id> --relate relates --to <other_issue_id>
redi issue update <issue_id> --attach ./foo.png --attach ./bar.log
redi issue comment <issue_id> "hello~"
redi issue delete <issue_id> # (confirm before delete)
redi issue delete <issue_id> -y # skip confirmation

# version (alias: v)
redi version # list versions(fixed_versions)
redi version -p <project_id>
redi version view <version_id>
redi version create <name> -p <project_id> --due_date 2026-12-31 --status open
redi version update <version_id> --status closed

# wiki (alias: w)
redi wiki
redi wiki -p <project_id>
redi wiki view <page_title>
redi wiki create # (interactive)
redi wiki update # (interactive)

# file (alias: f, project files)
redi file -p <project_id> # list
redi file create ./foo.zip -p <project_id> -d "description"

# attachment (alias: a)
redi attachment view <attachment_id>
redi attachment update <attachment_id> -f new_name.png -d "desc"
redi attachment delete <attachment_id> # confirm before delete (-y to skip)

# relation (issue relation details)
redi relation view <relation_id>

# time_entry (alias: te)
redi time_entry -p <project_id> -u me
redi time_entry create 1.5 -i <issue_id> -a <activity_id> -c "comment"
redi time_entry update <time_entry_id> --hours 2.0
redi time_entry delete <time_entry_id> # confirm before delete (-y to skip)

# me (own account)
redi me
redi me update -f <firstname> -l <lastname> -m <mail>

# membership (alias: m)
redi membership -p <project_id>
redi membership view <membership_id>

# news (alias: n)
redi news -p <project_id>

# issue_category (alias: ic)
redi issue_category -p <project_id>
redi issue_category create "category" -p <project_id>

# others
redi user # list users (alias: u)
redi tracker # list trackers (alias: t)
redi issue_status # list issue statuses (alias: is)
redi issue_priority # list priorities (alias: ip)
redi time_entry_activity # list activities (alias: tea)
redi document_category # list document categories (alias: dc)
redi role # list roles (alias: r)
redi group # list groups (alias: g)
redi custom_field # list custom fields (alias: cf)
redi query # list custom queries (alias: q)
redi search "keyword" # (alias: s)
redi --version

Development

install

uv tool install -e .

task

Common tasks (managed by task runner Task):

task check       # format → lint → typecheck → test (run before opening a PR)
task format      # uv run ruff format
task lint        # uv run ruff check
task typecheck   # uv run ty check
task test        # uv run pytest -v

Debug

redi --debug <command> # log request URLs and response status codes to ~/.config/redi/redi-debug.log
redi --debug-tui   # dump rendered TUI screens as YAML to log

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

redtile-0.0.26.tar.gz (73.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

redtile-0.0.26-py3-none-any.whl (103.4 kB view details)

Uploaded Python 3

File details

Details for the file redtile-0.0.26.tar.gz.

File metadata

  • Download URL: redtile-0.0.26.tar.gz
  • Upload date:
  • Size: 73.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for redtile-0.0.26.tar.gz
Algorithm Hash digest
SHA256 5d8bd10e0f2e9c252f4f0b6e692e30d081a7c9a2ab3dd573c0ae966e094daadc
MD5 601f72ee0beebfa7f9e911cb29ab83c9
BLAKE2b-256 b814921802e9c8ea027b37488e25001cc8997cb467104ed57f5fc46d88175328

See more details on using hashes here.

Provenance

The following attestation bundles were made for redtile-0.0.26.tar.gz:

Publisher: release.yml on kawagh/redi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file redtile-0.0.26-py3-none-any.whl.

File metadata

  • Download URL: redtile-0.0.26-py3-none-any.whl
  • Upload date:
  • Size: 103.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for redtile-0.0.26-py3-none-any.whl
Algorithm Hash digest
SHA256 b3ad48e11d53b6aa3aa8f6c5cbec392955e151e8f4b9ee68fdd35693b4caca4d
MD5 a6db46040a3c03273993ad21579531f6
BLAKE2b-256 42c619adbbb17550bd0f7b204e3bdca9925accd732f31f75cee75886f6c6ab79

See more details on using hashes here.

Provenance

The following attestation bundles were made for redtile-0.0.26-py3-none-any.whl:

Publisher: release.yml on kawagh/redi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page