Some CS2 demos recorded before the July 8/9, 2026 Source 2 update no longer play. The client either fails straight away or runs for a while and then drops out with Failed to parse message. This page repairs that one failure, in your browser.
Drop your .dem files below. Valve match downloads arrive as .dem.bz2 archives, and those work too; the archive is unpacked here before the repair runs.
Fix CS2 demo playback
Add the demos that stop with “Disconnected - Failed to parse message”. They are repaired here, in this tab. Nothing is uploaded.
No demos added yet.
Credit
The research behind this fix and the original command-line tool are unicbm’s work:
- unicbm/cs2-demo-playback-fix-260720 - the tool, including a Windows executable if you would rather not use a web page.
- TYPE138_COMPATIBILITY.md - the write-up of the finding, the rewrite procedure, and the invariants any implementation has to hold.
This page is a browser port of that tool, published under the same Apache-2.0 licence.
What breaks the demo
Game state travels through a demo as a stream of Source 2 netmessages. In the affected samples unicbm examined, the first fatal point is a correctly framed entity netmessage of type 138, CEntityMessageRemoveAllDecals. The current client will not parse it, and playback stops there.
Why the client rejects a message it used to handle is not known. The public GameTracking-CS2 protobuf snapshot still defines both EM_RemoveAllDecals = 138 and CEntityMessageRemoveAllDecals, so this is not evidence that Valve removed the message or its schema. The closed-client cause could be handler registration, dispatch, or some other compatibility regression.
The failure itself is confirmed by before and after playback tests: dropping those messages lets the same demos continue past the point where they previously died. unicbm last validated that on July 17, 2026 against demo version 14171.
What the repair changes
A type 138 message is only removed when its payload matches the legacy schema exactly. That check is stricter than an ordinary protobuf decode: two fields in the order 1 then 2, field 1 a varint whose value is 1, field 2 one complete nested message holding a single varint that fits losslessly in a u32, and nothing else. Unknown, repeated, reordered or trailing fields are rejected. Anything unfamiliar fails closed rather than being assumed safe to delete.
The rest of the file is left alone. Frames containing no matching message are copied byte for byte, original compression included. Messages that are kept retain their order, type, payload size, payload bytes and exact encoded bit ranges, which are re-read and compared after the rewrite. Ticks, player state, equipment, events and round state are not intentionally changed.
The expected visible side effect is decals. Clearing blood marks and bullet holes was what those messages did, so some old decals stay on the walls past the moment they were originally wiped.
Your original file is never touched. The repair produces a new download, named match_safe138.dem for an input called match.dem.
What it does not fix
This addresses one confirmed parser failure. It is not a general demo upgrader, and it does not guarantee that every historical demo will play. Old demos can also depend on models, animation graphs, materials and other resources the game no longer ships, and a packet rewrite cannot restore those. If a repaired demo fails later, treat it as a separate problem with its own cause.
A demo carrying no strictly matching type 138 messages is reported as already compatible, with no download offered. That is the correct result for an unaffected file, and running the tool over the same demo twice gives the same answer.
CS2 demo fix questions
Are my demos uploaded?
No. JavaScript and WebAssembly read and rewrite the file inside your browser. The demo data isn’t sent to this website.
Where does CS2 keep demos?
...\Steam\steamapps\common\Counter-Strike Global Offensive\game\csgo\. If Steam installed the game somewhere other than the default library, right-click CS2 in your library, choose Manage then Browse local files, and open game\csgo from there.
Why is my match download a .dem.bz2 file?
Valve serves downloaded match demos as bzip2 archives. Drop the .dem.bz2 in as it is. It gets unpacked here first, and if the demo inside turns out to need no repair you still get the plain .dem to keep.
What does _safe138 mean?
It marks the copy that had the legacy type 138 messages removed. match.dem becomes match_safe138.dem, so the repaired demo sits beside the original instead of replacing it.
Should I keep the original demo?
Yes. Feed the original to parsers and analysis tools, which read it fine, and use the repaired copy for playback in the client. Keeping both also means you can start over if a future patch handles the file differently.
Can I do several demos at once?
Yes. Drop in as many files as you like and they’re processed one at a time. When more than one repaired demo is ready, a single ZIP download collects them.
