Skip to content

Release v26.4.0 - #5092

Merged
dgibbs64 merged 73 commits into
masterfrom
release/v26.4.0
Oct 18, 2026
Merged

dgibbs64 merged 73 commits into
masterfrom
release/v26.4.0

Conversation

@dgibbs64

@dgibbs64 dgibbs64 commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Release v26.4.0.

  • Bumps version (linuxgsm.sh) and modulesversion (core_modules.sh) to v26.4.0.
  • master was merged into develop first (62a79ca), so this branch already contains every master-only commit: the v26.3.0 release, the triage fixes (#5064, #5066), the milestone workflows and PR template (#5085) and issue-labeler 3.5.
    • One conflict, action-milestone-sync.yml, resolved with develop's version, which already includes #5091.
  • develop was merged in again after #5093 (4d947fd).
  • Compared with develop, this branch changes only the two version strings.

Pre-release testing

A fresh tf2server install from develop on Ubuntu 26.04, connected to with the game client:

  • Install: SteamCMD downloaded the game with no errors (after #5093).
  • Start and details: the server runs as srcds_linux64, and details shows ./srcds_run_64 (#5059).
  • Player warnings: with warnplayerstimer="1", restart showed the warning in the in-game chat (#5025).
  • Stop: graceful, in a few seconds (#5059 -norestart).

Release summary (draft release notes)

⚠️ Action required

Team Fortress 2 now uses the 64-bit server

tf2server starts ./srcds_run_64 by default, with -norestart added to startparameters so a graceful stop completes (#5059).

  • Custom startparameters: if your own config sets startparameters, add -norestart yourself. Without it, stop still works but falls back to killing the session after 60 seconds.
  • SourceMod servers stay on 32-bit until you opt in, because DHooks and many extensions have no 64-bit Linux build yet. To switch, set executable="./srcds_run_64" in your instance config.

SCP: Secret Laboratory ServerMod (scpslsm) removed

Steam has retired app 786920, so ServerMod can no longer be installed or updated by anyone (#5038). Existing installs keep running on their current files, but update-lgsm now fails for them. For a modded server, install scpslserver and use LabAPI or EXILED.

Highlights

  • Steam Workshop downloads for games that can't fetch Workshop content themselves: Arma 3, DayZ, Squad, Squad 44, Operation: Harsh Doorstop, Starbound, Barotrauma, Stationeers, Colony Survival, Left 4 Dead 2, Hurtworld and Soldat. Add item or collection IDs to workshopmods and run workshop-update (wu), or let update handle it. Mods are installed, kept up to date and added to the start parameters (#5008, #5009, #5012, #5014, #5016, #5017, #5018, #5019, #5020).
  • In-game player warnings before a stop, restart or update. Set warnplayerstimer to the number of minutes to warn for (off by default). Works on servers whose console accepts chat commands (#5025, #5033).
  • Postponed updates and backups: with stoponlyifnoplayers="on", an update or backup that finds players online is postponed, and monitor runs it once the server is empty. A backup-postponed alert is sent if a backup has waited over 24 hours (#5025, #5029).
  • Missing dependencies in details and post-details, so they are included in support links. details no longer tries to install packages (#5041).
  • Downloads over HTTPS: SteamCMD, MTA and every linuxgsm.download file, and an HTTPS download can no longer be redirected to HTTP (#4954, #5054, #5070).
  • Docker images on Ubuntu 26.04: 134 game server images move to Ubuntu 26.04. Existing /data volumes, game files and configs are kept (#5028).

Changes to existing behaviour

  • stoponlyifnoplayers now works for update, backup and workshop-update. Before, a prevented stop could leave the server stopped and not updated. A backup with stoponbackup="on" is now postponed while players are online instead of stopping the server (#5025, #5029).
  • Failed updates are reported as failures. A failed download now exits non-zero, sends the update-failed alert and starts the server again, instead of being reported as a successful update (#5060).
  • updateonstart now starts the server after applying an update (#5056).
  • SteamCMD progress is shown as it happens, and a SteamCMD failure is detected and retried (#5055).
  • Prompts without a terminal (cron, piped input, containers without -it) now exit with an error (code 2) instead of looping forever. Scripted answers such as yes | ./gameserver ... still work (#5042).
  • Monitor no longer restarts a server while a backup or update is running (#5025, #5029, #5057).
  • Monitor detects running commands when the script is run by its full path (#5011, #5015).
  • Permissions check accepts files the server user can reach through groups or ACLs, rather than requiring ownership (#5067).
  • Console timestamp logging works again (#5073).

New servers

  • Running With Rifles (#5021)
  • Jedi Knight: Jedi Academy (OpenJK) (#3891)
  • Conan Exiles (#5068)

Newer distros

  • Call of Duty, Call of Duty 2, Call of Duty: United Offensive and Medal of Honor: Allied Assault run on Debian 13, Ubuntu 26.04 and RHEL 9 (#5069).
  • Battlefield 1942 and Battlefield: Vietnam run on Ubuntu 24.04 and later (#5043).
  • Minecraft and PaperMC use Java 25 on Ubuntu 22.04 (#5079).
  • Minecraft and PaperMC check that the installed Java is new enough for the server version (#5075).
  • Rocky Linux 9 dependency lists are fixed (#5077).

Game server fixes

  • IOSoccer: uses the new 64-bit server, which replaced the 32-bit one in the 7 October update (#5024).
  • IOSoccer: no longer gets stuck in a map reload loop (#5024).
  • The Isle: EOS credentials are passed as launch arguments, because the game deletes Engine.ini on every stop (#5061).
  • 7 Days to Die and Soulmask: the graceful telnet stop no longer needs expect (#5051).
  • Soulmask: saves the world before stopping (#5051).
  • Rust: stops with quit, which saves the world (#5022).
  • Stationeers, Natural Selection 2 and NS2: Combat: stop with CTRL+c, as their consoles don't act on commands (#5022).
  • Left 4 Dead: stops with quit, the same as Left 4 Dead 2 (#5022).
  • SCP: Secret Laboratory: the EULA is accepted, so fresh installs start (#5022).
  • Core Keeper: multiple instances can run at once (#5074).
  • Vintage Story: old assets are removed before an update (#5032).
  • Rising World: stops gracefully with shutdown (#5031).
  • Unreal Tournament 3: default configs are installed, with the web admin enabled (#5062).
  • Unreal Tournament 3: details reads the web admin setting and port from UTWeb.ini (#5044).
  • Unreal Tournament 99: patch 469f and later are supported (#5034).
  • Unreal Tournament 99: update checks validate and retry release API responses (#5089).
  • Nuclear Dawn: downloads its game content again (#5040).
  • Barotrauma: server name, max players and tick rate are read from both config forms (#5072).
  • Just Cause 3: adds the missing libatomic dependency (#5053).
  • Sven Co-op: drops the libssl3:i386 dependency on Debian 12 and 13 (#5058).
  • Source servers: Steam ports are shown in details (#5046).
  • GoldSrc servers: FastDL collects content with the GoldSrc file layout (#5045).

Other fixes

  • details reports CPU cores and frequency accurately (#5076).
  • A failed virtualisation check no longer stops installs (#5086).

What's Changed

New Contributors

Full Changelog: v26.3.0...v26.4.0

dgibbs64 and others added 30 commits October 10, 2026 23:47
* feat(workshop): download Steam Workshop mods for Arma 3 and DayZ

Arma 3 and DayZ servers can't download Workshop content themselves.
Add workshopmods (item and collection IDs) and a workshop-update
command that downloads changed items with one SteamCMD login, installs
them to serverfiles/workshop/@<id>, lowercases them, copies BattlEye
keys and removes mods no longer listed. update and check-update include
Workshop mods, and start appends installed mods to -mod= in order.

* chore(workshop): make workshop_core.sh executable

* fix(workshop): download before stopping the server, and skip the restart when nothing changed
…5009)

* feat(workshop): add Steam Workshop downloads for Squad and Starbound

* fix(workshop): remove the saved mod list once no Workshop mods are left
…on: Harsh Doorstop (#5012)

* feat(workshop): add Steam Workshop downloads for Squad 44 and Operation: Harsh Doorstop

* fix(workshop): install OHD mods as their plugin folder so the game can mount them
…oneers (#5014)

* feat(workshop): add Steam Workshop downloads for Barotrauma and Stationeers

* fix(workshop): restore an empty Barotrauma regularpackages element to its original form
* feat(workshop): add Steam Workshop downloads for Colony Survival

* refactor(workshop): edit Colony Survival worldconfig.json with jq instead of Python
fn_monitor_check_starting and fn_monitor_check_stopping printed
"Checking start" / "Checking stop" on screen but wrote "Checking backup"
to the script log, a leftover from copying fn_monitor_check_backup.

Fixes #5010

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
…ull path (#5015)

Monitor only found commands started as ./gameserver <command>, because
the checks used pgrep -x with the /bin/bash ./ prefix. The cron, systemd
and Docker examples in the docs run the script by its full path, so
monitor missed updates and backups and restarted the server in the
middle of them. One helper now builds a single pattern per check that
accepts any path to the script. Fixes #5013.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
* feat(newserver): add Running With Rifles server

* fix(rwrserver): show rwr_server in the port diagnostic command

* feat(rwrserver): start game modes from their own package with startpackage

* fix(rwrserver): add the 32-bit libgpg-error dependency

* docs(rwrserver): note the game and DLC ownership requirements in the config
…5022)

* fix(config): correct consoleinteract for servers that do or don't read console input

* fix(config): correct stop modes and accept the SCP:SL EULA on install
IOSoccer moved to a 64-bit server (srcds_run_64) on 7 October 2026. The new engine executes the server cfg on every map load, so the map line in the default cfg caused an endless map reload. Add fix_ios.sh to comment it out on existing installs, and bump glibc to 2.29.

Fixes #5023
… retry postponed updates (#5025)

* feat(stop): warn players in-game before stop, restart and update, and retry postponed updates

* fix(stop): exit when players prevent a stop during update or backup, keep module modes

* fix(stop): mark variables shared between modules for shellcheck

* refactor(stop): shorten check_players_online module description

* refactor(stop): keep chat commands out of the config, clean up locks when a stop is cancelled, exit on CTRL-C

* feat(stop): say why the player count is unavailable

* fix(monitor): run postponed updates in the background, keep a long update's lockfile, retry forced updates as forced

* fix(monitor): mark exitcode as used by core_exit for shellcheck
…ty (#5029)

* feat(stop): warn players in-game before stop, restart and update, and retry postponed updates

* fix(stop): exit when players prevent a stop during update or backup, keep module modes

* fix(stop): mark variables shared between modules for shellcheck

* refactor(stop): shorten check_players_online module description

* refactor(stop): keep chat commands out of the config, clean up locks when a stop is cancelled, exit on CTRL-C

* feat(backup): run backups postponed by players once the server is empty, and keep long backups' lockfile

* feat(stop): say why the player count is unavailable

* fix(monitor): run postponed updates in the background, keep a long update's lockfile, retry forced updates as forced

* fix(monitor): run postponed backups in the background

* fix(monitor): mark exitcode as used by core_exit for shellcheck

* fix(monitor): mark exitcode as used by core_exit for shellcheck
Patch 469f no longer ships System64 and puts the 64-bit ucc-bin in System, so fresh installs failed with Executable was not found.
Moves 134 docker-gameserver images from ubuntu-24.04 to ubuntu-26.04 by
changing the os column of lgsm/data/serverlist.csv. Every server was
installed fresh and checked with monitor on both 24.04 and 26.04; full
results are in #5027.

Staying on 24.04: cod, cod2, coduo and mohaa (libstdc++5:i386, #5026)
and scpslsm (retired Steam app, #5038).

ios, ut99 and rwr also need #5024, #5034 and #5021, which ship in the
same release.

Refs #5027
App 111710 only ships the Linux server binaries. Its content depot
17711 is a shared install from the Nuclear Dawn game app (17710), which
SteamCMD records under SharedDepots and never downloads, so servers
fail with "Unable to find gameinfo.txt". app_update 17710 does not work
either, as SteamCMD treats it as shared only.

Require a Steam account that owns Nuclear Dawn and add fix_nd.sh, run
post install and pre start, which downloads depot 17711 with
download_depot when gameinfo.txt is missing and merges it into
serverfiles without overwriting the server files. app_info_print is run
first as download_depot fails with "missing app info" on a cold cache.

Fixes #5039
Removes SCP: Secret Laboratory ServerMod (scpslsm). Steam app 786920 has
been retired by the publisher, so SteamCMD returns "No subscription" for
every account and the server can no longer be installed. Modded SCP:SL
servers are covered by scpsl with LabAPI or EXILED.
…5043)

* fix(bf1942,bfv): provide 32-bit ncurses 5 libraries on newer distros

Ubuntu 24.04+, Debian 13 and RHEL 9 no longer package the i386
libncurses.so.5 and libtinfo.so.5 that the Battlefield 1942 and
Battlefield: Vietnam server binaries need. The new fix modules download
them into serverfiles when the system does not provide them, and add
serverfiles to LD_LIBRARY_PATH.

The static binaries only need ncurses 5 and the 32-bit libc, so the
libstdc++5 dependency and the Ubuntu 22.04 / Debian 12 support block in
check_deps are removed.

* feat(bf1942,bfv): move Docker images to Ubuntu 26.04

* fix(bf1942,bfv): install the LinuxGSM default serversettings.con

The server archives ship their own serversettings.con with
gameSpyPort 0. install_config skips copying the LinuxGSM default when
the file already exists, so a fresh install had no query port and
monitor failed with "queryport is not set". The bundled file is removed
first so the default config is copied. install_config only runs on
install, right after the archive has been extracted, so no user
settings are lost.

* fix(bf1942,bfv): preserve configs by repacking server archives

* fix(bf1942,bfv): document shared module variables for ShellCheck
…5044)

UT3 stores [UWeb.WebServer] bEnabled and ListenPort in UTWeb.ini, not
UTGame.ini, so details always showed the web interface as disabled on
port 0. Parse both keys from UTWeb.ini, as kf2server does with KFWeb.ini.

Fixes #1438
)

The fastdl command is offered for GoldSrc servers and already copies
files instead of compressing them, but it gathered files using the
Source layout (materials, particles, resource and Source file types).
GoldSrc custom content was therefore left out: wad files in the mod
root, map .res files, sprites, sky and detail textures in gfx, and
overviews.

When the engine is goldsrc, the preview and build steps now use a
GoldSrc directory list and per-directory file types from a single
shared function:

- mod root: *.wad (top level only)
- maps: *.bsp *.res *.txt
- models: *.mdl
- sound: *.wav
- sprites: *.spr *.txt
- gfx: *.tga *.bmp
- overviews: *.bmp *.tga *.txt

Source and Garry's Mod behaviour is unchanged.

Fixes #1778
…5042)

* fix(core): stop prompts looping forever when no input is available

fn_prompt_yn read the answer in an endless loop. When stdin is not a
terminal (cron, piped input, a container started without -it), read hits
EOF, the answer stays empty and "Please answer yes or no." is printed
forever at full CPU. Running ./vhserver install with stdin from /dev/null
wrote over 3 million lines (83 MB) in 60 seconds at the server directory
prompt.

Without a terminal bash also ignores read -e, -i and -p, so the prefilled
default is never applied and taking the default is not an option. Several
prompts default to Y on actions that must not happen unattended (accept
EULA, enable stats, delete all modules, overwrite the fastdl directory,
remove a mod), and treating no input as "no" would exit 0 on an aborted
install.

Prompts now check the read return code. If read fails with no answer,
the command prints an error and exits with code 2. Scripted answers such
as "yes |" or "printf 'y\n' |" keep working, including an answer with no
trailing newline. The same check is added to:

- fn_prompt_message, which returns 1, and command_send, which exits with
  an error because core_exit.sh inside $() only ends the subshell.
- the mods-install and mods-remove selection loops, which looped forever
  on "is not a valid addon/mod" in the same way.

* fix(core): document shared prompt exit codes for ShellCheck
* Update port number for jk2server

* Add jk3server LinuxGSM configuration
This adds Jedi Knight: Jedi Academy configuation to LinuxGSM
Similar to jk2server configuration but with minor differences.

* Update port number and defaultmap for jk3server

* feat(new server): Jedi Knight: Jedi Academy

* fix(jk3): misplaced number

* Update serverlist.csv

Try to add new server to serverlist

* add update jk3 module
also added jk3 to serverlistmenu

* update jk3s lgsm config

* remove serverlistmenu.csv
not meant to be there

* Update missing info for lgsm modules - jk3server

* fix typos

* add condition for starting jk3server in tmux

* fix(jk3server): select Academy app and bound release lookups

* fix(jk3server): omit unavailable config version from details

* refactor(jk3server): follow shared updater conventions

---------

Co-authored-by: Alexander Silva <alexander.silva@my.jcu.edu.au>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
dgibbs64 and others added 17 commits October 17, 2026 19:05
* chore: sync PR milestones to linked issues

Assign the next open milestone to new PRs into develop and copy the
PR milestone to issues referenced with Fixes, Closes, Resolves or
Related to. On merge, move referenced issues to the PR milestone.

* chore: label fixed issues and close them when the release merges
* chore: enforce PR template and closing keywords for agents

Add AGENTS.md with pull request rules, a PR Body Check workflow that
fails when the template is dropped or the issue placeholder is left in,
and closing keyword guidance in the PR template.

* fix: only flag an unedited Fixes #[issue] placeholder line

* chore: drop AGENTS.md and tidy PR template sections

* chore: avoid a real issue reference in the checklist wording
…5082)

Synced from dgibbs64/repo-sync@5b50822 — feat(sync): sync each group in a parallel matrix job (#25)

Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
…5084)

Synced from dgibbs64/repo-sync@50af2c5 — perf(workflows): use slim super-linter and lint changed files on PRs (#26)

Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
Minecraft 26.1 and later need Java 25 and refuse to start on Java 21.
jammy-updates packages openjdk-25-jre, which hyt already uses on 22.04,
so mc and pmc now install it too.
* fix(deps): update Java and libstdc++ 5 deps for the RHEL family

Minecraft 26.1+ needs Java 25. EL9 AppStream packages
java-25-openjdk, so mc and pmc use it on AlmaLinux, CentOS Stream, RHEL
and Rocky 9. EL7 and EL8 keep their older Java packages for pinned
older releases, and the Minecraft Java runtime check stops with
guidance when the configured version needs a newer Java.

Hytale's java-25-openjdk is not packaged on EL7 or EL8, so the hyt rows
there have no packages and check_deps warns that Java 25 must be
installed manually, as it already does on older Debian and Ubuntu.

compat-libstdc++-33.i686 is not packaged on EL8 or EL9. The cod, cod2,
coduo and mohaa fix modules already provide libstdc++.so.5 when it is
missing, so those rows have no packages there, matching rhel-9. EL7
still packages it and is unchanged.

* fix(pvr): provide libc++ on distros that do not package it

The Pavlov VR server links against libc++.so.1 and libc++abi.so.1. The
RHEL family lists asked for libcxx, which no EL8 or EL9 repo provides,
including EPEL and CRB.

When ldd reports either library missing, fix_pvr now downloads
libcxx-amd64-11.0.1-2.tar.xz (md5 pinned) and extracts it into
serverfiles/linux64, which is already on LD_LIBRARY_PATH. The tarball
holds the unmodified libraries and copyright files from Debian
bullseye's libc++1-11 and libc++abi1-11 11.0.1-2 packages. LLVM 11 is
used because it needs only glibc 2.18 and libatomic, so it also runs on
EL8. The existing libc++.so copy now falls back to the bundled library.

libcxx is replaced with libatomic in the RHEL family lists. Distros
that package libc++1 are unaffected, as ldd finds the system library.
#5055)

* fix(steamcmd): stream progress output and propagate SteamCMD exit code

SteamCMD output was piped through uniq before tee. uniq writes to a
pipe, so it block-buffers its output and progress only reached the
terminal and logs when SteamCMD exited, defeating unbuffer. stdbuf -oL
is not a portable fix: it has no effect on uutils coreutils (the
Ubuntu 26.04 default), and mawk also buffers pipe input.

Replace uniq with fn_dl_steamcmd_output, a bash read loop that drops
consecutive duplicate lines (keeping the #3010 behaviour) and writes
each line immediately.

exitcode=$? after the pipelines was tee's status, so a SteamCMD crash
without an "Error!" line was reported as success. Capture
${PIPESTATUS[0]} after each SteamCMD pipeline instead, so non-zero
exits are reported and retried. unbuffer passes the child exit code
through.

Fixes #3655

* fix(steamcmd): restore executable bit on core_dl.sh
* feat(ceserver): add Conan Exiles server

Adds the native Linux dedicated server for Conan Exiles (Enhanced),
Steam appid 443030.

Resolves #4923

* feat(ceserver): add stop mode for Conan Exiles

The first CTRL+c runs the engine shutdown but the process then hangs.
A second CTRL+c exits it.

* fix(ceserver): require glibc 2.28
Brings the v26.3.0 release and the master-only CI commits into develop. Keeps develop's action-milestone-sync.yml, which already has #5091.
@dgibbs64 dgibbs64 added this to the v26.4.0 milestone Oct 18, 2026
@github-actions github-actions Bot added engine: unity3d Issues related to unity3d engine engine: source game: SCP: Secret Laboratory ServerMod Issues related to SCP: Secret Laboratory ServerMod game: Team Fortress 2 Issues related to Team Fortress 2 labels Oct 18, 2026
install_server_files.sh runs update_steamcmd.sh with forceupdate=1.
Since #5060 that branch calls fn_update_apply, which is defined in
command_update.sh and is not loaded during install, so every SteamCMD
install printed "fn_update_apply: command not found" and only downloaded
the game through the missing appmanifest fallback. It also left an
update.lock behind.

During install, download directly and write last-updated.lock, as before
#5060. force-update still uses fn_update_apply.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

engine: source engine: unity3d Issues related to unity3d engine game: SCP: Secret Laboratory ServerMod Issues related to SCP: Secret Laboratory ServerMod game: Team Fortress 2 Issues related to Team Fortress 2

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants