Skip to content

Releases: sid2934/DemoViewer.NET

DemoViewer.NET v0.9.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 00:38
d13a875

What's new in 0.9.0

Extensions from outside this repository, a library that knows a demo by its content rather than its
path, one parse per demo for everything the app reads from it, and an opt-in beta channel.

Third-party extensions. Drop an extension into the extensions folder under the app's
config folder and it loads on the next launch, in its own load context, beside the Strat Book, as
long as it is compatible with this version. An unsigned one loads only with Allow
unverified and potentially dangerous extensions
turned on in Settings, which is off by default. A
broken signature never loads, and an extension that claims a net.demoviewer.* id is refused.

An extension can't take the app down with it. Every call into an extension is guarded. Three
faults in a minute, or ten in a session, switch it off for the rest of the session with a notice.
One that throws while registering is left out and the app starts without it. Launch with
--safe-mode to load no extensions at all; the app also starts in safe mode on its own after a
launch that never finished, a crash with an extension on the stack, or a freeze you had to kill.

Moved, renamed and remounted demos keep their analysis. The cache used to key a demo by its
path, so moving a file, renaming it, or reaching it through a second mount parsed it again from
scratch, and a bad prune could delete results. A demo is now known by its SHA-256, with every path
it has been seen at kept as a location. A copy is recognised from its size and a hash of its head
and tail, so a second mount of the same folder folds onto the cards you already have. Removing a
folder detaches it rather than deleting anything, and a demo with no location left is only swept
after a grace period. Recents, extension data and Strat Book indexes follow the content too. The
first launch after updating renames the existing cache files in one queue item; it reads no demos
and steps aside if you open one.

Network folders stop costing you analysis. A folder used to count as scanned before it had been
listed, so an automount that had not mounted yet looked empty and pruned everything under it, and
one slow share held up the whole queue. Listing and header reads now run as short queue slices with
a time bound, and a folder counts as reached only when its walk completes. Network demos are no
longer memory-mapped.

One parse per demo. Library score, clans and coaches, highlights, round facts, the Strat Book's
round index, suggested tags and the grenade walk each used to walk the demo on their own. They now
all read off the one rules run. On the benchmark demos a library sweep is 26 to 48% faster and
opening a demo 21 to 38% faster.

The processing queue panel. Running work sits on top and queued work is listed in the order it
will start. Finished work moves to a Recent tab with the last 25 items and their errors.
Right-click a queued item and Move to top to make it next, without interrupting what is running.

Beta releases, if you want them. Settings > Updates has Subscribe to beta releases, off by
default. Betas can break your configuration or corrupt cached data. Subscribed copies always move to
whichever is newer, the latest beta or the latest full release, and turning it off never downgrades
you: you stay put until a full release passes your build. Unsubscribed copies never see a beta.

Smaller fixes. A surrendered match keeps the score it was read at. The Background Work chip
counts only the work the concurrency setting controls. A full queue no longer keeps the planner
spinning. Context menus and flyouts take their colours from the theme instead of Fluent's gray,
under every theme.

What was new in 0.8.2 and earlier

0.8.2 brought the Strat Room as the Strat Book extension: Situation Search, Round Tagger,
Strat Book, Utility Book, the Review Queue with reels, and the Opponent Dossier, all behind one
switch that gives back its memory when turned off. The analysis engine moved to the 0.13 line: a
weapon's clip reads the real magazine count, smokes decode their full state, and a round's winner
comes from the server's own verdict.

0.8.1 rebuilt the Stats page: a scoreboard with per-column scales and a podium, fifteen
aim-quality columns and an Aim board measuring reaction, time to first damage and spray control from
what the demo records about every shot, a spray plot with your own bullets drawn over the recoil
pattern, collision geometry for all ten shipped maps so the seventeen sight-dependent columns
stopped reading a flat zero, a dash instead of a zero wherever a cell has no data, CS2's own icons
through the app and the kill feed, and an Analysis graph that draws the rules the engine really ran,
per player, instead of its shared scaffolding. Counter-strafe figures fell: the window had been too
long and was crediting shots taken after you had already stopped.

0.8.0 rebuilt the 2D playback view on a new Skia compositor: annotations you can draw on the map
with their own time envelopes, saved beside the demo; video export straight out of the 2D view as
WebM, MP4 or GIF; maps with more than one floor, with the level switching as the action moves;
a scrubbable timeline with tracks for rounds, kills, the bomb and your annotations; following a
player by clicking their card; and a headless dv2d command for rendering, exporting and
benchmarking from a terminal. Drawing a frame became one Skia operation that allocates nothing per
frame and holds p99 2.5 ms at 1080p against an 8 ms budget.

0.7.2 was a maintenance release. Demos that used to fail analysis outright started working
again: a frame sharing a tick with a checkpoint the analyzer had picked took out 6 of 15 demos
across a real matchmaking replays folder, and the more cores you had the more likely you were to hit
it. Analysis also got roughly 25% faster to parse and 13% faster to evaluate, with total allocation
down between a third and a half. A dead player's entity reference stopped resolving to whatever
happened to occupy that slot, and the "What's new" window stopped opening ahead of the main one.

0.7.1 was a maintenance release: the parser and analysis engine moved out to
CS2DemoKit and are consumed from nuget.org as packages,
shrinking the source tree here by roughly a hundred thousand lines, and the editor schema file for
rule authors became cs2demokit-rules.schema.json (existing dv-rules.schema.json references keep
working).

0.7.0 was the open-source debut: the source moved to a public repository under MIT, releases
and auto-updates began coming from it, damage stats stopped overcounting same-frame burst hits, and
analysis allocation dropped by roughly half.

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring and roster correctness fixes.


Install

Download the one installer for your platform. Nothing else is required:

  • Windows: …-win-Setup.exe
  • macOS (Apple Silicon): …-osx-Setup.pkg
  • Linux (x64): the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS: right-click the app → Open on first launch.
  • Windows: at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads; you don't need to download them by hand.

DemoViewer.NET v0.8.2

Choose a tag to compare

@github-actions github-actions released this 06 Oct 00:06
53d1e02

What's new in 0.8.2

The Strat Room: six features for a team working through its own demos, shipped as the Strat Book
extension on top of a new extension framework in the app.

Situation Search. Describe a situation and get back every round in your library that matches it.
Build the query on a canvas, or open a round in 2D Playback and press Ctrl+F to find rounds like
that one. A tolerance slider decides how close a match has to be, and the results come back as
cards you can walk straight into playback.

Round Tagger. Tag rounds from a shipped palette or with your own labels, with the facts the
engine already knows about a round filled in for you. Detectors propose tags and you accept or
reject them in a review loop, rather than having them written behind your back. Tagging works from
2D Playback too, and the tags get their own lane on the timeline.

Strat Book. Write a strat as steps with lines, verbs and locations picked on the map, then watch
the preview walk each player along real nav routes and throw the utility where you put it. Strats
keep their version history, the record panel tracks how one has actually gone, role view shows a
single player's job, and callout aliases let your team's name for a spot work as well as the
canonical one. Strats mined out of your own demos turn up as detected strats, and anything in the
book exports.

Utility Book. Every grenade thrown across your demos, indexed, with a lineup card and a clip
for each, and a map view of the utility for a site.

Review Queue and Reels. Queue a clip from anywhere in the app, then work through the queue in
review mode. The dv2d command renders a whole pack headlessly if you would rather have files.

Opponent Dossier. A team's map pool record, how they open rounds, what they do after a plant,
their setups, how the two halves differ, and how they behave in specific situations, with notes you
can edit and an export. Teams come from rosters you confirm yourself; nothing is tracked from
matchmaking automatically.

All of it is an extension, and off is a real off. First run asks whether you want the Strat
Book. Turning it off removes its tabs, panels and lanes, stops its indexing passes and its queued
jobs, and gives back the memory it was holding in the session you are in, not after a restart. With
it off, Library indexing does strictly less work than before this release. The extension carries its
own version and updates from its own feed on its own cadence; a new copy is signed, and both the
signature and the host contract it was built against are checked before it is accepted.

Numbers that move. The analysis engine moves to the 0.13 line, which the Strat Room needs for
round facts, team-scoped rules and grenade projectiles. Three things change for figures you may
already have written down: a weapon's clip now reads the real magazine count, smokes decode their
full state rather than a partial one, and a round's winner comes from the server's own verdict, with
round-won and round-lost counting only for the team they name.

