Updates¶
The launcher updates itself. Every release carries a signed record of its size and hash; Xol checks that signature against keys built into the app, refuses replays and downgrades, and verifies the download before anything is opened.
Which version does what
Automatic installation arrives with launcher 0.2.2, which is built but not published yet. Launcher 0.2.0, the published development release, downloads and verifies updates the same way, but hands over manually: on Windows it starts the installer, on macOS it opens the disk image for you to drag. Moving from 0.2.0 or 0.2.1 to 0.2.2 is therefore still manual, because the updater that runs is the old version's. Everything on this page describes 0.2.2 unless it says otherwise.
Updates need a valid access key. Without one, Settings ▸ Service ▸ Launcher updates reads "Updates need an access key."
This page is about the launcher. The Xol client mod ships inside the launcher, so a launcher update is also how a new client version reaches you; your instances move to the new client jar the next time you press Play. Game files are never "updated"; a profile pins exact versions.
How an update happens¶
- Check. When the launcher starts, and when you press Check now, it asks the Xol service whether a newer release exists for your operating system and CPU architecture. The request carries your access key, the launcher version, the operating system and the architecture.
- Evaluate. The offer contains a release record signed with Ed25519. Xol evaluates the record before it downloads anything; see What is verified.
- Download in the background. With Update automatically on, the download starts by itself. The banner shows progress and a Cancel button. The file is written under a temporary name.
- Verify. The download is aborted if it grows past the signed size. Its SHA-256 is compared with the signed record before the file is given its real name. A mismatch is deleted.
-
Stage (macOS only). The verified disk image is mounted read-only,
Xol.appis copied next to the running app, and the copy is checked. See macOS. - Install. When you close Xol, or when you press Restart and update. Never while Minecraft is running.
Your instances, worlds and settings are not touched by an update.
The update banner¶
| Banner | Meaning | Button |
|---|---|---|
| "Xol 0.2.3 is available", with the size and "The download is checked against its signed release record before anything is opened." | Shown when automatic updates are off, or before the background download has started | Download update |
| "Downloading Xol 0.2.3", "12.4 MB of 96.0 MB" | Download in progress | Cancel |
| "Xol 0.2.3 is ready", "It installs by itself when you close Xol." | Downloaded, verified and, on macOS, staged | Restart and update |
| "Xol 0.2.3 is ready", followed by a reason | This copy cannot replace itself; see When Xol cannot replace itself | Open the installer |
| "Installing Xol 0.2.3" | Hand-over in progress | |
| "Update failed", followed by the reason | See Failure messages | Check again |
The version numbers and sizes above are examples. A banner can be dismissed for the session unless the update is mandatory.
The setting¶
Settings ▸ Service ▸ Launcher updates ▸ Update automatically, on by default. "New versions download in the background and install when you close Xol. Switch this off and Xol asks first." With it off, nothing is downloaded until you press Download update, and nothing is installed until you press the install button.
The same panel shows the running version and the result of the last check, for example "Xol is up to date." The possible results are listed under Check results.
Never while Minecraft runs¶
An update is not installed while a game is being prepared or is running. Pressing the button then gives "Close Minecraft before installing the update." Closing Xol while the game is still open does not install the update either; it installs the next time you close Xol with no game running.
What is verified¶
| Check | What it prevents |
|---|---|
| The release record is signed with Ed25519, and the signature verifies against a key that is built into the app. Unknown, revoked and expired keys are refused. | A compromised web server offering its own build. The service stores release records but holds no signing key. |
| The record must be for the Xol launcher and for a release channel this build accepts | A record for another product or a less stable channel |
| The record's sequence number must be higher than the last one this installation accepted. The number is stored only after a verified download. | Replay: re-offering an old, genuinely signed record |
| A version older than the installed one is refused unless the signed record carries an explicit rollback entry naming the installed version | Downgrade to a build with known flaws |
| The unsigned part of the offer must repeat exactly the file name, size and SHA-256 of the signed record | An offer whose download does not belong to its signature |
| The download is cut off past the signed size, and must end at exactly that size | Oversized or truncated files |
| SHA-256 of the file against the signed record, before the file gets its name, and again right before installation | A swapped or modified installer, including one changed on disk after the download |
macOS only: bundle identifier, version equal to the signed version, and code signature (codesign --verify --deep --strict) of the staged app, before the swap |
A disk image that contains something other than the promised Xol |
Only the signed fields mandatory and minLauncherVersion can block Play. The same flags in the unsigned part of an offer are ignored for that purpose.
macOS¶
- The verified disk image is mounted read-only, without opening a Finder window.
-
Xol.appis copied out of it withdittoto a hidden folder next to the running app.dittokeeps the ad-hoc signature that every Apple Silicon program needs. -
The copy is checked: its bundle identifier must be Xol's, its version must be the version the signed record promised, and
codesign --verify --deep --strictmust pass. If any check fails the copy is deleted and the update fails with the reason. - The disk image is unmounted. Everything slow has now happened in the background.
- Install is two renames on the same volume: the running app is moved aside to a hidden name, and the staged copy takes its place. If the second rename fails, the first is undone and the old app is put back.
- Xol starts again. The previous app is removed at the next start, once the new one has shown that it runs.
Why macOS asks only once¶
Gatekeeper assesses only files that carry the quarantine mark, and that mark is added by the program that downloaded the file: a browser, Mail or AirDrop. Your first copy of Xol comes from a browser, so macOS asks once (Install on macOS). An update is downloaded by Xol itself, so it carries no quarantine mark, its bytes match a hash inside a signed release record, and the app is copied out of that verified image. The replacement never enters Gatekeeper's queue. Nothing is bypassed; there is simply no new browser download to assess.
When Xol is signed with an Apple Developer ID and notarized, the first prompt goes away too. There is no date for that; see the roadmap.
When Xol cannot replace itself¶
Some copies of Xol cannot swap themselves. Xol then says why, and for that update falls back to opening the verified disk image so you can drag the new app into place. The button reads Open the installer.
| Message | Cause | Fix |
|---|---|---|
| macOS is running Xol from a temporary read-only copy. Quit Xol, drag it into your Applications folder with Finder, and start it from there; after that it updates by itself. | App Translocation. macOS runs a quarantined app from a random read-only location when it is started from the folder it was downloaded or unpacked into, such as Downloads. | Quit Xol. In Finder, drag Xol into Applications (the move has to be done with Finder). Start it from there. |
| Xol is running straight from the disk image. Drag it into your Applications folder and start it from there; after that it updates by itself. | Xol was started from inside the mounted .dmg |
Drag Xol to Applications, eject the disk image, start Xol from Applications |
| Xol cannot write to |
The folder that contains Xol is read-only for your user | Move Xol to a folder you can write to |
| Xol is not running from an application bundle. | An unusual way of starting the program | Install Xol normally |
After the fallback: "The disk image is open in Finder. Quit Xol, drag the new Xol to Applications (replace the old one), then start it again."
What has been proven on macOS¶
An automated macOS 14 build machine runs the whole staging and swap sequence for both architectures: a quarantined image, a staged copy with no quarantine mark, the swap, the signature check, a start of the new app, and the clean-up. Not yet observed: the full loop from a running, installed copy on a tester's Mac. That needs 0.2.2 installed and a later release published.
Windows¶
The update is the normal installer, run silently with the arguments that keep the installation folder and, after Restart and update, start Xol again. The banner reads "Updating. Xol closes and starts again in a moment." When the update installs because you closed Xol, it reads "Updating in the background." and Xol does not reopen.
An automated Windows Server 2022 machine runs a silent update over an existing install and checks that Xol starts again. It has not been observed on a tester's PC yet.
Rollback installers kept on disk¶
Verified installers are kept in the updates folder inside the data folder. After each verified download the folder is pruned to the last two installers. The older one is your manual way back: if a new version misbehaves, quit Xol and run the previous installer (Windows) or open the previous disk image and drag the app into place (macOS).
Xol itself will not install an older version unless the release record authorises it. If a release has to be pulled back, a signed rollback record can name the version it replaces; the banner then reads "Xol 0.2.2 (a rollback:
Before it hands a stored installer over, Xol re-hashes it. If it changed: "The downloaded installer changed on disk after it was verified, so it was deleted. Download the update again."
Mandatory updates¶
A release can be marked mandatory, or can declare a minimum launcher version, inside its signed record. Only then does Xol block Play. The button reads Update required, the line above it "Update Xol to keep playing", and the reason is one of:
- "Xol 0.2.3 is a required update. Install it to keep playing."
- "Xol 0.2.0 is no longer supported; version 0.2.2 or newer is required. Install the update to keep playing."
The banner of a mandatory update cannot be dismissed. A flag that is not covered by the signature cannot block anything, so a compromised server cannot lock you out.
Check results¶
Settings ▸ Service ▸ Launcher updates shows the result of the last check.
| Line | Meaning |
|---|---|
| Xol is up to date. | |
| Xol 0.2.3 is available. | See the banner on the main screen |
| No release is published for this system on your channel yet. | |
| A newer release exists but is not rolled out to you yet. | Releases can be rolled out in stages |
| The newest release has no installer for this system. | |
| The service has a release it cannot offer because it is not signed. / …because its record is invalid. | A publishing problem on Xol's side; nothing for you to do |
| An update was offered but refused: |
The record failed a check. Reasons include "signed by an unknown key", "signed by a revoked key", "signing key expired", "signature does not verify", "stale metadata (replay of an older release record)", "older than the installed version and not an authorised rollback", "the download offered does not match the signed release record". |
| Could not check: |
The service was unreachable or answered unexpectedly |
| Updates are paused: the access key was refused. | See access key states |
| Updates need an access key. | No key is saved |
| Not available on this system | This build does not update itself; see Linux |
A refused or failed check never blocks Play, and never discards an installer that is already verified and waiting.
Failure messages¶
Every failure ends with "Xol
| Message | Cause | What to do |
|---|---|---|
| The update could not be downloaded. Check your connection and try again. | Network failure | Check again later |
| The download link has expired (links last a few minutes) or the key is no longer active. Check for updates again. | Download links are short-lived and stop working when a key is suspended or revoked | Check again; check the key state |
The update server answered HTTP . |
Server-side problem | Try later |
| Not enough free disk space for the update ( |
The updates folder needs the installer's size plus 64 MB | Free some space |
| The update is |
Size mismatch before download | Report it to contact@xol.dev |
| The update is larger than the signed release record says; the download was discarded. / The update download ended early (…); it was discarded. | Size mismatch during download | Check again; report it if it repeats |
| update integrity check failed (expected …, got …); the download was discarded | SHA-256 mismatch | Check again; report it if it repeats |
| The update could not be unpacked: … | macOS: mounting or copying failed | Try again; see the fallback above |
| The disk image does not contain Xol.app. / …contains a different application (…). / …contains Xol |
macOS: the staged copy failed its identity checks | Report it |
| The unpacked update did not pass its checks: … | macOS: the code signature check failed | Report it |
| The current Xol could not be moved aside: … / The new Xol could not be moved into place, so the old one was put back: … | macOS: the swap failed. The old app keeps working. | Check the folder's permissions; see the fallback above |
| The installer could not be started: … | Windows: the installer did not start | Run it by hand from the updates folder |
| The update to Xol |
Shown at the next start when a hand-over did not take effect | Check again, or run the installer by hand |
With diagnostics on, a failed update is reported automatically: launcher version, system type and the reason, with no game log. The banner then adds "A report was sent (diagnostics are on)." With diagnostics off, nothing is sent. See Privacy and data.
Linux¶
There is no Linux build, so there is nothing to update. A copy of the launcher running on Linux, which today means a developer build, says under Launcher updates: "Installers are published for Windows and macOS only; this build does not update itself." An AppImage build and its update path are planned; see the roadmap.