A terminal user interface (TUI) for Linear built with Go and tview.
- 3-pane layout (navigation tree + issues list + details view)
- Command palette for quick actions with keyboard shortcuts
- Vim-style keyboard navigation (j/k, h/l, g/G)
- Mouse support (click to focus, scroll to navigate)
- Issue descriptions with markdown rendering
- Sub-issues support (expand/collapse, create, view parent)
- Issue management (create, edit title, edit labels, archive)
- Comments (view and add)
- Status management (change status, assign/unassign)
- Search and filtering
- Sorting (by updated, created, or priority)
- My Issues vs Other Issues sections
- Agent runs via command palette (Claude or Cursor Agent)
- Agent prompt templates and streaming output with copy/resume
- Real-time issue fetching from Linear API
- Comprehensive logging system for debugging
- Settings modal with live config updates
- Themes (linear, high_contrast, color_blind) and density modes
- Status bar with context and search info
- Clipboard actions (issue ID, issue URL, agent output)
- Linear API key (set as
LINEAR_API_KEYenvironment variable) - Agent CLI for the agent command:
- Claude provider:
claude - Cursor provider:
cursor-agent(preferred) oragent
- Claude provider:
LINEAR_API_KEYis required (the API key is not stored on disk).- Settings are stored in
~/.linear-tui/config.jsonand created on first start. - Use the Settings modal from the command palette (
:->Settings) to edit and apply settings immediately. - UI settings in
config.json:theme(linear,high_contrast,color_blind) anddensity(comfortable,compact). - Agent settings live in
config.json:agent_provider(cursororclaude),agent_sandbox(enabledordisabled),agent_model(optional), andagent_workspace(optional). - Prompt templates are stored in
~/.linear-tui/prompts.jsonand edited via the "Edit agent prompt templates" command. agent_workspaceis the default workspace for agent runs and can be overridden per run in the Ask Agent modal (overrides are not persisted).
Example ~/.linear-tui/config.json:
{
"api_endpoint": "https://api.linear.app/graphql",
"timeout": "30s",
"page_size": 50,
"cache_ttl": "5m",
"log_file": "/Users/you/.linear-tui/app.log",
"log_level": "warning",
"theme": "linear",
"density": "comfortable",
"agent_provider": "cursor",
"agent_sandbox": "enabled",
"agent_model": "",
"agent_workspace": ""
}brew install roeyazroel/linear-tui/linear-tuiRequires Go 1.24 or later:
go install github.com/roeyazroel/linear-tui/cmd/linear-tui@latestOr clone and build locally:
git clone https://github.com/roeyazroel/linear-tui.git
cd linear-tui
go build ./cmd/linear-tuiDownload pre-built binaries from the Releases page.
Set your Linear API key and run the application:
export LINEAR_API_KEY="your-api-key-here"
./linear-tuiExample ~/.linear-tui/config.json:
{
"api_endpoint": "https://api.linear.app/graphql",
"timeout": "30s",
"page_size": 50,
"cache_ttl": "5m",
"log_file": "/Users/you/.linear-tui/app.log",
"log_level": "warning",
"theme": "linear",
"density": "comfortable",
"agent_provider": "cursor",
"agent_sandbox": "enabled",
"agent_model": "",
"agent_workspace": ""
}To disable logging, set log_file to an empty string in the settings file or via the Settings modal:
{
"log_file": ""
}j/↓- Move downk/↑- Move uph/←- Focus left panel/→- Focus right paneg- Jump to topG- Jump to bottomTab/Shift+Tab- Cycle between panesSpace- Toggle expand/collapse sub-issuesEnter- Select issue / Execute commandEsc- Close palette / Cancel / Clear searchq- Quit
:- Open command palette/- Open search paletteask agent- Run a terminal agent on the selected issue
r- Refresh issuesn- Create new issuee- Edit issue titleg- Edit issue labelss- Change statusa- Assign to userm- Assign to meu- Unassign issuet- Add commento- Open in browsery- Copy issue IDw- Copy issue URLx- Archive issueb- Create sub-issuep- View parent issuei- Set parent issued- Remove parent]- Expand all sub-issues[- Collapse all sub-issues
Run tests:
go test ./...Build:
go build ./cmd/linear-tui


