Repository navigation
Releases
v0.87.0
Caution
Everyone: this release is a required update. Before it, a page in any browser on your machine could read a
session's checkout through its browser's local-file server, the session token showed in a process's command line,
and a session running in the sandbox could reach lich's own token and act on your machine through it, so update now.
Added
- A release can require its update. When a release fixes a security problem, the update prompt has no Later and comes back if you close it, and lich opens no new agent session until the update is installed: the window,
lich openand an agent's tools all refuse, each saying why and how to update. Sessions already running are not touched, and a shell still opens so you can run the update there. It counts every release you skipped, not only the latest, and needs GitHub to be reachable. In the What's new dialog such a release carries a red callout. - A session can wait for something and then act on it. Schedule prompt… on its menu takes a prompt and either a time (
45m,2h30,14:30or a full date, with the moment it lands on shown as you type) or a condition on the pull request of its branch: checks fail, checks pass, or a review arrives. Nothing is spent while nothing changes, and the prompt is typed at the session the way a relayed message is, on every provider. A watch on failing checks stays on for each new commit until the pull request closes and stops after 3 runs, telling you it did. A clock or a radar on the session's row says it holds one, and its tooltip says what. An agent can arm the same thing on its own session withlich scheduleor theschedule_promptMCP tool, and what you set there stays until you change it. - An agent can run JavaScript in its session's browser and read the answer (
browser_eval,lich browser eval): the state of your app, a value the page does not print, the result of afetch. The answer is cut at 2000 characters, so a large page state costs the agent's context only what it asks for. The script can read what a field holds, passwords included, which the page reading never hands it. - An agent can read part of a page instead of all of it:
browser_infotakeswithin, a CSS selector (lich browser info --within <css>), and answers with the text and the buttons and links of the first element it matches, so the main column of a docs site or one open dialog costs a fraction of the page and its navigation. A selector that matches nothing, or is not valid, answers with an error and leaves the indexes of the last read working. - A session browser's screenshot can carry each button's and link's index drawn on it (
annotateonbrowser_screenshot,lich browser screenshot --annotate), so an agent clicks an icon with no label by its index instead of working out where it is. Your pane shows the numbers for the moment of the capture. - Any program can tell its session's card what it is doing. A build script, a deploy or an agent without lich hooks writes the Program Status Protocol sequence (OSC 7501) and the card shows it working with its message, waiting on you with its question, or finished. A session's own hooks still win when it has them. Programs that ask whether the terminal reads the protocol get the answer. On Windows this has not been verified.
- When a usage limit stops a Claude Code or Codex turn and another of your logged-in profiles of the same agent still has quota left, a notice offers to continue there. Only clicking it moves the session, the way Continue in does, and sends the continuation right away; otherwise the session waits for the reset as before. A profile whose plan lich cannot read is never offered, and a click after the session has moved on is refused and says why.
- An agent handing its work off can suggest another of your profiles for the successor (
profileonhandoff_session,lich handoff --profile). The successor still starts in the caller's profile, and a notice offers the suggested one once its first turn ends: only clicking Continue in moves it. A suggestion that cannot apply is dropped, the agent is told why, and the handoff goes on. - An agent can hand its work off to a fresh session of itself at a clean break, instead of carrying on in a context that has grown long. The
handoff_sessiontool (andlich handoff) takes a short note, what is done, the branch and commits, the next steps and the gotchas, opens a new session in the same checkout on the same provider, model and profile, and types the note at its prompt. The old session stays open for you to close. - A Claude Code session whose conversation is compacted while tasks from other sessions still wait on its answer is reminded of them once the compaction ends: each ticket, what it asked and the command that answers it. Before, the summary could drop the ticket, and with two tasks open an answer that named none was refused, so the sessions that asked waited for nothing.
- Two sessions caught messaging each other back and forth with no work in between are stopped. The second such message in a row reaches its agent with a note that the exchange looks like a loop, and the fourth is refused, so the pair stops spending tokens on nothing. A message that follows real work, a third session joining in, or you typing into either session starts the count over. The same goes for a loop through three sessions or more: a fifth message passed on in a row, each from a session that did nothing but pass on the one it got, is refused. Crush sessions report no tools, so they are never stopped.
Changed
- A double click in the window's own widgets (text selection, the editor, the tab bar) now registers up to 400 ms apart instead of 200 ms, as the terminal and the browser pane already did.
- On Windows, the window presents frames through the flip model with at most one frame queued, and a resize shows its new size at once instead of an older frame stretched to it.
- A session browser's page answer, what
browser_evalreturns, and the tab list and page handle the browser tools answer with now put what the page wrote (its title, text, element labels, console errors, dialog messages) between<page …>and</page …>markers with a random code that changes on every answer, andbrowser_infotells the agent that text between them is the page's and never instructions. A page that writes "SYSTEM: ignore previous instructions" no longer reads like lich talking, and cannot fake the closing marker. It adds 31 characters to an answer. - A session browser's screenshot is at most 1280 pixels on its longest side, so one of a 2000-pixel-wide pane has 60% fewer pixels, which is what an agent pays tokens for when it looks at it, and a click at a point read off it still lands where it was read. The browser tools' descriptions, which an agent reads with every request, are a fifth shorter.
- A click or key press that leaves a page's buttons and links as the agent last read them answers with one line saying so instead of the whole list again, which about three page answers in ten repeated.
- A session browser's page answer names where a link goes only when the link has no label of its own: the agent clicks a labeled link by its index, and the addresses were a sixth of what it read.
- A button or link in a session's browser keeps its index while it is on the page, so an agent's index still clicks it after the page adds something above it or scrolls it away, and an index from a page the agent left fails instead of clicking whatever took its number. Before, every read numbered the page again from 0.
- A session browser's page answer leaves out of the page's text each line that is only the label of a button or link it lists right below, and cuts the text at 1000 characters instead of 1200: a tenth smaller, with as much of the page's own text as before.
- A session browser's click, type and key press on an element by index or selector fail before dispatch, naming what is in the way, when another element covers the target's click point (a cookie banner, a modal backdrop:
covered by <div#consent-banner>) or the target is disabled, instead of clicking whatever is on top or doing nothing and answering with the page as before. A click at an x and y the agent chose is unchanged.
Fixed
- The New folder dialog opens with the cursor in its name field, so you can type the name at once instead of clicking the field first.
- The prompt lich parks to continue a turn a usage limit stopped shows on the session again, and can be cancelled from its menu. So does the notice that deleting a session also deleted a prompt scheduled on it. Both went missing with the web window.
GIO_DAMAGE=onredraws into a framebuffer lich keeps instead of trusting the driver's buffer age, so a driver that misreports it no longer leaves the window with stale pixels.- On X11, a wheel notch scrolls once instead of twice, and hover clears when the pointer leaves the window, on Windows too.
- Codex and Kiro CLI sessions are now told they run inside lich and when to open another session for the work, in your prompt language: both CLIs drop what lich's MCP server says to the model, so they had the tools and no word on using them. Codex gets it in new conversations, unless your
config.tomlsetsdeveloper_instructions, which lich leaves alone; Kiro gets it once lich next updates its plugin there. - An agent's click or key press right after it clicked a download link in a session browser that had just started no longer gets wiped by the page reload Chrome does when it starts that download: lich holds the second action until the reload has landed, or until the browser is 6 seconds old.
- A worktree created without a name no longer fails with "which already exists" when the name lic...
v0.86.0
Added
- The tray tells you which sessions need you. Its menu lists the sessions waiting on you, with what they are asking, and the ones whose finished turn you have not read, then the ones working, with the tool they are running; clicking one opens the window on its card. Hovering the icon lists them all, uncut, where your tray shows the icon's tooltip, and on macOS each entry's tooltip has its whole line. The icon takes a dot when something is going on: amber for a session waiting on you, green for a turn left unread, grey while one works. The services moved into a submenu.
- The tray of notes on a session browser's page has a box for a note about all of them, the way a batch of review comments does. What you write there closes the message the agent gets. Enter sends the notes, Shift+Enter starts a new line, and Clear empties it with the rest.
Changed
- The window spends about a tenth less CPU on every frame it draws: it no longer works out which part of a frame changed when it is drawing the whole frame anyway.
- Moving the pointer over the window no longer redraws it on every move: it draws only when something under the pointer changes, and an agent that tracks the mouse (Claude Code does) no longer makes its output draw at once as the pointer moves. Less power spent while your hand is on the mouse.
- A link in a terminal underlines, and the pointer turns into a hand, only while Ctrl (Cmd on macOS) is held, the key a click opens it with, as in Ghostty. Before, every link under the pointer underlined.
- The note under a batch of review comments, in Code, Review and Pulls, is now a box that grows with what you write: Shift+Enter starts a new line, Enter still adds it to the batch.
Fixed
- Typing or pasting in a terminal you scrolled up brings it back to the bottom, where what you type shows up, the way most terminals do. Before, the text reached the session while the view stayed on the scrollback, and you had to scroll down by hand to see it.
- Terminal text has the same weight as the rest of the window's text. Before, the soft edges of each letter were blended differently, so light text on a dark theme looked thinner than it should and dark text on a light theme looked heavier.
- A variable your shell's rc exports with a line break in its value (a certificate, a key) reaches your sessions whole. Before, only its first line arrived, and a later line written like
NAME=valuecame through as a variable of its own. - A file ticked Viewed on the Pulls screen's Files tab opens folded when the pull request is opened again, until a new commit changes it. Before, it came back open.
- Opening lich again right after quitting it, or the relaunch after an update, no longer fails with "lich could not listen on 127.0.0.1:47821" while the old lich is still stopping a project's services. Quitting now frees the port before it waits for them.
v0.85.0
Added
- A checkout's menu in the sidebar, from a right click or the … on its row, has Close all sessions: every session in that checkout closes at once, each with its own Undo, after a confirmation when any of them is mid-turn, and the last one offers to remove the worktree.
Fixed
- On Linux, the window no longer turns to scattered stale pixels on graphics drivers that misreport what their buffers hold, as NVIDIA 595 on COSMIC does: every frame is drawn whole again, as before 0.84.0. Drawing only what changed, and its lower graphics card load, is now opt-in with
GIO_DAMAGE=onin the environment. - A lich built from a release with a label of its own in its version, such as
0.83.0+local.3, is offered the next release by Check for updates and the startup check. Before, any build with a+in its version was taken for a development build and told it was on the latest version.
v0.84.0
Added
- The Conversation tab of a pull request on the Pulls screen shows each author's GitHub picture beside their reviews and comments, in a column down the left, the way GitHub does. Comments inside a review thread, on the Conversation tab and on the Files tab, are separated by a line. Until a picture loads, or for an account that has none, the author's initial stands in its place.
- Task lists in pull request descriptions and comments show a checkbox, ticked or not, in place of a literal
[x]or[ ]. - Top-level headings in pull request descriptions and comments are underlined across the text's width, as on GitHub.
- The lich plugin's theme skill, which writes, ports or fixes a lich color theme, now reaches opencode, oh-my-pi, Crush and Kiro CLI as
lich-theme; it was only in Claude Code, Codex, Antigravity and Cursor CLI. In opencode it is the/lich-themecommand. It arrives with the next install or update of the plugin from Settings › Providers. - opencode 2 runs in lich. lich tells it from opencode 1 by its version and opens it the way 2 expects: each session on a server of its own, so its profile, its model and lich's tools reach it, with forks, Unfold long pastes, profile logins and the OpenCode Go gauge working as they do on opencode 1. Conversations started in opencode 2, and opencode 1 ones it has continued, show their cost, closing words and search results again, and are listed in History. The card's spinner, ring, bell and title need the lich plugin's next release, installed from Settings › Providers, which now goes where opencode 2 reads plugins and takes the place of the copy an older lich installed. A session lich opens is not on opencode 2's shared background server, so
opencode pairand the desktop app don't see it. - The Description heading on the Pulls screen's Overview has a ⋯ menu, as GitHub's comments do: Copy link copies the pull request's address, Copy Markdown its description as written, and Edit opens the description for editing, which the Edit button beside the heading did before.
- An agent can manage a project's services as the Services footer does: list, create, edit, delete, start, stop, force-stop and restart one, start or stop them all, and read what one has printed, running or stopped, with the
*_serviceMCP tools orlich servicefrom a terminal. A service is named by its name in the project, the agent's own unless it names another.
Changed
- On your own pull request, the Pulls screen no longer offers Approve or Request changes, which GitHub refuses from the author, and the diff's menu no longer offers a comment on the pull request. The diff's menu also leaves Comment on the pull request out when no lines are selected, where it used to show it disabled.
- Pull request descriptions, comments and Markdown previews are easier to read, with brighter text, clearer headings and links, inline code highlighted, more room between lines and blocks, and wrapped list items aligned with their text.
- The Pulls screen opens on an index of the project's pull requests across the whole screen, and a pull request opens in its place instead of beside the list. A back button over its title returns to the index as you left it; beside it, the number opens a menu of the other pull requests, and previous and next walk the index's filter. On the Files tab only the file tree sits beside the diff, which gains the width the list took. The Overview puts the description beside a column with the reviewers, checks, mergeability and the checkout the branch sits in; the tab strip ends with the pull request's size. Open in Session and Merge stay in the header, with Resolve conflicts or Fix checks beside them when the pull request needs one, and Approve, Refresh and Open on GitHub move to the ⋯ menu. The screen lines up on the sidebar's spacing, its buttons are the size of the rest of the window's, and the code a review thread is about sits in a block of its own, apart from the comments. On the index, j and k or the arrows move, Enter opens and / goes to the filter; on a pull request, Escape goes back and Alt with an arrow steps to the previous or next one.
- The bundled Dark theme gives the interface and terminal the same neutral charcoal background, removing the terminal's blue-black cast, and uses a brighter terminal and syntax palette of green, coral, amber, blue, violet and cyan. The Light theme uses darker counterparts of those colors, tuned for contrast on its light terminal background.
- A session's browser is no longer closed without asking. When no pane shows it and nobody has used it for five minutes, a toast asks whether to close it: Close closes it, and Keep open, or swiping the toast away, keeps it for another five minutes. Unanswered, the toast stays up and the browser stays open, so a page left open over lunch is still there when you come back. Using the browser, or the agent using it, takes the toast down. Before, the browser was closed after five minutes away from its session, and its page, tabs and login were lost.
- On the Pulls screen, the button that sends a pull request's open review threads to its session sits in the header beside Open in Session, on every tab, at the size of the buttons around it. It was a small button at the top of the Conversation tab, out of sight once the conversation was scrolled.
- The sidebar's resize strip sits on the sidebar's own right edge, as the Code and Review panel's does, instead of in the gap between the sidebar and the sessions.
- The sidebar is a tree of sessions. A session is one line: its ring, its name, its pull request and changes, and a corner where a … under the pointer opens the session's menu, close included. What the card's other lines said moved to its tooltip: the tool the turn runs or what it waits on, for how long, the path and the model. Each checkout is a row of its own, with its branch, pull request and changes, and its sessions hang from it. A session another one opened (a fork, a session opened with
open_sessionorlich open, a subagent card) hangs from the session that opened it, even when it runs in another worktree, and a mother folds her children away, keeping a count and the waiting or unread mark. Rows move by their line: as a mother opens, a session opens or a worktree or a folder appears, a row opens with its name already on it and the line runs down to it and draws its ring; folding or closing takes the name off, undraws the ring and runs the line back up, and a worktree's or a folder's last session leaving takes the worktree's row, or the folder, out after it. A folder sits on a tray, so where it ends shows. Pinning moved to the card's menu, which also copies thelich replycommand of a request the session owes. A project with no worktree keeps a flat list. The collapsed sidebar shows the same tree in one column: each checkout's node, the line through its sessions, a child's smaller ring on its mother's line, and each folder on its tray, its rows coming and going by the same line. Dragging a session lets go of its line, shows a dashed slot where it will join the tree, and draws the line back to it once it lands; the folder or worktree it would be filed into lights up whole. A dragged mother takes her children with her, and a session only lands where the tree keeps it, never between a mother and her child. A session filed into a folder that wears a color takes that color, so the folder keeps it, whether you drag it there, pick the folder in its menu, or an agent files it withfile_sessionorlich file; a session opened into a folder, a subagent's worker or the session that asked for it, wears it too. Dropping a session on a folder further down the sidebar files it again, where it went back to its place when a worktree above also took it. The collapsed sidebar drags sessions too, and its search button opens the same filter as the open sidebar, which keeps filtering the rail after its panel closes. - On the Pulls screen's Overview, the Description heading and its ⋯ stay in place at the top of the column while the description scrolls under them, over a separator, and the ⋯ sits at the column's right edge.
- The Pulls screen's loading placeholders match what loads in their place: the index shows rows the height of real ones with the checks column where it lands, filling the screen, and a pull request shows its title row with its buttons, the real tab strip, and the open tab's layout (the description beside its facts, commits, checks, the conversation's avatars and comments, or the files' toolbar, tree and cards) instead of a few generic bars. The conversation and the diff show the same placeholders while they load, in place of a line of text.
Fixed
- A review, reply or other pull request action GitHub refuses says why, such as a pending review left open on github.com or a comment on a line outside the diff. Before, every refusal read "gh could not complete the request", because the reason GitHub sent was discarded.
- A pending review comment under its line on the Pulls screen's Files tab has Edit and Discard, as it does on the Conversation tab. Before, it could only be changed or dropped from the Conversation tab.
- On the Pulls screen's Files tab, expanding the lines hidden between changes, previewing a Markdown file and showing an image work on a pull request whose branch is not checked out anywhere. They failed with "Couldn't read" the file, because lich looked for it in a folder named after the pull request's address.
- A pull request's tab on the Pulls screen opens at its top. Before, it opened where the previous tab or pull request had been scrolled to, so the Conversation tab could open at its end.
- Code quoted in a review thread on the Pulls screen shows its indentation instead of a box for every tab.
- A...
v0.83.0
Added
- The terminal draws images sent with the Kitty graphics protocol, and tells programs the size of its cells in pixels (
CSI 14 t,16 t,18 t). A TUI that shows icons or previews this way, the file managertfmamong them, now shows them in a lich session as it does in Kitty or Ghostty. Before, those programs fell back to small text glyphs or drew nothing. Images sent as Sixel or through tmux are still not drawn. - The session browser has tabs. They sit on the browser's header, where a + opens a new one; click a tab to switch to it, or its × to close it. What a page opens in a new tab or window joins them, in front, and closing it brings back the page that opened it, as it was. The agent lists and switches tabs with the new MCP tools
browser_tabsandbrowser_tab(orlich browser tabsandlich browser tab), and its cursor moves to the tab it acts on. lich insert --focusedpastes into the session whose card is on screen in lich's window: the active card of the project tab in front. A file manager action or an editor can send a path to the agent you are looking at without guessing it from the file's folder.lich sessions --json,lich whoami --jsonand the MCP toollist_sessionsmark that session with"focused": true. With the window closed, no session is marked and--focusedsays so.
Changed
- What a page in the session browser opens in a new tab or window no longer replaces the page that opened it. Before, the new tab's address loaded over that page, so a login or anything else the page held in its script was lost, and a flow that opens a tab and waits for it to finish broke.
Fixed
- Closing a session whose browser was open beside it, with its terminal focused, no longer closes the lich window.
v0.82.0
Added
lich sessions --json,lich whoami --jsonand the MCP toollist_sessionscarry the line a session's card shows under its label:toolanddetailwhile it is busy, the tool it is running and what it acts on, andreasonwhile it waits on you. A script or a desktop widget can show what each agent is doing without opening the window.- A session's browser opens a local file from the session's checkout. Type its path in the address field, or the agent passes the path or a
file:URL tobrowser_open, and lich serves the checkout over http on 127.0.0.1, on a port of its own per worktree (the checkout'sLICH_WORKTREE_PORTplus 1000), so module scripts,fetchand relative assets work and each worktree keeps its own storage. A path outside the checkout is refused. Before, a local file could not be opened at all, and previewing one meant starting a static server by hand. - A session browser's toolbar has a zoom button. It opens a small menu that steps the page zoom down and up by 10% and resets it to 100%, each control naming its keyboard shortcut. Before, the zoom could only be changed from the keyboard.
Fixed
- Continue in keeps the session's browser. Moving a session to another profile closed its browser, and its page and cookies were gone when the session came back up.
- The session browser keeps up with a busy page. On a page that animates or runs a lot of JavaScript, the browser tab fell seconds behind the page and the rest of the window waited with it; it now skips to the newest frame.
- The session browser is sharp on a HiDPI screen. Its tab showed the page at 1x, blurred, on any display; it now draws it at up to 1.5x.
- Notes from the session browser, and the Pulls screen's Fix CI errors and Resolve conflicts, reach a Claude Code session you stopped with Esc. Claude Code turned the message down until someone typed at the session, and the tray said "its mod refused it"; lich now types the message at the prompt instead.
v0.81.0
Important
Anyone whose agent works on a web page: point at the page and tell it what to change. The crosshair on the
session browser's toolbar leaves notes on the elements you pick and sends them to the agent in one message.
Added
- The crosshair on a session browser's toolbar lets you leave notes on the page for the agent. The element under the pointer is outlined and named, the outline sliding from one element to the next as the pointer moves, a click opens a note beside it, and each note pins its element with a number, following it as the page scrolls. Notes wait in a tray floating over the bottom of the page, which never resizes under you. Hovering a note there lights its element, and a click on it or its pin scrolls the element into view and edits the note. An element a scrolling list, sidebar or dialog cuts is outlined only where it shows, and one it hides keeps no pin over what stands beside it. Send (or Ctrl+Enter) types them into the session as one message: which element, a selector the agent's
browser_clicktakes, the React component that drew it in a development build, and your note. Ctrl+Shift+E (Cmd+Shift+E on macOS) turns the crosshair on and off, and Esc leaves it. A send the session refuses keeps the notes and says why in the tray. - A session's browser downloads files. A download the page starts, from a link, a button, a new tab or a script, lands in your Downloads folder under the name the page gives it, with
(1)added rather than overwriting a file already there. The agent can also open a file's URL directly. The agent's click, key press or open answers with the file's path and size, and the window shows a toast naming the file, with a button that opens its folder. Before, a download button in the session's browser did nothing. - The agent can wait for its browser page to change instead of reading it again in a loop.
browser_infotakeswait_for(text that should appear) andwait_gone(text that should disappear), matched anywhere on the page, and answers as soon as the page shows it, or after 20 seconds with the page as it stands and a line saying the wait timed out. - The agent hears when the page in its session's browser breaks. Each page it reads, clicks or presses a key on answers with the console errors since its last look, once each:
console.errorcalls, uncaught exceptions and resources that failed to load, cut to one short line, the first five and how many more. Warnings and other messages stay out. - An agent can close a project, with
close_projectorlich close-project: the tab leaves the window and its sessions stop, kept for a reopen as when you close the tab. The project the agent runs in and the home project are refused. - The agent and you answer the page's JavaScript dialogs in a session's browser. An alert, a confirm, a prompt or a "Leave this page?" the page opens shows as a card over the top of the page in the session's browser tab, naming the site that opened it, with its buttons and, for a prompt, a field. You answer it there, or the agent does with
browser_dialog, and its cursor presses the card's button. The agent's click that opened a dialog answers at once with the dialog in it, and the agent hears of one you answered. Before, a button that showed an alert froze the page: the agent's click and every read after it waited thirty seconds and failed. - Settings › General has a Copy on select switch for the terminal. On by default, it copies a selection as soon as you make it; off, copy it with Ctrl+Shift+C (Cmd+C on macOS).
- A session's browser zooms its page on its own, apart from the interface zoom: Ctrl+- and Ctrl+= (Cmd on macOS) zoom out and in by 10%, from 50% to 200%, and Ctrl+0 goes back to 100%. A zoomed-out page lays out wider, as in a desktop browser, which makes a small screen usable without shrinking the rest of the window. The zoom applies to every session's browser, shows on the toolbar while it is not 100%, and is kept for the next start.
- Settings › General › Window › Buttons chooses whether the window's minimize, maximize and close buttons show: Follow system, Always show or Hide. Follow system is how lich behaved before, and on Linux it now also follows a change to the desktop's button layout while lich is open instead of only reading it at start. Always show draws the buttons even where the window manager decorates the window or tiles it without a title bar, as Hyprland does. Hide leaves the window without them, the traffic lights included on macOS.
Changed
- A project's GitHub account (Settings › Version Control) now reaches its sessions too:
ghrun by the agent or in a shell card answers as that account instead of whichever one gh has active, from the session's next start. Inside those sessionsgh auth switchno longer changes the account. - The window holds less memory with many sessions open. A terminal off screen lets go of the pixels it drew, a few megabytes each, and redraws them in one frame when it comes back.
- The window's garbage collector now runs at 50 instead of Go's default 100, which in a test with 15 sessions cut about a tenth of its resident memory, the slack the system would otherwise swap out.
GOGCstill overrides it. - The browser tools answer an agent in the session's prompt language: the legend of the element list, the note that more elements wait below, the filled and checked marks, a download still running, a wait that timed out, the count of further console errors, and what an open dialog asks of it. The line tags (
url:,text:,downloaded:,console error:,dialog open:and the rest) stay as they are in every language. - A session's browser that no tab shows lays its page out at the size of the lich window, at the browser zoom, instead of Chrome's 800×600, so the agent reads and screenshots the page as a desktop browser shows it. Closing the browser tab puts the page back at that size rather than leaving it at the tab's.
- Resolve conflicts on the Pulls screen names the conflicting files in the prompt it sends the session, as Fix CI errors names the failing checks. Clicked before the files are known, it sends the prompt without them, as before.
Fixed
- On Windows the window is titled
lichin the taskbar and Alt-Tab, instead oflich (native slice). - A project whose GitHub account lives on a GitHub Enterprise server gets that account in the Pulls screen, the pull request badges and a sandboxed session granted its token. The token went out under a variable gh ignores for an enterprise host, so gh answered as its active account there.
- A session browser's click, type or key press by index reaches the element the agent's last page read gave that index. After a scroll and a second read, an element the first read had listed under the same index, now out of view, could take the click instead, with no error.
- On Windows, sessions starting at the same time on one profile no longer fail now and then with
Access is deniedwhile lich writes that profile's files.
v0.80.0
Important
Anyone whose agent works on a web page: it now drives a browser beside the session. Open Browser from a
session card's menu and watch the agent's cursor click, type and scroll in the page, while you use it too.
Added
- A session card's menu opens a browser for that session, above Open in, in a tab beside the session: its terminal on one side and the page on the other, with the divider, rotate and zoom of a split. The session's agent drives the same page: open a URL, read it, click, type, press a key, go back and forward, scroll and screenshot, from
browser_*tools or fromlich browser. The agent's own cursor shows where it acts: lich's arrow, in the session's card color or the theme's, with a badge naming the provider, glides to each click, field and scroll on the page and to back, forward, reload and the address on the pane's toolbar, playing even an agent's parallel calls in turn. You click, type and copy and paste with your own clipboard in the page while it does. Each click and key the agent sends answers with the page it left, in a compact form, so a long session spends about half the tokens it would reading the page back as JSON. When the agent opens a browser on its own, a toast in the bottom-right corner offers to show it. Open in a window moves the page to a Chromium window of its own, cookies and all. Closing the card closes the browser. The browser is the Chrome, Edge, Chromium, Brave, Vivaldi or Helium already installed. - The footer shows how much of the last turn was read back from the prompt cache, with a bar splitting the turn's input into cached, written to the cache and uncached. A turn after the cache expired reads 0% in amber, which is the turn billed at the full rate. It sits in the context window tooltip on Claude Code and Codex, and in the cost tooltip on oh-my-pi and opencode.
Changed
- An opencode session gets lich's MCP server at spawn, like Claude Code and Codex, so it lists every lich tool, the
browser_*ones included, under thelichserver in opencode's MCP list. Your own servers and anyOPENCODE_CONFIG_CONTENTyou export are kept. - An agent can change the model or the reasoning effort of the session it runs in through
control_session, and close that session when you ask it to (selfonclose_session,lich close --self). Both used to be refused outright.
Fixed
- A session browser's open, reload, back and forward return once the page is interactive, instead of waiting for every image and tracker to finish. That wait held the agent's next action for as long as the load event took, up to 30 seconds, after the page was already on screen. A screenshot is the viewport being watched.
- A Codex session's cost no longer bills the tokens written to the prompt cache twice. They were priced at the cache-write rate and again as uncached input.
- The mouse wheel in a terminal scrolls smoothly and as far as in other terminals. A notch moves three lines of the shell's history, or a full-screen program such as
less, eased over a few frames instead of jumping some eight lines at once. A program that takes the mouse, such as nvim, Claude Code or Codex, gets one wheel step a notch and scrolls its own distance, where it used to get about eight and race through the conversation.
v0.79.0
Important
Anyone who keeps a dev server, a container or a tunnel open beside their agents: lich now runs them. Save
them once in Settings › Services of a project, then start, stop and read them from the bottom of the sidebar.
Added
-
On macOS, lich has a menu-bar item: a lich whose window is closed shows it is still running its sessions there, with Show lich, the count of running sessions and Quit, as the tray does on Linux and Windows.
-
Services: commands a project keeps running, started by lich. Save a container, a tunnel or a dev server once in Settings › Services of a project, and start it from the Services row at the bottom of the sidebar, above the profile. Closed, the row says how many run (2/3); opened, it lists each service with how long it has run or how it ended, and Start, Stop and Restart on hover. A click opens its console, where it takes input and Ctrl+C stops it. A service is not a terminal: when its command exits, it has stopped, its last output stays readable, and Start runs it again. Tick Start with lich and it starts every time lich does with its project open. Services saved in Settings › Services with Global selected run in your home directory and show on lich's home screen, the place for a
lazydockeryou keep open whatever the project. A service lives as long as its project's tab: closing the tab stops it, and reopening the project starts the ones saved to start with lich. Closing the window leaves them running, and the tray lists them with Show output, Restart and Stop; quitting lich stops them, and the close dialog counts them. With the sidebar collapsed, the rail's Services button opens the same list. -
Send a pull request's review threads to its session. On the Pulls screen, an open review thread has Send to session beside Reply and Resolve, in the Conversation tab and in the diff, and the Conversation tab can send every open thread at once. The threads go as one prompt to the session in the branch's checkout, which lich opens when there is none, with each thread's file, lines, link and every comment in it. Pulls stays on screen, and a toast with Open says when the session took them. lich then answers each thread on GitHub with "Fixing this. It'll be in the next commit." and resolves it once the pull request is pushed again, replying with the commit it landed in; until then the thread reads Sent, waiting for a push. Any push resolves it, even one that did not touch it.
Changed
- A pull request merged outside lich, on github.com, with
ghin a terminal or by an agent, is now announced to the agents in its branch's checkout as one merged from Pulls is, within a minute of the merge. They used to keep believing it was still open. The agents running there when lich sees it open and then merged hear it; one parked at that moment, or a pull request that merged before lich last started, does not. - Resolve conflicts and Fix CI errors in Pulls no longer take you to the session they hand the pull request to. Pulls stays on screen so you can move to the next pull request, the session starts in the sidebar, and a toast says when the agent got the task, with Open to go to it. A session whose start needs your answer first, such as whether to resume its last conversation, still comes up. Open in Session still goes to the session.
- The quick filters over the pull request list in Pulls (All, Ready, Drafts, Failing) are lighter: small text with the selected one shaded, as in the dock's tabs, sharing the list's width. A filter with nothing in it is faded and Failing's count turns red when a check fails. They no longer run past the list's edge with a monospace interface font.
Fixed
- A pull request badge on a session card, its Pull request menu item and the footer's pull request button no longer open the wrong pull request after the session's shell moved into another repository. The badge shows that repository's pull request, and the click used to look its number up among the project's own on Pulls; it now opens the pull request on GitHub instead.
- The collapsed sidebar shows the profile new sessions are born in, at the bottom of the rail, and opens the same menu the open sidebar's footer does. It used to show no profile at all.
- A tab in the top bar can no longer get stuck lifted, drawn in the accent color as if it were being dragged, with no tab moving again until lich restarted. A tab focused by a click and then given Space or Enter was picked up to reorder from the keyboard, and once a click elsewhere took the keyboard it could neither be dropped nor cancelled; it now goes back to its place when it loses focus. A layout tab renamed in the middle of a drag no longer gets stuck the same way.
- A session card no longer grows and shrinks as its agent starts and stops a tool, waits on you or compacts, pushing every card below it up and down. That line now takes the place of the card's path while it shows, and the path comes back when it goes.
- The native window holds less memory for its fonts. A font file asked for more than once, such as the interface and the terminal set in the same family or the bold face that also stands in for semibold, was parsed again each time, about 30MB for a Nerd Font face; it is now parsed once and shared while in use. An interface in a language other than Chinese, Japanese or Korean no longer loads a CJK font at start, tens of megabytes: it does on the first CJK text on screen, drawn meanwhile with a system font. With one Nerd Font for the interface, the terminal and the editor and no CJK on screen, the fonts take 119MB where they took 246MB.
- On macOS, opening lich from the Dock, Launchpad, Spotlight or Finder while it runs with its window closed opens the window again. lich started at login with
--no-windowincluded, where the click did nothing. Logging out now quits lich the waylich quitdoes, so the next launch does not read it as a crash.
v0.78.1
Changed
- While a session works, the window redraws its busy spinner at 30 frames a second rather than at the display's rate, a card builds its right-click menu only while that menu is open, and a dialog that is shut builds nothing at all.
Fixed
- Branch, changes and pull request on the cards and the footer catch up within a second of a commit, checkout or edit made outside a turn, where they could lag up to three seconds, and selecting a card reads its checkout at once instead of showing what the last read found.
- Hiding the pull request list in Pulls slides it away at once, where the list stayed on screen until the mouse moved or Pulls next checked GitHub. Showing it again no longer waits a frame either.
- Kiro CLI sessions follow
KIRO_HOME. With it set, lich read Kiro's conversations, cost and context from~/.kirowhile Kiro kept them underKIRO_HOME, so they showed nothing and History listed none; the agent that carries lich's hooks was installed where Kiro never looked, and a sandboxed session was not given the directory it writes into. - Opening or closing the dock no longer leaves the session's terminal cut off at its edge for a beat once the dock stops. The terminal takes its new width as the dock starts moving, so the agent redraws while the dock slides in, where the terminal waited until a tenth of a second after the dock stopped and then jumped. A split layout's terminals fit the moment the dock stops.
- Expanding the sidebar no longer leaves the session's terminal at its old width for a beat once the sidebar is open. The terminal takes its new width as the sidebar starts moving, as with the dock, where it waited until a tenth of a second after the sidebar stopped and then jumped; collapsing it refits at once too. A split layout's terminals fit the moment the sidebar stops.
- Reopening the window no longer types stray text into a session. Rebuilding a terminal from its recent output answered the terminal queries in it again, such as the ones nvim sends at start, and the answers landed on the session's input: in a shell as a
command not found, in an agent as text in its prompt. - A session's terminal opened while the session is printing no longer misses what it printed in that moment. The backend now hands the window the session's recent output in line with its live output, so nothing between the two is lost or shown twice.
- On Linux, stepping the terminal font size and opening a card for the first time hitch less. Every terminal looked its font up again through fontconfig each time, four lookups of about 10ms apiece inside one frame; lich now remembers the answer for the rest of its run.
- Stepping the terminal font size no longer reloads the font of every open terminal: each one keeps the font it has and only draws it at the new size.
- A session printing a lot of output costs the backend less. Each byte on its way to the window was copied about seven times into memory the garbage collector then had to reclaim; it is now copied once.
- A block comment that opens above a collapsed stretch of a diff, in Review and Pulls, no longer colors the code after that stretch as a comment. Its closing
*/fell in the hidden lines, so every hunk below showed as comment until some later*/, and only expanding the stretch fixed it. The lines of a comment cut by a collapsed stretch, above it, can still show as code until it is expanded.









