You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+21-20Lines changed: 21 additions & 20 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,26 @@
1
1
# Changelog
2
2
3
+
## [1.2.0] — 2026-03-21
4
+
5
+
### Added
6
+
7
+
-**Game-already-running detection** — launching while another session is active shows a confirm dialog with "Stop & Launch" to switch games instantly
8
+
-**Live "Playing" indicator** — play button shows a pulsing green "Playing" state while a game session is active
9
+
-**Stop & Launch** — terminates the running game process (`TerminateProcess`) before launching the new one; all launch entry-points consolidated into a shared `useLaunchGame` hook
10
+
11
+
### Fixed
12
+
13
+
-**ZipSlip path traversal** — `install_bepinex` and `install_melonloader` now validate each ZIP entry path component, rejecting any `..` or rooted segments; `canonicalize` double-check against base directory
14
+
-**Scan button broken** — `GameGrid` now calls `useScan()` at component level; the "Scan Steam / Epic / GOG" empty-state card correctly triggers the scan hook instead of a dead dynamic import
15
+
-**Dual game state divergence** — `game-session-ended` listener in `AppBehavior` now calls `qc.invalidateQueries` rather than manually replacing store state; TanStack Query is the single source of truth
16
+
-**Soft-delete UNIQUE constraint** — `steam_app_id` and `epic_app_name` UNIQUE column constraints replaced with partial unique indexes (`WHERE deleted_at IS NULL`); live migration rebuilds existing installs automatically
17
+
-**IGDB token waste** — `fetch_igdb_metadata` now caches the OAuth access token in `IgdbTokenState` with a 60-second expiry buffer; subsequent lookups reuse the cached token instead of requesting a new one per call
18
+
-**Unrestricted filesystem write** — `save_file` command validates the resolved canonical target path against an allowlist of safe directories (APPDATA, LOCALAPPDATA, Documents, Desktop, Downloads, OneDrive); writes outside these directories are rejected
19
+
-**Missing transactions** — `reorder_games` and `batch_update_games` now wrap their multi-statement loops in a single SQLite transaction for atomicity and a ~10× throughput improvement
20
+
-**Game tracking fallback** — tracking state no longer resets instantly when a Steam/Epic game has no install directory or exe path; fallback tracker keeps the session active until manually stopped
The milestone release. v1.0.0 is focused on **Polish & Discovery** — making ZGameLib feel like a finished, welcoming product from the very first launch.
|**Interactive Onboarding Tour**| Three-mode cinematic tour (Quick / Standard / Deep Dive) with animated spotlight overlay, live UI demonstrations, and a custom ending animation |
37
-
|**Year in Review**| Annual gaming recap at `/wrapped` — total hours, most played, top rated, busiest month, platform split, 9 animated stat cards |
38
-
|**Smart Play Recommendations**| "Play Next" strip on the library page — surfaces your best backlog picks using tag and genre matching against your highest-rated games |
39
-
|**What's New Modal**| In-app release notes shown automatically on first launch after an update |
40
-
|**Contextual Empty State**| Three action cards (Scan, Add, Browse Steam) replace the blank state once onboarding completes |
|**Default 6-Column Grid**| Out-of-the-box grid now shows 6 columns instead of 4 |
36
+
|**Game-Already-Running Detection**| Launching while another session is active shows a confirm dialog with "Stop & Launch" to switch games instantly |
37
+
|**Live "Playing" Indicator**| Play button shows a pulsing green "Playing" state while a game session is active |
38
+
|**Stop & Launch**| Terminates the running game process (`TerminateProcess`) before launching the new one |
39
+
|**ZipSlip Patch**| Path traversal vulnerability patched in BepInEx/MelonLoader installer |
40
+
|**Filesystem Hardening**|`save_file` restricted to safe directories (AppData, Documents, Desktop) |
41
+
|**IGDB Token Cache**| OAuth tokens cached with 60s expiry buffer — no redundant round-trips |
42
+
|**Soft-Delete Fix**| Partial UNIQUE indexes prevent duplicate blocking on soft-deleted records |
43
+
|**Transaction Safety**|`reorder_games` and `batch_update_games` wrapped in SQLite transactions |
44
+
|**Game Tracking Fallback**| Steam/Epic games without install directory stay tracked instead of resetting instantly |
43
45
44
46
---
45
47
46
48
## Preview
47
49
48
-
> Recorded on v0.7.0. v1.0.0 includes onboarding tour, Year in Review, smart recommendations, and many more improvements.
50
+
> Recorded on v0.3.0. Latest version includes game session management, onboarding tour, Year in Review, smart recommendations, and many more improvements.
@@ -59,16 +61,16 @@ The milestone release. v1.0.0 is focused on **Polish & Discovery** — making ZG
59
61
60
62
| Installer | Format | Notes |
61
63
|-----------|--------|-------|
62
-
|[ZGameLib_1.0.0_x64_en-US.msi](https://zsync.eu/zgamelib/app/ZGameLib_1.0.0_x64_en-US.msi)|`.msi`|**Recommended** — Windows Installer |
63
-
|[ZGameLib_1.0.0_x64-setup.exe](https://zsync.eu/zgamelib/app/ZGameLib_1.0.0_x64-setup.exe)|`.exe`| NSIS alternative installer |
64
+
|[ZGameLib_1.2.0_x64_en-US.msi](https://zsync.eu/zgamelib/app/ZGameLib_1.2.0_x64_en-US.msi)|`.msi`|**Recommended** — Windows Installer |
65
+
|[ZGameLib_1.2.0_x64-setup.exe](https://zsync.eu/zgamelib/app/ZGameLib_1.2.0_x64-setup.exe)|`.exe`| NSIS alternative installer |
64
66
65
67
> **Windows SmartScreen:** On first launch you may see *"Windows protected your PC"* — click **More info → Run anyway**. This is expected for unsigned indie apps.
66
68
67
69
---
68
70
69
71
## Table of Contents
70
72
71
-
-[What's New in v1.0.0](#whats-new-in-v100)
73
+
-[What's New in v1.2.0](#whats-new-in-v120)
72
74
-[Features](#features)
73
75
-[Onboarding Tour](#-interactive-onboarding-tour)
74
76
-[Library & Scanning](#-library--scanning)
@@ -264,7 +266,9 @@ The signature 1.0 feature. On first launch, users pick a tour mode — ZGameLib
264
266
- Multi-process games (launcher stub → real exe) are handled with an adaptive grace window: 300 s for the initial launcher handoff, then 30 s once the real game is confirmed running
265
267
- Records elapsed minutes and saves a session row when the game exits; fires a `game-session-ended` event to the frontend so playtime updates instantly without a manual refresh
266
268
- Updates `last_played` timestamp on launch
267
-
- Falls back to single-PID tracking when no install directory is resolvable
269
+
- Falls back to timeout-based tracking when no install directory is resolvable — session stays active until manually stopped
270
+
-**Game-already-running detection** — if you try to launch a game while another is tracked, an in-app confirm dialog offers "Stop & Launch" to kill the running game (`TerminateProcess`) and start the new one
271
+
-**Live "Playing" indicator** — the play button shows a pulsing green "Playing" state while a game session is active
268
272
-**Idle detection** — polls `GetForegroundWindow` every 30 s; if the game window loses focus for 5+ consecutive minutes, that idle period is excluded from the session total; brief alt-tabs are ignored; can be toggled off in Settings → Behavior
269
273
-**Steam Playtime Sync** — enter your Steam API Key and SteamID64 in Settings → Integrations; sync only increases local values, never decreases
270
274
-**Minimize on launch** — ZGameLib hides to tray with a 400 ms delay (for window focus handoff), then auto-restores when the game exits
@@ -1070,6 +1074,17 @@ npx tauri dev
1070
1074
1071
1075
Rust source changes trigger a full backend recompile. Frontend changes hot-reload instantly.
1072
1076
1077
+
### Production Build
1078
+
1079
+
```powershell
1080
+
.\build-release.ps1
1081
+
```
1082
+
1083
+
Outputs installers to `src-tauri/target/release/bundle/`:
0 commit comments