Skip to content
CAI
Software that uses CAICheck a score

jesseduffield/lazygit

55.7

Adequate · 24 September 2026

70k

lines of production code

Go

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a terminal-based Git client that provides a comprehensive graphical interface for managing repositories, including branches, commits, stashes, and worktrees. It features advanced workflow capabilities such as interactive rebasing, cherry-picking, bisecting, and merge conflict resolution, alongside native integration for hosting services like GitHub and GitLab. The application supports extensive customization through themes, keybindings, and custom commands, while ensuring stability via daemon mode for complex operations and robust background refresh mechanisms.

How it got here

2018–2021 — Architecture modernization and GUI refactoring

30 changes.

This period focused on a comprehensive architectural overhaul, introducing Go modules, a typed model layer, and a centralized command execution system to improve stability and maintainability. The GUI was significantly refactored with a new presentation engine, generic components, and a modernized styling system supporting RGB colors and Unicode graphs. Concurrently, the project expanded its feature set with automatic updates, internationalization, and enhanced support for various hosting services and Git workflows.

2022 — GUI architecture refactor and test infrastructure

34 changes.

This period focused on a major architectural overhaul of the GUI, introducing a structured context and controller system to replace ad-hoc management, alongside significant improvements to branch, commit, and rebase handling. Concurrently, the project established a robust integration testing framework with a new component-based API, dedicated test runners, and extensive coverage across core features like bisect, stash, and sync.

2023–2026 — integration testing and infrastructure expansion

20 changes.

This period focused heavily on expanding integration test coverage across core features such as conflict resolution, staging, UI interactions, and filtering, while introducing helper utilities like FakeFieldLogger. It also involved significant infrastructure improvements, including the addition of a terminal UI library, automated config schema generation, and new demo recording capabilities.

Features

Add file, git, and worktree icons with Nerd Fonts support

The GUI now displays icons for files, git branches, commits, remotes, stashes, and worktrees, provided a Nerd Font is installed. This change introduces a new icon system in the \pkg/gui/presentation/icons\ package, defining specific icons and colors for various file types (e.g., \Cargo.toml\, \Dockerfile\, \.gitignore\) and git objects (e.g., merge commits, remote providers like GitHub/GitLab). It supports Nerd Fonts versions 2 and 3, automatically patching icon codes for V2 compatibility, and allows users to enable or disable icons via configuration.

pkg/gui/presentation/icons · high confidence

Add internal Snake game logic package

The \pkg/snake\ package introduces the core logic for a Snake game, including state management, movement ticks, collision detection, and a game loop with configurable rendering and direction input. This change adds the foundational game engine components (\Game\, \State\, \Position\) and associated unit tests, serving as a backend component for the broader integration of the game into the application.

pkg/snake · high confidence

Add platform-specific log tailing for debugging

A new \--logs\ command is available to view logs from other lazygit processes, aiding in debugging. The implementation uses the native \tail -f\ command on non-Windows systems and a custom polling mechanism on Windows to handle log file changes, formatting output with millisecond timestamp granularity.

pkg/logs/tail · high confidence

Add range selection support to list contexts

List contexts now support selecting multiple items via a range. Users can toggle sticky range selection (pressing 'v') or use non-sticky range selection (shift+arrow keys) to highlight a contiguous block of items for batch operations. The selection state is managed by a new ListCursor implementation that handles clamping indices to valid bounds and collapsing ranges when items are deleted.

pkg/gui/context/traits · high confidence

Add script to export English translations to JSON

A new command-line tool in cmd/i18n has been added to serialize the English translation set into a JSON file (en.json). This utility uses the existing i18n package to marshal the English strings, providing a standardized JSON representation of the English locale for downstream consumption or storage.

cmd/i18n · high confidence

Add support for marking a commit as the base for rebase operations

A new internal mode has been introduced that allows users to mark a specific commit as the base for a rebase operation. This change adds a new module to track the selected base commit's hash, enabling the GUI to maintain state regarding which commit serves as the starting point for rebasing, and provides methods to activate, reset, and retrieve this selection.

_pkg/gui/modes/marked\_base\commit · high confidence

Auto-generated keybinding cheatsheets in Markdown

The application now includes a tool to automatically generate keybinding cheatsheets as Markdown files (Keybindings\_{{.LANG}}.md) for each supported language. These files are created in the docs-master/keybindings directory and are built from the current translation sets and GUI bindings, ensuring the documentation stays in sync with the application's keybindings without manual updates.

pkg/cheatsheet · high confidence

Automated generation of config schema and documentation

