Version 3.7.0 was built on June 8, 2026
Major New Features:
- Companion App: a new iOS app, iTerm2 Buddy,
pairs with your Mac by scanning a QR code
(iTerm2 > Companion Device Settings) and
connects over an encrypted Noise channel so you
can interact with iTerm2 via AI chat from your
phone.
Devices connect through an encrypted relay, so
they work even when the Mac and phone are on
different
networks, and end-to-end encryption ensures that
your data is only visible to you.
First-time setup is now a guided wizard: it
installs the AI and companion plugins, turns on
both features with a single password prompt,
takes your API key, and walks you through
pairing your phone.
- There's a new kind of AI chat called
"orchestration" which can view all your
sessions and operate iTerm2 for you.
- A new Session Status system was added. Sessions
can now report status that appears on their tab
with a custom subtitle, color, and dot icon.
Status can be set by a control sequence, the it2
command, or by triggers. The Session Status tool
lets you view the status of all sessions in a
window at a glance and the new Cockpit window
lets you browse status across windows.
- Claude Code integration was added. It enables
the new Session Status feature for claude code
sessions so you can see at a glance which
instance is waiting for you. It also ties in
with the new Workflows feature to facilitate
viewing diffs and performing code reviews. It
ties in with clippings so that AI-authored code
review comments can easily be sent back to
Claude code.
- Session Notes were added: floating,
draggable, resizable, collapsible multiline
text notes attached to a session that
persist across restarts.
- The new Workgroups feature let you define how to
transform a session into a cluster of related
sessions. When a session enters a Workgroup, the
cluster of related sessions is created. They can
be in split panes, separate tabs, or "peers"
which are like tabs within a split pane.
Sessions in a workgroup have a unique name, a
custom command, a customizable toolbar, and can
even have custom behavior such as to drive AI
code review or perform in-terminal diffs of a
git repo.
When a Workgroup spawns extra tabs, they are
now collected into a tab group together with
the session you entered from, and each spawned
split or tab takes the name you gave it in the
Workgroup so its tab title is recognizable.
- Added tab groups: right-click a tab and choose
Add Tab to Group to group Chrome/Firefox-style
tabs. A named, colored chip heads each group;
right-click it to rename, recolor, duplicate,
move to a new window, ungroup, or close the
group. Drag the chip to move the whole group,
within a window or into another one; drag
single tabs into, around, or out of a group.
Groups persist their name and color with the
member tabs.
- You can now create screenshots including
highlights and redactions using the Make
Screenshot menu item.
- Session archives were added. The new Session >
Archives menu has “Save Archive of Current
Session…” and “Restore Archive…” commands, and
remembers your ten most recent archives. A
per-profile setting can automatically archive a
session to a configured directory when it
closes. Restoring an archive reopens the
session’s scrollback in a new window.
New Features in Terminal Sessions:
- Right-to-left script support (bidi
reordering plus Arabic and Persian
cursive joining) is now enabled by
default. You can turn it off in
Settings > General > Experimental.
- Double-width and double-height lines
(DECDWL, DECDHL, DECSWL) are now supported
via ESC #3, #4, #5, and #6.
- Custom in-terminal buttons with SF Symbol
icons that emit a user-defined escape code
when clicked. To add one, send
OSC 1337 ; Button=type=custom;code=N;
icon= ST. The code must be
positive. To invalidate all custom buttons,
send OSC 1337 ; Button=type=custom ST.
- A control sequence to programmatically
fold and unfold blocks of output. Send
OSC 1337 ; UpdateBlock=id=;
action=fold ST (or action=unfold) where
blockID matches a previously declared
block ID (see custom escape sequence docs
"Blocks" section for details).
- A new SetProfileProperty control sequence
lets you change profile properties at
runtime. Send
OSC 1337 ; SetProfileProperty==
[;=...] ST,
e.g. set “Cursor Type” to 2 by encoding
the JSON value 2 as base64.
- OSC 52 clipboard query responses now work
with tmux 3.6+ in tmux integration.
- Added OSC 21337 for session status. Send
OSC 21337 ; indicator=<#rrggbb> ;
status= ; status-color=<#rrggbb> ST
to set the tab’s dot indicator, subtitle,
and subtitle color. Send the same sequence
with empty values to clear.
- Smooth-typing animation for underscore and
vertical-bar cursors can be enabled in
Settings > Profiles > Text.
- Relative timestamps (set via the Set
Baseline for Relative Timestamps menu)
now use Go-style unit suffixes such as
+1m23s and +2h5m, giving sub-minute
precision in the 1m–1h range that was
previously rounded to whole minutes.
- The new Fold All menu item folds everything
(aside from folds at the very top of history).
This makes it easy to keep history around
without it getting in the way.
- Added support for the Kitty drag-and-drop
protocol (OSC 72). A program running in the
terminal can accept files, text, and images
dropped onto the window, and (when it has mouse
reporting on, e.g. a full-screen TUI) can offer
its own data to be dragged out to other apps.
For a program on a remote host, dropped files
are transferred to it over the connection. Hold
Option while dropping to use the old
paste/upload behavior instead.
- Clippings is a new side panel that contains a
list of items formatted as markdown. They're a
useful place to store text that you need
temporarily.
The Claude Code integration uses Clippings to
store code review comments so they can be shared
between related sessions in a Workgroup.
New Features in Tabs, Windows, and UI:
- Left and right tabs in the Minimal theme are now
as tall as top tabs, giving subtitles room to
render legibly. The height follows the existing
Minimal tab bar height advanced setting.
- Most window types support initial size as a
percentage of the screen (used to be only number
of rows and columns).
- Tabs can be pinned so they stay put and are
protected from reordering.
- New Lock Size menu item and per-profile
preference to prevent window resizing.
- New Lock Layout menu item (in the Window
menu, next to Lock Size) that freezes a
window’s layout: it prevents splitting,
adding or closing tabs, reordering tabs,
closing or dragging panes, and moving
panes or tabs to other windows. Resizing
panes, opening new windows, and closing
the window still work.
- Panes can be locked to prevent accidental drag
and drop.
- Tabs can now be placed on the right side
of the window.
- The control-sequence-controlled progress
indicator is now shown in the tab bar.
- An active pane border can be displayed to
highlight the focused pane.
- You can now choose to show a Proxy icon in
Compact and Minimal themes.
- The tab color menu now has a color picker,
recent colors, and an eyedropper tool.
- Asymmetrical broadcasting via a per-session
broadcast-source flag lets you prevent
accidental typing in non-designated sessions
from being broadcast.
- New key binding action to send text without
broadcasting.
- Nerd Font glyphs are now rendered in pane title
bars and tabs.
- A unified dock badge combines bell count and tab
status, and the old 999 cap on the bell count
was removed.
- Split pane icons were added to the context
menu.
- Hold Option when clicking a Split button in the
Profiles panel to open the selected profiles as
splits in a new window instead of the current
one.
- Background images can now rotate through a
folder of images at a configurable interval.
Pick a folder instead of a file in
Settings > Profiles > Window > Background.
- In the Jobs view (toolbelt and status bar
popover) hovering on a row shows the full
command as a tooltip, and pressing space
opens a popover with the full command,
process ID, start time, working
directory, environment variables, and a
list of open files and network
connections.
- The status bar can now draw a separator line
between itself and the terminal content. Enable
it in the status bar layout’s advanced settings.
- Improve tab dragging: keep Metal enabled
for normal tab drags, switch reorder
slots near tab midpoints, and stabilize
split-pane target highlights.
Triggers Improvements:
- Event-based triggers can fire on events such as
a session ending or a hostname change.
- A trigger can now match when a session variable
changes to a value matching a regex.
- Triggers can be imported and exported as
.it2triggers files.
- A regex can now be used to define word
characters for a trigger.
- Nulls are now treated as spaces in trigger regex
matching.
- You can now assign a "job" to a trigger, which
ensures the trigger is only active when that job
is running. This makes it possible, for example,
to write triggers that are only active while
Claude Code is running.
AI Improvements:
- The AI chat “View History” permission is now
“View Contents”. When it is set to provide
contents automatically, a session-bound chat
includes the terminal’s visible screen with
each message, not just on-request history
tools.
- An AI chat linked to a terminal session now
stays linked when the session's shell restarts
(which happens often with the Claude Code
integration). Previously the link, its command
permissions, and orchestrator @-mentions of the
session were lost on every restart.
- Chats in the AI chat list now get an icon
drawn by your AI model from the chat
title. Chats without one show a default
icon. The prompt can be edited in
Settings > General > AI > Prompts.
- The AI command safety check now uses your
configured AI model. It runs deterministic
terminal rules first and only asks the model
when those rules cannot decide. It can send
commands to your (possibly cloud) provider, so
it is opt-in. Users who already enabled it keep
using free on-device Apple Intelligence and are
asked once whether to switch to their model.
- AI chat can connect to LAN-hosted models
over HTTP.
- Anthropic prompt caching now also covers the
conversation history, not just the system
prompt and tools. A rolling cache breakpoint
on the latest message lets long chats reread
the prior turns from cache instead of paying
full input price every turn.
- AI models updated.
- The built-in AI model list is now data-driven
and refreshes in the background, so new models
appear without updating iTerm2.
- DeepSeek v4 thinking mode is now supported.
Toggle the lightbulb in the chat toolbar to
enable. Reasoning summaries appear live in
the conversation and round-trip correctly
on multi-turn tool calls (fixes a 400 from
the API when reasoning_content was missing).
- The “Configure AI Model Manually…” popover
now has a section for custom HTTP headers
that are appended to every AI request (chat,
vector store, and file upload). Useful for
proxy auth or routing tags. Custom headers
override built-in headers with the same
name. Values are stored unencrypted in
iTerm2’s preferences.
- PDF chat attachments now work on Anthropic.
- When AI chat types into a terminal, a newline
is now sent as Return (carriage return) so it
submits the line in programs like Claude Code
instead of inserting a literal newline. The
tool also reports how many characters were
inserted.
- Added a Zero Data Retention setting under
Settings > General > AI. Turn it on if your
OpenAI organization has Zero Data Retention
enabled. iTerm2 then stops sending
previous_response_id and sets store=false, so
chats no longer fail on the second message.
- AI chat can now restart a session for you.
The “Type for You” permission was renamed
“Control Terminal” and now also gates this.
- AI chat linked to a terminal session can now
watch that session and tell you when it reaches
a state or a described condition, without
polling. Previously only orchestration chats
could set watches. If your phone is paired it
can also push you a notification when the watch
fires.
- The manual AI model editor now offers presets
for OpenAI-compatible providers (Ollama,
OpenRouter, z.ai, Qwen, MiniMax) that fill in
the endpoint for you, plus a Test Connection
button that verifies your settings and API key
before you save.
- AI chat history entries can now be deleted
from the chat list.
- AI chats now keep the provider chosen at
creation time. Settings choose the default
provider for new chats, while existing
chats only offer models from their saved
provider.
Python API Improvements:
- Move sessions to new tabs or windows via the
Python API.
- Load URLs in browser sessions from the Python
API.
- The Open URL API now supports a per-domain
allowlist.
- App.async_apply_layout atomically reshapes
one or more tabs to a target layout in a
single transaction. Supports swapping panes,
rearranging the split tree, and moving
sessions across tabs and windows. New
sessions can be created in place with
new_session leaves.
- The API server no longer lets a client flood it
with frames to exhaust memory: it bounds how
much unparsed inbound data it buffers, and a
client that floods pings but stops reading the
pongs is disconnected as misbehaving rather than
having its pongs buffered without limit. The it2
command-line client handles a flood of ping
frames iteratively instead of recursively.
Credit to NSEcho for the find.
- The Script Console has a Clear Terminated
button that removes stopped sessions from the
list, so it no longer grows without bound when
you repeatedly restart a script.
- The warning that a script’s pinned Python
version will be bumped for the new uv runtime
now has an Upgrade Now button that migrates
those scripts immediately, instead of only
when each one next runs.
Password Manager Improvements:
- Bitwarden is now a supported password manager.
- Keeper Security is also supported.
Shell Integration Improvements:
- xonsh is now a supported shell.
- Better interop with Fish 4.3, which builds in
some of shell integration.
- A new it2 command-line utility lets you perform
common actions like creating a window at the
command line. Run `it2 --help` for details.
It's automatically in your path.
SSH Integration Improvements:
- Better passphrase handling for SCP and
private keys. Wrong passphrases now retry
instead of falling through to an empty
password, and encrypted-key detection was
improved.
Tmux Improvements:
- Bracketed paste state is restored on attach
(prep for tmux’s upcoming bracket_paste_flag
format).
- The per-pane modifyOtherKeys state is now
restored on attach (using tmux 3.5+’s
pane_key_mode format), so reattaching while
nvim or another app is running keeps the
correct key reporting mode active.
- Saner defaults for which window and tab a tmux
attach uses.
- The advanced setting for where tmux windows
created outside iTerm2 open is now a three-way
choice: a new window, the focused window, or
the topmost window already hosting that tmux
session.
- A new tmux window opened with Command-T now
picks up the profile’s custom tab title, if
one is set.
Expressions and Variables:
- Arithmetic expressions and comparisons are
now supported in interpolated strings.
- You can right click on a color in settings and
choose "Bind to Expression" so that it will
takes its value from an expression (e.g., a
user-defined Variable or registered function:
see the Scripting Fundamentals section of the
documentation for details). The value should
be a string like #ff8844.
- Same for checkbox settings. The value should be
a boolean.
- A new global variable iterm2.appBundlePath
exposes the path to iTerm2.app for use in
interpolated strings.
- A new window variable window.title holds the
rendered window title, alongside the existing
session.presentationName and tab.title.
UI Improvements:
- A new setting in Settings > Appearance makes
the tab bar scrollable. When the tab bar has
more tabs than fit, instead of moving the
extras into the “More tabs” overflow menu they
stay in the bar and you scroll to reach them.
Works for top, bottom, left, and right tab
bars. A horizontal bar scrolls with a trackpad
swipe or shift + mouse wheel. On by default;
turn it off to restore the overflow menu.
The “Tab width when the tab bar is scrollable”
advanced setting sets the scrolled tab size.
- A new preference hides the session status
text from tab subtitles while keeping the
colored dot. Toggle it from the gear menu
in the Session Status toolbelt tool.
- Right-click a row in the Session Status
toolbelt tool and choose Snooze to move it
below a divider at the bottom of the list
and dim it. A snoozed entry un-snoozes
automatically the next time its status
changes.
- Contextual alternates (calt) are enabled by
default for ligature-capable fonts.
- Rename dialogs, the pane menu, and the context
menu now respect dark/light mode.
- Tab colors are written to all appearance
variants so they survive light/dark switches.
- Customizable IME color.
- Cleaner glass material on the jobs popover.
- Scroll command marks to top (instead of
centering) on Next/Previous Mark.
- A new profile setting, “Use ANSI colors
for marks” (Settings > Profiles > Colors),
draws command-prompt mark indicators using
the color preset’s ANSI blue, red, and
yellow instead of the built-in colors, so
they harmonize with any theme. Off by
default.
- ⌘-click now linkifies very long URLs in
full. Previously only the first couple
thousand characters were clickable; the
linkifier now scans onward to the next
separator so the whole URL is detected.
Input and Accessibility:
- VoiceOver now announces terminal output and
deleted characters.
- Voice dictation now works.
- A repair button was added to fix key bindings
corrupted by a 3.4.x-3.5.x migration bug.
- Ctrl/Option-modified function keys now work with
third-party global shortcuts.
- 3-finger drag is now treated like a regular drag
for mouse reporting.
- Offer to reset the key reporting mode when it
gets stuck on.
Search and Selection Improvements:
- Folded content is searched in global search.
- URL search results extend across soft boundaries
such as tmux pane dividers.
- “$” is now considered part of a URL. Used when
detecting URL boundaries for cmd-click.
- Search results refresh after window resize.
- New “Copy or Paste” pointer action. If there's a
selection, it copies. Otherwise, it pastes.
- New pointer action to copy link address.
Menus and Miscellaneous:
- New menu item to open new tabs next to the
current tab or at the end (opposite of the
default).
- New “Always show alerts with remembered
selections” option. This temporarily turns off
the "Remember my selection" feature of alert
boxes that you already saved in case you change
your mind and want to make a different
selection.
- New “Buffer input by default” profile setting
with menu item, indicator, and trigger
integration. Buffering causes text you type to
be stored until buffering is disabled by
selecting Shell > Toggle Buffer Input.
- "Copy" menu item on status bar components to
copy relevant information.
- Smart selection action URL is shown on hover.
- Offer to restore titles when an ssh session
ends.
- New "Suppress notifications from the active
session" setting.
- Undo Close now has the ⌘⇧T shortcut. Show
Tabs in Fullscreen moved to ⌘⇧U. The first
time you press ⌘⇧T in full screen, an alert
explains the change and can restore ⌘⇧T to
Show Tabs in Fullscreen with a key binding.
- Added Edit > Marks and Annotations >
Annotate Selection, so annotating a
selection can now be given a keyboard
shortcut. Previously this was only on the
right-click menu.
- The job name shown in titles, the session
icon, and automatic profile switching now
reflect the foreground job actually attached
to the terminal, hiding helper subprocesses
that run in the foreground process group but
are piped to their parent (for example an MCP
server spawned by claude, or caffeinate). The
raw deepest job is still available as the
deepestJob variable. Note that automatic
profile switching now matches the tty-attached
job, so a rule keyed on such a helper name will
no longer fire for it.
Core Improvements:
- Significant Metal rendering speedups for
non-ASCII text should result in higher frame
rates.
- Faster rendering of text with many colors (e.g.
syntax-highlighted code) by reusing attribute
dictionaries across runs instead of rebuilding
one per color span.
- Framerate is capped at 30 fps in low-power mode.
- Crash-log search was moved off the main thread
so app launch does not hang when there are a
huge number of crash logs.
- Prompt for local-network permission on launch.
- New iTerm2 menu item, Save Retrospective Debug
Logs, writes recently captured low-frequency
diagnostics to a file you choose, even when
debug logging was never turned on.
- iTerm2 now probes the local network on
every launch so macOS keeps it in the
Local Network privacy list. This recovers
the permission after a tccutil reset or an
OS upgrade, fixing commands like
“ping 10.0.0.1” failing with “no route to
host”.
- Added support for light/dark color scheme
detection and reporting (DECSET 2031 and
DSR 996/997). Programs can query whether the
terminal is light or dark and ask to be
notified when it changes, so tools like vim
and delta can adapt automatically.
- You can now run multiple concurrent
instances of iTerm2 side by side with
independent settings. Launch with
arguments:
-suite com.iterm2.unique-id-of-your-choice.
Settings Improvements:
- Window frames are remembered per-profile rather
than globally. When you open a window, the
default frame will come from a previous window
with that profile, if possible.
- Font zoom is preserved during Automatic Profile
Switching.
- User-set colors are remembered separately
from control-sequence-set colors so that they
don't get reset by control sequence.
- Special Exceptions has a new Add Preset
button with common Unicode ranges such as
Han, Hangul, and Cyrillic.
- Profiles using a custom Command can now opt
to run the command through the user’s login
shell so dotfiles set $PATH and exported
variables (API keys, GEM_HOME, etc.) before
the command starts.
- A linked AI chat can be hosted inline in
its session’s right margin. Use the chat
menu’s “Put Chat in Linked Session” item
and toggle visibility from View > Show
Inline Chat.
- Open Quickly now uses recency as a
tiebreaker, so the session list (whether
the query is empty or matches several
panes) is ordered most-recently-used
first across tabs and windows. The
current session is omitted from results
since it is never a useful jump target,
so Cmd-Shift-O followed by Enter now
jumps to the most-recently-used other
pane. A new preview side panel shows a
snapshot of the highlighted session.
Open Quickly can also be assigned a
system-wide hotkey in Settings > Keys
that works while another app is in
front, without activating iTerm2 until
you commit a selection.
- Blinking cursors can now fade smoothly
in and out instead of toggling abruptly.
Turn on “Smooth blink” in Settings >
Profiles > Text, where you can tune the
fade-in and fade-out durations, easing
curves, and how long the cursor dwells
fully visible and fully hidden between
fades. Off by default.
- When you load settings from a custom
folder, snippets, global notes, and
session icon customizations can now sync
along with your other settings. Because
notes and snippets can hold sensitive
text, iTerm2 asks once before including
them. If the same item changed both on
this Mac and in the folder, it asks which
copy to keep rather than overwriting your
changes.
- Added Window > Tab > Select Tab > Select
Next Tab Group (⌃⇧⌘]) and Select Previous
Tab Group (⌃⇧⌘[). When the current tab is
in a group, these skip over the rest of
that group. For an ungrouped tab they
behave like Select Next/Previous Tab.
- Added Window > Tab > Add Tab to New Group
and Remove Tab from Group, mirroring the
tab bar’s right-click menu but acting on
the current tab.
Bug Fixes:
- Fixed a local privilege issue where the
orphaned-session server adopter connected to a
socket in a world-writable directory without
checking who owned it. A local attacker could
pre-create the socket and man-in-the-middle a
restored session, capturing keystrokes and
output. The peer's identity is now
authenticated before anything it sends is
trusted (CVE-2026-88514). Credit to NSEcho.
- The selected tab’s bright HDR outline on
macOS Tahoe is now off by default. It is
gated behind a new “Allow HDR effects”
advanced setting because forcing the
display into HDR could hang some systems.
- In the tmux Dashboard, “Open in Tabs” is now
enabled when a single hidden window is
selected, matching “Open in Window.” Issue
12994.
- Companion Device Settings no longer prompts
for Touch ID on its own. Opening the window
or unpairing a device now shows a “Show QR
Code” button, and authentication happens only
after you click it.
- Cmd-W now closes the Companion Device
Settings window instead of beeping.
- Fixed a beachball that could occur when the
tab style preference changed: every session’s
announcement view was re-fitted synchronously,
each fit re-running an expensive text-layout
search. Measurements are now cached and reused,
and a resize to the same size no longer
re-fits.
- Fixed a multi-second hang that could occur
when a window changed appearance (for example
when another app or a second iTerm2 instance
stole focus) while in traditional fullscreen.
Setting a window to its current appearance no
longer re-triggers a refresh loop.
- On macOS Tahoe, dark-theme selected tabs no
longer draw their chrome at a fixed image
height while the tab cell uses a different
height (for example left tabs with a custom
Default tab bar height). Cap images scale to
the pill so the dual-layer look goes away
without needing a custom tab color.
- Toggling Caps Lock no longer inserts an “A”
in programs that use the Kitty keyboard
protocol with “report all keys as escape
codes.” Now it reports the key’s own code
(57358) instead of a stray modifier value
that got read as an “A.” Issue 12922.
- Split-pane dividers in different rows or columns
can now be dragged into alignment: a divider
snaps to a matching divider elsewhere in the tab
when it comes within half a cell, fixing a
sub-cell misalignment that whole-cell steps
could not correct. Double-clicking a horizontal
divider to equalize the two panes also no
longer computes the wrong size.
- The Centered window style now looks and behaves
just like a normal window (title bar,
close/minimize/zoom buttons, and the same chrome
in the Minimal and Compact themes), except that
it stays centered. It also no longer changes
size when you minimize and restore it.
- In tmux -CC sessions with pane-border-status set
to top or bottom, the pane no longer ends up a
row too tall. Previously the bottom line went
unused and the cursor landed a row high after
reattaching.
- Retrospective debug logging no longer fills its
in-memory ring so quickly on busy hosts. Several
high-frequency sites that logged large payloads
(window descriptions, view hierarchies, and stack
traces) were trimmed or moved back to regular
debug logging, extending how far back the ring
reaches.
- The proxy icon in Compact and Minimal theme
windows now hides and reveals along with the
stoplight buttons instead of staying visible
when they are hidden.
- Hiding a hotkey window on macOS 26 no longer
briefly flashes background iTerm2 windows to
the front. The window now waits for the
previously active app to come forward before
ordering out.
- Global search no longer shows blank snippets
for results found on the main screen while an
alternate-screen app (such as a full-screen TUI)
is running. Snippets are now extracted from the
same snapshot the search ran against instead of
a freshly captured one that could drift.
- Smart tab-title truncation no longer flickers
between head and tail truncation when a tab
title begins with an animated status glyph
(such as a Claude Code spinner). The glyph is
no longer counted when deciding which end of
the title to truncate.
- Session Status tool: with “Merge workgroup
statuses” on, a merged row now shows the status
of the peer you’re actually looking at (the
visible peer of the switcher) instead of
whichever peer changed most recently. A busy
code-review peer holding a steady “working”
status no longer loses the row to a sibling
chat peer the moment it goes idle.
- Tab subtitle: when a tab is split into
multiple panes, the status of the pane you’re
focused on now drives the subtitle instead of a
background pane winning on status priority. For
example, an idle pane no longer overrides the
working pane you’re looking at. A focused pane
with no status falls back to the highest
priority sibling pane.
- Code review and diff workgroup sessions now
restore showing their last output instead of
launching a stray replacement shell when the
original program is gone. The code review prompt
panel reappears only if it was open when you
quit, and its reload button remembers the prompt
you last submitted.
- Session restoration no longer breaks when iTerm2
receives a signal (such as ^C when it was
started from a terminal): the background process
server is now insulated from signals sent to
iTerm2, so your running programs survive to be
reattached on the next launch.
- Fixed a rare case where a Claude Code workgroup
was torn down even though its claude process was
still running, due to a momentary misread of the
foreground job ancestor list.
- Fixed a case where a Claude Code workgroup pane
(such as Diff or Code Review) could close itself
when its command exited and take the whole
workgroup down with it. Spawned workgroup panes
now pin their end action so the profile’s “Close
Sessions On End” setting can no longer flip them
to close on their own.
- AI chat: fixed a race where a streamed tool
call could be dispatched with empty arguments
when the response completed before its argument
chunks were consumed. The agent would loop
retrying the same call, and the turn could end
with an empty message. Finalization now
reconciles against the full response body.
- SSH integration now runs the ssh command
through your login shell, so dotfiles set up
your environment first. A custom SSH_AUTH_SOCK
(pointing at an agent that holds your keys) is
now honored, fixing “Permission denied
(publickey)” failures that only happened with
the SSH command type.
- On macOS Tahoe the tab activity/progress
indicator now draws as an outline around the
pill-shaped tab instead of a bar that crowded
the tab title and status text.
- Fixed a crash in Replace Selection (e.g.,
Replace with Pretty-Printed JSON) when the
replacement had more lines than the selection.
Also, saved locations (marks, prompt ranges)
inside the replaced region are now invalidated
instead of drifting onto unrelated lines.
- tmux integration now parses pane state
correctly on macOS 26 and later. A new
system NSString method had shadowed ours
and caused numeric fields to be dropped.
- The companion device no longer triggers a
keychain confirmation prompt when it connects
or when a notification is sent. The paired
identity is now read once at launch, while you
are present, instead of mid-connection.
- When a companion device is paired, your AI
API keys are now loaded at launch, and when a
phone pairs, so a query sent from your phone
while you are away never has to prompt for
keychain access.
- Opening Settings no longer reads the keychain
or prompts for access. The AI API key row no
longer shows an “N of 4 configured” count.
- Restoring a window with an open inline AI chat
panel now reopens the panel on the chat it was
showing, instead of widening the terminal.
- Chat lists now mark orchestrator chats with a
wand glyph. The inline chat switcher bolds chats
linked to the current session.
- Orchestrator chats now handle full-screen apps
on the alternate screen (like Claude Code)
better: they see just the current screen and
can use a new scroll-wheel tool to page back
through the app’s own history.
- Saved and copied screenshots now fill margins
and other uncovered areas with the session’s
background (including a background image, with
its blend and scaling) instead of leaving them
transparent.
- The session-logging and archive folder
pickers now use the folder you select rather
than its parent when you don’t open it first.
- SSH integration no longer leaves Ctrl+C unable
to interrupt programs on remote hosts whose
Python is older than 3.7 (e.g. CentOS 7,
AlmaLinux 8). The login shell handoff was
leaving signal generation disabled on the tty.
- Clicking a notification posted by a background
tab of a dedicated hotkey window now selects the
source tab and pane instead of leaving the
previously-selected tab in front.
- AI chat with DeepSeek no longer fails with an
"insufficient tool messages" error after a tool
call that was interrupted or left unapproved.
- A live filter no longer drops content that
arrives while it is mid-search; such lines
could previously be missing from the filtered
view until more output came in.
- Copying selected text from a porthole (such as
rendered markdown) now works in apps that
prefer rich text.
- Clicking in a porthole in an inactive split
pane now activates that pane.
- Fixed several crashes: registering a profile
hotkey for a profile with no GUID, loading a
profile whose default-bookmark value is a
boolean, listing processes over SSH when a
process has an empty command, drawing margin
background colors with a nil color, a crash when
macOS rejected presentation options during a
Spaces transition (now retried once it settles),
and a divide-by-zero when the Metal view has a
zero-size drawable.
- iTerm2 no longer spuriously offers to reset
terminal state or restore the tab and window
title when the local hostname changes (for
example when mDNS renames your .local host)
or when you run sudo. Any two localhosts are
now treated as the same host.
- AI chat no longer fails with a tool_use_id
error after an auto-approved command. The
tool call was dropped from saved history
while its result was kept; the prompt is now
repaired when reloaded, healing chats saved
by earlier versions too.
- Session notes now keep their distance from
the top-right corner of a session when it
is resized, instead of from the bottom-left.
- A tab no longer shows a stale or missing
session status (such as “waiting”) when a
pane carrying a status is closed, moved
between tabs, or reparented (for example by
entering or exiting a workgroup). The tab’s
aggregated status is now recomputed whenever
its set of sessions changes.
- Full-screen programs that don’t use the
alternate screen buffer (such as Claude
Code) no longer destroy on-screen content
when, on startup, they move the cursor to
the top of the screen and repaint over it.
The visible screen is now scrolled into
history first. Requires shell integration.
- When such a program moves the cursor above
a fold and repaints, the fold is now
scrolled into history instead of being
overwritten and left with an orphaned
unfold icon in the margin. This works even
without shell integration installed.
- The “taking a long time to check state
restoration” prompt no longer appears so
readily right after login, when the system
is busy and disk I/O is slow. The integrity
check timeout is now extended in the first
ten minutes after boot, the prompt's
wording is friendlier, and it defaults to
continuing rather than discarding windows.
Issue 11809.
- Editing a color in a color well no longer
silently switches the picker from sRGB to
P3 (or back). The color space the well is
showing is now preserved across the edit
roundtrip. Issue 12720.
- The Python API server now takes an
advisory lock on its socket directory at
startup. A second iTerm2 instance sharing
the same application-support directory
(e.g. two non-suited copies launched from
different .app bundles) will refuse to
start the API server instead of silently
unlinking and rebinding the original
instance’s socket.
- Localhost detection no longer breaks when
your computer's hostname changes (for
example after switching networks). Whether
a session is on the local machine is now
recorded when the host is first reported,
rather than recomputed later by comparing
names. This fixes the git status bar, the
workgroup diff list, opening local files,
and uploads/downloads going stale after a
rename.
- Pressing Enter to commit an IME
composition (e.g. Chinese, Japanese,
Korean) in the AI Chat input no longer
prematurely submits the unfinalized
candidate text.
- Command-clicking links in terminal output
no longer crashes when command-mark data
is unavailable.
- Open Quickly now updates the MRU order
when you jump to a session, so repeated
Cmd-Shift-O Enter cycles between the two
most-recently-used panes instead of
drifting onto a sibling pane that
happened to be active in the destination
tab. Issue 12799.
- Open Quickly recency now strictly follows
focus order. Jumping to a pane no longer
bumps the previously-active sibling in the
destination window, and structural changes
(closing a pane, splitting, restoring) in
background windows no longer reorder the
list, so Cmd-Shift-O Enter reliably
toggles between the last two focused
panes. Issue 12799.
- OSC color overrides (foreground, background,
cursor, selection, palette, and the iTerm2
SetColors variants) now survive macOS Light
/ Dark appearance switches and toggles of
the separate light / dark colors profile
setting. The override is written to every
appearance variant of the profile key so
it persists until OSC 110/111 or a manual
reset clears it.
- In an AI orchestration chat, @-mentioning a
session or workgroup now grants the chat
standing permission to control it, so the
agent acts there without the one-time
approval prompt. A notice with a Revoke
button is posted so you can take the
permission back whenever you want.
- The orchestrator’s send_text tool
now routes payloads containing control bytes
(ESC, Ctrl-C, etc.) as raw keystrokes instead
of bracketed pastes. The previous wrap turned
embedded control bytes into literal pasted
data, so e.g. sending ESC :q ENTER to a vim
session inserted “^[:q” as text instead of
quitting. Pure prompt-style text still goes
through as a paste, as Ink-based TUIs expect.
- The orchestrator’s get_screen_contents
tool now marks faint text with ⟨dim⟩…⟨/dim⟩ and
the cursor with ⟨cursor⟩. Inline shell
suggestions and ghost completions are rendered
faint and used to be indistinguishable from
text the user actually typed, so the agent
would sometimes mistake a suggestion for an
entered command.
- Showing the clippings panel in a window
zoomed to fit the display no longer grows
the window horizontally. The tab content
area absorbs the panel’s width instead,
mirroring the toolbelt’s behavior.
- The Install Claude Code Integration intro is
now presented as a real sheet attached to the
installer panel, rather than a subview
overlay. Enter now correctly activates
Continue instead of the Install/Next button
it was visually covering.
- Workgroup peer-switch and toolbar shortcuts
now fire no matter which view in the terminal
window has keyboard focus, including the Diff
peer’s Run Anyway button, the Code Review
prompt’s text view, and the clippings table.
They are now dispatched centrally instead of
relying on the focused view to forward them.
- The Claude Code installer now reliably adds
Enter/Exit Workgroup triggers to divorced
sessions whose original profile was picked.
The previous pass matched on the dict’s
KEY_ORIGINAL_GUID, which could be stale
after an arrangement reload. The walk now
also consults each live or buried session’s
runtime originalProfile reference.
- The Code Review prompt overlay no longer
drifts out of sync with light/dark mode. The
panel cached a CGColor snapshot of
windowBackgroundColor resolved against an
arbitrary NSAppearance.current, so its
background could disagree with its own text
view. It now uses the existing layer-backed
solid color view, which refreshes the color
in updateLayer under the correct drawing
appearance.
- The heavy window border no longer leaves its
corners unbordered on low-opacity windows. The
corner-radius detector failed on transparent
windows (their interior is not opaque enough),
so the border fell back to a wrong radius and
the corner arc was clipped away. Detection now
works at any opacity, with a better per-OS
fallback radius. Issue 12882.
- The heavy window border now stays flush with
the window edges instead of sometimes drawing
as a smaller inner rounded rectangle. Its view
could be left at a stale size and was not kept
in sync with the window. Issue 12882.
- The heavy window border now has a uniform
width: its corners no longer look thinner than
its edges and no longer pick up semi-
transparent pixels. It is drawn entirely
inside the window instead of straddling the
window edge and relying on the system mask to
clip its outer half. Issue 12882.
- The window border color advanced settings now
accept a four-part color like #rrggbbaa (or
p3#rrggbbaa) to set the border opacity. A
color without an alpha component is still
drawn at 75% opacity. Issue 12882.
- The legacy (non-GPU) renderer now invalidates
only the lines that actually changed, instead
of repainting the entire view on every cell
update. Heavy TUI animations (e.g. spinners
that rewrite a single line at high frequency)
use significantly less CPU on hosts where the
GPU renderer is disabled. Issue 12790.
- Anthropic tool calls reloaded from a chat
transcript would fail with HTTP 400 because
the function output got serialized as plain
text instead of a tool_result block. The
parser stored the tool_use id only on the
inner FunctionCall while the serializer
looked on the outer wrapper, so the id was
lost on round-trip. Both fields are now
populated so persisted tool calls survive
the round-trip.
- Anthropic requests no longer 400 when a
stray user message gets persisted between a
tool_use and its matching tool_result. The
request builder reorders so the tool_result
is always emitted immediately after the
tool_use, with any intervening messages
bumped to after it.
- Fix a launch crash when a saved status bar
layout referenced an RPC-provided text
component whose configuration was missing
the registration request (for example, from
a partial profile restoration). The base64
decoder dereferenced a NULL pointer instead
of returning nil. Issue 12861.
- The “Respect shortcuts from System Settings >
Keyboard > Keyboard Shortcuts > Keyboard”
option used subset matching on modifier keys,
so a system shortcut bound to Ctrl+Right (or
any other strict subset of an event’s
modifiers) would also intercept
Ctrl+Shift+Right and similar keystrokes.
Modifier comparison is now exact. Issue 12859.
- When launched with -suite, orphan adoption
could no longer reattach to surviving
multi-server daemons after a state-database
loss. The application-support directory is
already isolated per suite, but daemon
sockets were also being named with the
suite in the filename, while the orphan
adopter (and the settings-export exclusion
list) still expected the plain
iterm2-daemon- prefix. The suite is now
carried only by the containing directory,
matching how the dotdir fallback already
worked. A transitional fallback accepts
the {suite}-daemon-N.socket form so betas
that wrote that name don't strand their
daemons across the upgrade. Issue 12860.
- Fix a crash when a Python API client invoked
a function whose argument string contained
non-BMP characters (for example, emoji). The
expression tokenizer’s optional-path
recognizer indexed by Unicode scalar while
the surrounding tokenizer tracks UTF-16
positions, so the offset could run past the
scalar count and trap. Issue 12856.
- When ESC #3, #4, or #6 (DECDHL/DECDWL) was
received mid-line, characters already on the
line were correctly doubled in size but the
cursor was not advanced to compensate, so
text printed afterward overwrote the right
half of the existing characters. The cursor
is now repositioned when the line’s width
class changes.
- ssh:// URL handling and Bonjour-discovered
host profiles now find ssh through the user’s
login shell PATH, so Homebrew’s ssh (or any
ssh outside /usr/bin) is used. The advanced
setting SshSchemePath, when changed from its
default, still wins. Issue 3415.
- The faint-text opacity slider in Profiles >
Colors now has a minimum of 0.1, and existing
profiles with a stored value below 0.1 are
clamped at runtime. A value of 0 caused SGR 2
text to render in exactly the background
color, making it invisible. The slider’s
tooltip was also incorrect (it described
minimum contrast); it now describes faint
text opacity.
- The “open password manager automatically”
feature no longer triggers when a shell
script briefly disables terminal echo to
suppress the visible echo of an OSC report
response (e.g. it2getvar, it2profile -g).
ECHO must now stay off for at least 0.2
seconds — tunable via the
DetectPasswordInputDebounce advanced
setting — before iTerm2 treats it as a
password prompt.
- Fix the Minimal-theme tab bar overlapping the
terminal in fullscreen when adding a second
tab with “Hide tab bar when there is only
one tab” enabled. The titlebar accessory
hosting the tab bar grew from zero to its
full height but the content view was not
re-laid out to leave room for it. Issue
12811.
- The Touch ID for sudo offer no longer relies on
AppleScript admin elevation, which fails on
macOS 26 with EPERM when writing to
/etc/pam.d/. Accepting the offer now lets you
copy the install command or run it in a new
iTerm2 window where you can enter your sudo
password.
- Fix a bug where suppressing a warning would
not stick across launches when prefs are
loaded from a custom folder with “Save
changes: Automatically.” The debounced save
could lose the race against app exit, so
the next launch overwrote the just-saved
suppression with the stale remote copy.
applicationWillTerminate now flushes
synchronously when Automatic mode is on.
- Fix Ctrl-letter keystrokes appearing as
literal text (e.g., “0x4” for Ctrl-D) in
tmux -CC mode when the tmux server has
extended-keys enabled and an inner app
has turned on modifyOtherKeys. Control
bytes 0x00–0x1F are now sent through
send-keys with the -H flag on tmux
3.0a or newer, which bypasses tmux 3.5’s
silent literal-text fallthrough for
unmodified C0 bytes. Issue 12845.
- Fix dragging a tab or split pane onto a
window with only one tab. The destination
window’s tab bar is hidden in that case, so
AppKit could not deliver drag events to it
and a brand-new window was created instead.
Tab bars are now temporarily shown for the
duration of any tab or session drag.
Issue 12846.
- Fix a latent use-after-free in Core Text run
enumeration when the font does not return
contiguous glyph or string-index pointers.
The fallback NSMutableData backing buffers
could be released before the closure ran.
- Fix the cursor jumping to the end while
typing in an annotation when the caret was
not already at the end. The optimistic
main-thread write echoed back through the
delegate and reassigned the text view’s
string, which resets the selection.
- Fix a crash when invoking Undo after closing
a split pane that contained an annotation,
session note, or chat input. These text
views now own their own undo manager so
text-edit undo actions can’t outlive the
text view in the window’s undo stack.
- Fix UI hangs when opendirectoryd is slow or
wedged. The user’s login shell is now
fetched in the pidinfo XPC service (so a
daemon hang only burns the helper, never
the main app) and cached in-process. Every
call still kicks off a fresh background
lookup so the cache stays current after
chsh, but a slow lookup no longer stalls
the UI — the cached value is returned if a
fresh result doesn’t arrive in time.
- Fix a multi-second hang when closing the
Settings window. PreferenceInfo now only
registers a notification observer when an
observer block is set, avoiding O(N²)
teardown across the many controls in the
panel.
- Fix a state-restoration crash where the
recovery path could leave records with no
rowid in the in-memory tree, causing the
next save to abort with MissingRowID. The
recovery now operates on a deep copy of
the failed save’s tree so it can’t corrupt
records other code still holds, and it
dedupes siblings by (key, identifier) so
every record gets a fresh rowid.
- Fix the window growing wider when a
clippings panel appears in a non-current
tab. Window resize now happens only when
the visible tab needs the space.
- Fix Code Review (and any other long
command) failing immediately with a zsh
"unmatched '" error. The shell-arg
splitter used by startProgram was running
every unquoted argv element through
-stringByExpandingTildeInPath, which
silently truncates at 1024 chars. Long
arguments now skip the expansion when
there's no leading ~.
- Fix shell escaping of embedded apostrophes
and CR/LF in single-quote (POSIX) and
$'...' (bash) modes. Apostrophes now use
the close-escape-reopen idiom ('\''), and
control chars round-trip cleanly through
the receiving shell instead of either
injecting a literal backslash or producing
an unmatched-quote parse error.
- Fix the password-manager CLI picker
greying out interpreter scripts (such as
the Homebrew-installed Bitwarden ‘bw’,
which is a Node.js script). Also accept
the symlink target name (e.g. bw.js).
- Improved energy efficiency.
- Fix bell and other user notifications not being
posted when iTerm2 is not hidden behind another
app. Notifications now post whenever iTerm2 is
not the active app or the session’s window is
not frontmost.
- Fix ⌥Y and the Character Viewer inserting
a backslash instead of ¥ on non-JIS
keyboards. Restore ⌥+¥ sending ESC+\
(with Option=Esc+) on JIS keyboards.
- Fix a bug where a restored session whose
working directory was on an unmounted drive
could fail to relaunch, closing the tab. The
session now starts in your home directory and
shows a notice. Issue 12955.
- Fix various crashes.
- Fix wrong terminal size after exiting
fullscreen with multiple tabs.
- Fix tmux window shrink when a pre-tmux
session is buried after attach.
- Fix theme not updating when changed via
the Python API.
- Fix legacy hotkey window profiles
defaulting to 100% width and height.
- Fix NSTextInputClient to use consistent
absolute coordinates.
- Work around a macOS SVG bug that dropped