February 17, 2026
Merge Builds, Environment Management CLI, Remove Files with File Preview, Build File Viewer in Dashboard, Local Checksum Cache & Segmented Verification, Link Only Mode, Per-Instance Launch Argument Ov
Merge Builds
🔀 Merge Builds — Partial Updates for Large Games
NEW FEATURE: Upload only changed or new files into an existing build, instead of re-uploading the entire game!
Merge builds are designed for large games where only a small portion of the content changes between updates. Instead of uploading a full 20 GB build, you upload a ZIP containing only the modified files and the system creates a new build with the changes merged in.
How it works:
Select a baseline build — any completed, deployed build (including previous merge builds)
Upload a ZIP with only the changed/new files
The backend copies the baseline content to a new build and applies your changes on top
The result is a new independent build — the baseline stays untouched
Assign the new merge build to an environment when ready
Key benefits:
Faster uploads — upload only what changed, not the entire game
Same storage — merge builds are full builds with their own R2 content
Safe rollback — baseline is never modified, rollback = switch environment back
Chainable — merge into a merge build (merge builds are eligible baselines)
File removal — optionally remove files from the baseline during merge
🖥️ CLI — Interactive Baseline Selection
NEW: The CLI shows a rich selection prompt when creating merge builds!
When creating a merge build in interactive mode, the CLI fetches eligible builds from the API and presents them in a selection list with detailed build info:
Each build shows:
Build ID
The unique build identifier
(merge) tag
Indicates the build is itself the result of a merge
Version
Patch version (e.g., v1.3)
Environment
Which environment(s) this build is assigned to, or "No environment"
Date
When the build was created
Deployed size
Total size of the deployed patch content
File count
Number of files in the build
Build notes
First 40 characters of the build notes (if any)
Manual fallback — you can always select "Enter Build ID manually" to type an ID directly.
CLI command-line usage:
✂️ CLI — Remove Files from Build
NEW: Remove files from a build directly from the CLI — no ZIP upload needed!
The new remove-files command creates a new build from a baseline with specified files removed, without uploading anything:
Interactive mode — select "✂️ Remove Files from Build" from the main menu:
The interactive flow guides you through app selection, baseline build selection (with the same rich build list), path entry, and optional notes.
Path validation — the CLI validates entered file paths against the actual build files before submitting. Invalid paths are rejected with a clear error message.
Command options:
--app
-a
Application ID
Yes
--build
-b
Baseline Build ID to remove files from
Yes
--paths
-p
File paths to remove (can specify multiple)
Yes
--notes
-n
Build notes for the new build
No
--no-watch
Don't watch build progress after creation
No
🌍 CLI — Environment Management
NEW: Manage environments directly from the CLI — list, create, delete, and assign builds!
The new environments command group lets you manage your app environments without leaving the terminal:
Interactive mode — select "🌍 Manage Environments" from the main menu:
The interactive flow presents a sub-menu with all environment actions:
List environments displays a formatted table:
ID
Environment ID
Name
Environment name
Active Build
Currently assigned build ID, or "None"
Enabled
Whether the environment is active
System
Whether it's a system-managed environment
Access Code
Access code if configured
Assign build — when assigning a build to an environment, the CLI shows a confirmation message:
Delete environment — in interactive mode, only non-system environments are shown. A confirmation prompt is required before deletion.
Subcommand reference:
list
--app, -a (required)
List all environments for an app
create
--app, -a, --name, -n (both required)
Create a new environment
delete
--app, -a, --name, -n (both required)
Delete an environment
assign-build
--build, -b, --environment, -e (both required)
Assign a build to an environment
Dashboard
🎨 Redesigned App Environments Section
IMPROVED: The Environments section in the App Builds tab has been completely redesigned with a new layout and a launcher preview panel!

The environments list now features a cleaner, more informative layout:
Launcher Preview panel — a new sidebar on the right side shows a real-time preview of how the selected environment looks in the launcher:
Displays the app banner/logo
Shows an Environment dropdown reflecting the selected environment
Renders the Play button using the app's actual accent color
Includes the settings gear icon just like the real launcher
Updates dynamically as you switch between environments
🔄 Merge Builds in Environment Selection
NEW: Merge builds appear in the environment build selection dialog!

Merge builds are selectable — since they have their own complete content, they can be assigned to any environment
Rollback — done by selecting a different build in the environment dialog
🗑️ Remove Files from Build
NEW: Remove specific files from any completed build directly from the Dashboard!


