Releases: dawiisss/DzLinux-releases
Releases · dawiisss/DzLinux-releases
1.0.8
Performance & Architecture
-
Data Lookup Optimizations: Replaced linear checks with
$O(1)$ lookup maps inservers.js(for favorites check) andmodManager.js(for mod update check). -
Parallelized Favorites Refresh: Switched sequential favorite queries to parallel pings using
Promise.all. -
Incremental Ping Count Tracking: Added
totalPingedCountto the centralstate.jsstore, allowing incremental updates and eliminating expensive$O(N)$ filter operations. -
Asynchronous File I/O: Migrated cache loading and saving operations in
servers.jsto asyncfs.promises. -
Monolithic Function Decomposition: Decomposed the monolithic 217-line
fetchDayZServersfunction inservers.jsinto five single-purpose helper functions. -
Standalone Watchlist Storage: Decoupled the server watchlist from
settings.jsoninto its own dedicatedwatchlist.jsonfile. -
Global Variables Migration: Moved global
cachedSortOrderandcurrentModCheckIntervaloff thewindowobject into the centralstateobject.
Refactoring & Cleanup
- Win32 Platform Code Removal: Simplified
findDayzWorkshopFolderinsteamPaths.jsto assume Linux as the target platform. - Alias queryServerGameDig: Removed the redundant pass-through function
pingServerand aliased it directly toqueryServerGameDigin exports. - Cleaned Up Unused Callbacks: Prefixed unused
stdout/stderrarguments inside launch-process callbacks with_to satisfy strict lints. - Standardized Imports: Standardized core Node.js built-ins in
main.jsto usenode:prefixes.
Bug Fixes
- Linux App Icon Resolution: Guarded Wayland/desktop launcher name bindings and used
nativeImage.createFromPathfor correct app icon resolution on Linux platforms. - Integration Test Mocks: Resolved integration test suite crashes inside
ipc-handlers.test.jsby mockingnativeImageproperties and merged duplicate properties in global mocks. - Query Port Loss: Fixed a bug in the merge loops of the server list scripts where merging BattleMetrics data would overwrite valid/curated
queryPortnumbers withnullwhen a server was offline or its query status was invalid. - Dependency Security Patch: Resolved a high-severity vulnerability in the transitive package
form-dataunderaxiosby applying an override to version^4.0.6inpnpm-workspace.yaml.
v1.0.7
v1.0.7
Features
- Server Watchlist: Added a new "Watchlist" tab and background tracker. Players can now watch servers and receive native desktop notifications when player counts cross user-defined thresholds (e.g., notifying you when a full server has an open slot).
- Right-click context menu integration for easily adding servers to the Watchlist.
- Favorites Refactoring: Unified favorites data model. Consolidated favorites, favoriteNames, and favoritePorts into a single watchlist-style unified object array
{ip, port, queryPort, name}. Conserved query ports across sessions, added auto-migration on load, and improved UI sync behavior. - UI & Accessibility: Added
aria-labelandtitleproperties to dynamically generated mod checkboxes in Mod Manager to improve screen reader support and hover tooltips.
Performance Optimizations
- Folder Size Calculation: Optimized
getFolderSizeinsrc/modManager.jsto process stats concurrently usingPromise.all, providing a ~4.5x speedup on large workshop directories. - Async I/O in Server Cache: Converted
saveServerCacheto use asynchronous file writing (fs.promises.writeFile) to prevent blocking the Node.js event loop during large sweeps. - Async Mod Metadata: Converted mod metadata cache saving (
saveModsMetadataCache) to asynchronous file writing. - Async Query Cache: Prevented event loop blocking in
serverQuery.jswith async cache read/write operations and implemented a serialization queue to prevent data corruption.
Bug Fixes
- Fixed
queryPortretrieval for the update script.
Testing Improvements
- Replaced flaky
setTimeouttests with exactcacheWriteQueueawaiting in Jest. - Added test coverage for
saveSettingserror handling. - Improved
isSystemInstallunit tests using the AAA pattern and resolved mock reference memory leaks. - Added edge case tests for the
countryToFlagutility.
v1.0.6
v1.0.6
Features & Rendering
- Added
queryPortsupport for better server querying - Implemented progressive server reveal
- Added diff-based rendering for improved performance
Settings & Layout
- Configurable server list page size (default 50, range 10–500)
- Compact / Comfortable display mode toggle (compact is default)
- Compact mode: tighter server table rows, detail rows, mod pills, filters, stats bar, toolbar, settings cards, diagnostics entries, and favorites inputs
- Fixed
applyThemewipingcompact-modebody class on restart - Settings cards restructured: Performance Tuning in right column, remaining cards in 2-column grid on left
- Network Polling fields arranged in two-column row, label shortened
- Header padding reduced (20px → 10px) and main content padding reduced (30px → 15px) for tighter layout
Server List
- Pagination bar moved inside table card as sticky bottom bar — always visible, never cuts rows
- Pagination text changed from "READOUTS" to "SERVERS"
- Server rows always display fully without being cut off mid-row
Bug Fixes
- Fixed
applyServerListModehoisting issue preventing compact mode from persisting across restarts
Security & Stability Fixes
- Replaced
exec()withexecFile()in get-disk-space, checkGameMode, and game launch handlers — prevents command injection via user-supplied launch params, Proton paths, and directory paths - Added URL scheme validation to
openExternal— onlyhttp://andhttps://allowed - Added
modIdregex validation (/^\d+$/) onsubscribe-modbefore constructingsteam://URLs - Added path traversal protection in
deleteModandopenModFolder—modIdvalidated as numeric, resolved path verified to stay within mod directory - Fixed admin token auth bypass in server portal — empty
ADMIN_TOKENnow properly denies DELETE (wasfalse && ...), converted DELETE endpoint to async/await - Restricted
checkPathExiststo known directories (Steam, home, system paths) - Added
escapeHtmlsanitization on allinnerHTMLassignments containing user/server-supplied data — prevents XSS via mod names, server names, diagnostic descriptions - Settings merge now only accepts known keys — prevents prototype pollution via corrupted settings file
Bug Fixes
- Added
mangoHudEnabled: falseto default settings — MangoHud feature was permanently disabled (missing from defaults) - Fixed
before-quithandler — added 5s timeout on Steamworks shutdown,.catch()guard; app no longer hangs on quit - Fixed
showConfirmModaloverlay click listener never being removed — no more event listener leak on repeated confirm dialogs - Fixed Steam sync polling interval never clearing on transient errors — added 300-retry max
- Fixed
_resortTimerrace condition — now clears previous timer before scheduling a new one - Fixed empty server (0/0) incorrectly getting "high" population badge
- Added 200ms debounce on search input — no more
renderServers()on every keystroke - Fixed
countryToFlagnow validates with/^[A-Za-z]{2}$/before generating flag characters - Fixed NaN potential in storage map width calculation when space data is missing
- Added
parseIntradix (10) to all parse calls - Fixed log parser —
.MDMP/.LOGfiles now caught by case-insensitive extension check - Fixed UTF-8 boundary split in log buffer reading — aligns to next newline to avoid corrupting multi-byte characters
- Fixed telemetry buffer over-allocation after UTF-8 boundary adjustment (buffer now sized to actual remaining bytes)
- Added
parseFavKey()helper handling IPv6 addresses ([::1]:2302) — replaces allfavKey.split(':')throughout renderer - Fixed two
colspan="5"remnants in mod manager dynamic rows — nowcolspan="6"matching the 6-column table - Added missing
.table-scrollwrapper to mod manager table — scrolling now works (matched server browser structure) - Fixed
escapeHtml,MAP_NAMES,MAP_NORMALIZE,parseFavKeyscope — moved to module level so diagnostics tab can access them - Fixed
settingsunavailable inloadDiagnostics— stored onwindow._settingsbefore DOMContentLoaded callback closes - Fixed empty Steam subscription list hiding all installed mods — now treats empty
[]differently fromnull - Added error logging to previously empty catch blocks in servers.js, serverQuery.js
Removed ICMP Ping Fallback
- Game servers routinely block ICMP ping, causing "Ping fallback failed" spam on every refresh
pingServernow only delegates toqueryServerGameDig— no more ICMP fallback- Removed unused
execFileandutilimports from serverQuery.js
Steamworks Fixes
- Fixed worker init response format — now sends
{id, result, error}consistent with manager expectations - Added
awaitonworkshop.download()— download failures no longer silently ignored - Added
BigIntvalidation with try/catch — prevents crashes on invalid mod IDs - Added default response for unknown message types — prevents hanging in pending requests
- Added 30s timeout to all pending worker requests — no more permanent Promise leaks
- Added proper SIGTERM cleanup in worker — Steamworks client now disconnects before exit
Dependency Resolver & Updater Fixes
- Dependency cache no longer permanently caches error or truncated results
- Cache key now includes depth — prevents stale truncated results at different call depths
getFlatListnow usesSetfor O(1) duplicate checking (was O(n²))- Version comparison now handles pre-release tags (
1.0.0-betavs1.0.0) gracefully - Auto-update check errors now logged instead of silently discarded
Event Listener Management
onUpdateAvailable,onUpdateProgress,onUpdateDownloaded,onUpdateError,onServersBatch,onServersCompletenow return unsubscribe functions — prevents duplicate listener accumulation- Added
removeServerListenerscounterpart for server event cleanup onUpdateNotAvailablenow passesvalueparameter for API consistency- Server batch events now guard against destroyed
event.senderbefore calling.send()
Code Quality
- Moved
require('child_process')andrequire('fs')from inside IPC handlers to top-level imports in main.js - Extracted triplicated
mapNamesobject into sharedMAP_NAMES/MAP_NORMALIZEconstants in renderer.js - Moved
require('fs').promisesto module level in modManager.js - Fixed
win.loadFileto usepath.join(__dirname, 'index.html')— no more relative path loading - Server portal rate limiter now prunes expired entries to prevent unbounded memory growth
Code Review & Performance Optimization
- Application Stability: Added
isQuittingflag tobefore-quithandler to fully prevent app freezing on rapid exits. - Settings Integrity: Added
autoRefreshEnabled,autoRefreshTime,favoriteNames, andmodLoadoutsto the default settings whitelist so they are no longer wiped on restart. - UI Architecture: Extracted a massive inline script block from
index.htmlinto a newui-behavior.jsfile for maintainability. - Renderer Performance: Added a 200ms debounce to
updateStatsInlineto prevent UI thrashing during high-concurrency server sweeps. - State Management: Fixed a race condition in
fetchServersby safely merging new ping data intoallServersinstead of overwriting the array. - Network Performance: Tuned
BG_CONCURRENCYdown to 200 to ease the burden on local socket resources and router NAT tables while maintaining high scan speeds. - Audio Reliability: Converted
playAudioFeedbackto use a lazily-loaded singletonAudioContextwith.resume(), permanently fixing UI sounds dropping out after rapid clicking. - Mod Manager Stability: Refactored
getFolderSizeinmodManager.jsto use an iterative queue pattern instead of recursion, eliminatingEMFILEstack crashes on massive Workshop folders. - Steam Resolver Efficiency: Changed
resolveBatchDependenciesto usePromise.allfor parallel mod metadata lookups instead of slow sequential fetching. - DRY Code Quality:
rendererUtils.jsis now included globally inindex.html, allowing the removal of 60 lines of duplicated utility functions fromrenderer.js.
Performance Optimization
- Optimized server sorting by precomputing favorites Set (replaces O(n) array
.includes()with O(1)Set.has()) - Optimized favorites lookup and name filtering
Security Fixes
- Fixed [HIGH] DOM XSS vulnerability in
showToast
Accessibility & UI
- Improved accessibility for icon-only buttons and search input
Documentation & Tests
- Rewrote and improved main README.md with comprehensive documentation
- Added unit tests and significantly improved test coverage
- Updated acknowledgments.txt
v1.0.5
Changelog
v1.0.5
Features
- Map badge on server rows — (Cherarus, Livonia, Namalsk, etc.)
- Multi-select map filter dropdown
- Page size increased to 150 servers per page
- Merged extra servers to hosted_servers.json
GameDig-Native Pinging
- Replaced BattleMetrics API with GameDig A2S queries for player counts, mods, map, time, and server metadata
- GameDig
requestRules: trueenables parsing ofdayzMods,tags(time/perspective/modded), andrules(map/island) - Removed BM background fetch,
searchBattleMetrics, andqueryServerRules— no more BM API dependencies - GameDig query flow: tries
[gameport, gameport+1, 27016]withgivenPortOnly=true, 1000ms timeout - ICMP ping runs only as last-resort fallback after all GameDig attempts fail (fast mode still ICMP-only)
Background Pinger Rewrite
- In-place DOM streaming updates — each server's row updates immediately as pings return
- Deduplicated ping queue by IP:port — all slots go to unique servers
- Smart debounced re-sort (400ms) only triggers when new player count beats lowest visible on page
- Removed periodic UI refresh timer — no 4s full table rebuilds
- Stale pinger killed on refresh (
isBgPinging+bgPingQueuecleared beforeallServersreplacement) - Batch size 500, 15s cooldown between pinger rounds
Performance
DocumentFragmentinrenderServers()— single DOM injection for 150 rows instead of row-by-rowbuildDetailRow()extracted — expand/collapse toggles directly in DOM without full table rebuildfastPingServer()extracted — ICMP-only inline display separated from background GameDig pinger- Fixed double-load and unnecessary saves of mods metadata cache
Bug Fixes
- Player counts now appear correctly (stale pinger was modifying discarded objects)
getSubscribedItems()capped at 5000 to prevent IPC buffer overflow on large Workshop libraries- Expand/collapse no longer triggers full table rebuild (no animation stutter)
Misc
- Removed
--disable-gpuflag from startup to improve performance - Removed BattleMetrics from acknowledgments - no longer used
- IPC log bridge added for future renderer diagnostics
v1.0.4
v1.0.4 — Changelog
New Features
- Overhaul to server retrieval — Overhauled the server retrieval. It will now use the master list from the hosted-servers.json in preparation for custom submission portal. In the meantime this list will be updated regularly. This should mean that the serverlist will load up to 5x faster.
- Per-server ping button — 📶 button on every server row (main list + favorites) using fast ICMP-only mode. Updates the ping cell in-place with live latency feedback and TIMEOUT handling.
- Settings tab header — Reset to Defaults and Save Settings buttons relocated to a top-right header bar for quick access.
Ping Engine Overhaul
- Fast inline pings — Visible server pings now use ICMP-only mode (2s max timeout). Slow GameDig UDP probing is delegated to the background pinger.
- Promise rejection guard — Added
.catch()handlers to all inline ping callbacks, eliminating permanent "PINGING..." stuck state when IPC or network errors occur. - Favorites ping fix — Corrected broken response format handling (
statusObj.pinginstead of deprecated raw value). - Background ping cap — Queue limited to first 60 servers (top 2 pages by player count). Servers beyond this get inline-pinged on demand.
- Guaranteed startup — Background pinging now reliably begins after the initial server fetch, not just from batch events.
- Refresh interval — Default auto-refresh increased from 180s to 360s.
UI/UX
- Settings reorder — Cards rearranged to: Appearance & Audio → Storage Directories → Network Polling → Launch Presets → Performance Tuning.
- Action column — HUD Link column widened to 170px with
white-space: nowrapto accommodate both Ping and Connect buttons side by side. - Ping button styling — Matches Connect button sizing; shows
...while pinging and returns to 📶 icon on completion. - Row click suppression — Ping button clicks no longer trigger server row expansion or detail toggling.
v1.0.3
v1.0.2
v1.0.1
v1.0.1 — Changelog
New Features
- Real-time server streaming — Servers now stream in page-by-page via IPC events instead of a blocking fetch, eliminating the frozen loading screen. All 11,500+ global servers are fetched in the background.
- Favorites protection — Favorited/custom servers are instantly fetched on launch and pinned to the top of the list with live stats (with deduplication).
- Telemetry dashboard — New tab with a custom RPT log parser tracking game crashes, FPS drops, and session history, plus 6 crash patterns with suggested fixes.
- Dependency tree resolver — Recursive Steam dependency resolution with a collapsible card UI including error, truncated, and circular-dependency indicators.
- Mismatch checker — Enhanced with timestamps, "days outdated" display, and an Update All button.
- Advanced memory toggles — System Allocator, MALLOC_TRIM, Proton Esync, and Max Memory Allocation settings to mitigate DayZ memory accumulation on Linux.
- GameMode validation — Environmental detection for Feral GameMode.
- DXVK config editor and MangoHud config backup/restore.
- Mod storage visualization map — Interactive treemap showing per-mod disk usage.
- Flatpak Steam support — Proton autodiscovery now covers Flatpak installations.
Bug Fixes
- Updater — Restored GitHub polling logic that was broken.
- Renderer — Fixed broken
renderer.jsfrom a stray brace closing aforEachcallback. - Quick Launch — Fixed sending empty
-connect/-portargs to the DayZ executable. - About modal — Source links now open in the external browser instead of inside the app.
- Shutdown — SIGTERM handler + force-kill timeout in Steamworks worker;
before-quithook ensures clean worker cleanup on exit. - Mod verification — Now enforces presence of DayZ
addons/Addonssubdirectories to avoid premature readiness states from Steam API propagation delays. - Server API — Exponential-backoff retry, 5-min cache, rate limiter, CORS headers, and DELETE auth added.
- Proton/Steam launch paths —
unlockForLaunchmoved to a fixed timer to fix path resolution. - Subprocess leaks — Resolved blocking subprocess and ping execution leaks in background polling.
- Acknowledgments.txt — Now properly included in tar.gz and AppImage builds.
UI/UX
- Refactored styles — Extracted monolithic inline
<style>block intosrc/styles/main.csswith a utility class framework. - Performance — Removed heavy
backdrop-filterusages across modals, settings, and tables that caused severe GPU scrolling lag. - Direct Connect — Moved from the main header into a dedicated modal; Direct Join button re-aligned in the toolbar.
- Advanced filters — Added a toggle to collapse the server filter panel for vertical space savings.
- Styled modal — Replaced native
confirm()dialogs with a custom styled modal overlay. - Tab visibility — Fixed state bugs and cleaned up duplicate HTML classes breaking flexbox layouts.
- Server list pagination — Increased from 15 to 30 rows per page.
- UI cleanup — Removed non-functional "ESC CLOSE" text and "System Hud" badge.
- Favorites tab — Normalized entry field height, fixed white border, added panel padding.
- Countdown badge — Matched height with toolbar buttons.
- Button rename — "Commit Presets" → "Save Settings".
- Proton combobox — Constrained width to fit the TEST button.
Refactoring
- SteamCMD → steamworks.js — Migrated mod management from SteamCMD to native steamworks.js API with a background worker architecture to avoid UI freezes.
- Rich Presence — Removed redundant launcher-side Steam Rich Presence injection (DayZ handles it natively).
- Enforce script errors — Non-fatal
NULL pointer/Virtual Machine Exceptionreclassified as warnings to prevent false positive crash reports. - Mod resolution — Replaced brittle GameDig UDP A2S queries with BattleMetrics fallback for 100% accurate mod ID extraction.
- Async directory scanning — Mod manager now scans directory sizes asynchronously to avoid UI blocking.
- Graceful degradation —
getSubscribedModsfailure downgraded toconsole.warninstead of throwing. - Dead code removed — Duplicate null guards, redundant inner
require()calls, unused imports.
Documentation
- README — Rewritten for end-user clarity.