What was new in 0.8.1 and earlier

0.8.1 rebuilt the Stats page: a scoreboard with per-column scales and a podium, fifteen
aim-quality columns and an Aim board measuring reaction, time to first damage and spray control from
what the demo records about every shot, a spray plot with your own bullets drawn over the recoil
pattern, collision geometry for all ten shipped maps so the seventeen sight-dependent columns
stopped reading a flat zero, a dash instead of a zero wherever a cell has no data, CS2's own icons
through the app and the kill feed, and an Analysis graph that draws the rules the engine really ran,
per player, instead of its shared scaffolding. Counter-strafe figures fell: the window had been too
long and was crediting shots taken after you had already stopped.

0.8.0 rebuilt the 2D playback view on a new Skia compositor: annotations you can draw on the map
with their own time envelopes, saved beside the demo; video export straight out of the 2D view as
WebM, MP4 or GIF; maps with more than one floor, with the level switching as the action moves;
a scrubbable timeline with tracks for rounds, kills, the bomb and your annotations; following a
player by clicking their card; and a headless dv2d command for rendering, exporting and
benchmarking from a terminal. Drawing a frame became one Skia operation that allocates nothing per
frame and holds p99 2.5 ms at 1080p against an 8 ms budget.

0.7.2 was a maintenance release. Demos that used to fail analysis outright started working
again: a frame sharing a tick with a checkpoint the analyzer had picked took out 6 of 15 demos
across a real matchmaking replays folder, and the more cores you had the more likely you were to hit
it. Analysis also got roughly 25% faster to parse and 13% faster to evaluate, with total allocation
down between a third and a half. A dead player's entity reference stopped resolving to whatever
happened to occupy that slot, and the "What's new" window stopped opening ahead of the main one.

0.7.1 was a maintenance release: the parser and analysis engine moved out to
CS2DemoKit and are consumed from nuget.org as packages,
shrinking the source tree here by roughly a hundred thousand lines, and the editor schema file for
rule authors became cs2demokit-rules.schema.json (existing dv-rules.schema.json references keep
working).

0.7.0 was the open-source debut: the source moved to a public repository under MIT, releases
and auto-updates began coming from it, damage stats stopped overcounting same-frame burst hits, and
analysis allocation dropped by roughly half.

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring and roster correctness fixes.


Install

Download the one installer for your platform. Nothing else is required:

  • Windows: …-win-Setup.exe
  • macOS (Apple Silicon): …-osx-Setup.pkg
  • Linux (x64): the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS: right-click the app → Open on first launch.
  • Windows: at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads; you don't need to download them by hand.

DemoViewer.NET v0.8.1

Choose a tag to compare

@github-actions github-actions released this 18 Sep 07:24
f389d77

What's new in 0.8.1

The Stats page is rebuilt, and it can finally answer questions about aim rather than just counting
kills.

A new scoreboard. The table gained per-column scales, so a number is shaded against the other
players in the match instead of sitting there as a bare figure, and the best in each column is
marked. There is a podium for the top three, team badges, and a sub-nav that splits the stats into
pages rather than one endless table. The whole palette now comes from the theme, so a custom theme
retints the boards instead of fighting them.

Fifteen aim-quality columns and an Aim board. How fast you react to someone appearing, how long
from first sight to first damage to the kill, how well you hold a spray, and whether you were
actually stopped when you fired. These are computed from what the demo records about every shot,
not estimated from the scoreboard.

A spray plot. Pick a weapon and see its recoil pattern with your own bullets drawn over it, so
a spray-control number has a picture behind it. There is a toggle to measure from the enemy instead
of from your first bullet, which shows tracking rather than pure recoil control.

Every shipped map has geometry now. Seventeen of the new columns need to know what you could
actually see, which needs the map's collision. Four maps had none, so those columns showed a flat
zero that looked like a measurement. All ten maps have it now, de_train among them.

And when something cannot be measured, it says so. A cell with no data shows a dash and drops
out of the ranking and the shading, instead of showing a zero that reads like a real result. If a
demo is on a map with no geometry, the board says which map and why.

