Results pane

Stop manually typing long jq paths to explore nested JSON — navigate the output visually and let jiq build the path for you.

You guess at paths, hit errors, retype, try again:

$ jq '.data.users[0].profile.settings.notifications' data.json null $ jq '.data.users[0].profile.preferences.notifications' data.json null $ jq '.data.users[0].settings.notifications' data.json {"email": true, "sms": false}

Move the cursor to the row you want, press >:

Query: .data.users[0] ▸ "name": "Alice" ▸ "email": "alice@co.dev" ──── ▸ "settings": { ← cursor here ▸ "notifications": {...} Press > → query becomes .data.users[0].settings Press > → query becomes .data.users[0].settings.notifications Press < → back to .data.users[0].settings

To focus the results pane, press Shift+Tab or click it.


Use j and k (or arrow keys) to move the cursor one line at a time.

To move Press
1 line j k
10 lines J K
Half page Ctrl+d Ctrl+u PgDn PgUp
First line g Home
Last line G End
1 column left/right h l
10 columns left/right H L
Left edge 0
Right edge $

A two-finger horizontal trackpad swipe also scrolls the output left/right, on terminals that emit horizontal scroll events (Ghostty, kitty, WezTerm; inside tmux requires tmux 3.4+). See Mouse.

The title bar shows the result type and the jq path of the value on the cursor row.


Zoom into a nested value

When you see a nested object or array you want to inspect, move the cursor to that row and press >.

jiq appends the path of that value to your current query and re-runs it. The output now shows only that piece of data.

Zooming into nested values
Query: .
Cursor on: "users": [...]
 
> pressed
 
Query: .users
Cursor on: {"name": "Alice", ...}
 
> pressed
 
Query: .users[0]
Query with cursor on email field
.
After pressing >
.users[0].email

Step back to the previous query

Press < to undo the last zoom. jiq restores the previous query, cursor position, and scroll offset.

A clickable [ < Back ] badge also appears on the top-left of the results pane border whenever there is something to step back to. Click it to undo the last zoom — same effect as the keyboard chord.

You can zoom in multiple levels — each > is remembered, and each < steps back one level.

.users[0].email
<
.users[0]
<
.users
<
.

Expand an array

When the cursor is on an element inside an array and you want to see all elements at once, press *.

jiq replaces the array index in the path with [], showing every element.

Cursor on .users[2].tags[1]
"rust"
After pressing *
.users[2].tags[] "rust" "tui" "json"

Step up one level

Press ^ to remove the last segment from the path — moving up the hierarchy.

.users[0].name
^
.users[0]
^
.users
^
.

Unlike <, pressing ^ does not push to the history ring — you cannot < back through it.


Show a value alongside its key

When a value like "alice" is useful but you also want to see its key, move the cursor to that value and press }.

jiq rewrites the query to wrap the value in an object: .users[0].name becomes .users[0] | {name}, showing {"name": "alice"}.

Cursor on .users[0].name
"alice"
After pressing }
.users[0] | {name} {"name": "alice"}

Walk between siblings

When the cursor is on a child of an object or array, hop to the next or previous sibling without scrolling line by line:

  • Press ] to jump to the next sibling
  • Press [ to jump to the previous sibling

The cursor lands on the sibling’s row — the query is not rewritten. Wraps around at the boundaries.

Sibling navigation
Object keys:
"users": [...] ← cursor
"meta": {...}
"config": {...}
 
] → cursor jumps to "meta"
] → cursor jumps to "config"
] → wraps to "users"

Use this to scan an object’s keys or array elements quickly, then press > to zoom into the one you want.


Select and copy specific lines

To copy only part of the output:

1
Press v to enter visual mode
2
Use j/k to extend selection
3
Press y to copy to clipboard

To copy the entire result without selecting, press Ctrl+Y or Ctrl+O from anywhere.


Decode an error

When a query fails, the ⚠ Syntax Error badge appears and the last successful result stays on screen. Press Ctrl+E to open the error overlay.

jiq rewrites jq’s terse stderr into a plain-language explanation plus a concrete fix, so you rarely have to decode the raw message yourself:

Raw jq error
jq: error: syntax error, unexpected end of file at <top-level>, line 1, column 5: .foo[ ^ jq: 1 compile error
jiq error overlay (Ctrl+E)
Incomplete query: jq reached the end while still expecting more. Try: Close the '['; e.g. .foo[0] or .foo[]. jq: line 1, column 5

The overlay recognizes the common failure modes — incomplete queries, type and index mismatches, iterating over a non-collection, unusable field names, and unknown functions (with a “did you mean” suggestion). Anything it doesn’t recognize is shown verbatim, so no detail is lost.

This works across jq 1.6 and newer. Older jq releases phrase errors differently and append a misleading (Unix shell quoting issues?) hint; jiq normalizes those so the overlay reads the same regardless of which jq you have installed.

The AI assistant still receives jq’s raw error message, which language models read fluently.


Read the status indicators

Indicator What it means
L1-20/100 (0%) (top-right border) Line/position indicator: visible line range, total lines, and scroll percentage. It lives in the top-right corner of the results border so it stays visible even when the AI or help box overlays the bottom of the screen. During an active search the match count takes this slot instead.
Syntax Error The query has a syntax error; the previous result stays visible
No Results The query is valid but produces no output
No Matches A search is active but nothing matched
Execution time in yellow The query took 200ms-1s
Execution time in red The query took over 1s

All keys

Key Action
j k Move cursor 1 line
J K Move 10 lines
Ctrl+d PgDn Half page down
Ctrl+u PgUp Half page up
g Home First line
G End Last line
h l Scroll 1 column
H L Scroll 10 columns
0 Left edge
$ Right edge
> Zoom into value at cursor
< Step back to previous query
* Expand array at cursor
^ Remove last path segment
} Wrap leaf value as {key} object
] [ Jump cursor to next / previous sibling (wraps)
v V Enter visual line selection
y Copy selection (or full result if none)
Horizontal swipe (two fingers) Scroll left/right (terminal-dependent)