Files
NotAlterra/CHANGELOG.md
T

15 KiB

Changelog

All notable changes to NotAlterra are documented in this file.


[v0.4.3] — 2026-06-14

Fixed

  • Dashboard counts — "Saves" now shows .bak recovery file count, "Backups" shows .tar.gz archive count
  • Backup mtime preservation — tar archives now store source file modification times, preventing epoch dates on restored files
  • Navigation bound — restore backup picker no longer stops before migrated entries
  • Save folder dialog — pre-fills with the current path if one is already set
  • Disclaimer sentinel not removed on decline — rejecting the disclaimer now deletes the NOTALTERRA_LICENSE_ACCEPTED sentinel file, so the disclaimer reappears on the next launch. Previously, acceptance was irrevocable even through the "View disclaimer" menu item.

[v0.4.2] — 2026-06-09

Added

  • Info dialog — non-blocking popup (no button) for backup-in-progress status
  • INI restore picker header — pinned header with "INI Backup" / "Size" columns
  • Header pinned on restore pickers — column header + blank spacer stay fixed
  • Spacer row between list content and status bar on all screens
  • Split-layout backup picker — pip () highlight replaces background bar, right pane shows live GVAS metadata for the selected backup (loads on highlight, cached per file)
  • Persistent config (app.ini) — save-folder and backup-root paths now survive sessions, stored under data_local_dir/NotAlterra/config/
  • Set backup location menu entry — choose where save and UE5 backup archives are stored; defaults to ~/NotAlterra
  • Blank separator lines in menus — visual grouping, auto-skipped on navigation
  • docs/CVE_TEMPLATE.md — structured vulnerability disclosure template
  • docs/BUG_REPORT_TEMPLATE.md — user-facing bug report reference with privacy warnings
  • .github/PULL_REQUEST_TEMPLATE.md — PR checklist matching CI gates
  • Safe harbor clause in SECURITY.md — legal protection for good-faith security researchers

Changed

  • Layout alignment — restore backup and INI restore headers aligned with data
  • Column widths — Backup column widened to 38 chars for longer labels
  • Size column — right-aligned, header centered above values
  • Main menu — entries shifted 1 position left
  • INI submenu — entries aligned with main menu, header cyan + 3 right
  • Highlight color — all picker highlight color changed to yellow
  • Backup creation — no intermediate spinner page; info popup + summary dialog
  • INI restore picker — now uses pinned_header, matching restore backup style
  • File picker layout — horizontal 60/40 split: file list on left, metadata preview on right. Slot, Description, Date columns only
  • Main menu pip highlight replaces full-row cyan background (legacy highlight code retained for other pickers)
  • Config directoryapp.ini and sentinel moved from exe_dir/ to data_local_dir/NotAlterra/config/ (platform-standard)
  • Logs directorytransaction.log moved from exe_dir/logs/ to data_local_dir/NotAlterra/logs/
  • UE5 ini backups — stored in backups/ue5/ under the backup root instead of backups/config/
  • Menu labels — "Set save folder" renamed to "Set Subnautica 2 location", descriptions updated
  • Local builds — compiled with cargo build for both Linux and Windows targets
  • Context-aware header path — the right side of the title bar shows the relevant file location for the current menu or submenu item (save folder, backup root, or ini Config\Windows path)
  • Human-readable backup labels — archive filenames are now displayed as Full Backup — <date> and Pre-restore — <date> in the restore picker instead of raw .tar.gz filenames
  • Backup Types section in README — explains Full Backup vs Pre-restore in plain language so users understand the safety flow
  • Archive integrity checkcheck_tar_gz_integrity() verifies gzip magic bytes before restore; corrupt files show a warning description and Enter is blocked
  • Context-aware restore descriptions — restore picker shows different descriptions for full backup, pre-restore, migrated, and corrupted archives
  • Consistent warning spacing — all messages use double-space formatting

Fixed

  • Header/data misalignment — total widths matched so {:>8} fields align

Removed

  • "Inspect save files" menu entry — metadata is now visible inline in the backup picker right pane. action_inspect_saves() code retained.
  • i key handler in backup picker — redundant with live metadata pane
  • Outdated privacy claims — docs no longer state "no data stored" or "session-only"; now accurately describe app.ini persistence

Security

  • GitHub Private Vulnerability Reporting as primary disclosure channel, email as fallback
  • Safe harbor — explicit no-litigation commitment for good-faith reporters following the disclosure policy
  • CVSS v4 scoring documented in Dependabot advisory for lru transitive dependency (low severity, not actionable)
  • All paths in app.ini documented as potentially containing the system username — plain text, never transmitted

