Skip to main content

jira-time

jira-time is an interactive command-line tool for logging work against Jira issues without touching the web UI. Start a timer, enter manual durations, and search across your projects from one resilient CLI.

Features

  • Interactive prompts for adding Jira Cloud or Server/Data Center instances.
  • Timer-based and manual time logging with optional comments.
  • Fast issue discovery via saved JQL, team/project views, keyword search, or direct key entry.
  • Automatic retries with sensible HTTP timeouts so transient Jira or network failures do not crash the session.
  • Stores configuration under ~/.config/jira-time/ so repeated runs pick up your saved servers and preferences.

Requirements

  • Python 3.10 or newer
  • A Jira Cloud API token or Jira Server/Data Center personal access token

Installation

jira-time is published on PyPI. Install it with your preferred Python tool:

# Via pipx (recommended for standalone CLIs)
$ pipx install jira-time

# Or install into an existing virtual environment
$ pip install jira-time

After installation the jira-time command is available on your PATH.

Quick Start

  1. Run jira-time from your terminal.
  2. On first launch you will be prompted to add a Jira server:
    • Supply the base URL, e.g. https://your-instance.atlassian.net.
    • Choose Jira Cloud - Email and API token to authenticate with Atlassian cloud credentials, or Jira Server / Data Center - Personal Access Token for self-hosted instances.
    • Enter an optional friendly name, default issue JQL, shared/team JQL, and a comma-separated list of project keys used for broader searches.
  3. Provide the requested credentials:
    • Cloud: Atlassian email address and API token (create/manage at https://id.atlassian.com/manage-profile/security/api-tokens).
    • Server/DC: Personal Access Token (PAT) generated from https://<YOUR_JIRA_SERVER>/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens.
  4. jira-time verifies the credentials and writes them to ~/.config/jira-time/jira-time.conf. Subsequent runs reuse the same server selection.

Security note: Credentials are stored unencrypted in the config file. Ensure your local user account is trusted and the directory permissions are locked down appropriately.

Using the CLI

Selecting issues

Each session starts by choosing how you would like to find tickets. Depending on your configuration you will see options such as:

  • My assigned issues - uses the per-server issue_jql (defaults to assignee=currentUser() AND statusCategory not in (Done)).
  • Shared/team buckets - shown when team_issue_jql is configured.
  • All project tickets - lists issues from the configured project_keys and filters out Done work.
  • Search Jira by keywords - runs a fuzzy search across summary and description; include a key like TEAM-123 for an exact match.
  • Search Jira with custom JQL - paste any JQL query and browse the results.
  • Enter issue key manually - type a known issue key if you already have it.

While results load, a spinner appears so you can see progress. Inside any list you may press b to return to the view selector.

You can edit saved views later by modifying ~/.config/jira-time/jira-time.conf:

[my-server]
url = https://example.atlassian.net
auth_type = cloud_token
email = alice@example.com
api_token = <redacted>
issue_jql = assignee = currentUser() AND statusCategory not in (Done)
team_issue_jql = project = MEET AND type = Task
project_keys = PROJ, OPS, MEET

Leave team_issue_jql or project_keys blank to hide those menu entries.

Logging time

Once you pick an issue you can either:

  • Start Timer - keep the terminal open while you work. Press Enter to stop the timer, review the tracked duration, and add an optional comment.
  • Manual Time Entry - type a duration such as 30m, 1h, or 2d and optionally describe the work performed.

Before submitting, jira-time lets you adjust the duration. Worklog API calls are automatically retried when Jira responds with transient errors (timeouts, HTTP 429/5xx, etc.). If retries still fail you can confirm whether to try again manually.

Resilience and timeouts

All outbound Jira requests use a three second timeout and exponential backoff. Transient failures are retried up to three times before the tool asks how you would like to proceed. This keeps long-running sessions responsive and avoids crashing with obscure tracebacks.

Demos

Automatic time logging in action:

Manual entry flow:

Advanced multi-issue workflow, including integration with did:

Resulting Jira worklogs:

Running from source

Clone the repository and install dependencies with Poetry:

$ git clone https://github.com/jonnyhoff/jira-time
$ cd jira-time
$ poetry install

Launch the CLI from the virtual environment:

$ poetry run jira-time

Development

  • The project uses Poetry for dependency management and packaging.
  • Demo assets are recorded with asciinema and rendered using agg.
  • Contributions and bug reports are welcome via GitHub issues and pull requests.

License

Distributed under the MIT License. See LICENSE for details.

Metadata

Release files for jira-time 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jira-time 1.0.0
File Size Uploaded Provenance
jira_time-1.0.0.tar.gz 14.4 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for jira-time 1.0.0
File Interpreter ABI Platform
jira_time-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.1 kB

Release files / jira_time-1.0.0.tar.gz

Download URL jira_time-1.0.0.tar.gz
Size 14.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d7e29dc466de96d8ff19ef60a1035b1620d98fff3dd8427c7acc3a1739617ae9
BLAKE2b-256 checksum
How to use checksums
5938d74f580469ac839332f7f4d598160ef829c0635cf943f14f9254269a5925
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2025.

Transparency log

Release files / jira_time-1.0.0-py3-none-any.whl

Download URL jira_time-1.0.0-py3-none-any.whl
Size 13.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f6eafa19794c4c7df7229dad1da8ea907f8c8b6b03726621974be7cb482b4200
BLAKE2b-256 checksum
How to use checksums
7c36740cf346c0cd2c441c989101ff580f8eb125aaf9ac88ad9ee53e41ab9c1b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2025.

Transparency log

Security for jira-time 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for jira_time-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2025.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page