Skip to content

Releases: omartelo/lich

v0.19.0

Choose a tag to compare

@github-actions github-actions released this 26 Jul 00:32
62bf062

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 from git 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 Open until 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 are gh round-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

Choose a tag to compare

@github-actions github-actions released this 25 Jul 13:43
5c8aeb7

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 the gh CLI
    already behind the footer badge, so a repo without gh or 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 −deleted pair 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

Choose a tag to compare

@github-actions github-actions released this 24 Jul 05:11

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 — a cd deeper 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
    develop or main in 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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 20:39

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 .worktreeinclude file 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 install happens 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. A shell session 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 -c dump) and merges it over the
    launch snapshot, so both provider and shell sessions get the full environment.
    Best-effort: $SHELL unset 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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 18:39

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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 17:06

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. The sessions table's
    claude_session_id is renamed to provider_session_id on open (existing ids
    carry over — the rename is the migration, nothing is stranded);
    store.Session.ClaudeSessionID becomes ProviderSessionID
    (providerSessionId over the wire), and SetClaudeSession becomes
    SetProviderSession. The /session-start hook now takes
    provider_session_id and still accepts the old claude_session_id so plugin
    releases before v0.3.0 keep working — see docs/hooks/session-start.md.
    Resume itself stays Claude-only: --resume is 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 /restart silently 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

Choose a tag to compare

@github-actions github-actions released this 23 Jul 04:04

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 physically Ctrl+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 called preventDefault(), 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 CSS zoom, which scales rendered boxes but leaves
    vh/vw as physical viewport units, so the 100vh/100vw app root rendered
    at viewport × zoom: short of the window when zoomed out, overflowing when
    zoomed in — and the page's overflow: hidden cut 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 out and Reset zoom entries 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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 21:23

Changed

  • The in-app updater now updates Arch through the AUR. On Arch (and its
    derivatives) the update prompt pastes yay -S lich-bin instead of the
    install.sh one-liner, keeping the install tracked by the user's AUR helper.
    Since yay does 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 --app window 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 /restart in-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 (or paru -S lich-bin) installs
    the released binary; every release now pushes the updated PKGBUILD to the
    AUR automatically.

v0.11.1

Choose a tag to compare

@github-actions github-actions released this 21 Jul 19:11
146450c

Fixed

  • The footer bar's working directory now follows cd. It read the
    session's static start path, so a cd in 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 cd shows
    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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 18:08

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.json and 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.