Skip to content

Releases: dawiisss/DzLinux-releases

1.0.8

20 Jun 18:27

Choose a tag to compare

Performance & Architecture

  • Data Lookup Optimizations: Replaced linear checks with $O(1)$ lookup maps in servers.js (for favorites check) and modManager.js (for mod update check).
  • Parallelized Favorites Refresh: Switched sequential favorite queries to parallel pings using Promise.all.
  • Incremental Ping Count Tracking: Added totalPingedCount to the central state.js store, allowing incremental updates and eliminating expensive $O(N)$ filter operations.
  • Asynchronous File I/O: Migrated cache loading and saving operations in servers.js to async fs.promises.
  • Monolithic Function Decomposition: Decomposed the monolithic 217-line fetchDayZServers function in servers.js into five single-purpose helper functions.
  • Standalone Watchlist Storage: Decoupled the server watchlist from settings.json into its own dedicated watchlist.json file.
  • Global Variables Migration: Moved global cachedSortOrder and currentModCheckInterval off the window object into the central state object.

Refactoring & Cleanup

  • Win32 Platform Code Removal: Simplified findDayzWorkshopFolder in steamPaths.js to assume Linux as the target platform.
  • Alias queryServerGameDig: Removed the redundant pass-through function pingServer and aliased it directly to queryServerGameDig in exports.
  • Cleaned Up Unused Callbacks: Prefixed unused stdout/stderr arguments inside launch-process callbacks with _ to satisfy strict lints.
  • Standardized Imports: Standardized core Node.js built-ins in main.js to use node: prefixes.

Bug Fixes

  • Linux App Icon Resolution: Guarded Wayland/desktop launcher name bindings and used nativeImage.createFromPath for correct app icon resolution on Linux platforms.
  • Integration Test Mocks: Resolved integration test suite crashes inside ipc-handlers.test.js by mocking nativeImage properties 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 queryPort numbers with null when a server was offline or its query status was invalid.
  • Dependency Security Patch: Resolved a high-severity vulnerability in the transitive package form-data under axios by applying an override to version ^4.0.6 in pnpm-workspace.yaml.

v1.0.7

10 Jun 17:46
0359542

Choose a tag to compare

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-label and title properties to dynamically generated mod checkboxes in Mod Manager to improve screen reader support and hover tooltips.

Performance Optimizations

  • Folder Size Calculation: Optimized getFolderSize in src/modManager.js to process stats concurrently using Promise.all, providing a ~4.5x speedup on large workshop directories.
  • Async I/O in Server Cache: Converted saveServerCache to 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.js with async cache read/write operations and implemented a serialization queue to prevent data corruption.

Bug Fixes

  • Fixed queryPort retrieval for the update script.

Testing Improvements

  • Replaced flaky setTimeout tests with exact cacheWriteQueue awaiting in Jest.
  • Added test coverage for saveSettings error handling.
  • Improved isSystemInstall unit tests using the AAA pattern and resolved mock reference memory leaks.
  • Added edge case tests for the countryToFlag utility.

v1.0.6

05 Jun 12:45

Choose a tag to compare

v1.0.6

Features & Rendering

  • Added queryPort support 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 applyTheme wiping compact-mode body 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 applyServerListMode hoisting issue preventing compact mode from persisting across restarts

Security & Stability Fixes

  • Replaced exec() with execFile() 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 — only http:// and https:// allowed
  • Added modId regex validation (/^\d+$/) on subscribe-mod before constructing steam:// URLs
  • Added path traversal protection in deleteMod and openModFoldermodId validated as numeric, resolved path verified to stay within mod directory
  • Fixed admin token auth bypass in server portal — empty ADMIN_TOKEN now properly denies DELETE (was false && ...), converted DELETE endpoint to async/await
  • Restricted checkPathExists to known directories (Steam, home, system paths)
  • Added escapeHtml sanitization on all innerHTML assignments 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: false to default settings — MangoHud feature was permanently disabled (missing from defaults)
  • Fixed before-quit handler — added 5s timeout on Steamworks shutdown, .catch() guard; app no longer hangs on quit
  • Fixed showConfirmModal overlay 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 _resortTimer race 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 countryToFlag now validates with /^[A-Za-z]{2}$/ before generating flag characters
  • Fixed NaN potential in storage map width calculation when space data is missing
  • Added parseInt radix (10) to all parse calls
  • Fixed log parser — .MDMP/.LOG files 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 all favKey.split(':') throughout renderer
  • Fixed two colspan="5" remnants in mod manager dynamic rows — now colspan="6" matching the 6-column table
  • Added missing .table-scroll wrapper to mod manager table — scrolling now works (matched server browser structure)
  • Fixed escapeHtml, MAP_NAMES, MAP_NORMALIZE, parseFavKey scope — moved to module level so diagnostics tab can access them
  • Fixed settings unavailable in loadDiagnostics — stored on window._settings before DOMContentLoaded callback closes
  • Fixed empty Steam subscription list hiding all installed mods — now treats empty [] differently from null
  • 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
  • pingServer now only delegates to queryServerGameDig — no more ICMP fallback
  • Removed unused execFile and util imports from serverQuery.js