[v0.4.0] — 2026-06-03

Added

  • --help / -h flag — displays usage information
  • tar.gz backup format — one archive per backup event, all slots in one file. Standard tar -xzf recovers data without the tool (no vendor lock-in). Safeguards: atomic write (.tmp → rename), per-file SHA256 manifest, per-entry restore without full decompress.
  • Migration path — old NotAlterra_Backups/ directory-tree backups are automatically detected and imported into the new tar.gz format
  • Bus factor mitigation — documented in GOVERNANCE.md: emergency signing key stored with a non-technical trusted person, revocable if compromised

Changed

  • File layout — backups stored in backups/saves/ (tar.gz), backups/config/ (.ini archives), logs in logs/transaction.log
  • Stale config.ini removed on first launch from prior versions
  • Dependencies — added tar + flate2 (pure Rust, +~150KB binary)

Testing

  • 6 migration unit tests (basic, empty, nonexistent, integrity, filtering, idempotency)
  • Full round-trip integration tests for tar.gz backup/restore
  • Fuzz target for backup round-trip (10s: 11,717 runs, zero crashes)
  • File permissions fixed in tar headers (0o644 instead of 0o000)

[v0.3.2] — 2026-06-02

Added

  • Lightweight startup check — on launch, the app silently checks the current user's default save locations (%LOCALAPPDATA% on Windows, Proton + XDG data on Linux). No scanning of other profiles or system drives. If nothing is found, use Set save folder as before.
  • Migration notification — old backups in NotAlterra_Backups/ are migrated silently on first launch with a log entry. The user is informed their original data remains untouched.
  • Log migration — existing transaction.log is moved into logs/ on first launch, appended to the new location.

Removed

  • config.ini eliminated entirely — no save path, disclaimer flag, or scan timestamp is written to disk anymore. The save folder is session-only, entered via Set save folder. The disclaimer acceptance is tracked via a 0-byte sentinel file (NotAlterra_LICENSE_ACCEPTED) alongside the binary.
    • src/config.rs reduced to sentinel utilities and exe_dir()
    • AppConfig, load_config(), save_config() removed
    • Integration tests for config round-trips removed (replaced by sentinel test)

Changed

  • get_ini_path() now derives the Config/Windows path from the save folder at runtime — no cached ini_path in memory or on disk.

[v0.3.1] — 2026-06-02

Added

  • Patrolling whale in the Set save folder input dialog (was missing the bottom separator present on all other screens)

Fixed

  • Path injection via paste — control characters (newlines, tabs, null bytes) are now stripped from user-provided paths before they reach config.ini or transaction.log
  • Draft releases — CI now creates releases as drafts. You can download and test the binaries before publishing them live.

Removed

  • Locate save files menu item — the deprecated auto-discovery entry point is gone. Set save folder is the only path for configuring the save location. The discovery.rs module remains for validate_custom_path and derive_ini_path but is marked for removal in v0.4.0.

[v0.3.0] — 2026-06-02

Added

  • SECURITY.md with vulnerability disclosure policy
  • Release checklist in GOVERNANCE.md
  • 32-test integration suite (guard, config, ops, gvas, ini backup/restore)
  • Fuzz target for GVAS parser (parse_gvas)
  • Second fuzz target (full_metadata) — exercises IntProperty, DoubleProperty, and additional StrProperty/BoolProperty code paths
  • fuzz/Cargo.toml manifest with both fuzz targets registered
  • Set save folder menu option — manual path entry with clipboard paste support (bracketed paste mode), replaces auto-discovery as the primary way to set the save location
  • cargo clippy, cargo audit, and cargo-deny in CI
  • deny(unsafe_code) in library crate
  • Build script validates CHANGELOG has current version entry

Fixed

  • Index-out-of-bounds panic in all four GVAS property extractors (extract_str_property, extract_bool_property, extract_int_property, extract_double_property) when a property name appeared too close to the end of the buffer — discovered by fuzzing the existing parse_gvas target

Deprecated

  • Auto-scan for save folders (Locate save files menu item / discovery.rs module). Scans user profiles and system directories, which is a privacy concern. Shows a deprecation notice once per session. Scheduled for removal in v0.4.0 — use Set save folder instead.