Added a new code-generation tool in pkg/jsonschema that automatically produces the JSON schema for the user configuration (schema-master/config.json) and updates the default configuration documentation (docs-master/Config.md) from the Go source code. This ensures that the generated schema and documentation always reflect the current default values, descriptions, and structure of the configuration, removing the need for manual updates.

pkg/jsonschema · high confidence

Custom commands now support context-aware keybindings and command-driven menu suggestions

The custom commands system has been refactored to allow users to bind commands to specific UI contexts (e.g., only in the commit or file view) rather than globally, and to define nested command menus. Additionally, input prompts in custom commands can now dynamically generate suggestions by executing a shell command, enabling more interactive and context-sensitive workflows.

pkg/gui/services · high confidence

Daemon mode now supports interactive rebase operations

The daemon component now handles interactive rebase tasks such as changing todo actions, moving commits, dropping merge commits, and writing the rebase todo file. This allows the main lazygit process to delegate specific rebase operations to a child daemon process, improving stability and preventing hangs during complex rebase interactions.

pkg/app/daemon · high confidence

Initial repository scaffolding and configuration

The repository has been initialized with essential configuration files including an EditorConfig for Go tab indentation, Git attributes to enforce LF line endings, a comprehensive .gitignore, and a golangci-lint v2 configuration with specific linters enabled. Release automation is set up via a .goreleaser.yml v2 manifest, and build/test workflows are defined in a Makefile and Dockerfile. The project also includes initial documentation (README, CONTRIBUTING, VISION, AGENTS) and licensing.

(repo-wide) · high confidence

Introduce new model types for Git entities and worktrees

The \pkg/commands/models\ package now defines dedicated structs for core Git objects, including \Author\, \Branch\, \Commit\, \CommitFile\, \File\, \GithubPullRequest\, \Remote\, \RemoteBranch\, \StashEntry\, \SubmoduleConfig\, \Tag\, \Worktree\, and \WorkingTreeState\. This refactoring introduces a unified \Ref\ interface for reference types, adds author email tracking to commits, and provides explicit support for Git worktrees and GitHub pull request status, replacing previous ad-hoc data structures with a consistent, typed model layer.

pkg/commands/models · high confidence

Introduction of automatic binary update mechanism

The application now includes a built-in updater that automatically checks for and installs new versions. This feature verifies the latest release via the repository API, downloads the updated binary to the user's configuration directory (rather than a temporary location), and handles version comparisons to prevent breaking changes. The update check is skipped on Windows due to permission constraints and respects user-configured intervals and methods.

pkg/updates · high confidence

Introduction of diffing mode state management

A new diffing mode has been added to the GUI, allowing users to compare changes against a specific reference commit. This feature enables toggling between standard viewing and a diff view, including support for reversing the diff direction, which alters how file changes are presented to the user.

pkg/gui/modes/diffing · high confidence

Native direnv integration for environment loading and approval

Added a new \pkg/commands/direnv\ package that allows lazygit to automatically load environment variables from \.envrc\ files when switching repositories. The implementation runs \direnv export json\ to apply environment deltas and detects when a \.envrc\ is blocked (unapproved), exposing the path so users can approve it directly within the tool. This ensures environment variables are correctly isolated per repository without requiring manual external configuration.

pkg/commands/direnv · high confidence

New CLI and TUI entry points for integration testing

A new \cmd/integration\_test/main.go\ entry point is introduced, providing both a command-line interface (CLI) and a terminal user interface (TUI) to run integration tests. The CLI mode allows users to specify individual tests by name and supports flags such as \--slow\, \--sandbox\, \--debug\, and \--race\ to control test execution behavior, including enabling Go's race detector. The TUI mode offers an interactive way to run tests and also supports the \--race\ flag.

_cmd/integration\test · high confidence

New TUI and CLI integration test runners

The integration test suite now provides two distinct execution modes: a terminal user interface (TUI) for interactive test selection and debugging, and a command-line interface (CLI) for scripted or CI-based runs. The TUI client allows developers to browse, filter, and launch tests with visual feedback, while the CLI client supports passing specific test names as arguments and exposes flags for slow input simulation, sandboxing, and Go race detection. Both clients utilize the updated \components.RunTests\ framework to manage test execution, replacing the previous snapshot-based approach.

pkg/integration/clients · high confidence

New YAML utility functions for key management and transformation

The \pkg/utils/yaml\_utils\ package now provides new helper functions to manipulate YAML documents programmatically. Users can rename keys (\RenameYamlKey\), move keys between sections with automatic creation of intermediate paths and pruning of empty nodes (\MoveYamlKey\), and apply custom transformations to specific nodes via a path walker (\TransformNode\). These utilities also include low-level helpers like \LookupKey\, \RemoveKey\, and \AddStringKey\ for fine-grained control over YAML node structures.

