Skip to content

Releases: almeidx/versi

v0.12.3

08 Mar 02:28
Immutable release. Only release title and notes can be modified.
3dcc778

Choose a tag to compare

[0.12.3] - 2026-03-08

  • fix: prevent ETXTBSY in mock executable tests
  • fix: sync mock executable to disk before exec to prevent ETXTBSY
  • fix: add tooltip explaining disabled launch-at-login toggle
  • fix: escape apostrophes in macOS launch agent XML
  • refactor: extract shared advisory platform-matching helper
  • fix: use atomic write for shell config to prevent data loss
  • deps: Update Rust crate base64 to 0.22.1 (#89)
  • fix: fetch volta install script from GitHub instead of get.volta.sh
  • fix: verify SHA-256 checksum for asdf binary downloads
  • docs: add versi-asdf backend to CLAUDE.md
  • refactor: replace wildcard re-exports in state/mod.rs with explicit imports
  • refactor: extract hardcoded green color to SUCCESS theme token
  • refactor: consolidate duplicated installed() test helper
  • security: verify installer scripts via GitHub Contents API
  • refactor: use NodeVersion instead of String in BulkRunItem and related APIs
  • perf: single-pass BulkProgressSnapshot construction
  • perf: cache prepared security advisories to avoid re-parsing semver
  • fix: use wrapping_add for next_toast_id to prevent debug-mode panic
  • fix: wrap refresh_rotation to [0, TAU) during loading
  • security: pass version via env var in fnm script wrapper on Linux
  • security: use tempfile for installer scripts to prevent symlink attacks
  • security: restrict open_url_task to HTTPS-only URLs
  • security: validate download URL domain before fetching update binary
  • fix: replace unreachable!() with error return on Windows non-MSI path
  • fix: return false for unparseable versions in is_newer_version
  • test: add tests for update parsing, security advisories, and banner helpers
  • refactor: use NodeVersion instead of String in Operation and Message types
  • refactor: consolidate duplicated test fixtures and helpers
  • perf: eliminate duplicate widget tree construction in views
  • refactor: extract is_dark theme helper to replace 11 inline checks
  • perf: pre-parse VersionReq for security advisory checks
  • fix: re-verify checksum before pkexec cp to close TOCTOU race
  • perf: use Arc for cache save data to avoid full clones
  • fix: use unsigned_abs for Windows exit code cast
  • fix: track loaded state to prevent redundant reloads
  • fix: add consistent timeouts to all network fetch operations
  • fix: prevent Windows registry key handle leak in set_launch_at_login
  • fix: harden auto-update security
  • fix: sanitize imported settings and apply side-effects
  • fix: scope WSL shell config flag detection to marker lines
  • fix: clear hovered version on search query change
  • fix: trim version strings in is_newer_version fallback comparison
  • refactor: rename _file to _lock_file in SingleInstance
  • fix: correct toast expiry off-by-one
  • fix: correct subject-verb agreement in vulnerability banner
  • fix: preserve pending installs for actively-running versions in drain
  • fix: recompute banner stats after tray environment switch
  • fix: add reply timeout to dbus-send in tray host detection
  • fix: prevent proceeding past failed backend install in onboarding
  • fix: correct malformed macOS LaunchAgent plist XML

v0.12.2

07 Mar 13:40
Immutable release. Only release title and notes can be modified.
120de3b

Choose a tag to compare

[0.12.2] - 2026-03-07

  • deps: Update Rust crate which to 8.0.1 (#87)
  • fix: use correct script syntax for util-linux on Linux

v0.12.1

06 Mar 23:50
Immutable release. Only release title and notes can be modified.
189b00a

Choose a tag to compare

[0.12.1] - 2026-03-06

  • refactor: replace fd-lock with std File::try_lock
  • refactor: restrict version parse functions to pub(crate) visibility
  • refactor: remove redundant test_ prefix from test function names
  • refactor: avoid unnecessary clone in NVM provider detect
  • refactor: add missing Debug derive to FnmBackend and AsdfBackend
  • refactor: restrict NVM internal types and functions to pub(crate) visibility
  • refactor: restrict update check functions to pub(crate) visibility
  • refactor: make commands module private in versi-core
  • refactor: remove unused public re-exports
  • refactor: remove duplicated format tests from version list item
  • refactor: remove unused shells re-export module
  • perf: avoid intermediate allocation in response_snippet
  • refactor: extract shared combine_error_output helper
  • refactor: remove unused public re-exports from backend crates
  • refactor: reduce public API surface of internal symbols
  • refactor: remove unused methods and dead code
  • refactor: extract shared run_unix_install_script helper
  • refactor: remove redundant data_dir clone and with_asdf_data_dir call
  • perf: avoid unnecessary String allocations in update check and banner formatting
  • refactor: derive Copy for NvmVariant and ApplyResult
  • refactor: remove duplicate shell_type_to_str in favor of ShellType::shell_arg
  • refactor: derive Copy for ShellType and pass by value
  • refactor: extract shared write_mock_executable! macro to versi-backend
  • perf: use split_once and avoid intermediate allocations in shell config
  • chore: update Cargo.lock after sha2 removal from versi-asdf
  • refactor: reduce public API surface of internal symbols
  • refactor: use &Path instead of &PathBuf in function parameters
  • refactor: remove unused ShellConfigEdit.original field and diff_preview method
  • refactor: remove unused download_install_script_verified and related dead code
  • refactor: add #[must_use] to ShellConfig::add_init and update_flags
  • refactor: use &Path instead of &PathBuf in nvm detection
  • test: remove duplicate is_newer_version tests from versi-nvm
  • chore: remove unused sha2 dependency from versi-asdf
  • perf: derive Copy for NodeVersion and remove redundant clones
  • refactor: extract download_and_prepare_install_script to versi-backend
  • fix: add missing User-Agent headers to 4 HTTP request functions
  • refactor: standardize logging levels across all backends
  • refactor: remove AppError::Message variant and serde_json string escape hatch
  • perf: optimize toast IDs, fetch clones, and environment load dedup
  • refactor: standardize User-Agent to Versi/{version} across all HTTP clients
  • refactor: deduplicate version prefix stripping and fix sentinel check
  • refactor: remove unused install_date field from InstalledVersion
  • refactor: replace fs2 with fd-lock for file locking
  • refactor: remove unused execute_in_wsl and WslError from versi-platform
  • perf: use full LTO for smaller release binaries
  • test: add diagnostic output to fnm mock command failure test
  • test: add compile-time safety tests for BackendKind/provider name mapping
  • test: add tests for auto_update state machine
  • test: add tests for shell configuration handlers
  • test: add missing provider tests for versi-nvm
  • refactor: make FnmBackend::execute delegate to shared execute_backend_command
  • fix: use Result::ok method reference in fs_utils tests
  • refactor: extract duplicate replace_file and quarantine logic to fs_utils module
  • perf: remove intermediate Vec collect in background preload scheduling
  • perf: add fast path for sanitize_terminal_text when input has no escape sequences
  • refactor: remove dead fnm_dir and node_dist_mirror settings fields
  • fix: remove unnecessary providers.clone() in Versi::new
  • refactor: merge duplicate should_confirm_default_uninstall / is_already_default_version
  • fix: widen timeout test gap for Windows timer granularity
  • refactor: deduplicate provider test suites with shared macro
  • refactor: extract shared CommandEnvironment and command building to versi-backend
  • chore: update Cargo.lock after dependency changes
  • refactor: split auto_update.rs into download, extract, and apply phases
  • refactor: split state/operations.rs into modal, bulk, and operations
  • refactor: extract find_default_version helper to versi-backend
  • refactor: remove redundant internal detection structs
  • refactor: replace crossbeam-channel with MenuEvent::set_event_handler
  • refactor: extract InstallerAttempt to versi-core
  • refactor: extract download_install_script to versi-core
  • refactor: extract parse_current_version helper to versi-backend
  • refactor: extract check_github_backend_update helper to versi-core
  • test: add unit tests for get_cli_version prefix-stripping
  • refactor: remove duplicate asdf_data_dir field in AsdfBackend
  • chore: run formatter
  • fix: add nvm prefix to normalize_backend_version_output
  • fix: clear fetch errors consistently on retry
  • refactor: unify clamp helpers and use default functions in AppSettings
  • fix: use cfg(unix) instead of cfg(not(windows)) in settings
  • refactor: derive Default for FetchState and VersionCache
  • test: add unit tests for format_relative_time
  • refactor: deduplicate fetch error banner functions
  • refactor: precompute AppPaths in state instead of in view
  • refactor: extract items_matching helper in BulkRunState
  • perf: precompute LTS codename lookup map instead of O(n) scan
  • refactor: extract shared init task builder
  • test: add unit tests for is_major_release
  • refactor: extract shared format_tenths to dedicated module
  • fix: make command_output_to_result tests cross-platform
  • chore: run formatter
  • refactor: replace into_backend_update with From impl
  • refactor: extract shared command execution helper to versi-backend
  • perf: reuse shared reqwest::Client instead of creating new instances
  • refactor: deduplicate CLI version probe across backends
  • test: add unit tests for auto_update helpers
  • test: add unit tests for version list filtering and sorting
  • refactor: extract shared temp_script_path to versi-core
  • refactor: preserve typed context in AppErrorDetail core error conversions
  • refactor: extract shared GitHub release check to versi-core
  • refactor: remove redundant fnm_dir field from FnmBackend
  • refactor: use into_owned() instead of to_string() on Cow
  • fix: use typed errors in asdf Windows installer
  • fix: scope detect_options to marker lines only
  • deps: Update patch/minor dependencies (#84)
  • refactor: deduplicate ANSI stripping across backends
  • fix: log debug warnings for silent version detection failures
  • fix: use typed errors in NVM Windows installer
  • perf: reuse shared reqwest::Client in Volta backend
  • fix(windows): quote paths in WSL shell command interpolation
  • fix: log warnings instead of silently swallowing cache save errors
  • refactor: extract duplicated backend update checking to versi-core
  • refactor: extract duplicated response_snippet to shared module
  • perf: improve startup performance
  • fix(windows): convert WSL detection to async with configurable timeouts
  • deps: Lock file maintenance (#83)

v0.12.0

28 Feb 22:09
Immutable release. Only release title and notes can be modified.
5f237e5

Choose a tag to compare

[0.12.0] - 2026-02-28

  • fix(windows): default wgpu to low power preference to prevent startup hang
  • chore: run formatter
  • chore: remove unwanted changes from changelog
  • feat(onboarding): add unsafe backend auto-install flows
  • Align backend behavior and tests across managers
  • feat: add asdf backend (nodejs plugin)
  • feat: add volta backend support
  • deps: Update Rust crate objc2 to 0.6.4 (#81)
  • deps: Update GitHub Artifact Actions (#80)
  • fix: warning on non-windows
  • Redesign and center About page content
  • Move bulk progress banner to bottom overlay

v0.11.0

25 Feb 19:31
Immutable release. Only release title and notes can be modified.
dd58e99

Choose a tag to compare

[0.11.0] - 2026-02-25

  • feat: add overlay scrollbars and sticky section headers
  • fix: trap scroll on modals
  • Integrate Node security advisory warnings and caching
  • deps: Update patch/minor dependencies (#78)
  • Fix fnm mock command test
  • Fix keyboard list-mode version actions and search input bleed
  • Implement background env preload
  • Add bulk progress and preload envs
  • Add bulk operation progress UI
  • test(nvm): retry uninstall when target version is active
  • test(ci): remove WSL integration tests and workflow job
  • Fix tray tooltip update
  • test: add backend integration tests and CI workflow
  • Add tray tooltip version
  • Add detailed install progress
  • deps: Update Rust crate zbus to 5.14.0 (#77)
  • deps: Lock file maintenance (#76)

v0.10.3

20 Feb 23:29
Immutable release. Only release title and notes can be modified.
bbe967d

Choose a tag to compare

[0.10.3] - 2026-02-20

  • fix(windows): align launch-at-login registry status type
  • fix(clippy): gate home-dir launch error to macOS
  • fix(clippy): pass Linux badge worker receiver by reference
  • refactor(app): use direct error mappers for environment loads
  • docs(agents): codify typed error handling requirements
  • refactor(cache): type app-path resolution load errors
  • refactor(tray): remove type-erased tray and badge errors
  • refactor(app-errors): introduce typed AppError details and mappings
  • refactor(platform): type launch-at-login integration errors
  • refactor(shell): replace verification string errors with typed enums
  • refactor(single-instance): replace string lock errors with typed variants
  • refactor(errors): type backend parse/network/install failures
  • refactor(update): use GitHub asset digest for verification
  • perf(linux): reuse single worker for badge updates
  • fix(cache): add structured load errors and corrupt-file quarantine
  • fix(network): log configured HTTP client build fallback
  • fix(install): verify backend installer scripts with retries
  • perf(cache): coalesce incremental saves on bounded worker queue
  • perf(settings): debounce non-critical settings writes

v0.10.2

20 Feb 21:57
Immutable release. Only release title and notes can be modified.
0b2c602

Choose a tag to compare

[0.10.2] - 2026-02-20

  • build(deps): drop reqwest decompression codec features
  • build(ui): disable iced defaults with explicit runtime features
  • build(deps): minimize reqwest chrono and simplelog features
  • fix(windows): restore compile on CI and clean platform warnings
  • build(deps): disable tokio defaults and trim tokio-util
  • build(deps): reduce default dependency feature surface
  • refactor(tests): use main state helpers in app tests
  • chore(windows): document Win32 unsafe invariants
  • perf(queue): use hash set for install dedup in drain
  • perf(version): cut string allocations in hot compare paths
  • fix(nvm): avoid path interpolation in shell bootstrap
  • fix(tray): route set-default by stable environment id
  • fix(storage): use atomic replace semantics on Windows
  • fix(tray): make subscription worker shutdown deterministic
  • fix(windows): locate Versi window without exact title match
  • fix: clippy warning
  • perf(search): reduce per-keystroke allocation churn
  • refactor(state): simplify latest-by-major recomputation
  • refactor(shell): type WSL shell configuration errors
  • refactor(platform): type app path resolution errors
  • chore: fix formatting
  • refactor(auto-update): replace string errors with typed variants
  • refactor(core): use typed errors for remote fetch operations
  • refactor(tray): replace polling loop with blocking event bridge
  • fix(settings): sanitize persisted values and write atomically
  • fix(instance): enforce single-instance lock on non-windows
  • refactor(update): use semver for app version comparisons
  • fix(network): validate HTTP status for metadata and schedule fetches
  • fix(wsl): parse distro names with embedded spaces
  • fix(platform): quote launch-at-login executable paths
  • refactor(security): replace piped installer scripts with downloaded temp scripts
  • feat(security): verify update artifacts with published sha256 checksums
  • feat(settings): add configurable app update behavior
  • fix(wsl): use sh instead of bash in execute_in_wsl for portability
  • refactor: preserve io::ErrorKind in BackendError::IoError conversion
  • refactor: extract tick rate magic numbers into named constants
  • refactor: derive filter chips from a const table instead of a fixed-size array
  • refactor: remove trivial NodeVersion::major_group() getter
  • refactor: remove redundant .. in Operation::Install match arm
  • refactor: derive VersionParseError Display/Error via thiserror
  • refactor: return static slices from wsl_search_paths instead of Vec

v0.10.1

19 Feb 10:33
Immutable release. Only release title and notes can be modified.
5c599eb

Choose a tag to compare

[0.10.1] - 2026-02-19

  • refactor: update VersionGroup::from_versions to accept slices instead of vectors
  • refactor(platform): single-pass fold for WSL distro summary counts
  • refactor(nvm): move ANSI stripping from version parsing to client layer
  • fix(shell): return empty config paths when home directory is unavailable
  • Replace unsafe byte-offset string slicing in nvm version parsing
  • Extract main_state/onboarding_state test helpers to reduce boilerplate
  • Use split_once and strip_prefix/suffix in fnm version parsing
  • Reuse versi_core::GitHubRelease in nvm update module
  • Reduce unnecessary cloning in NvmProvider
  • fix(nvm,platform): log debug messages for silent parse failures
  • refactor(platform): deduplicate WslDistro construction in parse_wsl_list
  • fix(core): sanitize download filename extracted from URL
  • refactor(nvm): remove duplicated is_newer_version, use versi-core's
  • refactor(views): simplify app_update_badge with badge_btn and external_link_btn helpers
  • refactor(theme): extract hardcoded layout dimensions into token constants
  • refactor(theme): centralize repeated color literals into token constants
  • rename(theme): tahoe → tokens
  • refactor(theme): add RADIUS_XS constant and replace hardcoded border radii
  • refactor(backend): remove redundant FnmError and NvmError enums
  • refactor(backend): replace Box with Arc
  • refactor(nvm): remove Mutex anti-pattern from NvmProvider
  • fix(backend): return BackendError from check_for_update instead of String
  • fix(tray): log warning for unknown menu event IDs
  • refactor(views): extract duplicated has_tabs padding into content_padding
  • deps: Update Rust crate zip to 8.1.0 (#71)
  • chore: fix formatting
  • chore(fnm): remove dead _check_fnm_update function and serde_json dep
  • refactor(bulk_ops): deduplicate latest_by_major helpers
  • refactor(state): unify Operation and OperationRequest enums
  • refactor(state): extract FetchState to reduce VersionCache complexity
  • chore: remove unused dependencies
  • fix(nvm): log suppressed error in default_version()
  • fix(shell): use boundary-aware matching for flag removal
  • deps: Update patch/minor dependencies (#70)

v0.10.0

17 Feb 02:33
Immutable release. Only release title and notes can be modified.
1178034

Choose a tag to compare

[0.10.0] - 2026-02-17

  • refactor(versions): split fetch and update-check handlers
  • refactor(versions): move handler tests into dedicated module file
  • refactor(versions): extract cache-save worker module
  • perf(search): cache normalized remote version query fields
  • refactor(search): centralize shared query and release filter logic
  • test(perf): add ignored search and grouping baseline checks
  • refactor(banners): precompute update and eol counts in state
  • test(metadata): add navigation and banner regression coverage
  • refactor(errors): complete runtime migration to typed app errors
  • refactor(update): centralize URL open task helper
  • refactor(errors): use typed app-update error variants
  • refactor(errors): use typed operation failure errors
  • build(release): enable thin-lto and binary stripping
  • test(filters): add alias and limit-order regression coverage
  • refactor(available-row): remove unreachable action branch
  • feat(metadata): track metadata fetch errors and show retry banner
  • refactor(version-rows): reduce eager string cloning in row actions
  • refactor(versions): debounce background cache persistence
  • refactor(cache): write disk cache via atomic temp-file replace
  • fix(search): apply filters before limits and to alias results
  • refactor(errors): add structured app errors for settings and fetch flows
  • refactor(version-list): extract group/query predicates with tests
  • refactor(async): cancel stale environment and version fetch tasks
  • refactor(state): use typed installed version sets
  • refactor(search): unify query engine across state and widgets
  • refactor(widgets): extract nav state helpers with tests
  • refactor(version-list): extract row action and badge logic
  • refactor(search): extract chip state helpers and add tests
  • docs(crates): expand public crate-level API docs
  • refactor(operations): extract queue and toast helpers
  • refactor(tray): split tray event handlers into helpers
  • refactor(errors): use structured shell and backend variants
  • test(state): cover network status and navigation queries
  • test(update): cover context-menu dismissal rules
  • test(tray-handlers): cover tray event state transitions
  • test(tray): cover menu shaping and event parsing
  • test(shell): verify status mapping and backend kind
  • test(auto-update): cover update-state transitions
  • test(onboarding): cover state transitions and shell mapping
  • test(init): cover backend selection helpers
  • test(app): cover window lifecycle state transitions
  • fix(widget): honor version filter limit and add coverage
  • test(app): cover remote, schedule, and metadata update handlers
  • chore: fix formatting
  • test(app): cover environment filters and operation queueing
  • test(app): add dispatch coverage for update routing modules
  • test(linux): avoid identical match arms in wayland fallback test
  • fix(linux): satisfy wayland env lookup fn lifetime bounds
  • docs: refresh README and AI guide for current architecture
  • style: format rust sources after test expansion
  • test: address strict clippy lints in new tests
  • test(app): cover bulk operation version selection logic
  • test(app): add coverage for theme and single-instance helpers
  • test(core): cover auto-update zip extraction helpers
  • test(shell): cover verify path selection and wsl guards
  • test(app): add cache and logging helper coverage
  • test(backends): add error and provider coverage for nvm/backend
  • test(ui): cover version size formatting helpers
  • test(app): add coverage for async helpers and wayland detection
  • test(state): cover constructors and environment state updates
  • test(app): add unit coverage for settings and error types
  • test(core): add metadata mapping unit tests
  • test(fnm): add coverage for provider, detection, and update logic
  • test(platform): cover environment and path helpers
  • test(backend): cover version manager trait defaults
  • chore: fix formatting
  • fix: satisfy strict clippy warnings on linux platform
  • refactor: store window geometry positions as floats
  • docs: add errors sections for public result APIs
  • refactor: split large settings and version list views
  • refactor: split init and update dispatch handlers
  • chore: enable workspace pedantic clippy by default
  • refactor: clean pedantic warnings in views and widgets
  • refactor: tighten pedantic compliance in app core
  • chore: clean pedantic warnings in backend crates
  • fix(version-list): remove label-only hover affordance
  • fix(version-list): make full row left-clickable
  • test(operations): add generated invariant checks for queue draining
  • test: cover settings file IO and shell config edit flows
  • chore(format): normalize windows overlay icon call formatting
  • perf(cache): reduce cloning in latest-by-major recomputation
  • refactor(windows): remove unwraps in overlay icon path
  • refactor(platform): split platform helpers into per-OS modules
  • refactor(app): extract shared async timeout and retry helpers
  • fix(async): guard environment and version fetches by request sequence
  • refactor(state): store AppError in UI state
  • refactor(app): propagate AppError across remaining message flows
  • refactor(message): box heavy update payload variants
  • refactor(app): introduce typed AppError for core operation flows
  • test(app): add update dispatcher routing coverage
  • refactor(settings): deduplicate settings save and shell option updates
  • chore(clippy): box forwarded messages in update dispatch
  • test(environment): cover load failure and recovery paths
  • refactor(app): split update dispatcher by domain
  • chore(clippy): satisfy strict warnings and format touched code
  • refactor(app): move message dispatcher out of app/mod.rs
  • fix(environment): surface version load failures instead of swallowing
  • test(app): add cross-environment tray/backend regression coverage
  • refactor(app): replace raw backend strings with typed BackendKind
  • refactor(app): extract settings IO handlers and add dispatcher tests
  • fix(nvm): execute commands with argv instead of string parsing
  • fix(init): remove leaked fallback string in WSL backend detection
  • fix(shell): write WSL shell config changes to target distro
  • fix(app): keep active provider aligned with selected environment
  • refactor: reduce parameter threading and deduplicate styles
  • feat: add right-click context menu on version rows
  • deps: Update Rust crate zip to v8 (#67)

v0.9.0

15 Feb 14:34
Immutable release. Only release title and notes can be modified.
78bb54d

Choose a tag to compare

[0.9.0] - 2026-02-15

  • feat: add version detail modal with inline release metadata
  • feat: add launch at login setting with per-platform autostart
  • feat: add search filter chips for LTS, installed, not installed, EOL, and active
  • fix: remove unnecessary libxdo dependency
  • deps: Update patch/minor dependencies (#64)
  • fix(windows): update Windows API calls for newer windows crate and add GDI RAII cleanup
  • feat: add update badge on app icon and adopt reverse-domain app ID
  • fix: update icon and desktop caches in Linux install script
  • deps: Lock file maintenance (#63)