CS2's own artwork. Weapons, kill modifiers, ranks and round objects now appear as the icons
Valve drew for them, in the kill feed and through the app, with the text still there underneath
wherever an icon is missing.

The Analysis graph draws the rules that actually ran. It was drawing the engine's shared
scaffolding and nothing else: on a typical demo that is 61 boxes of plumbing and not one of the
stats you actually get out of it. The graph now shows the rules the engine really ran, per player,
with a selector for whose nodes are on screen; ten players at once is nearly four thousand nodes and
unreadable. Saved graph breakpoints do not carry over, because they were keyed by a node name that
is no longer unique, so the old file is dropped rather than quietly matching ten nodes at once.

One number moves down: counter-strafing was being measured over too long a window and was crediting
shots taken after you had already stopped. The window now comes from the game's own friction values,
so published counter-strafe figures fall. That is the metric getting more honest, not a regression.

What was new in 0.8.0 and earlier

0.8.0 rebuilt the 2D playback view on a new Skia compositor: annotations you can draw on the map
with their own time envelopes, saved beside the demo; video export straight out of the 2D view as
WebM, MP4 or GIF; maps with more than one floor, with the level switching as the action moves;
a scrubbable timeline with tracks for rounds, kills, the bomb and your annotations; following a
player by clicking their card; and a headless dv2d command for rendering, exporting and
benchmarking from a terminal. Drawing a frame became one Skia operation that allocates nothing per
frame and holds p99 2.5 ms at 1080p against an 8 ms budget.

0.7.2 was a maintenance release. Demos that used to fail analysis outright started working
again: a frame sharing a tick with a checkpoint the analyzer had picked took out 6 of 15 demos
across a real matchmaking replays folder, and the more cores you had the more likely you were to hit
it. Analysis also got roughly 25% faster to parse and 13% faster to evaluate, with total allocation
down between a third and a half. A dead player's entity reference stopped resolving to whatever
happened to occupy that slot, and the "What's new" window stopped opening ahead of the main one.

0.7.1 was a maintenance release: the parser and analysis engine moved out to
CS2DemoKit and are consumed from nuget.org as packages,
shrinking the source tree here by roughly a hundred thousand lines, and the editor schema file for
rule authors became cs2demokit-rules.schema.json (existing dv-rules.schema.json references keep
working).

0.7.0 was the open-source debut: the source moved to a public repository under MIT, releases
and auto-updates began coming from it, damage stats stopped overcounting same-frame burst hits, and
analysis allocation dropped by roughly half.

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring and roster correctness fixes.


Install

Download the one installer for your platform. Nothing else is required:

  • Windows: …-win-Setup.exe
  • macOS (Apple Silicon): …-osx-Setup.pkg
  • Linux (x64): the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS: right-click the app → Open on first launch.
  • Windows: at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads; you don't need to download them by hand.

DemoViewer.NET v0.8.0

Choose a tag to compare

@github-actions github-actions released this 07 Sep 01:49
3e63292

What's new in 0.8.0

The 2D playback view is rebuilt. It renders through a new Skia compositor, and that rework is what
the rest of this release is built on: annotations you can draw on the map, video export straight out
of the 2D view, maps with more than one floor, and a scrubbable timeline.

Annotations. Draw and erase on the 2D view, with undo/redo and a color picker. Each stroke has
its own time envelope, so it can appear and fade when you want instead of hanging over the whole
round. Strokes anchor either to the map or to a player, so they survive seeking and level switches
rather than drifting. Everything saves to a .dvann.json file next to the demo, so a marked-up demo
stays marked up.

Video export from the 2D view. Export any range as WebM, MP4, or GIF, HUD included. ffmpeg is
picked up from your PATH if you have it and downloaded on demand if you don't, and there is a
built-in GIF encoder that needs no ffmpeg at all. The default is 720p60, which encodes at about 2.7x
realtime. Export declines to start while LiveSync or a reel job is running rather than fighting them
for the demo.

Maps with more than one floor. Multi-level maps now have a real layered level model instead of
one flattened overhead. Pick a level by hand or let it switch as the action moves, and following a
player always puts you on that player's floor.