_pkg/utils/yaml\utils · high confidence

New background refresh and command log panels

The GUI now includes a dedicated command log panel (Extras view) that records user actions and executed git commands, and a background routine manager that handles automatic fetching, file refreshing, and external change detection. These features allow users to track their history and keep the UI up-to-date without manual intervention, with configurable intervals and pause support during subprocesses.

pkg/gui · high confidence

New commit graph rendering engine with parallel processing

The commit graph view now uses a new rendering engine located in \pkg/gui/presentation/graph\ that renders the history using widely-supported Unicode box-drawing characters (such as \│\, \─\, \╮\) instead of previous symbols. This new implementation introduces parallel rendering via goroutines to improve performance on large histories and includes a new \Cell\ component for handling styled graph nodes and connections. The change also standardizes terminology from 'SHA' to 'Hash' in the presentation layer.

pkg/gui/presentation/graph · high confidence

New demo recording infrastructure supporting GIF and MP4 output

A new demo recording workflow has been added to the repository, allowing contributors to generate high-quality visual demonstrations of the application. The system includes a \record\_demo.sh\ script that automates the process of recording terminal sessions using \terminalizer\, rendering them, and compressing the output into either GIFs (via \gifsicle\) or MP4 videos (via \ffmpeg\). It also introduces a \config.yml\ file for customizing the recording appearance, such as font family (Nerd Font v3), theme, and frame styling, along with a README explaining the setup requirements like creating a git worktree for assets.

demo · high confidence

New developer tooling and automation scripts

Added a suite of shell scripts to streamline development workflows: \bisect.sh\ for debugging regressions via git bisect, \check\_commit.sh\ and \check\_filenames.sh\ for local CI-like checks, \gofumpt-check.sh\ and \gofumpt-tool.sh\ for Go formatting, \golangci-lint-shim.sh\ for linting, \run\_integration\_tests.sh\ for executing integration tests with coverage and timing support, \preview\_release\_notes.sh\ for generating release notes, \update\_docs\_for\_release.sh\ for updating documentation, \update\_language\_files.sh\ for processing Crowdin translations, and \check\_for\_fixups.sh\ for detecting fixup commits. Also added \bump\_modules.sh\ and \bump\_lazycore.sh\ for dependency management, \record\_demo.sh\ for demo recording, and \just\_e2e\_completion.zsh\ for zsh tab-completion of integration tests.

scripts · high confidence

New development logging package with global logger and enhanced debug output

The new pkg/logs package provides a structured logging foundation for the application, introducing a global logger accessible during development when the LAZYGIT\_LOG\_PATH environment variable is set. This logger writes debug output in JSON format with nanosecond timestamp granularity, and automatically inserts a blank line separator between distinct application runs to improve log readability. Production logging is configured to discard all output except errors, ensuring clean operation in non-debug environments.

pkg/logs · high confidence

New integration test driver interfaces for GUI interaction

The \pkg/integration/types\ package now defines the \IntegrationTest\ and \GuiDriver\ interfaces, establishing the contract for how integration tests interact with the lazygit GUI. This change introduces specific capabilities for test authors, including rapid key pressing (\PressKeysRapidly\), mouse gesture simulation (click, hold, move, release, scroll), and handling of UI states like focus events, toasts, and background refreshes. It also provides methods to inspect the current context, views, and branch state, enabling more robust and realistic end-to-end testing of the application's interface.

pkg/integration/types · high confidence

New internationalization (i18n) system with JSON-based translations

The application now uses a new i18n system that loads translations from JSON files embedded in the binary, replacing the previous Go-based translation sets. This change enables easier maintenance and addition of new languages by simply adding JSON files to the \translations\ directory. The system supports automatic language detection based on the user's environment and allows users to explicitly configure their preferred language. Tests have been added to verify the language detection and configuration loading logic.

pkg/i18n · high confidence

Performance and feature improvements in branch and commit handling

This update introduces a fast path for calculating branch divergence using the \%(ahead-behind:...)\ format in Git 2.41+, significantly speeding up the display of ahead/behind counts in the branches list. It also adds support for Git bisect, allowing users to start, mark, and skip commits during a bisect session, and introduces commands to reset or set the author of a commit directly from the commits panel.

_pkg/commands/git\commands · high confidence

gocui: initial import of the terminal UI library

