Releases: omartelo/lich
Release list
v0.19.0
Added
- The Pulls screen now lists the commits a pull request would land. A new
"Commits" tab, counted next to its name, shows every commit oldest first: the
subject line, who committed it and when, and clicking a row opens its message
body — the branch's story, which the diff and the file list never tell. The commits ride along with the lookup the screen already makes,
so it costs no extra round-trip.
Fixed
- The shell no longer behaves like a browser. The window is one only by
construction, and its reflexes leaked through everywhere except a focused
terminal, which already swallows them: a locale that did not match the UI
raised the translate bubble on startup; Ctrl+W closed the window, which quits
lich; Ctrl+T and Ctrl+N opened tabs and windows; Ctrl+P, Ctrl+S and Ctrl+O
opened dialogs with nowhere to land; Ctrl+Shift+Delete would have wiped lich's
own saved settings along with the browsing data; right-clicking the UI offered
Back, Reload and Save as; dropping a file on the window replaced the app with
that file, with no address bar to come back from; and middle-clicking a link
spawned a browser window. All of it is now refused. Reload, the devtools chords
and the terminal's own right-click menu are deliberately kept, and every chord
still reaches a terminal as its PTY sequence — Ctrl+W stays delete-word,
Ctrl+U kill-line, Ctrl+D end-of-file. - A new directory of files now counts as the files it holds, not as one. The
changed-file count came fromgit status --porcelain, which reports an
untracked directory as a single?? pkg/entry — so an agent writing 25 files
into fresh packages showed 4 changed files in the footer and on the session
card, while the Review tab listed all of them. The count now asks git for
every untracked file; the line totals were already right. - Merging a pull request now clears its badge everywhere, at once. The
footer, the session cards and the sidebar's "Pull request" entry only looked
the pull request up again when the checkout's HEAD moved, or when the window
lost focus and got it back — and a merge does neither, since the commit lands
on the base branch, on the remote. Merging from the Pulls screen emptied that
screen while every badge around it went on reading#N Openuntil you clicked
away to another window and back. Merging, opening a pull request and the
header's reload button now retire the shared answer and re-read it. - A model newer than your lich no longer reads its context window as 200k.
Opus 5 sessions showed five times their real usage in the footer, because the
window came from a table of the 1M models and anything missing from it fell
back to the smallest window that fit — so every model launch needed a release
here. The rule is now the other way round: Haiku is the 200k exception and
everything else is 1M, which is what a model released after your build reads
without a new version. - A pull request with hundreds of changed files no longer locks the app.
Every file in a diff panel starts expanded, and an expanded file builds its own
CodeMirror view — so a 191-file pull request built 191 editors in one go, each
followed by a language chunk re-configuring its document. Chromium offered to
kill the page, and the screen stayed unusable well after it recovered. A file's
editor is now built only once its card comes near the viewport; until then the
card holds a placeholder of the file's height, so the scrollbar still measures
the whole diff. An editor that has been built stays built, keeping its
selection and highlighting when you scroll back. That 191-file diff now settles
in 465 ms with 8 editors, against 13.7 s with 191. The dock's Review tab shares
the same cards and the same fix. Files changed also stopped refetching the diff
every time the window regained focus — a new commit still refreshes it. - The pull request screen no longer waits behind a bare "Loading…". Both the
lookup and the diff areghround-trips of about a second, and on a screen
that size a single muted line read as a failure. Each now holds the shape of
what is coming — title, actions, status line and tabs for the pull request;
file tree, toolbar and file cards for Files changed.
v0.18.0
Added
-
The pull request badge keeps up with the session working next to it. A
commit — or the push that opens a pull request — now reaches the badge, the
checks and the diff on its own, instead of waiting for you to click away to
another window and back. Git status also follows a checkout that is being
worked in every second rather than every three, settling back to the slower
cadence once it goes quiet, so nothing extra is spent on idle projects. -
Open, review and merge pull requests without leaving lich. A branch's
GitHub pull request now opens as a full-screen view — reached from the footer
PR badge, a session card's#N, or a session's "Pull request" menu — that
parks a card in the worktree's sidebar group beside its session, the way the
Settings screen does. The Overview tab renders the description as markdown
alongside the checks and mergeability; the Checks tab lists every check —
what failed first, what is still running and for how long — and opens its run
in the browser, refreshing itself every ten seconds while any of them is still
going; the Files changed tab shows the whole
diff next to a file tree that jumps to a file on click — hide the tree and
the diff takes the whole width — folds every file at once when the review
gets wide, and lets you tick each one off as viewed: the file folds away and
the header counts how far you are. Merge from the header
— squash, a merge commit or rebase, editing the commit message first if you
want — and the merge offers to remove the branch's worktree once it lands, or
open a pull request when the branch has none. A reload button covers what
nothing can announce (a review, a check going green). It reuses theghCLI
already behind the footer badge, so a repo withoutghor a non-GitHub remote
simply shows nothing. -
The footer shows the active session's model and context window. The status
strip now names the model the active Claude session runs and its reasoning
effort (e.g.opus 4.8 · xhigh), marked with the provider's icon, and a small
ring beside it fills with the percent of its context window in use; hovering
the ring shows a fuller bar and the exact tokens against the window size. It
refreshes as the context grows through a turn, read off the conversation's
transcript. The ring turns amber past 80% and red past 95%, so a session
drifting toward auto-compaction is visible without opening/context. The
percent is taken against the model's native window (1M for current
Opus/Sonnet/Fable, 200k for Haiku). The readout can be turned off under
Settings › Providers › Claude Code. Needs no change to the user's statusline;
other providers stay blank until they report a session id of their own. -
The file tree tracks the working tree live. The Files tab now lists
untracked-but-not-ignored files alongside tracked ones and drops any file
deleted from disk, so a file created or removed during a session shows up
without a commit — it is no longer frozen at the session's starting set. -
The file tree shows each changed file's line delta. A modified or new
file carries the same+added −deletedpair the review panel and footer use,
reusing the diff already parsed for the review — a clean file stays bare. -
Right-click in the file tree. A directory's context menu offers Expand all
and Collapse all over that folder's subtree; a file's offers Open in editor. A
GUI$VISUAL/$EDITOR— or the platform opener (xdg-open,open -t,
start) when neither is set — launches detached; a terminal editor (vim,
nvim, nano, …) opens in a fresh lich terminal session rooted at the checkout,
since a detached launch would leave it with no controlling terminal. The
editor is resolved from the login shell, so a GUI launch still sees rc exports.
v0.17.0
Added
- The session sidebar now groups by worktree. With several worktrees open,
a flat list of cards made it hard to tell which terminal or provider belonged
to which checkout. Sessions sharing a worktree now sit under one static
divider titled with the worktree folder name, so the checkout each card
belongs to reads at a glance while the branch stays on the card. Grouping
keys off each session's checkout
path fixed at spawn, never its live cwd — acddeeper into the tree never
moves a card to another group. A drag reorders within a group only, and a
project with no worktrees keeps its old flat, header-less list. - Search the base branch when creating a worktree. The New Worktree
dialog's base picker is now a filter: type to narrow the worktrees, local and
remote branches by name and pick with the arrow keys or the mouse — finding
developormainin a repo with dozens of remote branches no longer means
scrolling a collapsed list. - Collapse or expand every file in a review at once. A toggle in the review
dock header folds the whole diff down to its file headers, or opens it all
back up, so a large changeset is quick to skim.
Changed
- The interface has been reskinned. One idiom throughout — elements are
defined by spacing, hover and hairline seams instead of nested bordered
boxes: session and settings cards become borderless rows, review file diffs
become open surfaces separated by a hairline, footer and menu controls lose
their chip borders, and the segmented controls, tabs and dialogs tighten up.
The zinc palette and the window layout are unchanged. - Notifications read cleaner. The bell shows a small red dot instead of a
white count; the count moves into a titled dropdown, and the "needs your
input" toast gains an amber icon and the name of the project it came from —
and no longer lands on the top bar's corner buttons.
Fixed
- The light theme no longer glares. Every surface was pure white, so panels
had no separation and the large terminal pane was blinding. Light is now a
soft light-gray canvas with near-white raised chrome, mirroring the dark
theme's depth: the ground (and terminal) sit darker than the sidebar, cards
and menus that lift above them, and the hover/selection fill is dark enough to
read again. - A deletion line no longer bleeds through a diff file's sticky header. The
header's rounded corners let the red of a scrolled-under deletion peek out; it
now sits flush and covers the content beneath it.
v0.16.0
Added
- A fresh worktree now sets itself up. Creating a worktree copies the
gitignored.env*files over from the main checkout — a worktree starts
with tracked files only, so env files and local credentials were always
missing from a new checkout. A.worktreeincludefile at the repository
root overrides the patterns (globs, one per line; a slashless pattern
matches by basename at any depth). Wholly ignored directories
(node_modules, build output) are never copied — installing those is the
job of the new per-project setup script (Settings › Worktree), which
runs in the new worktree session's terminal ahead of the agent, so a
pnpm installhappens where you can watch it. The session opens even if
the script fails, resuming a kept worktree never re-runs it, and Windows
skips the script wrap while the port stays experimental.
Fixed
- A session spawned directly on a provider now inherits your login shell's
environment. lich is a GUI app, never started from a terminal, so its env
snapshot is the graphical session's — it never sourced.zshrc/.bashrc/
config.fish/.profile. Ashellsession hid this (the spawned$SHELL
sources its own rc), but a provider spawned directly (Claude Code, Codex, …)
saw only the launch env, so a${VAR}expansion in.mcp.json— e.g. an MCP
server's auth token exported in your rc — came up empty. lich now resolves the
shell env once at startup ($SHELL -l -i -cdump) and merges it over the
launch snapshot, so both provider and shell sessions get the full environment.
Best-effort:$SHELLunset or any failure keeps the launch env. Windows
without a$SHELL(env lives in the registry) is not covered. - Closing a worktree session only prompts to remove the checkout when it is
the last one there. A worktree can host more than one session — a provider
plus a hand-opened shell rooted at the same path — and closing the throwaway
shell offered to remove the whole checkout, so one accidental confirm discarded
the provider's work. The prompt is now gated on the closing session being the
last occupant of its worktree path; while a sibling still lives there, closing
just closes.
v0.15.0
Added
- An Updates section in Settings. It shows the running lich version with a
"Check for updates" button that forces the release check right now (the
automatic one still runs at startup and hourly), reopens the current
version's patch notes on demand, and shows the Claude Code plugin's installed
version with its own check, install and update actions.
v0.14.0
Changed
- A project may now sit with no session at all. Closing the last one no
longer spawns a replacement, and opening a project no longer seeds a first
session — both land on an empty screen, the same shape as the no-project-open
landing screen, with a button that opens a session when you want one. The
sidebar's "+" still picks the kind. An empty project stays empty across a
restart, Home included. - The stored Claude session id is now a provider session id. lich runs four
provider CLIs, but the column, the struct field, the store method and the
hook payload were all still named after Claude alone. Thesessionstable's
claude_session_idis renamed toprovider_session_idon open (existing ids
carry over — the rename is the migration, nothing is stranded);
store.Session.ClaudeSessionIDbecomesProviderSessionID
(providerSessionIdover the wire), andSetClaudeSessionbecomes
SetProviderSession. The/session-starthook now takes
provider_session_idand still accepts the oldclaude_session_idso plugin
releases before v0.3.0 keep working — seedocs/hooks/session-start.md.
Resume itself stays Claude-only:--resumeis a Claude Code flag.
Fixed
- Dragging a tab or session card no longer scrolls its strip. Reorder drags
are clamped to the strip's own axis, so pulling a project tab downward (or a
session card sideways) can't overflow the container and trigger dnd-kit's
auto-scroll on the cross axis. The dragged tab and session card also stay
solid instead of turning into a see-through ghost — the old opacity fade is
gone, and the card no longer sits in its translucent hover state (the pointer
rides it for the whole drag) while sliding across its neighbours. - Zoom now works on layouts with a dedicated "+" key (German, for one).
The chords matched only the physical Equal/Minus keys, so on those layouts
nothing claimed the press and Chromium's own zoom ran instead — the exact
double-zoom the physical-key matching was built to prevent. The typed
character is now checked as a fallback. - Stale results can no longer outrace fresh ones in the footer badges. A
slow git-status poll resolving late could overwrite the newer status the
session hooks had just fetched, and the pull-request badge kept showing the
previous directory's PR while the new lookup was in flight. - The command palette reopens clean. Toggling it closed with the hotkey
kept the previous filter and cursor for the next open; and Ctrl+F no longer
opens the terminal search box hidden beneath an open palette. - A failing file picker now says so with an error toast instead of
failing silently. - The self-update download no longer dies on a normal connection. The
binary download shared the 5-second timeout meant for small metadata reads,
and that timeout covers the whole transfer — so on anything but a very fast
link the download was cut mid-stream and self-apply (Windows/macOS) failed
every time. The download now gets its own generous ceiling. - A renamed worktree session keeps its name across keep/resume. Resuming a
kept worktree re-created the session with the "automatic title" flag reset,
so the next AI-generated title overwrote the name you chose. The flag now
survives the park/resume cycle. - Holding a hotkey no longer fires it repeatedly. Key auto-repeat on
Ctrl+Shift+T could spawn a stack of sessions from one held chord (and
Ctrl+K would flap the palette); hotkeys now fire once per press. - A failed in-place restart can be retried. If launching the successor
process failed (say, the binary mid-swap by the package manager), the
restart coordinator latched anyway and every later/restartsilently did
nothing until the app was relaunched by hand. - Sessions that exit on their own no longer leak their PTY handle, and
closing a session during its spawn round-trip no longer strands the PTY or
drops a queued update command.
v0.13.0
Added
- Terminal text size is now its own setting (Appearance › Terminal text
size, 8–32px, persisted). Interface zoom no longer touches the terminal, so
this is the control for how big terminal text is — and, unlike zoom, changing
it does change how much fits on screen, so a running session reflows to the
new width.
Changed
- Interface zoom now scales only the interface. It used to scale the
terminal along with everything else, which handed the terminal a different
amount of room at every zoom step and re-wrapped whatever was running in it —
a TUI mid-session would rewrap and its scrollback would keep the old wrap.
Zoom now moves the interface (rail, tabs, sidebar, footer, dialogs) and leaves
the terminal grid exactly where it was; terminal text has its own size setting
above.
Fixed
- Zoom no longer applies twice.
Ctrl +is physicallyCtrl+Shift+=on
every common layout, but the shortcut was declared as the character"+"with
Shift explicitly off — a combination no keyboard can produce. Zoom in therefore
never matched, nothing calledpreventDefault(), and Chromium ran its own zoom
accelerator, while zoom out (Ctrl −, no Shift needed) matched and scaled the
app instead. Two zooms, disagreeing with each other and with the Appearance
buttons, and clipped layouts once they compounded. Zoom chords are now matched
on the physical key (event.code), which is the same on every layout, so the
app is the only thing that zooms. The numpad keys work too. - Zooming no longer leaves the window part-empty or cuts the layout off. The
app scaled itself with CSSzoom, which scales rendered boxes but leaves
vh/vwas physical viewport units, so the100vh/100vwapp root rendered
at viewport × zoom: short of the window when zoomed out, overflowing when
zoomed in — and the page'soverflow: hiddencut the overflow instead of
scrolling it. Scaling now moves the root font size instead, which every
interface measurement already follows, so the layout fills exactly one window
at any zoom level.
Removed
- The
Zoom in,Zoom outandReset zoomentries from configurable
hotkeys. These chords exist to shadow Chromium's built-in accelerators, and
an accelerator is bound to a physical key rather than to a character, so they
cannot be expressed as a rebindable character combo — that mismatch was the bug
above. Any custom binding saved for them is ignored on load; every other hotkey
is untouched and still configurable.
v0.12.0
Changed
- The in-app updater now updates Arch through the AUR. On Arch (and its
derivatives) the update prompt pastesyay -S lich-bininstead of the
install.shone-liner, keeping the install tracked by the user's AUR helper.
Sinceyaydoes not know how to relaunch lich, the pasted command chains an
explicit restart using the terminal session's own loopback credentials. Other
distros are unchanged.
Fixed
- The app window now shows the lich icon. The frontend served no favicon,
so the Chromium--appwindow fell back to a generic page icon in the
taskbar (most visible on Windows). The app icon now ships with the frontend
and is declared in the page head.
Added
- A one-click Restart button after a Windows/macOS self-apply. Once the
update is downloaded and swapped in, the toast now carries a Restart
button that relaunches lich in place instead of only telling you to restart
by hand. It drives the same/restartin-place relaunch the Linux installer
already uses; the button stays until you use it, since the new binary only
takes over on the next launch. - lich is on the AUR.
yay -S lich-bin(orparu -S lich-bin) installs
the released binary; every release now pushes the updated PKGBUILD to the
AUR automatically.
v0.11.1
Fixed
- The footer bar's working directory now follows
cd. It read the
session's static start path, so acdin the terminal moved the session
card but left the footer stale. It now overlays the same live-cwd source the
card follows.
Changed
- The session cwd is polled every ~300 ms (was every 2 s), so a
cdshows
up in the card and footer promptly. Each read is one cheap syscall and emits
only on change, so a static directory still costs nothing.
v0.11.0
Added
- A "what's new" popup after an update. The first time you open lich on a
new version, a dialog summarizes what changed — the release's changelog
section, grouped into Added / Changed / Fixed, with a link to the full notes.
It fires once per release and never on a fresh install. The notes are read
from the changelog baked into the binary, so the popup works offline. - Pick which provider new sessions spawn by default. lich was wired to open
Claude Code for the routines that don't ask — a new worktree, the new-session
hotkey, a project's first session. Settings › Providers now has a "Default
provider" picker over the enabled harnesses, so those routines spawn Codex,
opencode or Crush instead if you prefer. Disabling the chosen default falls
back to the first enabled provider; the per-session New Session menu still
picks a one-off provider as before. - Command palette — Ctrl/Cmd+K. One shortcut, from anywhere, to jump to any
session across every project — or to a project — without hunting through the
tabs (which only show the active project's sessions). Type to filter by
session label, project or path; ↑↓ to move, ↵ to open, Esc to close. Each
session row shows its project, path and live status (busy / waiting / done).
The shortcut is rebindable in Settings › Hotkeys, since Ctrl+K otherwise
shadows the shell's kill-line. Jump-only for now — running actions from it can
come later. - Search within a terminal — Ctrl+F. Opens a find box in the top-right of
the terminal: type to jump to the next match as you go — every match
highlighted, with a live counter — Enter / Shift+Enter to step forward and
back, and Esc to close. Like VS Code's terminal, Ctrl+F shadows the shell's
own forward-char while the box is open; Esc hands the key back to the shell.
Pairs with reload-surviving scrollback — there is now more history worth
searching. - Terminal scrollback now survives a full page reload. Reloading the window
used to leave every terminal blank until new output arrived — the shells kept
running, but their recent history lived only in the page. The backend now
keeps a capped tail of each session's output and replays it into the terminal
on reconnect, so a reload restores what you were looking at. The tail is
bounded (2 MB per session), so very old scrollback still ages out. - Launching lich twice now focuses the open window instead of failing. The
second process detects the running instance holding the pinned port (via
runtime.jsonand a token-gated liveness ping) and hands its URL to Chromium,
which forwards to the running browser and brings its window to the front, then
exits cleanly. A genuine port conflict — a non-lich process on the port —
still fails with the same clear error as before. Window focus is best-effort:
Wayland forbids an external process from raising a window, so lich relies on
Chromium's own profile-lock IPC. - A notification queue in the top strip — a bell beside the settings gear —
gathers every session needing attention across all projects into one
count-badged list: a session blocked waiting on you, or a turn that finished
and you have not seen. Clicking a row routes straight to that session, even in
a background project, so you can work in one project and jump to a
notification from another without hunting for it. It is the persistent surface
for the same signal the attention toast raises transiently (a toast is missed
if you are away). The session you are currently viewing is never queued — its
own terminal already shows the state — nor is a running (busy) one; a
finished turn drops off once it has been seen. The queue lives in the page, so
a full reload empties it until new events arrive.
Changed
- New app icon — the purple meteor mark now ships across the Linux desktop
entry, the Windows executable and installer, and the packaged icons. - The update check now repeats hourly, not just at startup. A session left
open for a long time now notices a new lich release mid-run instead of only on
the next launch. The poll never stacks a second toast for a release it already
surfaced, and dismissing one still holds until a genuinely newer version
ships. Hourly keeps well within the unauthenticated GitHub API's rate limit. - Keeping a worktree now keeps its session, ready to resume. Closing a
worktree session and choosing to keep the checkout used to throw the session
away — reopening the worktree later started a blank Claude with none of the
earlier conversation. lich now parks the session instead of deleting it, so
reopening the worktree brings it back and offers to continue the same Claude
conversation right where it left off. Removing the worktree (rather than
keeping it) still clears the session for good. - Footer bar spacing tightened. The items sit closer together and the Browse
code icon now matches the size of its neighbors.
Fixed
- Reopening an existing worktree no longer spawns a new one from its branch.
The new-worktree picker listed a worktree's branch twice — under "Worktrees",
where picking it reopens the worktree, and under "Local branches", where
picking it creates a new worktree off that branch — with the local list open
by default, so the obvious choice quietly made a second worktree from the
first. A branch already checked out in a worktree is now shown only under
"Worktrees", and that group is expanded by default, so selecting it resumes
the existing worktree.