A timeline along the bottom. Scrub the demo directly, with tracks for rounds, kills, the bomb,
and your own annotations, and hover to see what is under the cursor. There is a full keymap for
playback speed, follow, fit, and the drawing tools.

Follow a player by clicking their card. Selecting a card in the overview follows that player in
the 2D view, and in-engine as well when LiveSync is on.

A headless dv2d command. Render frames, export video, run benchmarks, and verify goldens from a
terminal with no UI, against the same renderer the app uses.

Underneath all of it, drawing a frame is one Skia operation that allocates nothing per frame and
holds p99 2.5 ms at 1080p against an 8 ms budget. The previous 2D control is still available behind a
settings toggle for this release and is removed in the next one.

What was new in 0.7.2 and earlier

0.7.2 was a maintenance release. Demos that used to fail analysis outright started working
again: a frame sharing a tick with a checkpoint the analyzer had picked took out 6 of 15 demos
across a real matchmaking replays folder, and the more cores you had the more likely you were to hit
it. Analysis also got roughly 25% faster to parse and 13% faster to evaluate, with total allocation
down between a third and a half. A dead player's entity reference stopped resolving to whatever
happened to occupy that slot, and the "What's new" window stopped opening ahead of the main one.

0.7.1 was a maintenance release: the parser and analysis engine moved out to
CS2DemoKit and are consumed from nuget.org as packages,
shrinking the source tree here by roughly a hundred thousand lines, and the editor schema file for
rule authors became cs2demokit-rules.schema.json (existing dv-rules.schema.json references keep
working).

0.7.0 was the open-source debut: the source moved to a public repository under MIT, releases
and auto-updates began coming from it, damage stats stopped overcounting same-frame burst hits, and
analysis allocation dropped by roughly half.

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring and roster correctness fixes.


Install

Download the one installer for your platform. Nothing else is required:

  • Windows: …-win-Setup.exe
  • macOS (Apple Silicon): …-osx-Setup.pkg
  • Linux (x64): the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS: right-click the app → Open on first launch.
  • Windows: at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads; you don't need to download them by hand.

DemoViewer.NET v0.7.2

DemoViewer.NET v0.7.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Aug 23:14
efbae01

What's new in 0.7.2

A maintenance release built on new parser and analysis packages. One fix in it is worth upgrading
for on its own.

Demos that used to fail analysis outright now work. Some demos died with an unhandled error the
moment analysis started — not a degraded result, no result at all. The cause was a frame sharing a
tick with a checkpoint the analyzer had picked, and across a corpus spanning every protocol version
in a real matchmaking replays folder it took out 6 of 15 demos. All 15 now analyze. If you have a
many-core machine you were far more likely to hit this: the analyzer picks more checkpoints the more
cores you have, so above roughly 32 logical cores nearly every clash landed, while the same demos
were fine on a 10-core box. That is also why it was hard to reproduce from a bug report.

Analysis is faster and much lighter on memory. Against 0.7.1, measured as the median of three
runs across nine demos: parsing is about 25% faster, evaluation about 13% faster, and total
allocation is down between a third and a half.

A dead player's entity reference no longer resolves to the wrong entity. One of the two
"no such entity" markers was not being recognized in the app's read-only entity view, so instead of
reading as empty it resolved to whatever happened to occupy that slot.

The "What's new" window no longer opens before the app does. On the launch after an update it
could appear ahead of the main window.

What was new in 0.7.1 and earlier

0.7.1 was a maintenance release: the parser and analysis engine moved out to
CS2DemoKit and are consumed from nuget.org as packages,
shrinking the source tree here by roughly a hundred thousand lines, and the editor schema file for
rule authors became cs2demokit-rules.schema.json (existing dv-rules.schema.json references keep
working).

0.7.0 was the open-source debut: the source moved to a public repository under MIT, releases
and auto-updates began coming from it, damage stats stopped overcounting same-frame burst hits, and
analysis allocation dropped by roughly half.

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring and roster correctness fixes.


Install

Download the one installer for your platform — nothing else is required:

  • Windows — …-win-Setup.exe
  • macOS (Apple Silicon) — …-osx-Setup.pkg
  • Linux (x64) — the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS — right-click the app → Open on first launch.
  • Windows — at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads — you don't need to download them by hand.