The \pkg/gocui\ directory has been added to the repository, introducing the gocui terminal UI library as a vendored dependency. This includes the full source code for the library (e.g., \gui.go\, \view.go\, \escape.go\), along with its documentation, license, and author attribution files. This change establishes the foundational component for building console user interfaces within the project.

pkg/gocui · high confidence

Architecture

Refactor GUI event handling into a dedicated controllers package

The GUI's event handling logic has been restructured into a new \pkg/gui/controllers\ package. This change introduces a \baseController\ and an \AttachControllers\ helper to centralize the registration of keybindings, mouse bindings, and lifecycle callbacks (such as focus, render, and quit) for various UI contexts. Specific controllers have been added to handle distinct areas of the application, including \BasicCommitsController\ for general commit actions, \BisectController\ for bisect operations, \BranchesController\ for branch management, and dedicated controllers for the commit message and description panels. This refactoring moves action handlers out of the general GUI logic into these focused components to improve code organization and maintainability.

pkg/gui/controllers · high confidence

Refactor GUI into a structured context system

The GUI has been refactored to use a new context-based architecture defined in the \pkg/gui/context\ package. This introduces a \BaseContext\ for core view management, \ListContextTrait\ and \ListRenderer\ for handling list-based views (such as branches, commits, and files), and a \FilteredListViewModel\ to manage filtering and selection state. Specific contexts like \BranchesContext\, \CommitFilesContext\, and \LocalCommitsContext\ now inherit from these traits, centralizing logic for rendering, focus handling, and filtering. A \ContextTree\ structure manages the hierarchy and stacking of all UI contexts, replacing the previous flat or ad-hoc context management approach.

pkg/gui/context · high confidence

Refactored GUI helpers into dedicated, single-responsibility components

The monolithic controller logic in pkg/gui/controllers/helpers has been decomposed into specialized helper structs (AmendHelper, AppStatusHelper, BisectHelper, BranchesHelper, CherryPickHelper, CommitsHelper, ConfirmationHelper, CredentialsHelper, DiffHelper, etc.). This change improves code organization and maintainability by isolating specific UI and Git operation concerns into their own types, without altering the external user-facing behavior of the application.

pkg/gui/controllers/helpers · high confidence

Behavioural changes

Cached git config with directory pinning

The git config subsystem now uses a cached implementation that stores retrieved values to avoid redundant git calls. This cache is thread-safe and can be pinned to a specific repository directory via SetDir, ensuring that config reads remain bound to the correct repository even if the process's working directory changes (e.g., when switching repos). The cache can also be explicitly dropped when focus changes.

_pkg/commands/git\config · high confidence

A new constants file has been introduced to centralize all external documentation, support, and repository URLs. This change standardizes how links to the GitHub repository, issues, sponsors, discussions, and releases are managed. Notably, documentation links for keybindings and configuration now use a version placeholder (e.g., \%s\), allowing the application to dynamically point users to documentation matching their current version rather than always defaulting to the master branch.

pkg/constants · high confidence

Centralized git command execution with automatic lock-error retry

The git command layer has been refactored to centralize execution through a new command builder and runner. This change ensures that all git commands are pinned to their specific repository directory, preventing issues when switching between repos. Additionally, the system now automatically detects and retries transient lock errors (such as index.lock contention) with exponential backoff, significantly improving stability during concurrent git operations.

pkg/commands · high confidence

Centralized management of Git location environment variables

The application now provides a dedicated package to manage the GIT\_DIR and GIT\_WORK\_TREE environment variables, allowing the system to explicitly tell Git where the repository is located rather than relying solely on directory structure. This change introduces functions to get, set, and unset these variables, as well as a method to apply a specific set of location variables while clearing any previous settings, which supports scenarios such as bare worktrees or nested submodules where Git's automatic detection might fail.

pkg/env · high confidence

Cherry-picking mode now allows pasting commits multiple times

The cherry-picking feature has been updated to support pasting the same commits more than once. Previously, once commits were pasted, the mode would hide and prevent further actions with those specific commits. The new implementation tracks whether commits have been pasted via a \DidPaste\ flag but retains the list of cherry-picked commits, allowing users to re-paste them if needed. This change is implemented in the \pkg/gui/modes/cherrypicking\ module, which manages the state of cherry-picked commits and their visibility.

pkg/gui/modes/cherrypicking · high confidence

Config system refactored with platform-specific defaults and new diff renderer support

The configuration system in pkg/config has been restructured to support platform-specific defaults for OS commands (such as opening files and links) via new files like config\_linux.go and config\_windows.go, and to introduce a configurable diff renderer system (DiffRendererConfigManager) allowing users to switch between stdin filters, external diffs, and raw git output. Additionally, the config now includes a dedicated cache for GitHub pull requests stored separately from the main state file, and keybindings are now handled via a new Keybinding type that supports multi-key sequences and legacy alt-binding migration.