Changed

  • Zero compiler warnings
  • Example dump_samples compiles and runs
  • fuzz/target/ added to .gitignore
  • Fuzz targets rewritten from #[fuzz] attribute to libfuzzer_sys::fuzz_target! macro for nightly-toolchain compatibility
  • No auto-scan on startup — the application no longer scans user profiles and system drives for save folders at launch. Only the cached path from config.ini is loaded.
  • Menu is always 9 itemsSet save folder is always visible. Locate save files is always visible (with deprecation label). No conditional hiding or index remapping.
  • ensure_save_folder() and get_ini_path() no longer fall back to discover_save_folders(). They use the cached path or error with a message.
  • is_cloud_path() removed — was only used by the discovery-era cloud detection path.
  • Zero clippy warnings on CI — fixed collapsible_match (6 instances), empty_line_after_doc_comments, and manual_is_multiple_of lints from rustc 1.95 nightly.
  • KNOWN_ISSUES.md moved from docs/ to project root — reflects v0.3.0 privacy improvements (manual path entry live, discovery deprecated).

Notes

  • Working copy diverged from remote after signing the previous commit on a different clone. Resolved via git reset --soft origin/master (no content lost, identical tree).

[v0.2.3] — 2026-06-01

  • Zero compiler warnings (deny(unsafe_code), allow(dead_code) where intentional)
  • Example dump_samples compiles and runs
  • 100% function doc coverage with automated check script
  • last_pathsave_path, last_scansave_scan, config_pathini_path
  • Windows executable renamed to NotAlterra.exe
  • Diligence skill added for verification

Security

  • Logged paths truncated at Subnautica2/ — personal paths removed

[v0.2.0] — 2026-06-01

  • Zero compiler warnings (deny(unsafe_code), allow(dead_code) where intentional)
  • Example dump_samples compiles and runs
  • last_pathsave_path, last_scansave_scan, config_pathini_path
  • Windows executable renamed to NotAlterra.exe
  • Removed unused dependencies (sysinfo, log, simplelog)
  • Playtime zero-padded to 2 digits (03h 05m)
  • Header and blank rows non-navigable in pickers

Fixed

  • Playtime extraction on production saves (fallback byte-scan for DoubleProperty)
  • File picker column alignment and spacing tightened

[v0.1.3] — 2026-06-01

  • Zero compiler warnings (deny(unsafe_code), allow(dead_code) where intentional)
  • Example dump_samples compiles and runs
  • "Multiplayer" / "Single Player" used consistently throughout picker and inspector
  • Release archives moved to builds/ directory
  • Playtime zero-padded to 2 digits (03h 05m)
  • Header and blank rows non-navigable in pickers

Fixed

  • Playtime extraction on production saves (fallback byte-scan for DoubleProperty)
  • File picker column alignment and spacing tightened

[v0.1.2] — 2026-06-01

  • Zero compiler warnings (deny(unsafe_code), allow(dead_code) where intentional)
  • Example dump_samples compiles and runs
  • Replaced process detection (tasklist/pgrep) with startup warning modal to avoid Windows Defender false-positive (Trojan:Win32/Wacatac.C!ml)
  • "Online" / "Local" renamed to "Multiplayer" / "Single Player" throughout
  • Date format changed to YYYY-Mon-DD HH:MM
  • Status bar text removed — whale-only row
  • "Back" option added to .ini submenu
  • All save/ini operations now show file counts

Fixed

  • .ini backup now shows OK confirmation dialog
  • .ini restore returns file count
  • Fullbackup restore returns file count
  • Dashboard stats filter by savegame_* prefix
  • OK dialog width padding prevents text clipping
  • File picker column alignment tightened

[v0.1.1] — 2026-05-31

Changed

  • Zero compiler warnings (deny(unsafe_code), allow(dead_code) where intentional)

  • Example dump_samples compiles and runs

  • "Recover .sav file from .bak" renamed to "Recover save file" (less technical)

  • Dashboard stats now filter by savegame_* prefix, matching the file picker

  • Save/Backup labels pluralize based on count

  • Zero compiler warnings (deny(unsafe_code), allow(dead_code) where intentional)

  • Example dump_samples compiles and runs

  • Improved game-running exit message — explains why save files are at risk

Fixed

  • Background scan thread panic no longer hangs the application
  • Arrow-key navigation no longer overshoots — KeyEventKind::Release events filtered
  • GVAS metadata popup renders all 11 fields (was clipped to 2 because of Paragraph::new(Span))
  • Header path now shows tail of path (e.g. …\Subnautica2\Saved\SaveGames) instead of truncated prefix
  • Confirmation popup always appears — hard require_backup block replaced with soft warning

Security

  • Game-running detection at launch and before each destructive operation
  • .ini delete guarded by requiring at least one ini_backup_* directory