• 0.8.95 17108a1f36

    MatchZy 0.8.95
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 53s
    Stable

    Ghost released this 2026-10-03 09:42:42 +02:00 | 7 commits to main since this release

    Download MatchZy-0.8.95.zip below and extract it into game/csgo/. Updating never touches your cfg/ files.

    What's new: https://matchzy.miksen.me/whats-new/ · Full changelog: CHANGELOG.md

    Downloads
  • 0.8.94 5ddcf6aa86

    MatchZy 0.8.94
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 52s
    Stable

    Ghost released this 2026-10-02 15:56:21 +02:00 | 10 commits to main since this release

    Download MatchZy-0.8.94.zip below and extract it into game/csgo/. Updating never touches your cfg/ files.

    What's new: https://matchzy.miksen.me/whats-new/ · Full changelog: CHANGELOG.md

    Downloads
  • 0.8.93 7364199d42

    MatchZy 0.8.93
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 49s
    Stable

    Ghost released this 2026-10-01 23:13:27 +02:00 | 13 commits to main since this release

    0.8.93

    October 1, 2026

    • Fixed a server crash in practice when switching from .spec back to .t or .ct: the Linux signature for the engine team-join handler matched the wrong function since CS2 build 14182 and is updated in gamedata/matchzy.json.
    • Security: a match config's cvars block (and a backup that carries it) can now only set real convars and MatchZy/Get5 settings. Action commands such as matchzy_loadmatch_url, matchzy_loadbackup and get5_endmatch, and matchzy_everyone_is_admin, are ignored and logged. matchzy_demo_path and matchzy_demo_name_format must be relative paths without ...
    • Security: team names, tags and flags loaded from a round backup are cleaned the same way as match config team names.
    • Match configs with 1 / 0 for skip_veto, clinch_series or wingman are accepted (they were refused as "should be a boolean").
    • get5_endmatch / .forceend after a series has ended now replies that the series is over, instead of sending a second series_end and overwriting the winner in the database. Ending a series between two maps no longer writes a result for the next, unplayed map.
    • Bots are kicked one by one by user id instead of with bot_kick (warmup bots, bot teams, map changes, the warmup fallback config), so the CSTV bot is never kicked with them.
    • A round restore that is refused because the backup has no usable round data no longer changes the running match first (match id, teams, sides, timeouts). A queued restore that is refused when the match goes live now starts the match normally instead of leaving the server in warmup.
    • Chat commands that take an argument (.map, .ban, .pick, .spawn, .sp, .team1, .back, ...) only run when the command word matches exactly, so .mapx no longer runs .map and .spec x no longer runs .spawn.
    • A series is clinched once the trailing team can no longer catch up, so drawn maps are counted (a BO5 at 2-0 with two draws no longer plays a fifth map).
    • get5_endmatch team1|team2 / .forceend team1|team2 during a live map now sends map_result for that map (won by the named team) before series_end.
    • Veto: a captain who changes team is replaced by a teammate (the veto hung waiting for them), and a captain who left during the veto countdown is replaced instead of aborting the veto.
    • Match config cvars that set an on/off or number MatchZy setting such as matchzy_enable_tech_pause or matchzy_tech_pause_duration now take effect (they were rejected as "can't be converted") and are restored at series end.
    • Changed convars are restored as 1/0 instead of True/False and with a . decimal separator on every server locale. 64-bit float convars are read correctly.
    • Match load URLs are logged and shown without their query string or credentials.
    • The series score is still written to the database when the map row update fails.
    • Practice: .savenade and .importnade save positions with a . decimal separator on every server locale; lineups saved with , still load. A lineup with an invalid position is refused with a message instead of an error. .importnade no longer turns 1,5 into 15.
    • Practice: .last, .loadpos and .loadnade no longer move dead players or spectators.
    • Practice: .fas no longer adds a death to the players it moves to spectator.
    • Practice: ending practice during .ff resets the timescale and unfreezes players right away.
    • Team names with spaces are shown in full on the scoreboard (mp_teamname_1 / mp_teamname_2 are now quoted).
    • Demo and round backup paths are always quoted, so they also work on Windows servers. tv_record_immediate 1 is only sent when the server has that convar.
    • SQLite databases use WAL mode, so overlapping writes at the end of a map wait less for the file lock. Back up matchzy.db together with its -wal and -shm files.
    • A restore requested during warmup now only says that it is queued (it used to print "Backup file loaded successfully" first).
    • Practice: if a grenade signature in gamedata/matchzy.json resolves to an empty address, .rethrow / .throwindex use the entity fallback instead of failing with "Invalid function pointer".
    • Practice: the server log says why a thrown grenade was not recorded.
    • The release zip no longer contains anything under cfg/, so extracting an update never overwrites your cfg/MatchZy/ files and no longer creates a second cfg/MatchZy/ folder on servers that use cfg/matchzy/. MatchZy writes any missing cfg on load. Reference copies of the current defaults are in addons/counterstrikesharp/plugins/MatchZy/defaults/.
    • The default cfgs written on a fresh install are now the same files the release zip used to ship. The plugin's built-in copies had drifted from them (for example mp_match_end_changelevel, mp_round_restart_delay, mp_win_panel_display_time). Existing cfg files are not changed.
    • admins.json: every listed SteamID64 is a full MatchZy admin again. The value is free text (for example the player's name) and is no longer read as admin flags; use CounterStrikeSharp's own admin system for limited admins.
    • A remote log URL or header set in a match config's cvars now only applies to that match. The next match goes back to the server's own matchzy_remote_log_url settings instead of keeping the previous match's URL. series_end and match_cancelled still go to the URL of the match they belong to.
    • Events are sent with a 60 second timeout instead of 10 seconds, and a failed send names the event and host in the log.
    • Loading a match config with a matchid that was already used reopens that match in the database: the match row's end time and winner are cleared when its first map starts, and a replayed map's result is cleared when it starts again.
    • Stability: dropped grenades cleared after a practice .t / .ct switch, and the pawn of a player who leaves practice, are now removed with the engine's Kill input instead of being freed directly (the "WriteEnterPVS: GetEntServerClass failed" crash class).
    • Stability: moving a player to spectator (.spec, .fas, players outside a loaded match) waits until the player is actually dead before changing team, also for a player who cannot take damage. Changing team on a living player can crash the server.
    • Stability: the veto no longer moves spectators onto a team with a plain team switch (which left them stuck observing), and a spectator joining a team is never respawned when the server's team-join signature is missing.
    • Stability: .coachtest no longer strips weapons inside the chat command handler.
    • A match that failed to start (an error during the knife or go-live setup) no longer blocks every later ready-up until a map change.
    • A matchid allocated after the match was stopped or replaced is discarded instead of being given to the next match.
    • Live events read their target URL and match id when the event happens, not later on a background thread, so an event sent while a match resets is no longer lost or sent to the wrong place.
    • .unpause (both teams) or an admin unpause now ends an auto-pause even when a team is still short: the match plays on, and only a further drop in players pauses it again. Before, the match paused again within 10 seconds.
    • A round restore that has to set the round up again (a restore queued in warmup, or after a crash) now records a demo, and a scrim or hill game is restored as a scrim or hill game instead of a match.
    • A restore that needs another map no longer loses the match when it was started with .match instead of a match config.
    • A map change from outside MatchZy in the middle of a loaded match now sends match_cancelled with reason map_changed and closes the match in the database.
    • A force-ready only lasts for the ready phase it was given in (it carried over to the next map and after the veto).
    • Forfeits, .ffw walkovers and .gg surrenders now stop and upload the demo, send map_result for the map in progress before series_end, and write the real map score (a score of 16 was written before, wrong for MR12). All of them give the winner the series.
    • A second end-of-map event can no longer count the same map twice in the series score.
    • get5_status can report pending_restore.
    • The stats export JSON names no winner for a drawn map (it named team2).
    • Performance: coach matches no longer scan the whole entity list once per player at every round start (the spawn points are cached per map), .autoclear scans once per grenade instead of six times, bomb defuse and explode events reuse the site found at the plant, the whitelist file is only read when the whitelist is on, and chat from spectators during match setup no longer rebuilds the player list.
    • Practice: .ln and the nades menu load the lineup you picked. A shared lineup in the menu, .ln #N, or a name with a typo used to load your own closest-named lineup instead; a name that matches nothing now says so.
    • Practice: .delbotpos only deletes a saved bot position with exactly that name (a typo deleted another one). .loadbotpos no longer loads an unrelated position for a typo.
    • Practice: .exitdry only works during a dryrun (in practice it restarted the game). Starting .dry from practice turns off the practice markers, impacts and grenade preview first, and leaving practice stops .botjiggle.
    • Practice: a delayed rethrow no longer fails when the player left during the delay.
    • Practice: .ln always replies, also when savednades.json cannot be read.
    • Help texts: .ff skips 10 seconds, .crouchbot adds a crouching bot, .importnade has no .in chat alias, and non-admins are no longer pointed to .mhelp.
    • The technical pause "not enabled" message showed a raw translation key.
    • The admin and match setup menu titles no longer contain the chat prefix's colour codes.
    • New matchzy_ready_hint_style 2: no center text during the ready phase. Instead, like upstream MatchZy, the chat lists the players who are not ready every matchzy_chat_messages_timer_delay seconds (in each player's language). Styles 0 and 1 are unchanged.
    • .coach only works in warmup and during freeze time. Becoming a coach in the middle of a live round left the team a player short for the rest of the round.
    • Practice: .rs, .grt and .fas are admin commands now (they affect every player on the server).
    • Live events are sent through one queue in the order they happened, so a receiver no longer gets round_end after map_result or match_unpaused before match_paused. series_end no longer waits a fixed half second. When the receiver keeps failing, the high-volume live events (kills, damage, grenades, ...) are dropped for 30 seconds at a time so they cannot hold up match events; live events give up after 10 seconds, match events after 60.
    • Advanced stats (rating, KAST, opening duels, trades, clutches) are stored in each round backup and put back on a round restore, so the rounds that are replayed are no longer counted twice.
    • An auto-pause that both teams agreed to play through stays lifted after halftime (the agreed player counts followed the side, not the team).
    • .t / .ct while still in the team menu asks the player to pick a team first instead of forcing the join.
    • A queued restore from a .match game is dropped when the server switches to practice or sleep.
    • Translations: about 250 chat messages that were English-only (coach, practice, pauses, backups, forfeits, .gg, .ffw, admin replies and more) are now in the language files, with Danish and Albanian translations. Messages sent to one player use that player's language instead of the server's. The ready-phase center hint (classic style) and the "not ready" list are shown in each player's own language too. Practice toggles such as .god, .impacts and .traj now say On/Off instead of True/False.
    Downloads
  • 0.8.92 655029ce06

    MatchZy 0.8.92
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 1m58s
    Stable

    Ghost released this 2026-10-01 18:46:38 +02:00 | 16 commits to main since this release

    0.8.92

    October 1, 2026

    • Fixed round backup files (matchzy_<matchid>_<map>_roundNN.txt) being written to csgo/addons/metamod/ instead of csgo/ on Metamod servers since the September 22 CS2 update. Backups were saved without round data, so .stop and .restore had nothing to load.
    Downloads
  • 0.8.91 bd9c84dc2c

    MatchZy 0.8.91
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 52s
    Stable

    Ghost released this 2026-09-29 15:42:04 +02:00 | 19 commits to main since this release

    0.8.91

    September 29, 2026

    • New matchzy_coach_listed_only (default false): in a match loaded from a match config, only the SteamIDs in a team's "coaches" list may coach that team, and a team without a list has no coach. Use matchzy_coach_enabled false to turn coaching off completely.
    • The coaching docs now list who can coach in each case (no match loaded, match config with and without a coaches list, admins, coaching disabled) with a full match config example.
    Downloads
  • 0.8.90 12953ac278

    MatchZy 0.8.90
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 57s
    Stable

    Ghost released this 2026-09-29 14:05:21 +02:00 | 24 commits to main since this release

    0.8.90

    September 29, 2026

    • Fixed a server crash about one second after a player connected to a server with a loaded match (0.8.88 and 0.8.89). The automatic team placement on connect forced the engine's team join on a player who was still in the team menu. Players now pick a team from the menu again, as before 0.8.88; the roster lock still only lets them join their own team, and a player who ends up on the wrong side, is off the roster or is a substitute on a full side is still moved.
    Downloads
  • 0.8.89 11f4b53d92

    MatchZy 0.8.89
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 55s
    Stable

    Ghost released this 2026-09-29 13:38:31 +02:00 | 26 commits to main since this release

    0.8.89

    September 29, 2026

    • Tactical timeouts in overtime: live.cfg now sets mp_team_timeout_ot_add_once 1, mp_team_timeout_ot_add_each 0 and mp_team_timeout_ot_max 5, so each team gets one extra tactical timeout (.tac) when the match goes to overtime. The old live.cfg had no mp_team_timeout_ot_add_once, so a team that had used its timeouts in regulation had none in overtime. mp_team_timeout_max is now 4 (was 3). These are only defaults: both config.cfg and live.cfg can be edited to your needs. Set the timeouts in cfg/MatchZy/live.cfg (it runs when the match goes live, so the same lines in config.cfg would be overridden), or per match in the match config's cvars block. Note that live.cfg is part of the release zip, so extracting an update over the server replaces it; keep a copy of your edits (config.cfg is never replaced).
    • New matchzy_overtime_pauses_per_team (default 1, 0 = no limit): how many times each team may use .pause in each overtime period. Admin pauses are not counted; regulation is unchanged. Chat announces the overtime allowance when overtime starts. Change it to your needs in config.cfg.
    • .pause no longer requires tech pauses to be enabled. It was refused whenever matchzy_enable_tech_pause was false.
    Downloads
  • 0.8.88 2eea6b4b18

    MatchZy 0.8.88
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 54s
    Stable

    Ghost released this 2026-09-29 11:59:10 +02:00 | 29 commits to main since this release

    0.8.88

    September 29, 2026

    • Fixed a knife round being played although the match config sets the side ("map_sides": ["team1_ct"] and similar). Every player who connected during warmup switched the knife round back on. The same reset also undid .scrim / .hill (no knife) and an admin's .knife off, and matchzy_knife_enabled_default false was lost after the first match reset. In a loaded match map_sides now always decides.
    • Players in a loaded match are put on their team automatically when they connect (no team menu), listed spectators on Spectator, and anyone not in the match on Spectator. Players already on the server when a match is loaded are moved to their team as well. A player the game auto-assigned to the wrong team, or who came from Spectator, is moved back too; before, only a player with a live body was corrected, so someone could end up on (and coach) the other team.
    • players_per_team is enforced when players join: substitutes listed in a roster wait on Spectator while their side is full. Side swaps (halftime, knife switch) are not affected.
    • After a veto that keeps the current map, and after every map change of a loaded match, players are moved to the sides of that map.
    • .coach without a coaches list now requires the player to be on that team's roster. A player not in the match (for example an admin exempt from the kick) could coach either team.
    • get5_endmatch / .forceend / !forceend now follow Get5: without an argument they cancel the match (in any state, including warmup and veto), with team1 or team2 that team wins the series. They used to do nothing outside a live map and, mid-map, score the map for the team ahead and move a series on.
    • A stopped or cancelled match sends match_cancelled and closes its database row also when it is stopped before going live (warmup, veto, knife, between maps).
    • A database outage at ready-up no longer replaces the match id with -1 (which silenced every event for the map).
    • The veto no longer hangs when a captain leaves: a teammate takes over, or the veto is aborted when the team is empty.
    • skip_veto now defaults to false like Get5: a map pool larger than num_maps is vetoed unless "skip_veto": true is set. A pool of exactly num_maps maps is played in order as before. The Get5 keys side_type (standard, always_knife, never_knife, random) and veto_first (team1, team2, random) are now read. skip_veto, clinch_series and wingman accept 1/0 as well as true/false.
    • Match config cvars are applied before the live restart, so round 1 already uses them, and mp_overtime_enable / mp_match_can_clinch from the match config are no longer overwritten by the live.cfg values.
    • matchzy_remote_backup_url (get5_remote_backup_url) now uploads every round backup (with the Get5 headers). The setting was read but never used.
    • Surrender (!gg) needs votes from the players on the team (all but one), not from min_players_to_ready: with min_players_to_ready 1 one player could surrender. It is not available in a multi-map series (it would end the whole series), coaches cannot vote, and votes reset at halftime and on a new match.
    • series_end is sent after map_result has been delivered. map_picked and side_picked use a 0-based map_number like the other events. get5_status reports side as ct/t and ready state and connected players per team.
    • Pause and unpause messages name the right team after halftime.
    • The previous match's veto no longer decides who starts the next veto.
    • Security: entries in the match config cvars block must be a real convar or a matchzy_ / get5_ setting with a plain value; anything else (e.g. quit, or a value with a quote or ;) is ignored and logged. rcon_password cannot be set from a match config. Map names from a match config, veto, backup or .map may only contain letters, digits and _ - . / :. Match config loads that fail (invalid JSON, num_maps below 1, a team without a name, a non-numeric matchid) are refused and reset cleanly. The load URL's auth header value, the match config body and presigned demo upload URLs are no longer written to the log.
    • MatchZy's own admins.json now honors flags in its value: a value such as "@css/chat" grants only the commands that accept that flag. An empty value or text without flags (for example the player's name) keeps full admin, as before.
    • MatchZy settings set in a match config's cvars block (for example matchzy_kick_when_no_match_loaded, matchzy_knife_enabled_default, demo and backup upload settings) are restored at series end like the other cvars; they used to stay on the server. The remote log settings are kept so series_end still reaches the match's URL. A stopped or cancelled match now restores its cvars too.
    • New matchzy_forfeit_ready_timeout (default 0 = off): in a loaded match, a team that is not ready this many seconds after the ready phase of a map began forfeits the series; if neither team is ready the match is cancelled (match_cancelled with reason no_show). Reminders are printed at 5, 2 and 1 minute(s) and 30 seconds.
    • New matchzy_forfeit_leave_timeout (default 0 = off): in a loaded match, a team with no players left on its side for this many seconds during a live map forfeits the series.
    • New matchzy_veto_step_timeout (default 0 = off): seconds a veto captain has for each ban, pick or side choice before it is made at random (a random map, or CT for a side).
    • New knife_won event (Get5 format: team, side, swapped) when the knife winner has chosen a side.
    • The 1k stat (rounds with exactly one kill) is filled in the stats events.
    • .importnade refuses codes with invalid numbers, and imported lineups load as smokes instead of failing.
    • .matchsetup: a stale menu of an admin whose wizard was taken over can no longer change or cancel the new admin's setup.
    • Fixed .t / .ct from spectator in practice falling back to the old behavior (player left dead with a team-menu hint). The gamedata key had been renamed to CBasePlayerController_HandleCommand_JoinTeam in gamedata/matchzy.json while the plugin still looked up CCSPlayerController_HandleCommandJoinTeam. Both names are now accepted.
    • Match configs that list team "players" as an array of SteamID64s are accepted again (as strings or as plain numbers). The load check only allowed the object form. Adding a player to an array roster with matchzy_addplayer now stores the SteamID instead of the name, and matchzy_removeplayer removes from array rosters and spectators too.
    • matchzy_remote_log_url and its header settings set in config.cfg are kept when a match config is loaded. Before, loading a match dropped them, so no events were sent for that match unless the URL was repeated in the match config's cvars block.
    • The default for matchzy_minimum_ready_required in a newly generated config.cfg is now 2 (was 10), matching the plugin default. The default for matchzy_chat_messages_timer_delay is now 21 seconds in the plugin as well (was 13). Existing config.cfg files keep their values.
    • On/off settings such as matchzy_whitelist_enabled_default, matchzy_knife_enabled_default and matchzy_allow_pause now accept 1 and 0 as well as true and false. Before, 1 could not switch a disabled setting on.
    • matchzy_admin_chat_prefix with an empty value now resets the admin prefix. It reset the normal chat prefix instead.
    • .version in chat now replies. It printed nothing.
    • .skipveto / .sv, .rmap, .surrender, .configs, .kniferound, .autopause and .listbackups now work with the dot prefix, as .mhelp lists them. Before, only the ! form worked. .mhelp also shows the real team name commands (.team1 / .team2), .rrestore instead of .rr, and lists .forceend separately.
    • Fixed a loaded match being wiped by its own map change. The map change to map 2 of a series, and to the map picked in the veto, reset the whole match (series score, rosters, veto result), so the next map came up as an empty server. A cross-map round restore was lost the same way. A map change in the middle of a live map still resets the match; a map change during warmup of a loaded match keeps the match and changes back to the match's map.
    • Fixed warmup never ending after a map veto. The match-start guard stayed set after the veto, so the second ready-up was ignored.
    • A forfeit or surrender reports its winner in series_end even when the series score is level.
    • Fixed every finished series being announced as a tie ("X and Y have tied the match") with series_end winner "none". A drawn scrim or pug no longer announces "Draw has won the match".
    • map_result and series_end report the correct winning side, and a draw as side "0" / team "none". Before, the side was "2" whenever team2 won and a draw was reported as a team2 win.
    • round_end winner.team is now the team that won the round. It was the team ahead on score.
    • A drawn map in a series no longer breaks the series (the next map lookup ran past the end of the map list).
    • matchzy_stats_matches gets its winner and end time when the series ends, not after every map. Surrender (css_gg) stores the map's round score in matchzy_stats_maps instead of the series score.
    • The last round's player stats are written to the database before the map's CSV export.
    • Stats events now fill kast, trade_kills, first_kills_t/ct, first_deaths_t/ct, flash_assists, friendlies_flashed, team_kills, suicides, knife_kills, bomb_plants, bomb_defuses and 1v3-1v5 (human players). They were always 0.
    • A suicide no longer counts as a kill for KAST, and team kills no longer count as opening or trade kills.
    • Coaches are left out of player stats, the CSV, the stats JSON, the damage report, player_death / freezetime_end events and alive counts. Their end-of-freezetime death used to be the first death of every round, which took the opening duel stats away from the players.
    • freezetime_end reports has_helmet and has_defuser correctly. They were always false.
    • player_death, bomb_planted, bomb_defused and freezetime_end are sent for live rounds only, not during the knife round or side selection.
    • New player_kill event for every kill in a live round: killer, victim, assister (and whether it was a flash assist), weapon, headshot, wallbang, no-scope, through smoke, blind, distance, team kill, opening kill, trade kill, the killer's HP, and the killer's kills this round and this map. player_death is still sent as before and also covers suicides and world deaths.
    • New player_disconnect event (user id, SteamID, name, team, reason) while a match is loaded.
    • Disconnect cleanup (ready check, player list, coach list, practice data) no longer requires the leaving player to still have a valid, connected pawn, so it also runs for spectators and players already marked as disconnecting.
    • Auto-pause now triggers when a player leaves a full match. It required 10 connected players, which is exactly what a disconnect takes away. Only players on T/CT count (not spectators or coaches), so a smaller match is never auto-paused.
    • A manual or admin pause is no longer auto-resumed because of an earlier auto-pause.
    • matchzy_max_tech_pauses_allowed and matchzy_tech_pause_duration are now enforced: each team gets its tech pauses per map, and a tech pause ends on its own when the time runs out (-1 = no limit). Unpausing earlier, or a later regular or admin pause, cancels that countdown.
    • matchzy_allow_unpause false now disables .unpause. The setting existed but was never checked.
    • matchzy_allow_pause, matchzy_allow_unpause, matchzy_stop_command_no_damage and matchzy_asay_console_enabled are added to config.cfg (appended to existing files with their current defaults).
    • .stop works in round 1 of scrim and hill (it looked for a backup file name that was never written).
    • A round restore during the last round of a half no longer skips the halftime side swap, which mixed up team scores and stats for the rest of the map.
    • .match, .scrim and .hill no longer change knife/playout settings when a match is already running. Typed during the knife round they could leave the match stuck.
    • .match / .scrim / .hill could reset a loaded match after the server had been in sleep mode once.
    • A match start no longer continues if the match was reset while its database row was being created.
    • A failed demo recording is no longer reported as the match demo, and the part recorded before a stall is still uploaded when the restart fails. A restarted recording no longer overwrites an earlier demo with the same name (the new file gets _part2, ...), and all parts of a map's demo are uploaded. Demo uploads stream the file instead of loading it into memory.
    • The advanced stats JSON counts rounds from the scoreboard, so a replayed round no longer lowers ADR and rating.
    • The coach no longer causes a possible crash when the bomb is moved from the coach to a player, or when a coach on the wrong team is moved back.
    • .matchsetup is no longer locked for everyone when the admin using it closed the menu or left. The lock is released when its owner is gone or after 3 minutes without use.
    • .rr and the admin menu's "Restart Round" restore the current round in a match (.rr still restarts the round in practice). They did nothing outside practice.
    • .forceend and !forceend now do the same thing (end the match through the normal match-end path, like get5_endmatch).
    • Practice: .ff twice in a row no longer leaves players frozen, and the server no longer stays at 5x speed when practice ends during a fast forward.
    • Practice: .timer stops when practice mode ends instead of running into the match.
    • Practice: .back no longer teleports spectators or dead players.
    • Practice: .hidespawns / .showspawns no longer remove bot position, coach spot or grenade markers.
    • Practice: a damaged botpositions.json or grenade library file is backed up and never overwritten by a later save.
    • Practice: fixed a possible server crash when a crouching bot was kicked right after spawning.
    • Practice: .delay 0 clears a grenade delay, and .delay with no throw history no longer errors.
    • Practice: best/worst spawn commands no longer error on maps where spawns had not been collected yet.
    • Practice: stray bots are kicked by id, so a practice bot with the same name is never kicked by mistake.
    • Added a documentation site at https://matchzy.miksen.me.
    Downloads
  • 0.8.87 8c9899a787

    MatchZy 0.8.87
    All checks were successful
    Docs / Build and deploy docs (push) Has been skipped
    Build and Release / Build and Release (push) Successful in 52s
    Stable

    Ghost released this 2026-09-29 10:12:59 +02:00 | 32 commits to main since this release

    0.8.87

    September 28, 2026

    • New optional "coaches" list per team in the match config (object keyed by SteamID64 or an array, like "players"). Listed coaches can join their team, are not kicked by matchzy_kick_when_no_match_loaded, and become its coach automatically. When a team has a list, only those SteamIDs can .coach it. See the README.
    • Coaches no longer count toward players_per_team in the ready check and no longer need to .ready.
    Downloads
  • 0.8.86 074a909688

    MatchZy 0.8.86
    All checks were successful
    Build and Release / Build and Release (push) Successful in 55s
    Stable

    Ghost released this 2026-09-28 21:25:20 +02:00 | 36 commits to main since this release

    0.8.86

    September 28, 2026

    • New matchzy_coach_enabled (default true): set it to false to turn off .coach / css_coach. Players who are already coaching stay coaches until .uncoach or the match resets.
    • .coach now only lets you coach the team you are on. .coach ct while on T (or from spectator) is refused, so a player can no longer register as the other team's coach.
    • New live remote log events: grenade_thrown, grenade_detonated (smoke, flash, HE, molotov with position), player_blinded (who flashed whom, duration, team flash), bomb_pickup, bomb_dropped and bomb_exploded. Sent while the match is live and a remote log URL is set, like player_hurt.
    • bomb_planted and bomb_defused now report the correct site. Previously site was almost always "B".
    Downloads