Steamworks Fixes

  • Fixed worker init response format — now sends {id, result, error} consistent with manager expectations
  • Added await on workshop.download() — download failures no longer silently ignored
  • Added BigInt validation 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
  • getFlatList now uses Set for O(1) duplicate checking (was O(n²))
  • Version comparison now handles pre-release tags (1.0.0-beta vs 1.0.0) gracefully
  • Auto-update check errors now logged instead of silently discarded

Event Listener Management

  • onUpdateAvailable, onUpdateProgress, onUpdateDownloaded, onUpdateError, onServersBatch, onServersComplete now return unsubscribe functions — prevents duplicate listener accumulation
  • Added removeServerListeners counterpart for server event cleanup
  • onUpdateNotAvailable now passes value parameter for API consistency
  • Server batch events now guard against destroyed event.sender before calling .send()

Code Quality

  • Moved require('child_process') and require('fs') from inside IPC handlers to top-level imports in main.js
  • Extracted triplicated mapNames object into shared MAP_NAMES/MAP_NORMALIZE constants in renderer.js
  • Moved require('fs').promises to module level in modManager.js
  • Fixed win.loadFile to use path.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 isQuitting flag to before-quit handler to fully prevent app freezing on rapid exits.
  • Settings Integrity: Added autoRefreshEnabled, autoRefreshTime, favoriteNames, and modLoadouts to the default settings whitelist so they are no longer wiped on restart.
  • UI Architecture: Extracted a massive inline script block from index.html into a new ui-behavior.js file for maintainability.
  • Renderer Performance: Added a 200ms debounce to updateStatsInline to prevent UI thrashing during high-concurrency server sweeps.
  • State Management: Fixed a race condition in fetchServers by safely merging new ping data into allServers instead of overwriting the array.
  • Network Performance: Tuned BG_CONCURRENCY down to 200 to ease the burden on local socket resources and router NAT tables while maintaining high scan speeds.
  • Audio Reliability: Converted playAudioFeedback to use a lazily-loaded singleton AudioContext with .resume(), permanently fixing UI sounds dropping out after rapid clicking.
  • Mod Manager Stability: Refactored getFolderSize in modManager.js to use an iterative queue pattern instead of recursion, eliminating EMFILE stack crashes on massive Workshop folders.
  • Steam Resolver Efficiency: Changed resolveBatchDependencies to use Promise.all for parallel mod metadata lookups instead of slow sequential fetching.
  • DRY Code Quality: rendererUtils.js is now included globally in index.html, allowing the removal of 60 lines of duplicated utility functions from renderer.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

01 Jun 13:39

Choose a tag to compare

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: true enables parsing of dayzMods, tags (time/perspective/modded), and rules (map/island)
  • Removed BM background fetch, searchBattleMetrics, and queryServerRules — no more BM API dependencies
  • GameDig query flow: tries [gameport, gameport+1, 27016] with givenPortOnly=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 + bgPingQueue cleared before allServers replacement)
  • Batch size 500, 15s cooldown between pinger rounds

Performance

  • DocumentFragment in renderServers() — single DOM injection for 150 rows instead of row-by-row
  • buildDetailRow() extracted — expand/collapse toggles directly in DOM without full table rebuild
  • fastPingServer() 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-gpu flag from startup to improve performance
  • Removed BattleMetrics from acknowledgments - no longer used
  • IPC log bridge added for future renderer diagnostics

v1.0.4

31 May 18:26

Choose a tag to compare

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.ping instead 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: nowrap to 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

31 May 14:34

Choose a tag to compare

Fixing the auto updater for the AppImage.
Fixing the updater process for tar.gz

v1.0.2

31 May 14:04
e70b085

Choose a tag to compare

  • Bump to release 1.0.2 for auto updater changes.

v1.0.1

31 May 13:50
e70b085

Choose a tag to compare

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.js from a stray brace closing a forEach callback.
  • Quick Launch — Fixed sending empty -connect/-port args 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-quit hook ensures clean worker cleanup on exit.
  • Mod verification — Now enforces presence of DayZ addons/Addons subdirectories 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 pathsunlockForLaunch moved 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 into src/styles/main.css with a utility class framework.
  • Performance — Removed heavy backdrop-filter usages 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 Exception reclassified 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 degradationgetSubscribedMods failure downgraded to console.warn instead of throwing.
  • Dead code removed — Duplicate null guards, redundant inner require() calls, unused imports.

Documentation

  • README — Rewritten for end-user clarity.