pkg/config · high confidence

Dedicated integration test injector with debugger support

A new standalone injector binary has been added to decouple integration test execution from the main lazygit binary, preventing test code from bloating the production build. This injector resolves and runs specific integration tests by name and includes a mechanism to pause execution until a debugger attaches (detected via the 'debugserver' parent process heuristic), facilitating easier debugging of integration tests. In daemon mode, the injector skips the debugger wait and test resolution, allowing the main application to handle the workload.

pkg/integration/clients/injector · high confidence

Improved merge conflict detection and resolution logic

The merge conflict handling in the GUI has been refactored to support the \diff3\ conflict style, allowing users to pick both hunks (top and bottom) while correctly excluding the common ancestor in diff3 conflicts. The system now respects the \conflict-marker-size\ gitattribute, enabling correct parsing of files with non-standard marker lengths, and recognizes conflict markers even when they lack labels. Additionally, the conflict detection logic has been hardened to prevent panics and silent mutations, ensuring more reliable conflict identification and resolution.

pkg/gui/mergeconflicts · high confidence

Improved patch explorer selection and scrolling behavior

The patch explorer now handles scrolling and selection more intelligently: when navigating, the view automatically scrolls to keep the selected line or range in view, with logic to prioritize seeing the 'need' index while keeping the 'want' index (e.g., the other end of a range) as visible as possible. It also introduces a 'sticky' range selection mode, allowing users to expand a selection by moving up or down without canceling it, and distinguishes between user-enabled and default hunk modes to ensure hunk mode is only exited when the user explicitly toggles it off.

_pkg/gui/patch\exploring · high confidence

Introduce Common struct with atomic UserConfig for safe concurrent access

A new Common struct in pkg/common consolidates shared dependencies (logger, translations, app state, filesystem) into a single object passed around the application. To ensure thread safety, the UserConfig field is now stored as an atomic.Pointer and accessed via getter/setter methods, replacing previous direct field access.

pkg/common · high confidence

Introduce dedicated patch parsing and building logic

The patch command now uses a new internal package to parse, transform, and render git patches. This change introduces a structured \Patch\ model with \Hunk\ and \PatchLine\ types, enabling more robust handling of diff headers, hunks, and individual line changes. A new \PatchBuilder\ manages the state of custom patches, allowing users to select specific line ranges, toggle additions/deletions, and handle renamed files. The rendering logic now supports both plain text output and colored view output, highlighting included lines and distinguishing between additions (green) and deletions (red). This refactoring also adds support for reversing patches and stripping rename metadata when necessary.

pkg/commands/patch · high confidence

Introduce new GUI type definitions and interfaces

This change adds a new set of type definitions and interfaces in the \pkg/gui/types\ package to support the ongoing GUI refactoring. Key additions include \IGuiCommon\ and \IBaseContext\ interfaces that standardize context management, rendering, and refresh behaviors (such as \RefreshBlockingInput\ and \OnUIThread\), a new \Binding\ struct for keybindings with support for dynamic descriptions and disabled states, and a \Modes\ struct to manage working tree states like filtering and cherry-picking. It also introduces \RefreshOptions\ with granular control over selection behavior and UI batching, a \VersionNumber\ type for parsing version strings, and a \Views\ struct to explicitly define all terminal views.

pkg/gui/types · high confidence

Presentation logic for all GUI views is consolidated into the presentation package

The \pkg/gui/presentation\ package now contains the dedicated display logic for every major view in the application. This includes rendering the branches list (with divergence, PR icons, and worktree indicators), the commit list (with graph rendering, branch heads, and bisect status), the file tree (with icons, numstat, and root item support), and the reflog. Additionally, presentation functions have been added for remotes, remote branches, tags, stashes, submodules, worktrees, and auto-suggestions, ensuring that all UI string generation and styling is centralized in this location.

pkg/gui/presentation · high confidence

Redesigned task execution and view rendering for improved responsiveness

The task management system in pkg/tasks has been rewritten to improve UI responsiveness and eliminate race conditions. A new AsyncHandler ensures that only the result of the most recent request (e.g., during rapid search input) is processed, discarding stale results. View rendering now uses an off-screen buffer to swap content in one step, preventing flicker and partial renders. A read request queue manages line-reading requests from the UI thread, ensuring they are served in order and handled correctly even if the underlying task stops. These changes collectively reduce UI lag and visual glitches when flicking through large diffs or performing fast searches.

