Version 3.7.7 of iTerm2 was built on November 3, 2026. New Features: - `it2 session set-status` has a new --progress option that starts or stops the tab’s progress indicator for a program that reports through hooks but does not draw the indicator itself. The set_session_status Python API function takes the same progress argument. - The hook program for Claude Code and Codex is now `it2 handle-agent-hook` (add --agent codex for Codex), so the hook works wherever it2 does. Existing Claude Code installs keep working; reinstalling the integration updates the hook entries. - `it2 session add-clipping` and `archive-clippings` accept --tmux and --tmux-pane, and every addressing option accepts an empty value as “not given”, so a script can pass all of them and let it2 pick. - The Python API can now run JavaScript in a browser session’s page and get the result back with Session.async_eval_javascript, so a script can read a page or fill in a form without clicking on the screen. The first time a script does this on a site, iTerm2 asks you to allow it. You can review and change these permissions, and those for loading URLs, in Settings > General > Magic. - You can hide a browser session’s toolbar so the page fills the pane with Web > Show Toolbar, or from the Python API with Session.async_set_browser_toolbar_hidden. - nushell is now a supported shell for shell integration, including automatic loading and SSH integration. - Passwords saved in the Password Manager’s Keychain storage can now be exported to a passphrase-encrypted .iterm2passwords file and imported on another Mac. Use Export Passwords… and Import Passwords… in the Password Manager’s settings menu, or double-click the file. Settings > General > Export All Settings and Data can also include them. - 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. - 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. Improvements: - Python API context menu items can be grouped into submenus and shown only in sessions where an expression is true, such as a user variable your script sets. See ContextMenuProviderRPC’s submenu and visible_when arguments. - 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. - Downloading a file or folder with “Download using SSH Integration” is much faster. It used to wait for each kilobyte before asking for the next. - The Python API now has type annotations, so editors and type checkers such as mypy can check scripts that use it. - “Support basic HTML tags in tab titles” now applies to pane title bars too, so , , and render as styled text there instead of appearing literally. The window title shows the text without the tags, including titles set by a program or by tmux. - In iTerm2 Buddy, you can now tap, scroll, and type into a web browser session from your phone, and use back, forward, reload, and an address field. The phone’s keyboard comes up when a text field on the page has focus. Requires an up-to-date iTerm2 Buddy. - 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. - 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. - A command run on a host with it2ssh host command, or by an SSH profile, can now use it2, as an interactive shell there can. - 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. - it2 now works on a host reached through SSH Integration when the shell is tcsh, and when shell integration is not loaded there. Without it iTerm2 copies nothing to the host, so it2 has to be installed there. - 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. - 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. It used to need the environment variable ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX. It still skips itself in GNU screen. - In a tmux Integration pane on a host reached through SSH Integration, the git status bar component and other features that depend on the session’s host now work without shell integration loaded in the pane. - With it2git on a remote host, the git status bar component now counts changes the same way as for a repository on this Mac: every untracked file counts, conflicts are not counted as changes, and a detached HEAD shows its full commit ID. - In a tmux Integration session on a host reached through SSH Integration, each pane now knows which program is running in it. The tab shows the job, the Jobs tool lists the pane’s processes, and triggers that watch for a program, such as entering the Claude Code workgroup, work there. - 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. - On macOS 26, iTerm2 no longer lets macOS index its window and tab titles for search. Titles change constantly in a terminal, and indexing each one used a lot of CPU in Spotlight’s background processes. Bug Fixes: - Dragging a tab or pane no longer stutters with many windows open when the tab bar is always shown. - The browser’s address field no longer runs under the loading spinner while a page loads, and returns to its full width afterward. - Fixed more cases where a window could be made wider but not narrower. - If iTerm2 quits unexpectedly while tmux integration is attached, and you switched to another app at some point after attaching, tmux integration resumes when iTerm2 relaunches with window restoration on. Before, the session that ran tmux -CC could show raw tmux output instead. - If iTerm2 quits unexpectedly after you detach from tmux integration, the session that ran tmux -CC no longer gets tmux commands typed into its shell when window restoration brings it back. - In an AI chat with an empty message field, the “↩ to submit” hint no longer overlaps a long placeholder. - With KeePassXC as the browser password manager, “Remember this password” for a website’s sign-in dialog now saves the password instead of failing with “Could not save the password”. - Hardened the handler for x-man-page: URLs so a malicious URL can no longer be crafted to run an unexpected command or make man render an arbitrary local file. Man section and page names are now checked against an allowlist of characters, and a URL with disallowed characters is rejected with a warning instead of opening. Thanks to vin01 for finding this vulnerability and to Gurpreet Shergill (@giki-shergill) for reporting it. - Dragging a split divider in a tmux window now leaves the panes the way the drag showed them. Before, a different divider could move, or panes beside the divider could jump to other sizes when the drag ended. - Fixed a crash from a trigger in a Dynamic Profile whose parameter has an unexpected type, such as a list. A text parameter written as a number, such as text to send, is now used as text instead of being ignored. - Shell > SSH > Disconnect now recovers an SSH Integration session whose local it2ssh process was killed, even while the remote host is printing output. Previously the session stopped showing output and ignored input. Disconnect also works before advanced SSH features have started, instead of saying it can’t disconnect. - After using tmux integration in an SSH Integration session, ending ssh no longer leaves the session ignoring typed text until Return is pressed. - Ending an SSH Integration session no longer sometimes types YXV0b3BvbGw= into the local shell, or leaves the tab unable to start another it2ssh connection. - A session no longer stops taking input when it2ssh is run on a host that was itself reached with it2ssh but lacks the Python that advanced SSH features need. - After quitting with SSH Integration sessions open, relaunching with window restoration on no longer types stray text, such as cmVzZXQy, into the restored tabs’ new shells. Likewise, when iTerm2 restarts after a crash and an SSH Integration session’s ssh has ended in the meantime, the restored session no longer types cmVjb3Zlcg== into its shell and then ignores input. - A file fetched over SSH Integration with Shell > ssh > Download Files… no longer stays listed as downloading in the Downloads menu after it finishes. Clear All in the Downloads menu now removes finished SSH Integration downloads, and their notification no longer says “Upload finished”. - With the Browser Plugin installed, “Download using SSH Integration” in the context menu no longer does nothing when the file can’t be found on the remote host. It now shows a failed download that says why. - When you connect with it2ssh user@host or an ssh:// URL, SSH Integration now records the user and host separately. Before, it treated all of “user@host” as the host name, which showed up in the file panel and the Downloads menu. - Running tmux -CC in a session that is already part of tmux integration, for example over ssh, now explains that tmux integration can’t be nested instead of silently doing nothing. - it2ssh no longer leaves the terminal waiting for Return when ssh fails before connecting, such as for a host name that doesn’t resolve. it2ssh now exits with ssh’s exit status. - it2ssh no longer hangs when the host or command contains non-ASCII text, such as accented letters or emoji. If iTerm2 can’t read the arguments, it now ends the connection and explains why instead of leaving the tab stuck. - 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. - The notification for a failed download or upload now names the file and gives the reason, instead of showing only an error such as “File not found”. Canceling a transfer no longer reports it as failed. An SSH Integration transfer that fails because of file or folder permissions now says so. - Downloading a folder over SSH Integration now tells you when files in it couldn’t be read and were left out, instead of reporting success with no mention of the missing files. - An SSH Integration download that fails or is stopped no longer leaves an empty or partial hidden file in your Downloads folder. Stop now takes effect right away even when the connection has stalled. - An SSH Integration download that can’t be saved into your Downloads folder when it finishes now reports that it failed, instead of saying the download finished. One that can’t be marked as downloaded from the internet is deleted and reported as failed, instead of staying listed as downloading. - it2 session list and other it2 commands that print names, paths or profile values no longer show JSON escapes, such as \/dev\/ttys001 for a tty. - 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. - it2ssh now runs a command given after the host exactly as ssh does. Quotes in the command were lost, and newlines, tabs and non-ASCII text were mangled, so a command like it2ssh host "grep 'a b' file" ran the wrong thing. - A custom command or SSH profile command that contains a backslash or a double quote now runs as written. Such commands used to reach the shell broken when they ran in a login shell, which SSH profiles always do. - A tmux Integration pane whose server was not yet known to be local when the pane opened never learned which program it was running. - Programs that turn on the Kitty keyboard protocol and then request xterm’s modifyOtherKeys, as Claude Code does, keep the Kitty protocol, matching kitty. Before, the request turned it off, so Command keys stopped being reported. - With the Minimal or Compact theme and no tab bar at the top, the window buttons that appear when you point at the window’s top-left corner no longer cover a web browser’s back, forward, and reload buttons, which made them impossible to click. As with a status bar there, a small arrow appears in the corner instead; click it to show or hide the window buttons. - Fixed hotkey windows with the Centered or “Centered, No Title Bar” style returning to their original size each time they were shown after you resized them. - Fixed several Python API bugs. Subscribing to profile change notifications always failed, Color.hex failed for colors read from a profile, and items in nested submenus of MainMenu could not be reached on Python 3.12 and earlier. - Fixed Selection.async_get_string in the Python API adding line breaks that copying the same selection in iTerm2 leaves out. - A program that sets the window or tab title over and over no longer makes iTerm2 fall far behind, run at full CPU for minutes, and grow to gigabytes of memory. - In an alert with a text field, such as the one asking how many spaces to use when you paste text with tabs, Cmd-A, Cmd-C, Cmd-V, Cmd-X, and Cmd-Z now edit the text instead of pressing a button. Also, two buttons in an alert no longer share the same Cmd-key shortcut. - Fixed a memory leak where each AI request, such as each AI chat message, left memory in use until iTerm2 quit. - Opening a file or link in a split pane while a tmux integration tab is current now opens it in a new tab. Before, it could take over the tmux pane’s place, vanish without running, or open a tmux shell pane without the link. - The SetWindowFrame escape sequence no longer shrinks a window to nothing or moves it far off screen when given bad values. Malformed values are ignored, and the window now stays between its minimum size and the size of your displays, with part of it on a display. - If a Python script that loads a URL in a browser session gave up waiting while you read the permission prompt, approving it afterward no longer loads the URL. - An AI chat set to Llama (Local) no longer sends its messages to your cloud AI provider when no Ollama model is available, for example because Ollama isn’t running. It now shows an error asking you to start Ollama. Naming the chat and drawing its icon now also use the chat’s own model instead of the default one. - Copying part of a line that mixes left-to-right and right-to-left text no longer drops the space between a left-to-right word and the right-to-left text after it, which fused the two words. - The file iTerm2 keeps next to its saved window state (restorable-state.sqlite-wal) no longer stays as large as the saved state itself. With long scrollback it could use a lot of disk. - When settings load from a custom folder, quitting no longer asks to copy settings to the folder every time just because iTerm2 updated an older setting saved there. - Pressing Cmd-Y (Edit > Engage Artificial Intelligence) in the Cockpit’s composer no longer crashes iTerm2. The menu item is now disabled there. - With SSH integration, starting the remote shell, completing paths, and other requests with several long arguments no longer occasionally fail because the request was split in two on the way to the remote host. - In the minimal theme, a browser tab’s tint now matches the page you just loaded. Before, it showed the previous page’s background color until the next page loaded. - In the Cockpit’s composer, an @ followed by a space no longer keeps the session picker open, so Return inserts a newline instead of turning the @ into a session chip. After Esc closes the picker, it stays closed while you keep typing. - Sending from the Cockpit after closing the tab of one of its chosen sessions now sends to the sessions that remain, names the closed one, and removes its chip, instead of sending nothing and showing an internal identifier. - The Cockpit no longer covers alerts attached to a terminal window, such as the Broadcast Input confirmation, hiding their buttons. - The Cockpit composer’s placeholder text is no longer drawn twice when the panel is too narrow to fit it on one line. - In the Cockpit’s composer, Advanced Paste and Open Command History, which did nothing there, are now disabled, and its help no longer lists them or AI lookup. - Clicking the icon of the Current Directory, Hostname, or Username status bar component opens its menu again, as clicking its text does. - The folder icon in the Current Directory status bar component can no longer be dragged after its directory has been deleted. - With debug logging on, a password typed into a password field (for example, in the password manager) no longer appears in the debug log. - Fixed saving a window arrangement with “Save to File with Contents…” and archiving a session when the text contained hyperlinks, underline colors, similar styling, or right-to-left text. The arrangement file was never written, and the session archive was empty. If either kind of save fails, iTerm2 now reports an error. Issue 13143. - Fixed a hang that could freeze iTerm2 with a beachball when GPU rendering was on and the system was under heavy load, for example from memory pressure. Issue 13139. - In the Claude Code Integration setup, clicking Show on the Show Toolbelt step more than once no longer darkens the window further with each click. - In tmux integration, showing timestamps beside the text in one pane of a window split into top and bottom panes no longer covers the end of that pane’s lines and leaves an empty strip at the right edge of the window. - 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. - 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 to switch input sources no longer sends a malformed key report that some apps read as Control-C. Holding it to turn Caps Lock on or off now reports a Caps Lock press and release. Issue 13136. - The it2dl utility now works on systems where bash is not in /bin, such as Raspberry Pi OS. - With ligatures turned off, some fonts could still draw “fi” as a ligature and leave a gap after it, as in “confi g”. 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. - Installing Shell Integration with “Download and Run Installer” installed outdated scripts, so the warning that this account’s Shell Integration scripts 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. - Unpinning a pinned tab that was not the rightmost pinned tab, or one in a tab group, no longer breaks the tab bar (missing tabs, missing group headers, highlight on the wrong tab). Issue 13154. - Choosing the Make Hyperlink trigger action with interpolated string parameters turned on now fills in a working URL, https://\(matches[0]). It previously filled in https://\(match0), which refers to a variable that doesn’t exist. - 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. Triggers that use only matches[N] and line no longer wait on the session. - Fixed Kitty graphics images cropped to part of their height showing the wrong part of the image when GPU rendering is on. Multi-row images forwarded by some terminal multiplexers appeared with their rows in reverse order. 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. - Opening a web browser session in iTerm2 Buddy now shows the web page instead of a black screen. - iTerm2 Buddy no longer connects slowly or keeps saying your Mac is busy while the Mac’s displays are asleep. - An AI chat started from a web browser session in iTerm2 Buddy is now linked to it as a web browser, not a terminal. - 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. - Window > Lock Location and the tab menu’s Rename Tab… item and “Tab Color:” label are now translated instead of always appearing in English. - The “AI-generated name” choice in Settings > Profiles > General > Title is now translated. - it2 session list no longer shows a session’s tty as \/dev\/ttys000 or its name with backslash escapes. It prints the plain values. - it2 session set-var now sets a plain value such as hello. Before, it reported success but set nothing unless the value was quoted JSON. - After window restoration, a tab whose session had a status (for example, one set with OSC 21337) 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 a second time on the same line. - Uninstalling the Claude Code integration no longer says an empty settings.json couldn’t be parsed. - Installing the Claude Code integration when ~/.claude/settings.json is a broken symlink no longer leaves the new settings.json marked executable. - The Internet-Free shell integration install no longer hangs when the shell you’re using isn’t your login shell (for example, tcsh started from zsh). It installs for the shell you’re using. - An AI chat using a local Ollama model no longer sends its messages to your cloud AI provider after that model is removed from Ollama. It now shows an error, and you can pick another local model for the chat. - An alert shown again by “Permanently Forget Saved Selection” no longer presses a button when you type a plain letter. Its shortcuts need Cmd, as they did the first time. - Cmd-H, Cmd-Q, Cmd-W, and Cmd-M no longer press a button in an alert whose button happens to start with that letter, such as Help. - After you change a window’s style in Window > Window Style, for example to No Title Bar, the window keeps keyboard focus, so you can keep typing without clicking it first. - 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. - When tmux windows open as tabs in the attaching window, attaching from a hotkey window no longer moves the hotkey window to where tmux last had a window, often mostly off screen. - A profile setting chosen from a pop-up menu, such as the progress bar color scheme, now shows its default instead of a blank menu when the profile holds a value the menu lacks. - “Prefer integrated to discrete GPU” in Advanced GPU Settings is now disabled on a Mac with only one GPU, where it has no effect. - When pasting text with tabs, the prompt that offers to convert them to spaces now puts the cursor in its number-of-spaces field, so you can type a tab width without clicking first. - Shell > Close (⌘W) now closes the Cockpit when it is the key window. Before, the menu item was disabled there. - Advanced Paste now counts lines correctly. Before, text whose newlines were converted to carriage returns was reported as one line, and a trailing newline was counted as an extra line. - After you back out of the password manager from a website’s sign-in prompt in a browser session, “Remember this password” is no longer ticked unless you ticked it. - Session.async_move_to_new_tab() and async_move_to_new_window() in the Python API now return None for a tmux session instead of raising a JSON decoding error. - Calling Tab.async_update_layout() from the Python API without changing any sizes no longer shrinks the tab’s panes and window by a cell each time. - The banner shown when several nested SSH integration sessions end at once no longer ends with two periods. - The warning shown before opening an untrusted arrangement no longer counts a session’s command twice. - Typing quickly after a “Press any key to dismiss” message, such as the one shown when a program tries to clear scrollback, no longer loses the keys typed while the message slides away. Only the first key dismisses it. - With the Minimal theme, the git branch item in a workgroup’s toolbar draws its ahead and behind arrows in the toolbar’s text color instead of black on a dark terminal background. - In Low Power Mode, status bar graphs such as CPU Utilization move once a second instead of animating continuously. - After a screen lock ends password manager authentication, the trigger editor’s “Open Password Manager…” action no longer lists saved account names until you authenticate again. - Turning on generative AI while Companion Device Settings shows a failed pairing no longer erases the error and the QR code. - With Focus Follows Mouse, returning the pointer to a pane whose find field had focus no longer selects the whole query, so the next key you type doesn’t replace it. - With Focus Follows Mouse and “…even to views like Search or Composer” on, the status bar’s search field now takes focus when the pointer moves over it, like the find bar does. - The donation link in the Settings and Edit Session title bars no longer truncates the window title. - In the Add/Edit Manual AI Model sheet, the API key menu is no longer too narrow to show “Automatic (none for a local endpoint)”. - In Settings > Keys > Hotkey, the “App Hotkey:” and “Open Quickly Hotkey:” labels no longer run under the controls beside them. - The AI chat’s find bar no longer squeezes its search field to nothing in the inline chat or a narrow chat window. When space is short it hides the search mode menu and the match count instead. - Closing the AI chat’s find bar with Escape now returns focus to the message field, so what you type next is no longer lost. - Test Connection in the AI model editor can now be stopped while it runs. Before, a test of an unreachable server could take many minutes. - AI network errors now read “HTTP request failed: …” instead of a broken sentence, and errors from a self-hosted model name its server instead of “Unknown Platform”. - Test Connection in the AI model editor now rejects custom headers that are not valid, as Save does, instead of leaving them out and reporting success. - The AI Usage toolbar item no longer shows “Unreadable usage data” when Claude Code’s output contains color codes or other control characters. - Changing an AI chat permission from the info menu now updates the permission buttons shown in the chat right away. - In an orchestration chat, the notice shown when mentioning a session now shows names with underscores correctly. - AI command suggestions no longer repeat a directory you already typed in the filename they insert (for example, “rm logs/logs/ error.log”). - AI models on Azure OpenAI in Azure Government (.azure.us) and Azure China (.azure.cn) now send their API key the way Azure expects. - Look Up (Ctrl-Cmd-D) on a right-to-left line now highlights the word where it is drawn and shows its definition next to it, instead of over blank cells at the far side of the line. - With the GPU renderer off, underlines and strikethroughs on right-to-left text are now drawn under the text they belong to instead of a few cells to the right. - With the GPU renderer off, Devanagari and other scripts with vowel signs written before their consonant draw the sign in the right place again: क्षत्रिय no longer shows ि after त्र. - In Copy Mode, the cursor on a right-to-left line is now drawn on the character it is on, instead of in the blank area on the other side of the line. - A scroll region set by a program that is still running when iTerm2 quits unexpectedly is kept when the session is restored, so the program’s output no longer scrolls the whole screen. - Undo Close of a maximized floating pane now brings it back maximized, and unmaximizing it returns it to where it was before. - Docking a floating pane by dragging it onto a pane with Control held now keeps keyboard focus in the docked pane when other floating panes are open. - In Swap With Session, pointing at a floating pane no longer also highlights the pane under it as a swap target. - In tmux integration, resizing a floating pane with View > Restore Text and Session Size or the Python API now resizes it in tmux too. It used to leave the pane blank or out of sync with tmux. - Window > Arrangements > Change Profile in Arrangement now works for a floating pane restored from a saved arrangement. - Hidden floating panes no longer count toward the number of panes that turns off the GPU renderer in a tab. - In tmux integration, a floating pane over pane %0 is no longer drawn over a different 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. - In tmux integration, the ReportCellSize, ReportWindowFrame, and ReportScreenFrames escape sequences now get a reply. - With AI command suggestions on, a filename row in the composer’s suggestion list no longer shows extra backslashes before spaces and other special characters. - With Archive On Closure on, closing a pane in a tmux integration window no longer saves an archive of it that could not be restored. - Dragging the folder icon in the Current Directory status bar component when its directory can’t be dragged (for example, on a remote host) no longer opens the component’s menu when you release the mouse. - When a session is restored with the “Session Contents Restored” banner, the shell’s output now starts right below the banner instead of after a blank row when the cursor had been in the middle of a line. - Resizing panes with Tab.async_update_layout() in the Python API now gives each pane the size you asked for. A pane used to come up a column or row short and the window shrank a little each time. - With the GPU renderer off, selecting part of an Arabic or Persian word, or a find match inside one, no longer breaks the letters’ joining at the edge of the highlight. - it2 app get-focus, it2 profile list and it2 profile show no longer print names, fonts and badge text with backslash escapes, such as a profile named a/b shown as a\/b. - Kitty graphics placeholder cells that show a cropped part of an image now draw that part. Before, a crop could draw nothing, or a strip of the neighboring part of the image could appear at its edge. - An SSH Integration session restored after relaunching iTerm2 no longer hangs when its connection drops while the remote command is printing output. It returns to the local shell. - In AI Chat, a session mention in the message field now changes size along with the text when you change the font size from the Font menu or Font panel. - In the AI Chats window, when sending a message moves a chat to the top of the list, the highlight now moves with it instead of staying on a different chat. - An AI chat using a model you added in Settings > General > AI (for example, one on a local server) no longer sends its messages to OpenAI after you remove or rename that model. It now shows an error. - VoiceOver now reads the Profiles window’s New Floating Pane button as “New Floating Pane” instead of the name of its icon. - The browser’s page-load error page is now fully translated (its “Try Again” button and footer were in English), as is the page shown for an ssh: link with no ssh integration connection. - 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 several Dynamic Profiles files have errors, the alert now gives the right number of additional errors in the log. It counted each bad file twice. - With Focus Follows Mouse on, if you move the pointer into another split pane while a sheet such as Edit Tab Title is open, that pane now gets focus when the sheet closes. Before, it stayed with the original pane until the pointer left and came back. - AI custom headers you remove from a model no longer come back after launching iTerm2 on another Mac that shares your settings. - Changing your AI models in Settings when you used a single custom AI model no longer drops the custom headers you set up for it. - The AI Usage toolbar item’s problem report no longer fills the screen with the output of a usage command that printed too much, which left its buttons out of reach. - Searching in the AI Chats window no longer crashes iTerm2 when the search finds a match. - The setting and menu item pickers in the key binding editor now say “Select Setting…” or “Select Menu Item…” until you choose one. Before, they were blank. - Advanced Paste’s chunk size and delay values and the sizes in Paste History now use units in your language instead of English. - In some languages, the shell integration installer no longer cuts off the option to install the iTerm2 Utilities or its description. - The browser’s View Source command now shows the page’s source. Before, it always said “No source available.” - When you change the theme, an open browser tab now switches pages that have light and dark versions to the matching one instead of keeping the old look until you open a new tab. - In some languages, the shell integration installer no longer cuts off the titles of its install choice buttons or its Skip, Cancel, and Continue buttons. - In Russian, the shell integration installer no longer cuts off its Preview Command button. - Right-clicking in a browser tab that a page opened from a link now shows the context menu. - In a browser tab that a page opened from a link, find, copy on select, hovered links, autofill, the password manager, and named marks now work on that tab instead of the tab that opened it. - 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. - 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. - In the Minimal theme, a window opened while iTerm2 is running now shows the profile’s subtitle in its title bar instead of only after the window is resized. - When settings load from a custom folder and are saved manually, the red “!” in the Settings title bar now goes away after you click Save Now. - Importing a script archive whose signing certificate is damaged now shows an error instead of crashing iTerm2. - Undo Close of a floating pane now puts it back at its old place among the other floating panes, so a maximized one no longer comes back in front of and hiding the others. - Help > GPU Renderer Availability now explains why GPU rendering is off in a complete sentence. - Cmd-hover and Cmd-click now find URLs on right-to-left lines that run up to a pane divider, such as in a tmux split without tmux integration. - Cmd-hover now underlines a URL that ends in right-to-left text wherever the pointer is on it, instead of leaving the previous URL underlined. - Command Info no longer shows a negative running time such as “0:-1.999” for a command that finishes quickly. - The context menu of a tab group’s label now matches the window’s light or dark appearance, like a tab’s context menu, when it differs from the system’s. - With HTML tab titles on, “&” and “<” in a title are now shown as “&” and “<” even when the title has no bold, italic, or underline tags. - In Settings > Pointer, “…even to views like Search or Composer” is now dimmed when Focus Follows Mouse is off from the moment the pane opens, not only after toggling Focus Follows Mouse. - With the Settings window in front of a terminal window, Edit > Find > Find… now focuses the Settings search field instead of opening the find bar in the terminal behind it. - Command Info’s Output size no longer counts the next prompt or the command typed at it, and is no longer too large for a command that has scrolled into history. - Command Info’s Output size no longer counts the “%” marker and padding zsh adds after output that doesn’t end in a newline. - After Session.async_split_pane() in the Python API, calling Tab.async_update_layout() without changing any sizes no longer grows the original pane back to its old width. - In AI Chat with streaming responses on, a code block at the end of a reply now shows as code with a copy button instead of as large text or with a stray closing ```. - In AI Chat, a mention of a web browser session now shows a globe icon instead of a terminal icon, both in the message field and in sent messages. - The Internet-Free shell integration install no longer sometimes hangs while installing the utilities, waiting at a “> ” prompt. - The Internet-Free shell integration install for bash could finish without adding the line that loads shell integration to your .profile or .bash_profile. - The Internet-Free shell integration install no longer reports that it installed the utilities when they failed to unpack, no longer garbles them on a busy computer, and no longer types them into the shell as commands when the ~/.iterm2 folder is not writable. - Canceling the Internet-Free shell integration install while it sends the utilities now stops sending them right away instead of a minute or more later. Canceling a step or clicking Send Again now returns you to your own shell instead of leaving you inside the installer’s helper shells at a “>> ” prompt, even when your shell is slow to start them. If you are still in one when you try again, the installer says so instead of reporting that you use bash. - An scp download that asks for a password no longer hangs if you open the Password Manager and close it without choosing a password. - An upload over SSH Integration no longer overwrites a remote file of the same name when iTerm2 could not check whether one exists, for example because of a permission error or a connection problem. The upload now fails with an error instead. - When an administrator turns off generative AI, iTerm2 no longer uses Apple Intelligence for AI chat, AI tab titles, or the command safety check. - The Internet-Free shell integration install no longer unpacks the utilities into the current folder when it can’t open the ~/.iterm2 folder, as when a file has that name. It says they were not installed. - Search the Web for Selection now finds text that contains a plus sign. Before, “c++” was searched for as “c” followed by spaces. - The “Learn more.” links on the first page of the shell integration installer now use the same font as the text around them. - 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, so accepting it gives a working command. - The browser’s View Source now highlights attribute values. - With SSH Integration, the Composer now suggests remote file names when the remote host has Python 3.7 or 3.8. - With SSH Integration, a remote request that fails unexpectedly, such as a file operation, now reports an error instead of never finishing. - With SSH Integration, asking for an immediate update of the remote job list, as the Job status bar component can, no longer ends the integration for that session. - With SSH Integration to a Mac, output that a remote command printed just before it exited could be lost. - With SSH Integration, ending a connection while a remote file search was running could leave iTerm2’s helper program running on the remote host. - With SSH Integration, deleting a remote symbolic link to a folder now deletes the link instead of failing. - With SSH Integration, iTerm2 now reads the remote PATH correctly when it contains runs of spaces or wildcard characters, and when the remote login shell is one iTerm2 doesn’t recognize. - With SSH Integration, remote files and folders whose names contain non-ASCII characters, such as accented letters, can now be downloaded, deleted, renamed, and otherwise changed. Before, they were reported as missing. - With SSH Integration, restoring a session that had used ssh to reach a further host now works when that ssh command has non-ASCII characters. - With SSH Integration, non-ASCII text that iTerm2 reads from the remote host, such as a remote PATH containing accented letters, is no longer garbled. - With SSH Integration, after iTerm2 restarts or recovers a connection, it no longer waits for the remote host to print something before remote features start working again. - Answering Always to “Close tmux windows after detaching?” no longer closes sessions that did not ask, such as the tmux session itself. - Announcements in narrow panes are legible: when there is no room beside the buttons, the buttons go on a row below the text. - Shell > ssh > Download Files… now lets you choose any file. Before, it only allowed file types that the AI provider accepts as attachments. - Installing the iTerm2 utility scripts on Linux no longer prints tar warnings or leaves ._ files in ~/.iterm2. - 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. - The Downloads and Uploads menus now show their translated title in the menu bar, and the size of each file (such as “1.2 MB of 20 MB”) is now translated. - 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. - iTerm2 no longer crashes or stops drawing terminal contents if a display reports a refresh rate of 0. - Fixed a hang of about a second each time Dynamic Profiles were reloaded when there were hundreds of them. Issue 13174. - Choosing Paste as Text for a pasted or dropped file and then answering the paste confirmation no longer freezes the window. - Some apps that ask to be told about mouse movement, such as those built with Lanterna, received clicks but not movement. Issue 13184.