Changelog
All notable changes to this project will be documented in this file.
[0.8.0] - 2026-05-17
Added
--themeCLI flag overrides the theme setting from the config file. Passlazyenv --theme=draculato apply a theme for one run without editing your.lazyenvrc. Unknown theme names produce a warning on stderr.- Config validation now rejects malformed
[colors]values. Each color must be a hex literal (#RGB,#RGBA,#RRGGBB,#RRGGBBAA) or an ANSI 256 number (0-255). Previously, typos likeprimary = "blue"silently shipped to lipgloss and rendered as blank.
Fixed
parser.Marshalno longer injects a trailing newline that wasn't there. Files saved by scripts or editors that don't end with\n(e.g.echo "X=1" > .env) now round-trip faithfully, removing the spurious one-byte git diff lazyenv used to produce on first save. Files that did have a trailing newline still keep one.parser.WriteFilenow fsyncs the temp file before renaming it over the target. Without the sync, a crash between rename and the filesystem journal flush could leave a zero-byte file on ext4 and similar filesystems.--no-theme-bg=falsenow correctly restores the theme background when the config file already hadno-theme-bg = true. The theme + background precedence is now resolved in a single late step after CLI overrides, so any combination of config and CLI flags lands on the expected color.
Changed
- Source-default
versionis now"dev"instead of a stale release number. Localgo run ./just buildbinaries printlazyenv version dev (...)so they can't be mistaken for an official release. GoReleaser overrides this via ldflags for tagged builds. - CLI-flag warnings (unknown
--theme, out-of-range--file-list-width) now surface in the TUI's config-warning alert at startup instead of being written to stderr, which the TUI screen would obscure until exit. --check-configno longer exits with status 1 when no configuration file is found. Lazyenv works fine on defaults, so the absence of a file is now reported on stdout and the process exits 0. Exit 1 is reserved for configs that are present but invalid, so CI pipelines usinglazyenv --check-config &&work as expected even on repos without a.lazyenvrc.
[0.7.1] - 2026-05-06
Changed
- Variable grouping: when sort is alphabetical (
o), groups are now ordered alphabetically by prefix instead of by file position. The Ungrouped bucket remains pinned last. Pressingoalso keeps the cursor on the same var (or same group header) when groups shift. This also affects startup behavior when bothsort = "alphabetical"andgroup = trueare set in the config — groups now appear in alphabetical order from the first render.
[0.7.0] - 2026-05-03
Added
- Variable grouping by prefix in the var list. Toggle with
g: variables sharing a prefix (DB_*,REDIS_*, ...) are grouped under collapsible headers (▾ DB (4)/▸ DB (4)). Variables with a unique prefix or no_collect under a trailingUNGROUPEDheader (shown only when at least one named group exists). Pressenterorspaceon any header to collapse/expand it; click a header with the mouse for the same effect. Groups appear in file order; alphabetical sort applies inside each group. Search disables grouping in rendering and restores it on clear. Setgroup = truein config or pass-g/--groupto start with grouping enabled.
Fixed
- Help screen: aligned
n/NandSpace/Enteraction rows under the actions column.
[0.6.0] - 2026-04-19
Added
- Session summary on exit: prints a per-file recap of disk-level changes (added/changed/deleted vars, created/deleted/renamed files, duplicates with post-create diff, templates) to stdout when you quit. Silent if nothing changed. Disable with
session-summary = falsein config or--no-session-summaryCLI flag;--read-onlyforces it off.
[0.5.4] - 2026-04-11
Added
- Control characters in values (
\n,\t,\r) render as width-1 glyphs (↵,⇥,↩) in the variable list and compare view, keeping multiline values on a single row.
Fixed
- Multiline single-quoted values (
KEY='line1\nline2') were truncated at the first line on parse. Compare between two files whose values shared a first line falsely reported equality. - Copying a multiline value in compare mode and saving corrupted the target file — the writer emitted raw control bytes for unquoted values, breaking the
.envformat on re-read. - Values containing newlines or tabs broke the variable panel row layout and pushed status indicators off their row.
- Masked secrets showed replacement character glyphs at narrow column widths because the column truncator sliced mid-UTF-8 sequence.
truncatepanicked on negative column widths.
[0.5.3] - 2026-04-06
Added
- Rename variable key inline (
Ekey) with validation and duplicate detection - Variable count shown right-aligned in file list panel
- File and variable counts in panel titles (
Files (5),.env (12 vars), filtered3/12 vars)
Changed
- Variable panel status bar hints: removed compare/matrix/help (discoverable via
?), addedErename
[0.5.2] - 2026-04-05
Added
- Create template from selected file (
Tkey) — preserves comments and structure, strips values
Changed
- File management keys now all uppercase:
N(create),C(duplicate),D(delete),R(rename),T(template)
[0.5.1] - 2026-04-05
Added
- Rename
.envfiles from the TUI (Rkey in file list)
[0.5.0] - 2026-04-05
Added
- Create new
.envfiles from the TUI (nkey in file list) - Duplicate selected file with a new name (
Ckey), preserving comments and formatting - Delete files from disk with confirmation (
Dkey), blocks if unsaved changes exist
[0.4.3] - 2026-03-22
Added
- Homebrew tap for macOS and Linux (
brew install lazynop/tap/lazyenv) - Scoop bucket for Windows (
scoop install lazyenv) - AUR package for Arch Linux (
yay -S lazyenv-bin)
[0.4.2] - 2026-03-19
Added
- Secret masking in compare view with
Ctrl+Stoggle, synced with main view ^S secretshint in compare view status bar- Demo GIF and VHS tape source in README
Fixed
- Masked values no longer show truncation artifacts (
..) in narrow terminals
[0.4.1] - 2026-03-19
Added
- Configurable secret detection via
[secrets]config section withsafe_patterns,extra_patterns, andvalue_heuristicoptions - Shannon entropy-based value heuristic replacing the simple length+alphanumeric check, reducing false positives on hostnames and URLs
- Built-in detection rules documented in configuration docs
Fixed
- False positive in secret detection for long hostnames/URLs (e.g.
db-prod-ap-03.internal) - Diff view not refreshing visually after copy operations due to stale method value in Go value semantics
- Missing
(missing)placeholder in compare view for added/removed keys AddVarnot settingIsSecreton newly added variables
Improved
- Deduplicated missing placeholder computation in diff entry rendering
[0.4.0] - 2026-03-18
Added
- Interactive theme preview with
--themesflag and 56 built-in themes - Mouse support: click and scroll wheel handling across all modes
- Configurable mouse scroll lines via config
--no-mouseflag and config option to disable mouse--check-configflag to validate configuration--configflag to specify a custom config file path--file-list-widthflag to control file list panel width
Fixed
- Enforce minimum file-list-width of 20
- Show sort hint (o) in status bar for all normal mode panels
Improved
- Truncate long file names in file list panel
[0.3.1] - 2026-03-07
Added
- Configurable marker colors for variable indicators (new, modified, deleted, duplicate, empty, placeholder)
Fixed
- Next/prev diff navigation (
n/N) not working in compare mode
Improved
- Split monolithic
app.gointo focused files for better maintainability
[0.3.0] - 2026-03-07
Added
- Configuration file support (
.lazyenvrcin project root or~/.config/lazyenv/config.toml) - 15 built-in color themes (catppuccin, dracula, gruvbox, nord, tokyo-night, and more)
- Theme background color support via Bubble Tea v2
View.BackgroundColor --list-themesflag to list available built-in themes--no-theme-bgflag andno-theme-bgconfig option to disable theme background--show-configflag to display effective configuration-s/--sortflag for sort order (position or alphabetical)- Configurable file detection patterns (
[files]section in config) - Configurable layout dimensions (
[layout]section in config) - Configurable color overrides (
[colors]section in config) - Blocking error alert for invalid configuration (e.g. unknown theme)
Fixed
- Config file search now uses current working directory instead of scan directory
- ANSI color reset leaking in file list when using styled themes
- Status bar text now uses theme colors for visibility on all backgrounds
- Exclude
.bakfiles from env file detection
Improved
- Centralized configuration constants into dedicated config package
- Extracted file detection patterns into configurable FileConfig
- Themes organized in dedicated subpackage with one file per theme
[0.2.0] - 2026-03-01
Added
- Completeness matrix view for multi-file variable comparison with inline add (
m) - Yank to clipboard: copy value (
y) or KEY=value (Y) - Peek original value for modified/new variables (
p) - Per-variable indicators: modified (
*), new (+), deleted (-), duplicate (D), empty (○), placeholder (…) - Combined modified and issue indicators on the same variable
Fixed
- Preserve GitWarning flag across save, reset, and compare save operations
- Restore cursor position when exiting compare mode
- Show save/reset hints in file panel status bar
- Show matrix hotkey in status bar hints
- Reset peek state when switching files
- Set meaningful default version for source builds
Improved
- Organize imports into stdlib, external, internal groups
- Rewrite README with updated features, install instructions, and keybindings
- Update help panel with all current keybindings and indicators
Testing
- Increase parser test coverage from 82% to 93%
- Increase TUI test coverage from 44% to 79%
[0.1.4] - 2026-03-01
Added
- Automatic
.bakbackup before the first save of each session -B/--no-backupflag to disable backup
[0.1.3] - 2026-03-01
Added
- Visual warning (
!) in file list for.envfiles not covered by.gitignore -G/--no-git-checkflag to disable gitignore check- Silent fallback when git is not installed or not in a git repo
Improved
- Modernize codebase for Go 1.26 (
SplitSeq, range over int, etc.)
[0.1.2] - 2026-02-28
Added
- Reset command (
r) in normal mode to discard changes and reload from disk
Fixed
- Recursive scan (
-r) without explicit path now correctly defaults to current directory
Improved
- Replaced
flagwith Kong for CLI argument parsing - Kong
existingdirtype for path validation
Testing
- Test for
ScanDirwith dot path in recursive mode
[0.1.1] - 2026-02-28
First public release of LazyEnv.
- Two-panel TUI layout with file list and variable viewer
- .env file scanner: finds
.env,.env.*,*.envpatterns - Parser with round-trip fidelity (preserves comments, blank lines, quoting, ordering)
- Secret masking: auto-detects keys like
*_PASSWORD,*_TOKEN,*_API_KEY - Inline validation: warns on empty values, placeholders, and duplicate keys
- Side-by-side diff/compare between two env files
- Inline editing: edit, add, and delete variables
- Write-back with format preservation
- Keyboard navigation with vim-style bindings (hjkl)
- CLI flags:
-r(recursive scan),-a(show secrets),-v(version),-h(help) - Adaptive light/dark theme via terminal background detection
- Test suites with testify for parser, model, util, and scanner packages
- Bubble Tea v2, Lipgloss v2, Bubbles v2
- GoReleaser for automated multi-platform releases
justfileas task runner