pkg/tasks · high confidence

Refactored OS command execution with a new CmdObj builder and runner

The \pkg/commands/oscommands\ package has been restructured to use a new \CmdObj\ builder and runner architecture. This change introduces explicit command objects that manage execution details like environment variables, working directories, and output streaming, replacing the previous implicit execution model. It adds platform-specific shell quoting logic to correctly handle special characters and spaces in file paths on both Windows and Unix systems, and introduces a \CredentialStrategy\ to safely handle interactive prompts (such as SSH passphrases) during command execution without hanging the application.

pkg/commands/oscommands · high confidence

Refactored file tree into a generic, filterable component with configurable sorting

The file tree representation in \pkg/gui/filetree\ has been rewritten to use Go generics, separating the internal tree structure from the view model. This change introduces a new \FileTree\ and \CommitFileTree\ that support status-based filtering (e.g., staged, unstaged, tracked, untracked, conflicted) and text-based fuzzy search. Users can now configure the file tree's sort order (mixed, files first, folders first) and case sensitivity via the GUI config. The refactoring also improves selection persistence during tree rebuilds, ensuring the cursor stays on the correct file even when directories are compressed, expanded, or when renames split.

pkg/gui/filetree · high confidence

Refactored popup handler to use first-class task objects and new toast notifications

The popup handler has been refactored to replace global counters with first-class task objects for managing waiting statuses, and introduces new 'Toast' and 'ErrorToast' methods for displaying transient status and error messages. The handler now supports conditional confirmation via a new 'ConfirmIf' helper, allows editing custom command suggestions from the list, and strips leading/trailing whitespace from prompt input by default. Additionally, the 'Ask' method has been renamed to 'Confirm' to better reflect its behavior.

pkg/gui/popup · high confidence

Refactored status management with a dedicated render loop and configurable toasts

The status display logic has been restructured into a new StatusManager that queues loading states and toast notifications. This change introduces a single background render loop to handle status updates, ensuring atomic claims and releases of the rendering cycle. Users will see error toasts displayed for 4 seconds (doubled from the previous 2 seconds) and a configurable spinner for waiting statuses. The manager also provides a handle to pause and resume waiting statuses, improving responsiveness during long-running tasks.

pkg/gui/status · high confidence

Refactored utility package with new color, date, and formatting helpers

The pkg/utils package has been restructured to include new, dedicated files for specific concerns. Color handling now uses the github.com/gookit/color library and includes a cached Decolorise function that also strips hyperlinks. Date formatting introduces UnixToDateSmart for timezone-aware, smart date/ago display. Formatting utilities now rely on github.com/rivo/uniseg for accurate string width calculations and support column alignment and padding. Search functionality defaults to substring matching with an option for fuzzy search. Rebase todo operations are now handled by a dedicated utils/rebase\_todo.go file using the stefanhaller/git-todo-parser library. Additional helpers include HistoryBuffer, OnceWriter, and project root detection via go.mod.

pkg/utils · high confidence

Restructured application bootstrap and added startup options

The application entry point has been refactored into dedicated files (app.go, entry\_point.go) to improve modularity and testability. Users can now launch lazygit directly from a non-existent directory with a friendly error message, open a specific panel on startup using the new --git-arg flag (e.g., status, branch, log, stash), and enable a half or full screen mode via the --screen-mode flag. Additionally, a --profile flag is available to start a pprof HTTP server on localhost:6060 for performance debugging, and the minimum required Git version has been raised to 2.32.

pkg/app · high confidence

Support for author-based commit filtering and selection persistence

The filtering mode now supports filtering commits by author in addition to the existing path-based filtering. When entering this mode, the application tracks the previously selected commit, ensuring that the same commit remains selected when exiting the filtering view.

pkg/gui/modes/filtering · high confidence

The terminal styling system in pkg/gui/style has been rewritten to use the gookit/color library, replacing the previous implementation. This change introduces support for 24-bit RGB colors alongside standard 16-color palettes, allowing for richer visual customization in the GUI. It also adds new text decoration capabilities, specifically strikethrough and hyperlink rendering (OSC 8), and exposes color functions to the template system for dynamic styling in prompts and menus.

pkg/gui/style · high confidence

Theme customization now supports hex colors and granular style options

