Terminal UI for Jira and Confluence. Browse sprints, transition issues, search with JQL, and read Confluence pages.
Quick Start · Configuration · Usage · Keybindings · Development
- Sprint list view with filtering across the active sprint
- Kanban board view with status columns, card rendering, scrolling, and parent-based filtering
- Issue detail view showing metadata, progress, description, and comments rendered as Atlassian wiki markup, with parent/child navigation
- Inline actions to assign (
a), transition (m), edit (e), link (L), unlink (U), and delete (X) issues;ecovers summary, type, parent, priority, story points, labels, fix versions, and description. Transition, link, and copy-URL also work from list, board, and search views - Comments via a multi-line editor (
c) on the issue detail view - JQL search with context-aware autocomplete for fields, operators, values, and keywords, plus live user search for assignee/reporter
- Saved filters through a manager (
f) for saving, editing, duplicating, favouriting, applying, and copying JQL queries - Issue creation via a multi-step wizard covering project/type, priority, assignee search, labels, and parent issue
- Branch creation from an issue with configurable mode (local, remote, or both) and Title-Case or lowercase naming
- Issue key navigation between referenced issues (parent, children, description/comment links) via the picker (
i) - Confluence integration for browsing spaces, reading pages with full ADF rendering, viewing inline and footer comments, navigating page hierarchies, and revisiting recently viewed pages (
Tab) - Profiles for multiple Jira instances, switchable with
--profileorPin the TUI - CLI subcommands (
get,search,list,boards,wiki) that emit JSON for scripting - Setup wizard on first launch with API validation and OS keychain storage
- Direct issue opening by passing an issue key as a CLI argument
brew install undont/tap/jiruOn first launch, if required credentials are missing, jiru shows an interactive setup wizard that validates credentials against the Jira API and stores the API token in the OS keychain (macOS Keychain or SecretService on Linux). Other settings are saved to ~/.config/jiru/profiles.json. Re-open the wizard at any time with S.
jiru supports multiple named profiles for different Jira instances (e.g. work, staging). Use --profile <name> or P from the TUI to switch between profiles. Each profile stores its own credentials, project, board, and branch settings. From the profile picker you can also create (n), rename (r), and delete (x) profiles; renaming and deleting carry over or remove the profile's saved filters and recent pages, and the active profile cannot be deleted.
Settings are stored in $XDG_CONFIG_HOME/jiru/profiles.json (defaults to ~/.config/jiru/) and the API token is kept in the OS keychain. The setup wizard handles all of this automatically.
Environment variables can override profile settings when needed (e.g. for CI or scripting):
| Variable | Alias | Purpose |
|---|---|---|
JIRA_DOMAIN |
JIRA_URL |
Jira instance domain, e.g. yourorg.atlassian.net |
JIRA_USER |
JIRA_USERNAME |
Atlassian email address |
JIRA_API_TOKEN |
API token or PAT | |
JIRA_AUTH_TYPE |
basic (default) or bearer |
|
JIRA_BOARD_ID |
Board ID; if unset, the home shows the project's open issues instead of a board | |
JIRA_PROJECT |
Project key to filter the board list | |
JIRA_REPO_PATH |
Path to local git repo for branch creation | |
JIRA_BRANCH_UPPERCASE |
true for Title-Case branch names (e.g. PROJ-123-Fix-Login-Bug); otherwise lowercase (PROJ-123-fix-login-bug). The issue-key prefix is always uppercase |
|
JIRA_BRANCH_MODE |
Branch creation mode: local, remote, or both (default: local) |
The aliases (JIRA_URL, JIRA_USERNAME) provide compatibility with tools like mcp-atlassian that use different variable names. JIRA_DOMAIN strips the protocol automatically if provided.
Finding your board ID
The board ID is in the URL when viewing a board in Jira:
https://yourorg.atlassian.net/jira/software/projects/PROJ/boards/123
The board ID is 123.
jiru # Launch the TUI
jiru PROJ-123 # Open a specific issue directly
jiru --profile staging # Use a named profile
jiru --demo # Launch the in-memory demo (no real credentials needed)
jiru --version # Print version
jiru --reset # Reset all config and credentialsjiru get PROJ-123 # Fetch issue details as JSON
jiru search "JQL query" # Search issues via JQL
jiru list # List issues in active sprint
jiru boards # List available boards
jiru wiki # Confluence wiki commandsAll CLI subcommands support --profile and output JSON to stdout.
When a board is configured, the TUI opens its active sprint (falling back to the board's filter). When no board is set — choose None in the setup wizard's board step — the home shows the project's open issues (statusCategory != Done) instead. You can switch boards at any time with B.
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
d / u |
Half-page down / up |
Ctrl+E / Ctrl+Y |
Scroll one line down / up (scrollable views) |
g / G |
Jump to top / bottom |
h / l |
Move left / right (board columns) |
Enter / Space |
Open / select |
Esc |
Back one level |
q |
Quit (press q again to confirm) |
Ctrl+C |
Quit immediately |
| Key | Context | Action |
|---|---|---|
s |
Most views | Search issues (JQL) with autocomplete |
? |
Most views | Help overlay |
f |
Sprint / board / search board | Saved filters |
r |
Sprint / board / issue / search results / search board | Refresh current view |
m |
Sprint / board / search results / search board | Transition issue status |
L |
Sprint / board / search results / search board | Link issue |
y |
Sprint / board / search results / search board / wiki | Copy issue or page URL |
b |
Sprint / board / search results / search board | Toggle board / list view |
B |
Sprint / board | Switch board |
c |
Sprint / board | Create new issue |
H |
Most views | Go home (issue list) |
S |
Sprint / board | Open setup wizard |
P |
Sprint / board | Switch profile |
Tab |
Sprint / board | Switch to Confluence wiki view |
/ |
Sprint / board / search results / pickers | Filter current list |
| Key | Action |
|---|---|
o |
Open issue in browser |
y |
Copy issue URL to clipboard |
m |
Transition issue status |
c |
Add comment |
a |
Assign issue |
e |
Edit summary, type, parent, priority, story points, labels, fix versions, description |
n |
Create branch from issue |
L |
Link to another issue |
U |
Unlink (remove an existing link) |
X |
Delete issue |
w |
Toggle watch / unwatch |
p |
Navigate to parent issue |
i |
Issue picker (parent, child, mentioned) |
Global keys are suppressed when text input is active (search, create, branch, comment, etc.).
make build # Build binary → ./jiru
make test # Run tests with race detector
make lint # Run golangci-lint v2
make check # Run all checks: fmt, tidy, vet, lint, test
make build-all # Cross-compile for linux/darwin × amd64/arm64
make build-debug # Build with debug symbols (no -s -w, -gcflags='all=-N -l')
make debug # Attach Delve headless to a running ./jiru (127.0.0.1:38697)
make demo # Re-record .demo/demo.gif from .demo/demo.tape (needs vhs + ffmpeg)
make help # Show all targets