Skip to content

Releases: CS2OpenDev/DemoViewer.NET

DemoViewer.NET v0.10.1

Choose a tag to compare

@github-actions github-actions released this 03 Nov 09:17
cd14304

What's new in 0.10.0

Your own themes, a clear warning before anything touches your CS2 install, a first-run setup that
actually fills your library, and a switch for the app's automatic update checks.

Theme Customization. Settings > Theme > Customize… opens a window where you can make your own
copy of any theme and change every colour in it, with a live preview of panels, lists, the stats
table, the 2D map, the rule editor and the analysis graph. Turn on Apply to the app while editing
to see the change across the whole app before you save, and Cancel puts everything back. Light,
Dark, High Contrast and E-Girl are built in and marked with a Built-in chip; they can't be
changed, only copied. Your copies are plain JSON files in your themes folder, and complete examples
of all four built-ins are in samples/Themes in the repository.

Themes from older versions keep working. A theme that leaves out a colour, including colours
added in later versions, uses its base theme's value instead of failing. If your selected theme is
missing colours the app says so once, and Fix in Theme Customization opens the editor with only
the missing colours listed and a Fill missing from base button. A theme file that doesn't load
is listed in Settings with the reason.

A warning before Live Sync or Reels start CS2. Both launch CS2 with -insecure, which turns VAC
off for that session, and both temporarily patch your CS2 install. The app now says so before the
first launch, with what it changes and that it restores everything afterwards, and keeps a one-line
reminder next to the launch button. You can tell it not to ask again.

Recovering a CS2 install after a crash. If the app or CS2 stopped while the install was patched,
every profile now sees a banner offering to restore it, not only the developer profile. Restoring
needs CS2 closed, and Live Sync and Reels put the install back themselves before launching
again.

First-run setup fills your library. Folders you added in the setup wizard didn't reach the
Library tab, so you had to add them again. The library now follows folder changes from Settings and
the wizard and scans the new folders straight away.

A walkthrough that matches your profile. The tour only visits the parts of the app your profile
shows, and now covers Player Overview, the report-an-error button, drawing on the 2D map and
exporting it, the Strat Book and writing your own rules.

Turn off automatic update checks. Settings > Updates has Check for updates automatically,
on by default. Off, the app makes no update requests of its own: no check at launch, no release notes
fetched for the What's New window, and no extension update check when Settings opens. The Check
buttons still work when you want them.

Smaller fixes. The Strat Book's update check no longer reports an error when no extension update
has been published yet. Syntax colours in the rule editor keep their transparency.

For extension authors. The extension SDK is 2.1, built against CS2DemoKit 0.14.1; the SDK
README lists what 2.1 adds. Live Sync and Reels now use Cs2VideoGenerator.Core 0.10.1, its first
MIT-licensed release, listed in THIRD-PARTY-NOTICES.

What was new in 0.9.0 and earlier

0.9.0 brought third-party extensions, loaded in their own context with a signature check and
an opt-in for unsigned ones, with faults contained and a --safe-mode launch; a library that knows
a demo by its SHA-256, so moved, renamed and remounted demos keep their analysis; network folders
that no longer prune themselves before they mount; one parse per demo for everything the app reads,
which made a library sweep 26 to 48% faster and opening a demo 21 to 38% faster on the benchmark
demos; a processing queue panel with Move to top; and an opt-in beta channel.

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.10.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 08:49
d26694e

What's new in 0.10.0

Your own themes, a clear warning before anything touches your CS2 install, a first-run setup that
actually fills your library, and a switch for the app's automatic update checks.

Theme Customization. Settings > Theme > Customize… opens a window where you can make your own
copy of any theme and change every colour in it, with a live preview of panels, lists, the stats
table, the 2D map, the rule editor and the analysis graph. Turn on Apply to the app while editing
to see the change across the whole app before you save, and Cancel puts everything back. Light,
Dark, High Contrast and E-Girl are built in and marked with a Built-in chip; they can't be
changed, only copied. Your copies are plain JSON files in your themes folder, and complete examples
of all four built-ins are in samples/Themes in the repository.

Themes from older versions keep working. A theme that leaves out a colour, including colours
added in later versions, uses its base theme's value instead of failing. If your selected theme is
missing colours the app says so once, and Fix in Theme Customization opens the editor with only
the missing colours listed and a Fill missing from base button. A theme file that doesn't load
is listed in Settings with the reason.

A warning before Live Sync or Reels start CS2. Both launch CS2 with -insecure, which turns VAC
off for that session, and both temporarily patch your CS2 install. The app now says so before the
first launch, with what it changes and that it restores everything afterwards, and keeps a one-line
reminder next to the launch button. You can tell it not to ask again.

Recovering a CS2 install after a crash. If the app or CS2 stopped while the install was patched,
every profile now sees a banner offering to restore it, not only the developer profile. Restoring
needs CS2 closed, and Live Sync and Reels put the install back themselves before launching
again.

First-run setup fills your library. Folders you added in the setup wizard didn't reach the
Library tab, so you had to add them again. The library now follows folder changes from Settings and
the wizard and scans the new folders straight away.

A walkthrough that matches your profile. The tour only visits the parts of the app your profile
shows, and now covers Player Overview, the report-an-error button, drawing on the 2D map and
exporting it, the Strat Book and writing your own rules.

Turn off automatic update checks. Settings > Updates has Check for updates automatically,
on by default. Off, the app makes no update requests of its own: no check at launch, no release notes
fetched for the What's New window, and no extension update check when Settings opens. The Check
buttons still work when you want them.

Smaller fixes. The Strat Book's update check no longer reports an error when no extension update
has been published yet. Syntax colours in the rule editor keep their transparency.

For extension authors. The extension SDK is 2.1, built against CS2DemoKit 0.14.1; the SDK
README lists what 2.1 adds. Live Sync and Reels now use Cs2VideoGenerator.Core 0.10.1, its first
MIT-licensed release, listed in THIRD-PARTY-NOTICES.

What was new in 0.9.0 and earlier

0.9.0 brought third-party extensions, loaded in their own context with a signature check and
an opt-in for unsigned ones, with faults contained and a --safe-mode launch; a library that knows
a demo by its SHA-256, so moved, renamed and remounted demos keep their analysis; network folders
that no longer prune themselves before they mount; one parse per demo for everything the app reads,
which made a library sweep 26 to 48% faster and opening a demo 21 to 38% faster on the benchmark
demos; a processing queue panel with Move to top; and an opt-in beta channel.

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.

net.demoviewer.pack.stratbook 0.1.11

Choose a tag to compare

@github-actions github-actions released this 02 Nov 08:29
d26694e

Extension release. See docs/architecture/extension-system.md.

net.demoviewer.pack.stratbook updates

Choose a tag to compare

@github-actions github-actions released this 02 Nov 08:29
d26694e

Rolling update feed for net.demoviewer.pack.stratbook. See docs/architecture/extension-system.md.

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.