DemoViewer.NET v0.7.1

DemoViewer.NET v0.7.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 18 Aug 10:07
a8f24df

What's new in 0.7.1

A maintenance release. Nothing in the app looks or behaves differently; the change is underneath.

The parser and analysis engine are now packages. They moved out to
CS2DemoKit and this app consumes them from nuget.org
like any other dependency, which is why the source tree here shrank by roughly a hundred thousand
lines. Anyone building their own CS2 demo tooling can now install the same parser and analysis
engine this app runs on, without taking the app with it.

For rule authors: the editor schema file is now called cs2demokit-rules.schema.json. New rule
files get the new name in their # yaml-language-server: line automatically. Existing files in
your rules folder still point at dv-rules.schema.json, which stays where it is and keeps working
— update the line when convenient to validate against the current schema.

What was new in 0.7.0 and earlier

0.7.0 was the open-source debut: the source moved to a public repository under MIT, releases
and auto-updates began coming from it, damage stats stopped overcounting same-frame burst hits, and
analysis allocation dropped by roughly half.

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring and roster correctness fixes.


Install

Download the one installer for your platform — nothing else is required:

  • Windows — …-win-Setup.exe
  • macOS (Apple Silicon) — …-osx-Setup.pkg
  • Linux (x64) — the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS — right-click the app → Open on first launch.
  • Windows — at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads — you don't need to download them by hand.

DemoViewer.NET v0.7.0

DemoViewer.NET v0.7.0 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Aug 19:55
648cf3e

What's new in 0.7.0

DemoViewer.NET is now open source. The full source lives at
github.com/sid2934/DemoViewer.NET under MIT, and
releases and auto-updates now come straight from this repository. The parser and analysis engine
also ship as NuGet packages (Cs2DemoKit.*) for anyone building their own demo tools.

Damage stats no longer overcount burst hits. When several hits landed in the same GOTV frame —
shotgun pellets, sprays at tournament tickrates — enemy damage could exceed the health the victim
actually had. Same-frame hits are now capped at the victim's remaining health, so damage totals
match the scoreboard.

Analysis allocates about half the memory it did. Rule evaluation now runs on chunked
copy-on-write snapshots with a wrapper cache, cutting its allocations roughly in half versus 0.6.0
— below where the app sat before rich highlights landed.

Entity data now rides the community SDK. Entity schemas and game-event definitions come from
the community-maintained CS2OpenDev SDK packages instead of a
private generated layer. Decoding behaviour is unchanged — verified field-by-field against the
previous implementation on real demos — and definitions stay current as CS2 updates.

Quality of life

  • Graph breakpoint conditions now evaluate against the event that fired them, closing a gap where
    event.tick could read from the wrong event.
  • Parser tab source links work again (paths broke in an internal project reshuffle).
  • The Entity Tracking inspector only offers entity links for fields that are actually entity
    handles, instead of dressing every handle-shaped value as one.
What was new in 0.6.0 and earlier

0.6.0 turned the update offer into a full release-notes window with a once-per-update "What's
new" screen, added a damaged-demo banner, made Settings navigable with a jump-chip strip, checked
for ffmpeg before reels start, extended every theme to all surfaces, and added keyboard shortcuts,
window-state memory, and humane error messages.

0.5.2–0.5.4 brought the in-app updater, the Match Overview landing page with a bundled sample
match, a first-run walkthrough, roughly 24× lower memory after closing a demo, rich play-based
highlights with in-app reels, and a long list of scoring/roster correctness fixes.


Install

Download the one installer for your platform — nothing else is required:

  • Windows — …-win-Setup.exe
  • macOS (Apple Silicon) — …-osx-Setup.pkg
  • Linux (x64) — the …-linux…AppImage

Each installer is self-contained: it bundles the .NET runtime and the map assets, so a single download has everything.

This build is unsigned (signing is planned):

  • macOS — right-click the app → Open on first launch.
  • Windows — at the SmartScreen prompt, click More info → Run anyway.

The .nupkg, RELEASES*, and releases.*.json files below are what the in-app updater reads — you don't need to download them by hand.