Each completed build now has a "Remove Files" action button (✂️). Clicking it opens a two-panel dialog:
Left panel — enter file paths to remove (one per line), optional build notes, and see real-time path validation
Right panel — browse all files in the build with search filtering; click any file to add it to the removal list
Features:
File preview panel — see every file in the build with size information before deciding what to remove
Click-to-add — click any file in the preview to instantly add its path to the removal list
Path validation — entered paths are validated against the actual build files in real-time, with invalid paths highlighted
Original build untouched — the source build is never modified
Creates a new merge build — the result is a full, independent build you can assign to any environment
No upload required — the backend copies the baseline content and removes the specified files server-side
Use cases:
Remove a deprecated plugin or DLL
Clean up legacy assets between versions
Remove test files that were accidentally included
📂 Build File Viewer and Revamped Build Details
NEW: View all files inside any completed build directly from the Dashboard — no download needed!

Each completed build in the build details page now has a "View Files" toggle button. Clicking it expands an inline file viewer showing every file in the build:
Search filtering — quickly find files by name or path
File size display — see the size of each file
File count — total number of files shown in the header
Download Raw — link to download the raw
VersionInfo.infofileNo download required — browse the entire build contents without downloading the build
🔗 Link Only Mode — Configuration
NEW FEATURE: Set any app as "Link Only" so the play button opens a URL instead of triggering a download!

Link Only Mode is designed for games or apps hosted on external platforms, or any scenario where you want the launcher to redirect users to a URL rather than manage a local installation.
How it works:
Go to App Settings → Platforms and enable Link Only Mode
Enter the destination URL (e.g., your website, a Discord invite)
Optionally customize the Button Text and Status Text from a list of predefined options
The launcher's play button will open the URL in the user's default browser instead of downloading
The Platforms tab now includes a Link Only Mode card with:
Toggle switch — enable or disable link-only for each platform
URL input — the destination URL that opens when the user clicks play
Button Text dropdown — select from 13 predefined button labels (or leave the default "Open")
Status Text dropdown — select from 9 predefined status messages displayed below the play button (or "None" for no status text)
Live preview — an interactive preview chip showing exactly how the play button will appear in the launcher, including the external link icon and the selected button text
🎯 Per-Instance Launch Argument Overrides
NEW: Define custom launch arguments for each individual instance when using Multiple Executions!

When an app is configured with Multiple Executions, you can now override the global Launch Arguments on a per-instance basis. This is useful for multi-client setups where each instance needs different parameters (e.g., different client slots, screen positions, or server roles).
How it works:
Go to App Settings → Platforms and ensure Multiple Executions is enabled
In the Launch Arguments field, use the
{{instance_id}}placeholder to inject the instance number automatically — e.g.,-clientIndex {{instance_id}}For finer control, click "+ Add Override" under Instance Argument Overrides (Primary or Secondary) to define completely custom arguments for a specific instance number
Instances without an override use the global Launch Arguments (with
{{instance_id}}resolved)
{{instance_id}} placeholder:
1
-clientIndex {{instance_id}}
-clientIndex 1
2
-clientIndex {{instance_id}}
-clientIndex 2
3
-clientIndex {{instance_id}}
-clientIndex 3
Instance Argument Overrides:
Each override consists of an instance number and a custom argument string
Overrides take full priority — the global Launch Arguments are completely replaced for that instance
Add and remove overrides dynamically with the "+ Add Override" and delete (✕) buttons
Empty overrides are automatically filtered out on save
The
{{instance_id}}placeholder is also supported inside overrides
Example use case — Unity multi-client:
1
-clientIndex 1 -screen-fullscreen 1
2
-clientIndex 2 -screen-fullscreen 0 -screen-width 800
3
-clientIndex 3 -screen-fullscreen 0 -screen-width 800 -popupwindow
Launcher Desktop
File Verification Speed Improvements
Local Checksum Cache — Skip Re-Hashing Unchanged Files
NEW: The launcher now caches file checksums locally, dramatically reducing verification time on subsequent launches!
Previously, every time the launcher verified a game's integrity (on launch, repair, or update check), it had to read and hash every file on disk — even files that hadn't changed since the last check. For large games with thousands of files, this could take minutes.
The new Local Checksum Cache (checksums.json) stores each file's xxHash64 hash alongside its last-modified timestamp and size. On subsequent verifications, the launcher performs a fast metadata check (a stat call taking ~microseconds) instead of re-reading and hashing the entire file (~milliseconds to seconds per file).
How it works:
On first verification, all files are hashed normally and their checksums are stored in the local cache
On subsequent verifications, the launcher checks each file's
LastWriteTimeUtcandSizeagainst the cached entryIf metadata matches → the cached hash is reused instantly (cache hit)
If metadata changed or entry is missing → the file is re-hashed and the cache is updated (cache miss)
Stale entries (files removed from the manifest) are automatically pruned
Key details:
Cache location
%LocalAppData%\GameLauncher\Cache\Apps\{gameId}\checksums.json
Hash algorithm
xxHash64
Persistence
Atomic write (temp file + move) to prevent corruption
Error handling
Cache failures are non-blocking — the download flow is never interrupted
Cache pruning
Entries for files no longer in the manifest are automatically removed
Performance impact:
First launch: no change (all files must be hashed)
Subsequent launches: up to 90%+ faster verification for unchanged files
A stat call (~microseconds) replaces a full file-read + hash (~milliseconds to seconds)
Segmented File Verification — Smarter Batch Processing
NEW: File verification now groups files into logical segments for significantly more efficient processing!
Previously, the launcher processed each file individually with unbounded parallelism, which could overwhelm the thread pool for games with 20,000+ files. The new Segmented File Verification groups files into logical segments before processing:
Bundle segments — files that belong to the same Smart Bundle are grouped together by their
BundleIdDirectory segments — non-bundled files are grouped by their parent directory
This transforms ~20,000 individual file operations into ~100–300 segment-level operations, processed with bounded parallelism based on CPU core count.
How it works:
The
FileSegmenterreads the manifest and groups files by bundle or directorySegments are processed in parallel with
MaxDegreeOfParallelism = Environment.ProcessorCountWithin each segment, files are checked sequentially (cache-first, then hash if needed)
Results are aggregated at the segment level
Key benefits:
Prevents thread pool starvation — bounded parallelism instead of spawning thousands of tasks
Better disk I/O patterns — files in the same directory are read together, improving sequential read performance
Bundle-aware — files from the same Smart Bundle are verified as a group
Combined with checksum cache — segments with fully cached files complete almost instantly
Additional improvement:
File read buffer increased from 4 KB to 64 KB for better disk throughput during hashing
🔗 Link Only Play Button
NEW: The launcher fully supports Link Only apps with localized text and auto-scaling buttons!

