tng is a fast, keyboard-driven terminal client for Linear. It shows
your assigned issues, the active cycle, and your team's backlog in a single grouped, filterable
list, and lets you triage — change status, assignee, or priority, comment, edit descriptions,
and create new issues — without leaving the terminal.
(Demo-mode data — see below.)
- Three views — My Issues, the active cycle, and the whole team backlog, grouped by
workflow state with unicode glyphs (
■in progress,☐todo,⚠urgent, ...) - Issue detail in three screens — description with markdown rendering, full metadata, and the comment thread
- Triage without leaving the list — optimistic status/assignee/priority changes with fuzzy pickers; instant local apply, revert on API failure
- Your editor for writing — comments, descriptions, and new issues open
$EDITOR - Branch-name yank —
Ycopies Linear's suggested git branch name
From crates.io:
cargo install tngOr from source:
cargo install --git https://github.com/tdi/tngRequires a Rust toolchain.
tng needs a Linear personal API key. Create one at
https://linear.app/settings/account/security, then provide it either way:
-
Environment variable (takes priority):
export LINEAR_API_KEY=lin_api_... -
Config file — add
api_keytoconfig.toml(see below).
Launching without a key found in either place prints setup instructions and exits cleanly.
Want to kick the tires or grab a screenshot without a real account? Run:
tng --demo # or: TNG_DEMO=1 tngDemo mode drives the full UI against built-in fake data for a fictional "ACME" team — no API key, no network calls, nothing from your real Linear workspace.
| Key | Action |
|---|---|
j/k, g/G |
move down/up, jump to top/bottom |
Enter |
open issue detail |
Tab / 1 2 3 |
switch view; inside detail: Main / Metadata / Comments sub-screens |
Shift-Tab |
previous view; inside detail: previous sub-screen |
s |
change status (picking Duplicate opens a chooser for the canonical issue) |
a |
change assignee |
p |
change priority |
T |
switch team (persisted to config) |
c |
add a comment (opens $EDITOR) |
C |
create an issue (title, then editor for description, then pickers — Esc skips a picker field) |
e |
edit description (opens $EDITOR) |
/ |
filter the current list (Enter keeps the filter, Esc clears it) |
Ctrl-K |
search all issues (workspace-wide) |
o |
open the selected issue in your browser |
y |
yank the issue identifier to the clipboard |
Y |
yank the issue's git branch name to the clipboard |
r |
refresh the current view |
? |
toggle this help overlay |
Esc |
back: close the detail view or help overlay (never quits) |
q |
back when in the detail view, otherwise quit |
tng reads config.toml from $XDG_CONFIG_HOME/tng/config.toml, falling back to
~/.config/tng/config.toml when XDG_CONFIG_HOME is unset:
api_key = "lin_api_..." # optional; LINEAR_API_KEY env var takes priority
default_team = "BIT" # optional; team key, set automatically when you press T
editor = "nvim" # optional; falls back to $EDITOR, then "vi"The file is written automatically when you switch teams with T, so the choice survives a
restart. All fields are optional and the file does not need to exist on first run.
tng writes structured logs to $XDG_STATE_HOME/tng/tng.log, falling back to
~/.local/state/tng/tng.log when XDG_STATE_HOME is unset. Set RUST_LOG to control verbosity
(defaults to info).
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
