Skip to main content

tendril

A keyboard-driven JIRA companion. A local SQLite cache mirrors whole JIRA projects; a Textual TUI browses them offline; a small set of write operations (comment, link, feature-flags) lets you push back without leaving the terminal. Local tags and alerts surface related issues as you browse — the coworker's "logos need light/dark alternatives" issue pops up as a card when you open the PO's "add logo to layout" ticket, ready to link in one keystroke.

Deliberately narrow: this is a personal tool, not a team dashboard.

Install

uv tool install tendril-jira        # or: pipx install tendril-jira
tendril config init                 # walks through URL, email, API token
tendril whoami                      # verifies auth

Both installers put tendril on your PATH. Config lives at ~/.config/tendril/config.toml; the API token in the OS keyring; the cache at ~/.local/share/tendril/tendril.db. See docs/config.md for token rotation, manual TOML editing, and per-instance settings.

For a throwaway trial without installing, uvx tendril-jira config init works too — but the config, keyring entry, and cache still persist on disk between runs.

First sync

tendril sync project MMINT   # pulls every issue in MMINT into the cache (paginated)
tendril show MMINT-42        # prints an issue from the cache
tendril sync incremental     # from then on, refreshes only what changed
tendril sync link-types      # caches the instance's issue-link types (Blocks, Relates, …)

Run sync link-types at least once so the link modal in the TUI can offer a real chooser instead of a free-text field. Re-run only when your JIRA admin adds or renames a link type.

See docs/sync.md for sync issue (single-issue fallback), the rename-migration behavior, and the intended workflow in detail.

Watchlist

A marker layer on top of the cache — adding a key never touches JIRA. Watchlisted rows show a marker in the TUI overview and render in the accent color.

See docs/watchlist.md for watchlist add, remove, list, and the TUI shortcuts.

TUI

Run with no subcommand:

tendril

Three screens plus a global search.

Overview — a table of every cached issue, with a column marking watchlisted rows.

key binding
a add issue key to watchlist
d drop watchlist marker on highlighted row
w toggle watchlist-only filter
o toggle open-only filter (hides done statuses)
s run incremental sync
r reload from cache
open issue detail
q quit

Issue detail — metadata plus tabs (Description, Comments, Links, Flags) on the left, a Surfaces panel on the right (7:3 split).

key binding
r refetch this issue from JIRA
c add a comment (ctrl+s in the modal to submit)
l link this issue to another key (chooser + ctrl+s to submit)
x remove the highlighted link (Links tab only)
f edit the feature-flags custom field
t edit local tags on this issue
A toggle the alert marker on this issue
s focus the Surfaces panel
p open this issue's parent
(on a surface card) open the link modal
esc back

Sprint watchlist — every cached issue that sits in an active sprint. Populated dynamically from the cache; no manual add. Needs [fields].sprint = "customfield_XXXXX" in config.toml so the sync layer pulls the sprint customfield.

key binding
s run incremental sync
r reload from cache
open issue detail
esc back to the previous screen

Global — works from any screen:

key binding
/ search cached issues by key, tag, or summary (#tag narrows to tags only)
shift+s open the sprint watchlist
ctrl+p command palette (Sync project… + one per synced project)

Tags and alerts

Two local layers on top of the cache. Neither is pushed to JIRA.

  • Tags are free-form labels on cached issues (logo, branding, deal-placement, …).
  • Alerts mark an issue as one you want reminded of. When you open a different cached issue, alerts that share at least one tag surface as cards on the right-hand Surfaces panel. Press on a card to link the two issues.

The trigger is tag overlap — there are no rule files.

See docs/tags-and-alerts.md for the full CLI (tag add/remove/set/list, alert add/remove/list), the --json output shape for LLM pipelines, and the TUI shortcuts.

Feature flags

The f binding in the TUI is only useful once you set the custom-field id for feature flags:

[fields]
feature_flags = "customfield_10457"

The field is assumed to be a JIRA labels-type custom field (payload shape ["flag_a", "flag_b"]). Empty submit clears all flags. Full config layout: docs/config.md.

Design notes

  • Sync fills the cache; the watchlist, tags, and alerts sit on top. Separate tables, each opt-in.
  • Every write refetches the touched issue. No local mutation bypasses JIRA — the cache stays honest. Tags and alerts are local-only and never touch JIRA.
  • Whole-project sync only. Per-issue single fetches exist (sync issue KEY) but are a fallback; the intended workflow is sync project KEY once, then sync incremental from there.
  • JIRA rename resilience. If JIRA has moved an issue to another project, sync issue OLDKEY follows the redirect, cache is upserted under the new key, and any watchlist entry for the old key is migrated.
  • Alembic runs on startup. init_schema calls alembic upgrade head against the SQLite cache; every schema change is a migration in src/tendril/migrations/versions/.

Contributing

Setup, tests, layout, and the release rite live in CONTRIBUTING.md.

Download files

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

Source Distribution

tendril_jira-1.2.0.tar.gz (54.1 kB view details)

Uploaded Source

Built Distribution

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

tendril_jira-1.2.0-py3-none-any.whl (70.3 kB view details)

Uploaded Python 3

File details

Details for the file tendril_jira-1.2.0.tar.gz.

File metadata

  • Download URL: tendril_jira-1.2.0.tar.gz
  • Upload date:
  • Size: 54.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.23

File hashes

Hashes for tendril_jira-1.2.0.tar.gz
Algorithm Hash digest
SHA256 805a7d5634825c941a24ac86cbd05dd394dc2ba499308c93450345367a57242b
MD5 687e91a2b6c8c7cc2d3d771c02d12760
BLAKE2b-256 7b5ac5b788e535eab5a4a798df5ff23f3ff44f64283e08c2c3b4289cd978f7c5

See more details on using hashes here.

File details

Details for the file tendril_jira-1.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for tendril_jira-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 508a17db6ff2a9a714cc87208934a9ba93b91648c36fa211992cf453ac4f491f
MD5 57ad4034569bc92be5ed6e9e710f0b65
BLAKE2b-256 3b872e6ec531911ea6d084401085dd4e71cb5a6771e0d25dbdec3aa74de5c0c5

See more details on using hashes here.

Release history Release notifications | RSS feed

1.2.2

2 files

1.2.1

2 files

This release

1.2.0 This release

2 files

1.1.0

2 files

1.0.0

2 files

Supported by

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