Version 3.7.7beta2 of iTerm2 was built on October 27, 2026. New Features: - Workgroups now work in tmux Integration tabs. The workgroup is kept on the tmux server, so it survives detaching and is picked up again when you attach, even from another Mac. Requires tmux 3.2 or later. - When a Workgroup’s main session is on a host reached through SSH Integration, its companion sessions, such as Code Review, now run on that host too. - The Claude Code integration can now be installed on a host reached through SSH Integration, so Claude Code running there reports its status too. Choose iTerm2 > Install Claude Code Integration from a session on that host, including a tmux Integration pane there. Uninstalling removes it from every host you are connected to. - When a host reached through SSH Integration asks to use it2, you can now choose “Always Allow This Host” so it is not asked again on later connections. Review or remove these hosts in Settings > General > Magic > API access over ssh. - In iTerm2 Buddy, web browser sessions now show the page instead of a black screen, and you can tap, scroll, and type into them, and use back, forward, reload, and an address field. Requires an up-to-date iTerm2 Buddy. - While you type an @-mention in an AI chat that can control other sessions, you can click the session you mean instead of picking it from the list. - `it2 session set-status` has a new --progress option that starts or stops the tab’s progress indicator. - `it2 session add-clipping` and `archive-clippings` accept --tmux and --tmux-pane. Other Improvements: - SSH Integration now paces output from the remote host, so a program that prints a lot no longer fills the connection’s buffers. Control-C takes effect at once instead of after minutes of buffered output on a slow link, and typing stays responsive while output streams. - Downloading a file or folder with “Download using SSH Integration” is much faster. - On a host reached through SSH Integration, it2 is now a real command in ~/.iterm2/bin rather than a shell function, so scripts, sh -c, and tools such as Claude Code’s Bash tool can run it, not just an interactive shell. Commands that read standard input now receive it. A command run with “it2ssh host command”, or by an SSH profile, can use it2 too. - On a host reached through SSH Integration, an it2 command that names no session now acts on the session it runs in rather than the focused one. - it2 now works on a host reached through SSH Integration when the shell is tcsh, and when shell integration is not loaded there. - it2ssh now loads shell integration on the remote host by default, whatever the current profile’s Load Shell Integration Automatically setting. Run it2ssh --no-shell-integration to skip it. SSH profiles still follow their own setting. - The git status bar component now shows the status of a repository on a host reached through SSH Integration, by running git there. It used to need it2git set up on the host. With it2git, changes are now counted the same way as for a repository on this Mac. - Shell integration now loads inside tmux, including on a host you ssh to from a tmux pane, so marks, the current directory and host, and the git status work there. - In a tmux Integration session on a host reached through SSH Integration, each pane now knows which program is running in it, and the git status bar component and other features that depend on the session’s host work without shell integration loaded in the pane. - The Claude Code hook program is now `it2 handle-agent-hook`, so the hook works wherever it2 does. Existing installs keep working; reinstalling the integration updates the hook entries. - If you customized the Code Review system prompt, iTerm2 offers to update it the next time a review starts, so reviews work in tmux and on remote hosts. It shows the changes first, and changes nothing else in your prompt. - Shell > ssh > Download Files… now lets you choose any file. Before, it only allowed file types that the AI provider accepts as attachments. - The notification for a failed download or upload now names the file and gives the reason. Canceling a transfer no longer reports it as failed. - Answering No to “Allow Terminal-Initiated Download?” (for example, for it2dl) no longer fills the terminal with the file’s encoded contents. The same goes for declining to display a file inline. - When a session’s program ends and iTerm2 offers to restart it, short output such as a custom command’s is no longer hidden behind the offer. - Announcements in narrow panes put their buttons below the text when there is no room beside it. - When you change the theme, an open browser tab now switches pages that have light and dark versions to the matching one. - The browser’s View Source command now shows the page’s source, with attribute values highlighted. Before, it always said “No source available.” - In Low Power Mode, status bar graphs such as CPU Utilization move once a second instead of animating continuously. - More of the interface is translated, including Window > Lock Location, the tab menu’s Rename Tab… and “Tab Color:”, the browser’s error page, the Downloads and Uploads menus, and file sizes and units throughout. Translated labels no longer get cut off in the shell integration installer, Advanced Paste, Smart Selection, Settings > Keys > Hotkey, the manual AI model editor, and elsewhere. Bug Fixes: - Fixed various crashes, including ones when searching in the AI Chats window, importing a script archive with a damaged signing certificate, finishing an SSH Integration download on a user@host connection, using a trigger in a Dynamic Profile whose parameter has an unexpected type, and when a display reports a refresh rate of 0. - Fixed a hang that could freeze iTerm2 with a beachball when GPU rendering was on and the system was under heavy load. Issue 13139. - Fixed a bug where a trigger whose interpolated parameter refers to its match, as in \(matches[0]), could make output stall, and with tmux integration could freeze every tmux window. - Programs that turn on the Kitty keyboard protocol and then request xterm’s modifyOtherKeys, as Claude Code does, keep the Kitty protocol. Before, Command keys stopped being reported. Issue 13138. - When an app enables the Kitty keyboard protocol and “Use the Caps Lock key to switch to and from the last used Latin input source” is on, tapping Caps Lock no longer sends a malformed key report that some apps read as Control-C. Issue 13136. - With the kitty keyboard protocol reporting all keys, a dead key followed by a key it does not combine with now reports the dead key and then the second key, instead of the second key twice. - Installing Shell Integration with “Download and Run Installer” installed outdated scripts, so the warning that they are out of date kept coming back. Issue 13155. - Fixed Shell Integration for xonsh, which was installed but never took effect. Installing it again fixes an existing installation. - Fixed many problems with the Internet-Free shell integration install: it could hang when the shell you’re using isn’t your login shell or while installing the utilities, could leave bash without the line that loads shell integration, could report success when the utilities failed to unpack, and could leave you inside its helper shells after you canceled. - Shell > SSH > Disconnect now recovers an SSH Integration session whose local it2ssh process was killed, and works before advanced SSH features have started. - Fixed several ways an SSH Integration session could stop taking input or type stray text such as YXV0b3BvbGw= or cmVjb3Zlcg== into the local shell: when ending a session, after using tmux integration in it, when it2ssh ran on a nested host without the Python advanced SSH features need, and when restoring sessions after relaunching or after a crash. - An SSH Integration session restored after relaunching iTerm2 no longer hangs when its connection drops while the remote command is printing output. - it2ssh no longer leaves the terminal waiting for Return when ssh fails before connecting, and now exits with ssh’s exit status. - it2ssh no longer hangs when the host or command contains non-ASCII text, and now runs a command given after the host exactly as ssh does. Quotes, newlines, tabs and non-ASCII text in the command were mangled. - A custom command or SSH profile command that contains a backslash or a double quote now runs as written. - When SSH Integration loads shell integration into a remote bash, the shell is now a login shell, so aliases and functions defined in ~/.profile or ~/.bash_profile are available. - When you connect with it2ssh user@host or an ssh:// URL, SSH Integration no longer treats all of “user@host” as the host name. - Fixed SSH Integration bugs: remote files with non-ASCII names could not be downloaded, deleted, or renamed; deleting a remote symbolic link to a folder failed; a failed remote request could never finish; asking for an immediate update of the remote job list ended the integration; output printed just before a remote command exited could be lost; the remote PATH could be misread; and Composer suggested no remote file names when the host had Python 3.7 or 3.8. - On a FreeBSD or OpenBSD host reached through SSH Integration, sessions and the Jobs tool showed an environment variable such as VENDOR=unknown instead of the running program. - A file fetched with Shell > ssh > Download Files… no longer stays listed as downloading after it finishes, Clear All now removes finished SSH Integration downloads, and their notification no longer says “Upload finished”. - A failed or stopped SSH Integration download no longer leaves a hidden partial file in your Downloads folder or reports success. Stop takes effect right away even when the connection has stalled, and a folder download tells you when files in it couldn’t be read. - With the Browser Plugin installed, “Download using SSH Integration” in the context menu no longer does nothing when the file can’t be found. - An upload over SSH Integration no longer overwrites a remote file of the same name when iTerm2 could not check whether one exists. - Running tmux -CC in a session that is already part of tmux integration now explains that tmux integration can’t be nested instead of silently doing nothing. - Fixed saving a window arrangement to a file and archiving a session when the text contained right-to-left text. If either kind of save fails, iTerm2 now reports an error. Issue 13143. - With the Minimal or Compact theme and the Snippets tool enabled in the toolbelt, a window could be made wider but not narrower. Issue 13118. - With ligatures turned off, some fonts could still draw “fi” as a ligature and leave a gap after it. Issue 13133. - Turning off “Show activity indicator” in Settings > Appearance > Tabs now also hides the tab’s spinner when a program reports progress. Issue 13145. - Unpinning a pinned tab that was not the rightmost pinned tab, or one in a tab group, no longer breaks the tab bar. Issue 13154. - Fixed Kitty graphics images cropped to part of their height showing the wrong part of the image when GPU rendering is on, and Kitty placeholder images showing nothing or the wrong part of a cropped image. Issue 13146. - Pressing an arrow key or Tab while composing text with an input method now finishes the character and performs the key in one press, as Return already did. Issue 13030. - Hardened the handler for x-man-page: URLs so a malicious URL can no longer run an unexpected command or make man render an arbitrary local file. - A web address containing a quote or other special characters can no longer inject script or markup into the browser’s page-load error page. - When an administrator turns off generative AI, iTerm2 no longer uses Apple Intelligence for AI chat, AI tab titles, or the command safety check. - Dragging a split divider in a tmux window now leaves the panes the way the drag showed them. - In tmux integration, showing timestamps in one pane of a window split into top and bottom panes no longer covers the end of that pane’s lines. - If iTerm2 quits unexpectedly while tmux integration is attached, tmux integration now resumes when iTerm2 relaunches, provided you switched to another app at some point after attaching. If it quits unexpectedly after you detach, the session that ran tmux -CC no longer gets tmux commands typed into its shell. - Answering Always to “Close tmux windows after detaching?” no longer closes sessions that did not ask, such as the tmux session itself. - In tmux integration, the ReportCellSize, ReportWindowFrame, and ReportScreenFrames escape sequences now get a reply. - With Archive On Closure on, closing a pane in a tmux integration window no longer saves an archive that could not be restored. - When tmux windows open as tabs in the attaching window, attaching from a hotkey window no longer moves the hotkey window off screen. - Fixed Floating Pane bugs: Undo Close now restores a maximized one maximized and in its place among the others; Control-drag docking now keeps keyboard focus; Swap With Session no longer also highlights the pane underneath; Change Profile in Arrangement now works for one restored from an arrangement; hidden ones no longer count toward the pane limit for the GPU renderer; and in tmux integration, resizing one now resizes it in tmux and one is no longer drawn over the wrong pane while Find > Filter is open. - A pane in a Workgroup can no longer be turned into a floating pane by dragging it onto a floating pane in another tab. - A scroll region set by a program that is still running when iTerm2 quits unexpectedly is kept when the session is restored. - When a session is restored with the “Session Contents Restored” banner, the shell’s output no longer starts after a blank row. - After window restoration, a tab whose session had a status shows it again in the tab bar, not only in the Session Status tool. - A trigger written by hand in a Dynamic Profile no longer forgets its state when the profile reloads, so an Instant trigger no longer fires twice on the same line. - Choosing the Make Hyperlink trigger action with interpolated string parameters turned on now fills in a working URL. - When several Dynamic Profiles files have errors, the alert now gives the right number of additional errors. - An AI chat using a local Ollama model, or a model you added in Settings > General > AI, no longer sends its messages to OpenAI or your cloud AI provider after that model is removed or renamed. It now shows an error. - An AI chat’s session watches now resume when iTerm2 launches, and Stop cancels them. A pending timer no longer misses its deadline after you enable orchestration. - When AI chat asks to run a tool that can’t run in the linked session, the chat now reports the error and continues instead of waiting forever. - In AI chat, if you send a new message instead of answering a request to run a command, the AI is no longer told that iTerm2 restarted and invited to run the command again. - In AI Chat with streaming responses on, a code block at the end of a reply now shows as code with a copy button. - AI command suggestions no longer repeat a directory you already typed in the filename they insert, and filename suggestions in the composer no longer show extra backslashes. - With AI command suggestions off, the gray completion the composer shows for a file name with a space or other special character is now escaped. - Test Connection in the AI model editor can now be stopped while it runs, and rejects custom headers that are not valid, as Save does. - AI custom headers you remove from a model no longer come back on another Mac that shares your settings, and changing your AI models no longer drops the headers set up for a single custom model. - AI models on Azure OpenAI in Azure Government (.azure.us) and Azure China (.azure.cn) now send their API key the way Azure expects. - AI network errors now read “HTTP request failed: …” instead of a broken sentence. - The AI Usage toolbar item no longer shows “Unreadable usage data” when Claude Code’s output contains color codes, and its problem report no longer fills the screen. - Fixed AI chat bugs: the “↩ to submit” hint overlapped a long placeholder, the find bar squeezed its search field to nothing in a narrow chat and closing it lost focus, changing a permission from the info menu didn’t update the chat’s buttons, session mentions didn’t resize with the font and showed a terminal icon for browser sessions, and the AI Chats list highlight stayed behind when a chat moved to the top. - Uninstalling the Claude Code integration no longer says an empty settings.json couldn’t be parsed, and installing it over a broken settings.json symlink no longer marks the new file executable. - it2 commands such as it2 session list and it2 profile list no longer show JSON escapes, such as \/dev\/ttys001 for a tty, and it2 session set-var now sets a plain value such as hello. - The it2dl utility now works on systems where bash is not in /bin, such as Raspberry Pi OS. - Installing the iTerm2 utility scripts on Linux no longer prints tar warnings or leaves ._ files in ~/.iterm2. - iTerm2 Buddy no longer connects slowly or keeps saying your Mac is busy while the Mac’s displays are asleep. - Turning on generative AI while Companion Device Settings shows a failed pairing no longer erases the error and the QR code. - With “Exclude from Dock and ⌘-Tab Application Switcher” and “…but only if all windows are hotkey windows” on, Show menu bar icon is no longer stuck checked and disabled. - Look Up, Copy Mode’s cursor, Cmd-hover and Cmd-click on URLs, and (with the GPU renderer off) underlines, strikethroughs, and selection highlights now line up with right-to-left text where it is drawn. Devanagari vowel signs written before their consonant are drawn in the right place again with the GPU renderer off. - After you change a window’s style in Window > Window Style, the window keeps keyboard focus. - After Swap With Session between a tab with one pane and a split tab, each pane now shows or hides its title bar to match its new tab. - With Focus Follows Mouse, returning the pointer to a pane whose find field had focus no longer selects the whole query, the status bar’s search field now takes focus when “…even to views like Search or Composer” is on, and a pane you point at while a sheet is open gets focus when the sheet closes. - Right-clicking in a browser tab that a page opened from a link now shows the context menu, and find, copy on select, autofill, the password manager, and named marks work on that tab instead of the tab that opened it. - After you back out of the password manager from a website’s sign-in prompt, “Remember this password” is no longer ticked unless you ticked it. - After a screen lock ends password manager authentication, the trigger editor no longer lists saved account names until you authenticate again. - An scp download that asks for a password no longer hangs if you close the Password Manager without choosing a password. - An alert shown again by “Permanently Forget Saved Selection” no longer presses a button when you type a plain letter, and Cmd-H, Cmd-Q, Cmd-W, and Cmd-M no longer press an alert button that starts with that letter. - Typing quickly after a “Press any key to dismiss” message no longer loses the keys typed while it slides away. - Search the Web for Selection now finds text that contains a plus sign, such as “c++”. - Advanced Paste now counts lines correctly. - Command Info no longer shows a negative running time for a quick command, and its Output size no longer counts the next prompt. - With HTML tab titles on, “&” and “<” are now shown as “&” and “<” even when the title has no tags. - In the Minimal theme, a new window now shows the profile’s subtitle right away, and the git branch item in a Workgroup’s toolbar draws its arrows in the toolbar’s text color. - When settings load from a custom folder and are saved manually, the red “!” in the Settings title bar now goes away after Save Now. - With the Settings window in front, Edit > Find > Find… now focuses the Settings search field. - Shell > Close (⌘W) now closes the Cockpit when it is the key window. - The Snippets tool no longer shows a folder’s icon on a snippet or a snippet’s icon on a folder. - A profile setting chosen from a pop-up menu now shows its default instead of a blank menu when the profile holds a value the menu lacks. - The setting and menu item pickers in the key binding editor now say “Select Setting…” or “Select Menu Item…” until you choose one. - When pasting text with tabs, the prompt that offers to convert them to spaces now puts the cursor in its number-of-spaces field. - Calling Tab.async_update_layout() from the Python API now gives each pane the size you asked for and no longer shrinks the panes when nothing changed. Session.async_move_to_new_tab() and async_move_to_new_window() now return None for a tmux session instead of raising an error. - The warning shown before opening an untrusted arrangement no longer counts a session’s command twice. - “Prefer integrated to discrete GPU” in Advanced GPU Settings is now disabled on a Mac with only one GPU. - The donation link in the Settings and Edit Session title bars no longer truncates the window title.