When a game is configured as Link Only, the Desktop launcher:
Opens the URL in the user's default browser when the play button is clicked
Displays the custom button text — translated to the launcher's language for predefined options, or shown as-is for custom text
Shows the custom status text below the play button — also translated for predefined options
Auto-scales long text — the play button uses a Viewbox to automatically shrink text that would otherwise overflow
Skips all download logic — no verification, no patching, no update checks for link-only apps
Supports 7 languages — English, Spanish (MX), Thai, Simplified Chinese, Portuguese (BR), Hebrew, and French
Connection Error Screen
NEW: A dedicated error screen now appears when the launcher cannot load data from the server or local cache!

When the launcher fails to retrieve the launcher manifest from both the API server and the local cache, it now displays a Connection Error screen instead of showing a blank or broken UI.
The screen provides clear troubleshooting steps:
Check your internet connection and try again
VPN issues — try disabling it or switching to a different country. Some regions (e.g., China, Russia) may have network restrictions; in that case, try using a VPN
Firewall or antivirus — make sure it's not blocking the application
Run as Administrator — try running the launcher with elevated permissions
Contact the launcher administrator if the problem persists
A "Retry Connection" button allows the user to attempt reconnecting without restarting the launcher.
Connection Diagnostics Window
NEW: A standalone diagnostics window runs 7 automated checks to help users and administrators identify connection issues!