The theme system has been refactored to allow users to specify colors using hex values (e.g., \#123456) in addition to named colors, and to customize specific UI elements like cherry-picked commits, marked rebase base commits, and unstaged changes with distinct foreground and background styles. This change also introduces support for strikethrough text styling and allows the default foreground color to be configured via the theme config, providing finer control over the visual appearance of the interface.

pkg/theme · high confidence

Unified hosting service support for pull requests and commits

The hosting service logic has been refactored into a new package that centralizes URL generation for pull requests and commits across GitHub, GitLab, Bitbucket, Azure DevOps, Bitbucket Server, Gitea, and Codeberg. This change introduces support for new providers (Gitea, Codeberg, Bitbucket Server) and improves URL handling by adding proper URL encoding for branch names, removing extra leading slashes, and supporting custom SSH config aliases and on-premise Azure DevOps Server instances. Users will see more reliable browser links for pull requests and commits, especially when using non-standard remote URLs or custom SSH configurations.

_pkg/commands/hosting\service · high confidence

User-configurable author colors and improved name rendering

The authors presentation layer now supports user-configurable colors for commit authors, allowing specific authors to be assigned custom colors or a unified style. It also introduces configuration keys to control the display length of author names in the commits view. Under the hood, the library has switched from go-runewidth to uniseg for more accurate Unicode grapheme handling, and author styling logic has been extracted into a dedicated package with caching for performance.

pkg/gui/presentation/authors · high confidence

Test coverage

Add FakeFieldLogger for testing log output; Added integration test for the 'Add fork remote' command; Added integration tests for diff view features; Added integration tests for filtering commits by author; Added integration tests for filtering commits by file path; Added integration tests for git bisect functionality; Added integration tests for per-repo config behavior; Added integration tests for recent repos, clipboard, direnv, and startup behavior; Added integration tests for shell command history and execution; Added integration tests for stash operations; Added integration tests for status side panel interactions and log command cycling; Added integration tests for undoing commit drops and checkouts; Added shared test helpers for merge conflict scenarios; Added test infrastructure and configuration for integration tests; Expanded integration test coverage for UI interactions and layout behaviors; Expanded integration test coverage for commit operations; Expanded integration test demos for Git workflows; Expanded integration tests for branch operations; Expanded integration tests for interactive rebase scenarios; Expanded integration tests for merge conflict resolution; Expanded integration tests for staging panel behaviors; Expanded integration tests for the Files panel; Integration tests for cherry-pick functionality; Integration tests for custom command features; Integration tests for filtering and search functionality; Integration tests for sync operations (fetch, pull, push, force-push); New integration test component library.

Dependencies

Initialize Go module with dependency manifest

The project now uses Go modules, introduced by the addition of go.mod and go.sum files. This establishes the module path as github.com/jesseduffield/lazygit and sets the required Go version to 1.25.0. The manifest defines the application's direct dependencies, including the terminal UI library tcell v3.5.0, the git library go-git (via the forked stefanhaller/git-todo-parser), and various utility packages like logrus and afero, along with their indirect dependencies.

(dependencies) · high confidence

Updated vendored dependencies

The vendored dependencies for \dario.cat/mergo\ and \github.com/adrg/xdg\ have been updated to newer versions, bringing in their latest source code, documentation, and configuration files.

vendor · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 61 → 56 (-5.7)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 77 → 86 (+8.7)
  • Architecture 99 → 82 (-16.3)
  • Maturity 62 → 61 (-0.4)
  • Readiness 85 → 82 (-3.1)
  • Security 49 → 38 (-11.7)

Resolved (114)

  • Change coupling: commits.go ↔ reflog_commits.go (pkg/gui/presentation/commits.go)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 2) (pkg/config/app_config.go)
  • Duplicated block (10 lines × 2) (pkg/gui/controllers/commits_files_controller.go)
  • Duplicated block (10 lines × 2) (pkg/gui/view_helpers.go)
  • Duplicated block (10 lines × 2) (pkg/integration/clients/tui.go)
  • Duplicated block (11 lines × 2) (pkg/config/keybinding.go)
  • Duplicated block (11 lines × 2) (pkg/gocui/escape.go)
  • Duplicated block (11 lines × 2) (pkg/gui/context/local_commits_context.go)
  • Duplicated block (11 lines × 2) (pkg/gui/controllers/tags_controller.go)
  • Duplicated block (11 lines × 2) (pkg/gui/controllers/tags_controller.go)
  • Duplicated block (11 lines × 2) (pkg/gui/global_handlers.go)
  • Duplicated block (12 lines × 2) (pkg/gui/controllers/custom_patch_options_menu_action.go)
  • Duplicated block (13 lines × 2) (pkg/gui/filetree/commit_file_tree_view_model.go)
  • Duplicated block (13 lines × 2) (pkg/gui/presentation/files.go)
  • Duplicated block (14 lines × 2) (pkg/commands/git_commands/patch.go)
  • Duplicated block (14 lines × 2) (pkg/gui/controllers/custom_patch_options_menu_action.go)
  • Duplicated block (14 lines × 2) (pkg/gui/controllers/helpers/refs_helper.go)
  • Duplicated block (14 lines × 3) (pkg/gui/controllers/submodules_controller.go)
  • …and 94 more