The new Connection Diagnostics Window is a dedicated tool that runs a comprehensive suite of network checks and presents the results in a clear two-column layout — troubleshooting recommendations on the left, detailed diagnostic results on the right.
7 Automated Checks:
Internet
HTTP request to google.com — verifies basic internet connectivity
DNS
Resolves the API hostname — checks DNS resolution and shows resolved IPs
API Health
Calls the API health endpoint — validates the backend is reachable and healthy
CDN
Requests the CDN base URL — confirms CDN reachability and response status
SSL
Validates the API SSL certificate — checks expiration date and issuer
Clock
Compares local time with the API server time — detects clock drift
Firewall
Inspects Windows Firewall rules — checks inbound/outbound rules for the launcher
Smart result display:
Each check shows a green ✅ or red ❌ icon with detailed result text (status code, response time, resolved IPs, certificate info, etc.)
User-friendly error messages — technical exceptions like "No such host is known" are translated into clear descriptions (e.g., "DNS resolution failed — Could not resolve api.gamelauncher.cloud")
The Copy button copies all diagnostic results to the clipboard for easy sharing with support, including raw error details for failed checks
A retry counter tracks how many times diagnostics have been run in the current session
Three-state left panel:
Running — shows a neutral stethoscope icon with "Connection Diagnostics" while checks are in progress
All Passed — shows a green checkmark with "All Checks Passed" when every check succeeds
Errors Found — shows the warning icon with "Connection Error" and troubleshooting steps when any check fails
Fix Firewall button — when the firewall check detects blocking rules, a dedicated button appears to automatically fix the Windows Firewall rules for the launcher executable.
Accessible from multiple entry points:
Connection Error panel — "Run Diagnostics" button on the main error screen
Offline indicator — click the offline status icon in the top navigation bar
Launcher Settings — "Run Diagnostics" button in the Launcher settings tab
Per-Instance Launch Argument Resolution
NEW: The launcher resolves {{instance_id}} and per-instance overrides at launch time — each instance gets the correct arguments automatically!
When launching a game configured with Multiple Executions, the Desktop launcher now:
Resolves
{{instance_id}}— replaces the placeholder with the actual instance number (1, 2, 3, …) for each processApplies per-instance overrides — if the Dashboard defines a custom argument string for a specific instance, it completely replaces the global arguments for that instance
Works across all launch paths — normal launch, optimized mode, and multi-instance launch all resolve arguments correctly
Smart process detection — when arguments contain
{{instance_id}}or per-instance overrides, the launcher matches running processes by executable path only (skipping argument comparison) to avoid false negatives during optimized mode monitoring
Resolution order for each instance:
Check if a per-instance override exists for this instance number → use it as-is (with
{{instance_id}}resolved)Otherwise, use the global Launch Arguments with
{{instance_id}}replaced by the instance number
Fixes
🐛 Build Version Not Updating After Game Updates
FIX: The build version displayed below the play button now correctly updates after a game download or update completes.
Some users reported that after updating a game, the version label below the play button still showed the version from the original installation — even after multiple updates.
This was a visual-only bug. The game files were always updated correctly on disk, but the launcher UI was not refreshing the version display after completing a download. This has been fixed so the version label now updates immediately after every download or update finishes.
🐛 Launched Apps Not Closing When Launcher Exits
FIX: All launched game processes are now terminated when the launcher is closed — preventing orphaned processes from running indefinitely.
Previously, when the user closed the launcher (from the tray icon "Exit" menu, the window close button, or a force shutdown), any games that had been launched would continue running as orphaned processes. The launcher only stopped its internal monitoring timers but never terminated the actual game processes.
Now, when the launcher exits through any shutdown path:
All monitored game processes are killed along with their entire process tree
Monitoring timers are disposed
A fallback mechanism retries the kill without the process tree flag if the first attempt fails
The cleanup runs in both the normal shutdown (
CleanupServices) and the force shutdown (ForceShutdown) paths
🐛 News UI Improvements
FIX: Several visual issues in the news slideshow have been corrected.
"Read More" button misalignment — the button was rendering incorrectly in certain layouts; it now displays properly within the news card
Default placeholder image — when a news entry has no image configured, a generic default image is now shown instead of a blank or broken area
API
📡 New Endpoint — Merge Candidates
NEW: GET /api/cli/build/merge-candidates/{appId} endpoint for listing eligible baseline builds.
Returns completed, deployed builds for an app that can serve as merge baselines
Includes environment assignment info (which environments each build is assigned to)
Both original and merge builds are included (all completed + deployed builds)
Used by the CLI interactive mode and available for third-party integrations
📡 New Endpoint — Remove Files from Build
NEW: POST /api/AppBuild/remove-files endpoint for creating builds with files removed.
Creates a new merge build from a baseline with specified files removed — no ZIP upload needed
Validates permissions, baseline build status, and removed paths
Enqueues the merge build job immediately for background processing
Used by the Dashboard "Remove Files" dialog and the CLI
remove-filescommand
📡 New Endpoint — Build File List
NEW: GET /api/AppBuild/build-files/{appBuildId} endpoint for retrieving all files in a build.
Returns the complete list of files in a deployed build, parsed from
VersionInfo.infoEach file includes its relative path and size in bytes
Used by the Dashboard file viewer, the remove-files dialog for path validation, and the CLI for path validation
Requires the build to be in a completed/deployed state
Need Help? Check out our Help Center or join our Discord Community!
Last updated
Was this helpful?