New (225)

  • BranchLoader.Load (cyclomatic 17) (pkg/commands/git_commands/branch_loader.go)
  • ClassTooLong: BranchesController (pkg/gui/controllers/branches_controller.go)
  • ClassTooLong: FilesController (pkg/gui/controllers/files_controller.go)
  • ClassTooLong: Gui (pkg/gui/gui.go)
  • ClassTooLong: LocalCommitsController (pkg/gui/controllers/local_commits_controller.go)
  • ClassTooLong: RefreshHelper (pkg/gui/controllers/helpers/refresh_helper.go)
  • ClassTooLong: TranslationSet (pkg/i18n/english.go)
  • ClassTooLong: ViewDriver (pkg/integration/components/view_driver.go)
  • CommitLoader.getHydratedTodoCommits (cognitive 19) (pkg/commands/git_commands/commit_loader.go)
  • Dependency pinned to a stale untagged commit: github.com/cloudfoundry/jibber_jabber
  • Dependency pinned to a stale untagged commit: github.com/jesseduffield/lazycore
  • Dependency pinned to a stale untagged commit: github.com/kardianos/osext
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no project overview (docs/Custom_Command_Keybindings.md)
  • Duplicated block (10 lines × 2) (pkg/gui/controllers/commit_description_controller.go)
  • Duplicated block (10 lines × 2) (pkg/gui/controllers/commits_files_controller.go)
  • Duplicated block (10 lines × 2) (pkg/gui/controllers/helpers/commits_helper.go)
  • Duplicated block (10 lines × 2) (pkg/gui/filetree/commit_file_tree.go)
  • Duplicated block (10–14 lines × 2) (pkg/gui/global_handlers.go)
  • Duplicated block (11 lines × 2) (pkg/gui/controllers/screen_mode_actions.go)
  • …and 205 more

Changes since last survey

  • 251 commits — 235 feature/other, 16 fixes

By area

  • pkg/gui — 74 commits
  • (repo) — 52 commits
  • pkg/integration — 30 commits
  • pkg/commands — 24 commits
  • pkg/gocui — 18 commits
  • (root) — 15 commits
  • pkg/tasks — 9 commits
  • vendor/github.com — 5 commits
  • .github/workflows — 4 commits
  • pkg/utils — 4 commits
  • pkg/app — 3 commits
  • docs-master/Searching.md — 2 commits
  • pkg/config — 2 commits
  • pkg/i18n — 2 commits
  • pkg/logs — 2 commits
  • docs-master/Custom_DiffRenderers.md — 1 commit
  • docs/keybindings — 1 commit
  • pkg/cheatsheet — 1 commit
  • pkg/jsonschema — 1 commit
  • scripts/run_integration_tests.sh — 1 commit

Notable commits

  • fix: Add tests for the scroll-into-view regressions we fixed by hand
  • fix: Fix Esc being handled with significant delay on some terminals (#6011)
  • fix: Fix broken commit auto-scrolling (#5972)
  • fix: Fix example for args field in rawGit diff renderer docs
  • fix: Fix example for args field in rawGit diff renderer docs (#5927)
  • fix: Fix flicker, scroll glitches, and crashes in async diff rendering (#5938)
  • fix: Fix hang on quit when confirmOnQuit is true (#5919)
  • fix: Fix linter warning about WriteString(fmt.Sprintf(...))
  • fix: Fix pull requests silently disappearing until lazygit is restarted (#5921)
  • fix: Fix race in "Stash staged changes" on git versions before 2.32.0 (#5903)
  • fix: Fix scrolling back when dragging a commit
  • fix: Fix several problems with repos whose git dir lives outside the working tree (#5910)
  • fix: Fix some obscure selection highlighting bugs (#5990)
  • fix: Fix the Commits panel's column widths when scrolling during interactive rebase or bisect (#6022)
  • fix: Fix use of reflect.Ptr
  • fix: Fix visual glitches when moving a rebase todo
  • change: AGENTS.md addition
  • change: AGENTS.md additions
  • change: AGENTS.md additions
  • change: Add LAZYGIT_SLOW_RENDER debug knob for watching async render frames
  • …and 231 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

jesseduffield/lazygit was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 24 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 5fcbdadc67dc6bb8b60d2c095306d9ba21bc62c6 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-923689c465cf.