Skip to content
ConsoleMonster

Live dashboards

Recorded runs of ConsoleMonster's live showcases, replayed frame by frame. Threads post updates; the session draws about 15 frames a second.

ConsoleMonster.Examples stress 12 120×4024-bitFull
 Stress test · 32 workers · random Console.WriteLine · 12s                                                     00:00:05 

╭─ Workers ─────────────────────────────────────────────────────────────────────╮ ╭─ Session ──────────────────────────╮
│ ⠹ worker 01  ━━─────────────  14%  ✓ 12708 ✗   431 ▴   981  writing item 140… │ │ Updates post…   422,616            │
│ ⠸ worker 02  ━━─────────────  14%  ✓ 12702 ✗   410 ▴  1008  writing item 140… │ │ Updates appl…   418,775            │
│ ⠼ worker 03  ━━─────────────  14%  ✓ 12699 ✗   430 ▴   991  writing item 140… │ │ Update rate    84,103/s            │
│ ⠴ worker 04  ━━─────────────  14%  ✓ 12718 ✗   424 ▴   978  scoring item 140… │ │ Frames               77            │
│ ⠦ worker 05  ━━─────────────  14%  ✓ 12697 ✗   423 ▴  1000  scoring item 140… │ │ Frame rate         15.1 fps        │
│ ⠧ worker 06  ━━─────────────  14%  ✓ 12699 ✗   400 ▴  1021  scoring item 140… │ │ CPU                  3% (0.0       │
│ ⠇ worker 07  ━━─────────────  14%  ✓ 12658 ✗   460 ▴  1002  scoring item 140… │ │                cores)              │
│ ⠏ worker 08  ━━─────────────  14%  ✓ 12768 ✗   411 ▴   941  evaluating item … │ │ CPU share          0.1% of 32      │
│ ⠋ worker 09  ━━─────────────  14%  ✓ 12730 ✗   405 ▴   985  evaluating item … │ │                cores               │
│ ⠙ worker 10  ━━─────────────  14%  ✓ 12717 ✗   420 ▴   983  evaluating item … │ │ Captured lin…        85            │
│ ⠹ worker 11  ━━─────────────  14%  ✓ 12752 ✗   404 ▴   964  resolving item 1… │ │ Dropped / er…         0 / 0        │
│ ⠸ worker 12  ━━─────────────  14%  ✓ 12699 ✗   420 ▴  1001  resolving item 1… │ │ ── updates/s ───────────────────── │
│ ⠼ worker 13  ━━─────────────  14%  ✓ 12681 ✗   443 ▴   996  resolving item 1… │ │                   █▆▇▇▇▇▇▆▇▇       │
│ ⠴ worker 14  ━━─────────────  14%  ✓ 12741 ✗   422 ▴   957  parsing item 140… │ │                   ██████████       │
│ ⠦ worker 15  ━━─────────────  14%  ✓ 12732 ✗   418 ▴   970  parsing item 140… │ │                   ██████████ 84k/s │
│ ⠧ worker 16  ━━─────────────  14%  ✓ 12676 ✗   426 ▴  1018  parsing item 140… │ │ ── CPU % (100% = one core) ─────── │
│ ⠇ worker 17  ━━─────────────  14%  ✓ 12663 ✗   450 ▴  1007  parsing item 140… │ │ 67.2%│                  ⡜⡄         │
│ ⠏ worker 18  ━━─────────────  14%  ✓ 12669 ✗   460 ▴   991  writing item 140… │ │      │                 ⢰⠁⠸⡀        │
│ ⠋ worker 19  ━━─────────────  14%  ✓ 12718 ✗   417 ▴   985  writing item 140… │ │      │⠒⠤⢄⡀             ⡇  ⢣        │
│ ⠙ worker 20  ━━─────────────  14%  ✓ 12724 ✗   374 ▴  1022  writing item 140… │ │      │   ⠈⢆           ⡸    ⢇⣀⠤⠒⢄   │
│ ⠹ worker 21  ━━─────────────  14%  ✓ 12788 ✗   407 ▴   925  scoring item 140… │ │    0%│     ⠱⣀⡠⠤⠤⠤⠤⠤⠤⣀⣠⠃    ⠈    ⠉⠢ │
│ ⠸ worker 22  ━━─────────────  14%  ✓ 12766 ✗   397 ▴   957  scoring item 140… │ │      └──────────────────────────── │
│ ⠼ worker 23  ━━─────────────  14%  ✓ 12696 ✗   411 ▴  1013  scoring item 140… │ │                                    │
│ ⠴ worker 24  ━━─────────────  14%  ✓ 12731 ✗   404 ▴   985  evaluating item … │ │                                    │
│ ⠦ worker 25  ━━─────────────  14%  ✓ 12789 ✗   416 ▴   915  evaluating item … │ │                                    │
│ ⠧ worker 26  ━━─────────────  14%  ✓ 12710 ✗   464 ▴   946  evaluating item … │ │                                    │
│ ⠇ worker 27  ━━─────────────  14%  ✓ 12692 ✗   463 ▴   965  evaluating item … │ │                                    │
│ ⠏ worker 28  ━━─────────────  14%  ✓ 12691 ✗   413 ▴  1016  resolving item 1… │ │                                    │
│ ⠋ worker 29  ━━─────────────  14%  ✓ 12700 ✗   464 ▴   956  resolving item 1… │ │                                    │
│ ⠙ worker 30  ━━─────────────  14%  ✓ 12790 ✗   402 ▴   928  resolving item 1… │ │                                    │
│ ⠹ worker 31  ━━─────────────  14%  ✓ 12728 ✗   440 ▴   952  parsing item 140… │ │                                    │
│ ⠸ worker 32  ━━─────────────  14%  ✓ 12692 ✗   449 ▴   979  parsing item 140… │ │                                    │
╰───────────────────────────────────────────────────────────────────────────────╯ ╰────────────────────────────────────╯
╭─ Captured output ────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 00:05 FakeLib: connection pool at 976% capacity                                                                      │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
 Ctrl+C stop

Recorded from a real run in a 120×40 pseudo console. The session drew 15 frames a second; this replay samples 3 of them per second to keep the file small.

The stress test

32 workers post lane updates as fast as they can while four threads write to Console.Out and Console.Error at random. The workers never touch the console: the session coalesces everything into about 15 frames a second and captures the stray output into the log region.

Updates posted in 12.8 s
1,010,136
Average update rate
79,056/s
Frames drawn
192 (15.0 fps)
Dropped updates and errors
0 / 0
CPU, share of one core
14.8%

Measured by the stress test itself during the recording above (.NET 8, Release build). The ConsoleMonster 2.0 pull request reports the same picture: 15.0 fps sustained at about 80,000 updates/s, 0 dropped, about 0.75 ms per frame.

Result line
STRESS seconds=12.8 workers=32 posted=1010136 avgRate=79056/s peakRate=86704/s frames=192 fps=15.0 cpuOneCore=14.8% cpuMachine=0.5% captured=208 dropped=0 errors=0 runtime=.NET 8.0.32

Recorded once, replayed exactly

The TestimoX-style showcase does not run any rules. It replays a JSON-lines event stream of 1,439 events into a dashboard definition that knows nothing about the recording: every update arrives as a LiveEvent addressed by name.

ConsoleMonster.Examples testimox 24-bitFull
 TestimoX · ad.evotec.xyz forest assessment · 12 targets · 332 rules   ● evaluating 332 rules on 6 workers  ·  00:00:30 

 ✓ Discover 2.8s › ✓ Collect 4.0s › ⠧ Evaluate › ○ Report

╭─ Targets ────────────────────────────────────────────────────────── 6 workers ─╮ ╭─ Results ─────────────────────────╮
│ ✗ ad.evotec.xyz (domain)     ━━━━━━━━━━━━━ 100%  ✓ 9 ✗ 2 ▴ 5  done in 24s      │ │ █████████████████████████████████ │
│ ✗ eu.ad.evotec.xyz (domain)  ━━━━━━━━━━━━━ 100%  ✓13 ✗ 1 ▴ 1  done in 16s      │ │ █ Passed   157  78%               │
│ ▴ DC01.ad.evotec.xyz         ━━━━━━━━━━━━━ 100%  ✓26 ✗ 0 ▴ 3  done in 17s      │ │ █ Warnings  28  13%               │
│ ▴ DC02.ad.evotec.xyz         ━━━━━━━━━━━━━ 100%  ✓23 ✗ 0 ▴ 6  done in 17s      │ │ █ Failed    10   4%               │
│ ✗ DC03.ad.evotec.xyz         ━━━━━━━━━━━━━ 100%  ✓23 ✗ 3 ▴ 4  done in 19s      │ │ █ Skipped    6   2%               │
│ ✗ DC04.ad.evotec.xyz         ━━━━━━━━━━━━━ 100%  ✓25 ✗ 1 ▴ 3  done in 19s      │ │ ───────────────────────────────── │
│ ⠸ DC05.ad.evotec.xyz         ━━━━━────────  40%  ✓ 9 ✗ 0 ▴ 2  SYSVOL DFSR sta… │ │ Evaluated        195 / 332        │
│ ⠼ DC06.ad.evotec.xyz         ━━━━╾────────  33%  ✓ 9 ✗ 0 ▴ 1  Replication lat… │ │ Average rate     8.5 rules/s      │
│ ⠴ DC07.eu.ad.evotec.xyz      ━━━━━────────  40%  ✓ 8 ✗ 3 ▴ 0  SYSVOL DFSR sta… │ │ Remaining       ~17s              │
│ ⠦ DC08.eu.ad.evotec.xyz      ━━━╾─────────  26%  ✓ 7 ✗ 0 ▴ 1  Operating syste… │ │ Targets done       5 / 12         │
│ ⠧ DC09.eu.ad.evotec.xyz      ━━━──────────  23%  ✓ 5 ✗ 0 ▴ 2  Windows Update … │ │ Targets fail…      3              │
│ ○ DC10.eu.ad.evotec.xyz      ─────────────                    queued           │ │                                   │
╰────────────────────────────────────────────────────────────────────────────────╯ ╰───────────────────────────────────╯
╭─ Throughput ─────────────────── rules/s ─╮ ╭─ Rule duration ──────────────────╮ ╭─ Failures by category ─────────────╮
│ 16│                              ⢀⠞⡄     │ │ 60│    ████ ████                 │ │ Domain con… ▆▆▆▆▆▆▆▆▆▆▆▆▆        2 │
│   │                           ⢀⠖⠒⠊ ⢣   ⡰ │ │   │    ████ ████                 │ │ Replication ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 3 │
│   │         ⢠⢣  ⡠⡀      ⢠    ⢀⠎    ⠘⡄ ⢠⠃ │ │   │▇▇▇ ████ ████                 │ │ DNS         ▆▆▆▆▆▆▆              1 │
│   │ ⡸⢢ ⢠⠢⢄  ⡎⠈⡆⡰⠁⠱⡠⠔⠤⡀ ⢀⠇⢇ ⢠⠒⠉      ⠉⠒⠃  │ │   │███ ████ ████                 │ │ Kerberos    ▆▆▆▆▆▆▆              1 │
│   │⢀⠇ ⠑⠁  ⠉⠚  ⠘⠁     ⠈⠢⡜ ⠸⣠⠃             │ │   │███ ████ ████ ▄▄▄▄            │ │ Security                         0 │
│   │⡸                      ⠁              │ │   │███ ████ ████ ████            │ │ Group Poli…                      0 │
│  0│⣁⣀⣀⣀⣀⡠⠔⠤⣀⣀⣀⣀⠤⠒⠤⣀⣀⣀⣀⣀⣀⣀⠤⠢⢄⡠⠔⠊⠑⠤⣀⣀⣀⡠⠔⠒⠒ │ │   │███ ████ ████ ████ ▃▃▃▃       │ │ Accounts    ▆▆▆▆▆▆▆▆▆▆▆▆▆        2 │
│   └───────────────────────────────────── │ │  0│███ ████ ████ ████ ████ ▁▁▁▁  │ │ PKI                              0 │
│    █ completed   █ failed                │ │    0s  0.25s     1s   2s   4s 8s │ │ Forest      ▆▆▆▆▆▆▆              1 │
╰──────────────────────────────────────────╯ ╰──────────────────────────────────╯ ╰────────────────────────────────────╯
╭─ Log ────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 00:29 ERR  DC07.eu.ad.evotec.xyz: Replication latency per partner failed - no successful inbound replication from D… │
│ 00:30 WARN DC09.eu.ad.evotec.xyz: Credential Guard posture - Credential Guard configured but not running             │
│ 00:30 ERR  ad.evotec.xyz (domain): Functional level failed - domain functional level is Windows Server 2008 R2       │
│ 00:30 ERR  DC07.eu.ad.evotec.xyz: USN rollback detection failed - event 2095 logged (USN rollback suspected)         │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
 Ctrl+C stop
 TestimoX · …  ● evaluating 332 rules on 6 workers  ·  00:00:30 

 ✓ Discover 2.8s › ✓ Collect 4.0s › ⠦ Evaluate › ○ Report

╭─ Targets ─────────────────── 6 workers ─╮ ╭─ Results ────────╮
│ ⠦ ad.evotec.xy…  ━━━━  93%  ✓ 9 ✗ 1 ▴ 5 │ │ ████████████████ │
│ ✗ eu.ad.evotec…  ━━━━ 100%  ✓13 ✗ 1 ▴ 1 │ │ █ Pass… 154  78% │
│ ▴ DC01.ad.evot…  ━━━━ 100%  ✓26 ✗ 0 ▴ 3 │ │ █ Warn…  27  13% │
│ ▴ DC02.ad.evot…  ━━━━ 100%  ✓23 ✗ 0 ▴ 6 │ │ █ Fail…   8   4% │
│ ✗ DC03.ad.evot…  ━━━━ 100%  ✓23 ✗ 3 ▴ 4 │ │ █ Skip…   6   3% │
│ ✗ DC04.ad.evot…  ━━━━ 100%  ✓25 ✗ 1 ▴ 3 │ │ ──────────────── │
│ ⠹ DC05.ad.evot…  ━╾──  36%  ✓ 8 ✗ 0 ▴ 2 │ │ Evalu…    195 /  │
│ ⠸ DC06.ad.evot…  ━╾──  33%  ✓ 9 ✗ 0 ▴ 1 │ │         332      │
│ ⠼ DC07.eu.ad.e…  ━╾──  36%  ✓ 8 ✗ 2 ▴ 0 │ │ Avera…    8.5    │
│ ⠴ DC08.eu.ad.e…  ━───  23%  ✓ 6 ✗ 0 ▴ 1 │ │         rules/s  │
│ ⠦ DC09.eu.ad.e…  ╾───  16%  ✓ 4 ✗ 0 ▴ 1 │ │ Remai…   ~17s    │
│ ○ DC10.eu.ad.e…  ────                   │ │ Targe…      5 /  │
│                                         │ │         12       │
│                                         │ │ Targe…      3    │
╰─────────────────────────────────────────╯ ╰──────────────────╯
╭─ Throug… ─ rules/s ─╮ ╭─ Rule duration ─╮ ╭─ Failures by c… ─╮
│ 16│             ⣼   │ │ 58│  ██▇▇       │ │ Doma… ▆▆▆▆▆▆▆▆ 2 │
│   │    ⡄⢀   ⡀ ⢀⠏ ⡇⡸ │ │   │▄▄████       │ │ Repl… ▆▆▆▆▆▆▆▆ 2 │
│   │⢸⢆⠦⣠⠻⡜⢣⠦⣀⢷⢰⠉  ⠑⠃ │ │   │██████       │ │ DNS   ▆▆▆▆     1 │
│   │⡎⠈ ⠈ ⠁  ⠘⠈⠇      │ │   │██████▅▅     │ │ Kerb… ▆▆▆▆     1 │
│  0│⣃⣀⡠⢄⣀⡠⣀⣀⣀⡠⢄⠤⢢⣀⡠⠤ │ │   │████████     │ │ Secu…          0 │
│   └──────────────── │ │  0│██████████▁▁ │ │ Grou…          0 │
│    █ completed   █  │ │    0s  0.5s  8s │ │ Acco… ▆▆▆▆▆▆▆▆ 2 │
╰─────────────────────╯ ╰─────────────────╯ ╰──────────────────╯
 Ctrl+C stop

The recording

LiveRecorder writes one JSON object per applied event: the time in milliseconds, the target, the operation, the key and the values. LiveRecordingReader reads it back with no dependencies. Live sessions record with RecordPath or RecordWriter, and Start-ConsoleDashboard with -RecordPath.

JSON linestestimox-run.jsonl, first lines
{"consolemonster":"recording","version":1}
{"t":1,"target":"dashboard","op":"status","text":"discovering forest","state":"running"}
{"t":1,"target":"phases","op":"state","key":"Discover","state":"running"}
{"t":1,"target":"lanes","op":"add","key":"dom-ad","text":"ad.evotec.xyz (domain)","total":16}
{"t":1,"target":"lanes","op":"add","key":"dom-eu","text":"eu.ad.evotec.xyz (domain)","total":16}
{"t":1,"target":"lanes","op":"add","key":"dc1","text":"DC01.ad.evotec.xyz","total":30}
{"t":1,"target":"lanes","op":"add","key":"dc2","text":"DC02.ad.evotec.xyz","total":30}
{"t":1,"target":"lanes","op":"add","key":"dc3","text":"DC03.ad.evotec.xyz","total":30}
{"t":1,"target":"lanes","op":"add","key":"dc4","text":"DC04.ad.evotec.xyz","total":30}

Download the whole recording (1,439 events).

The dashboard

Phases, lanes for twelve targets, a stacked bar and a key/value list, a braille line chart, a histogram, a bar chart and a log region. Below 60×20 the dashboard shows one status line plus the phases and the lanes that fit.

C# source of the dashboard
C#ConsoleMonster.Examples/Showcases/ParallelRun.cs
public static Dashboard Build(out Lanes lanes) {
    Phases phases = new Phases()
        .Set("Discover")
        .Set("Collect")
        .Set("Evaluate")
        .Set("Report");
    StackedBar results = new StackedBar("results")
        .Add("Passed", 0, ThemeToken.Pass)
        .Add("Warnings", 0, ThemeToken.Warn)
        .Add("Failed", 0, ThemeToken.Fail)
        .Add("Skipped", 0, ThemeToken.Skip);
    KeyValueList summary = new KeyValueList("summary")
        .Add("Evaluated", "0 / " + ParallelRunRecording.TotalRules)
        .Add("Average rate", "-")
        .Add("Remaining", "-")
        .Add("Targets done", "0 / 12")
        .Add("Targets failing", "0");
    LineChart throughput = new LineChart("throughput") { Height = 7 };
    throughput.AddSeries("completed", ThemeToken.Accent);
    throughput.AddSeries("failed", ThemeToken.Fail);
    Histogram durations = new Histogram(new double[] { 0, 0.25, 0.5, 1, 2, 4, 8 }, "durations") { Height = 6, Unit = "s" };
    BarChart findings = new BarChart("findings") { BarToken = ThemeToken.Fail };
    foreach (string category in new[] { "Domain controllers", "Replication", "DNS", "Kerberos", "Security", "Group Policy", "Accounts", "PKI" }) {
        findings.Add(category, 0);
    }
    Lanes targets = new Lanes { MaxLabelWidth = 28 };
    Dashboard dashboard = new DashboardBuilder("[bold]TestimoX[/]")
        .Subtitle("ad.evotec.xyz forest assessment · 12 targets · " + ParallelRunRecording.TotalRules + " rules")
        .Add(new Prioritized(new Padding(phases, 1, 0, 1, 1), 10, 1, 30))
        .Columns(c => c
            .Panel("Targets", new Prioritized(targets, 8, 4, 40), 2.3, ParallelRunRecording.Workers + " workers")
            .Panel("Results", new Rows(results, new Rule(), summary), 1))
        .Columns(c => c
            .Panel("Throughput", throughput, 1.2, "rules/s")
            .Panel("Rule duration", durations, 1)
            .Panel("Failures by category", findings, 1))
        .Panel("Log", new LogRegion { PreferredHeight = 6 }, fill: true)
        .BuildDashboard();
    // Below 60 x 20 the dashboard shows one status line plus the phases and the lanes that fit.
    dashboard.MinimumSize = new Size(60, 20);
    dashboard.CompactSummary = () => CompactSummary(results);
    lanes = targets;
    return dashboard;
}

A build pipeline, from C# and PowerShell

A PSPublishModule-style build: phases, steps with timings, module facts, overall progress and the tool output. The C# showcase writes to Console.Out like a real tool, and the PowerShell script calls Write-Host and Write-Warning from the dashboard's runspace; both land in the log region. Each run was recorded in a 110×32 pseudo console.

ConsoleMonster.Examples pipeline 110×3224-bitFull
 PSPublishModule · Build-Module ConsoleMonster                                        ● building  ·  00:00:13 

 ✓ Prepare 970ms › ✓ Restore 1.7s › ✓ Build 7.2s › ⠇ Test › ○ Docs › ○ Sign › ○ Package › ○ Publish

╭─ Steps ───────────────────────────────────────────────────────╮ ╭─ Module ─────────────────────────────────╮
│ ✓ Read Build/project.build.json                         427ms │ │ Module      ConsoleMonster               │
│ ✓ Update ConsoleMonster.psd1                            541ms │ │ Version     0.0.4 → 2.0.0                │
│ ✓ Restore NuGet packages                                 1.7s │ │ Frameworks  netstandard2.0 · net472 ·    │
│ ✓ Compile ConsoleMonster (netstandard2.0)                2.0s │ │             net8.0                       │
│ ✓ Compile ConsoleMonster (net472)                        1.6s │ │ PowerShell    5.1 Desktop · 7.x Core     │
│ ✓ Compile ConsoleMonster (net8.0)                        1.5s │ │ Run mode    Build (publish disabled)     │
│ ✓ Compile ConsoleMonster.PowerShell                      2.1s │ │ Elapsed       13s                        │
│ ✓ Run xUnit tests (net472, net8.0)                       3.5s │ │ ──────────────────────────────────────── │
│ ⠇ Run Pester tests (Windows PowerShell 5.1)                   │ │ Test      ━━━━━━━━╾────────   50%   8/16 │
│ ○ Run Pester tests (PowerShell 7.5)                           │ │                                          │
│ ○ Generate markdown help (38 commands)                        │ │                                          │
│ ○ Generate en-US MAML help                                    │ │                                          │
│ ○ Sign module files                                           │ │                                          │
│ ○ Pack ConsoleMonster.2.0.0.nupkg                             │ │                                          │
│ ○ Create module archive                                       │ │                                          │
│ ○ Publish to PowerShell Gallery                               │ │                                          │
╰───────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────╯
╭─ Output ───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 00:06 ConsoleMonster -> bin\Release\net8.0\ConsoleMonster.dll                                              │
│ 00:07 ConsoleMonster.PowerShell -> bin\Release\net472\ConsoleMonster.PowerShell.dll                        │
│ 00:08 ConsoleMonster.PowerShell -> bin\Release\net8.0\ConsoleMonster.PowerShell.dll                        │
│ 00:10 Passed!  - Failed: 0, Passed: 286, Skipped: 0 - ConsoleMonster.Tests.dll (net472)                    │
│ 00:10 Passed!  - Failed: 0, Passed: 286, Skipped: 0 - ConsoleMonster.Tests.dll (net8.0)                    │
│ 00:13 Tests completed in 2.1s                                                                              │
│ 00:13 Tests Passed: 41, Failed: 0, Skipped: 0                                                              │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
 Ctrl+C stop

The PowerShell script

PowerShellModule/Examples/Example-BuildPipeline.ps1
Import-Module "$PSScriptRoot\..\ConsoleMonster.psd1" -Force

# PSPublishModule / PowerForge style build pipeline: phases, steps with timings, module facts and the tool output.
# The script runs in a runspace ConsoleMonster owns: Write-Host, Write-Warning and Write-Verbose land in the log
# region instead of writing over the live screen.

$steps = @(
    @{ Phase = 'Prepare'; Key = 'config'; Label = 'Read Build/project.build.json'; Seconds = 0.5; Result = 'Pass' }
    @{ Phase = 'Restore'; Key = 'restore'; Label = 'Restore NuGet packages'; Seconds = 1.5; Result = 'Pass' }
    @{ Phase = 'Build'; Key = 'core'; Label = 'Compile ConsoleMonster (3 frameworks)'; Seconds = 2.5; Result = 'Pass' }
    @{ Phase = 'Build'; Key = 'ps'; Label = 'Compile ConsoleMonster.PowerShell'; Seconds = 1.5; Result = 'Pass' }
    @{ Phase = 'Test'; Key = 'xunit'; Label = 'Run xUnit tests'; Seconds = 2.5; Result = 'Pass' }
    @{ Phase = 'Test'; Key = 'pester'; Label = 'Run Pester tests'; Seconds = 2.0; Result = 'Warn' }
    @{ Phase = 'Docs'; Key = 'docs'; Label = 'Generate help (38 commands)'; Seconds = 1.5; Result = 'Pass' }
    @{ Phase = 'Package'; Key = 'pack'; Label = 'Pack module and NuGet package'; Seconds = 1.5; Result = 'Pass' }
    @{ Phase = 'Publish'; Key = 'publish'; Label = 'Publish to PowerShell Gallery'; Seconds = 0.3; Result = 'Skip' }
)

$dashboard = New-ConsoleDashboard -Title '[bold]PSPublishModule[/]' -Subtitle 'Build-Module ConsoleMonster' -Gap 1 {
    New-ConsolePhases -Phase 'Prepare', 'Restore', 'Build', 'Test', 'Docs', 'Package', 'Publish'
    New-ConsoleColumns {
        New-ConsolePanel -Title 'Steps' -Weight 1.5 { New-ConsoleStatusList -Name steps -Item $steps.Label }
        New-ConsolePanel -Title 'Module' {
            New-ConsoleKeyValue -Name module -Data ([ordered] @{ Module = 'ConsoleMonster'; Version = '2.0.0'; Frameworks = 'netstandard2.0 · net472 · net8.0'; Elapsed = '-' })
            New-ConsoleRule
            New-ConsoleProgress -Name overall -Label 'Overall' -Total $steps.Count
        }
    }
    New-ConsolePanel -Title 'Output' -Fill { New-ConsoleLog }
}

Start-ConsoleDashboard $dashboard -ArgumentList (, $steps) {
    param($Steps)
    $watch = [System.Diagnostics.Stopwatch]::StartNew()
    $phase = $null
    $index = 0
    foreach ($step in $Steps) {
        if ($step.Phase -ne $phase) {
            if ($phase) {
                Update-ConsolePhase -Key $phase -Status Pass
            }
            $phase = $step.Phase
            Update-ConsolePhase -Key $phase -Status Running
        }
        Update-ConsoleStatus -Name steps -Key $step.Label -Status Running
        Write-Host "$($step.Label)..."
        Start-Sleep -Milliseconds ([int] ($step.Seconds * 1000))
        if ($step.Result -eq 'Warn') {
            Write-Warning '1 Pester test skipped on PowerShell 7 (requires conhost)'
        }
        Update-ConsoleStatus -Name steps -Key $step.Label -Status $step.Result -Detail ($step.Seconds.ToString('0.0', [cultureinfo]::InvariantCulture) + 's')
        $index++
        Update-ConsoleProgress -Name overall -Value $index
        Set-ConsoleValue -Name module -Key Elapsed -Value ($watch.Elapsed.TotalSeconds.ToString('0.0', [cultureinfo]::InvariantCulture) + 's')
    }
    Update-ConsolePhase -Key $phase -Status Skip
    Update-ConsoleProgress -Name overall -Status Pass
    Write-Host 'Build completed: Artefacts\Packed\ConsoleMonster-PowerShellModule.v2.0.0.zip'
    Start-Sleep -Seconds 2
}

What stays in the scrollback

When the session ends the screen is restored and a summary is printed to the scrollback, so a live dashboard always leaves a record behind. This is the C# run's summary.

after the session ends 69×20
 Build summary ConsoleMonster 2.0.0
 Phase    Step                                       Result  Duration
 ───────  ─────────────────────────────────────────  ──────  ────────
 Prepare  Read Build/project.build.json              ✓ PASS     427ms
 Prepare  Update ConsoleMonster.psd1                 ✓ PASS     541ms
 Restore  Restore NuGet packages                     ✓ PASS      1.7s
 Build    Compile ConsoleMonster (netstandard2.0)    ✓ PASS      2.0s
 Build    Compile ConsoleMonster (net472)            ✓ PASS      1.6s
 Build    Compile ConsoleMonster (net8.0)            ✓ PASS      1.5s
 Build    Compile ConsoleMonster.PowerShell          ✓ PASS      2.1s
 Test     Run xUnit tests (net472, net8.0)           ✓ PASS      3.5s
 Test     Run Pester tests (Windows PowerShell 5.1)  ✓ PASS      2.6s
 Test     Run Pester tests (PowerShell 7.5)          ▴ WARN      2.3s
 Docs     Generate markdown help (38 commands)       ✓ PASS      1.9s
 Docs     Generate en-US MAML help                   ✓ PASS     984ms
 Sign     Sign module files                          – SKIP         -
 Package  Pack ConsoleMonster.2.0.0.nupkg            ✓ PASS      1.3s
 Package  Create module archive                      ✓ PASS     875ms
 Publish  Publish to PowerShell Gallery              – SKIP         -

The same run in CI

With CONSOLEMONSTER_MODE=stream, with redirected output or when a CI system is detected, a live dashboard narrates append-only lines instead of redrawing. This is the TestimoX replay at six times speed in stream mode.

CONSOLEMONSTER_MODE=stream 100 columnsstream mode
discovering forest
phase Discover RUN
Connecting to ad.evotec.xyz via LDAP (DC01.ad.evotec.xyz)
Forest ad.evotec.xyz: 2 domains, 10 domain controllers, 4 sites
WARN DC10.eu.ad.evotec.xyz responded slowly (812 ms LDAP bind)
phase Discover PASS (2.8s)
phase Collect RUN
collecting rule inputs
Collecting 18 data sources per domain controller
VERB Using cached schema snapshot from 2026-10-15
phase Collect PASS (4.0s)
phase Evaluate RUN
evaluating 332 rules on 6 workers
ad.evotec.xyz (domain) started
ad.evotec.xyz (domain): evaluating 16 rules
eu.ad.evotec.xyz (domain) started
eu.ad.evotec.xyz (domain): evaluating 16 rules
DC01.ad.evotec.xyz started
DC01.ad.evotec.xyz: evaluating 30 rules
DC02.ad.evotec.xyz started
DC02.ad.evotec.xyz: evaluating 30 rules
DC03.ad.evotec.xyz started
DC03.ad.evotec.xyz: evaluating 30 rules
DC04.ad.evotec.xyz started
DC04.ad.evotec.xyz: evaluating 30 rules
lanes: 6 running, 0 done, 6 queued
ERR DC03.ad.evotec.xyz: Credential Guard posture failed - virtualization-based security is off
ERR eu.ad.evotec.xyz (domain): Password never expires failed - 18 user accounts never expire their p
assword
WARN DC01.ad.evotec.xyz: DC locator SRV records - stale SRV record for a retired DC
lanes: 6 running, 0 done, 6 queued
WARN DC01.ad.evotec.xyz: Event log sizes - Directory Service log under 64 MB
ERR DC03.ad.evotec.xyz: Lingering objects failed - 3 lingering objects in the configuration partitio
n
WARN eu.ad.evotec.xyz (domain): Site link costs - 2 site links use default cost 100
eu.ad.evotec.xyz (domain) FAIL: 13 passed, 1 failed, 1 warnings, 1 skipped in 16s
DC05.ad.evotec.xyz started
DC05.ad.evotec.xyz: evaluating 30 rules
ERR DC03.ad.evotec.xyz: DC locator SRV records failed - _ldap._tcp.dc._msdcs record missing
WARN DC02.ad.evotec.xyz: Local administrators - nested group in BUILTIN\Administrators
ERR ad.evotec.xyz (domain): Service account SPN hygiene failed - duplicate SPN HTTP/intranet registe
red twice
WARN DC03.ad.evotec.xyz: krbtgt password age - krbtgt password is 190 days old
DC01.ad.evotec.xyz WARN: 26 passed, 0 failed, 3 warnings, 1 skipped in 17s
DC06.ad.evotec.xyz started
DC06.ad.evotec.xyz: evaluating 30 rules
ERR DC04.ad.evotec.xyz: Unconstrained delegation failed - 2 servers trusted for unconstrained delega
tion
DC02.ad.evotec.xyz WARN: 23 passed, 0 failed, 6 warnings, 1 skipped in 17s
DC07.eu.ad.evotec.xyz started
DC07.eu.ad.evotec.xyz: evaluating 30 rules
WARN ad.evotec.xyz (domain): CA weak key size - issuing CA certificate expires in 9 months
WARN DC05.ad.evotec.xyz: LDAP channel binding - channel binding set to 'when supported'
WARN DC04.ad.evotec.xyz: Local administrators - nested group in BUILTIN\Administrators
DC03.ad.evotec.xyz FAIL: 23 passed, 3 failed, 4 warnings in 19s
DC08.eu.ad.evotec.xyz started
DC08.eu.ad.evotec.xyz: evaluating 30 rules
DC04.ad.evotec.xyz FAIL: 25 passed, 1 failed, 3 warnings, 1 skipped in 19s
DC09.eu.ad.evotec.xyz started
DC09.eu.ad.evotec.xyz: evaluating 30 rules
WARN DC06.ad.evotec.xyz: Secure Boot certificate rollout - update staged, reboot pending
ERR DC07.eu.ad.evotec.xyz: Operating system support failed - Windows Server 2012 R2 is out of suppor
t
WARN DC05.ad.evotec.xyz: Replication latency per partner - latency to DC05 is 42 minutes
ERR DC07.eu.ad.evotec.xyz: Replication latency per partner failed - no successful inbound replicatio
n from DC02 for 4h
WARN DC09.eu.ad.evotec.xyz: Credential Guard posture - Credential Guard configured but not running
ERR ad.evotec.xyz (domain): Functional level failed - domain functional level is Windows Server 2008
 R2
ERR DC07.eu.ad.evotec.xyz: USN rollback detection failed - event 2095 logged (USN rollback suspected
)
ad.evotec.xyz (domain) FAIL: 9 passed, 2 failed, 5 warnings in 24s
WARN DC07.eu.ad.evotec.xyz: SYSVOL DFSR state - DFSR backlog of 37 files
lanes: 5 running, 6 done (4 failed), 1 queued
DC10.eu.ad.evotec.xyz started
DC10.eu.ad.evotec.xyz: evaluating 30 rules
ERR DC07.eu.ad.evotec.xyz: Tombstone lifetime failed - tombstone lifetime is 60 days
ERR DC10.eu.ad.evotec.xyz: Print Spooler disabled failed - Spooler service is running
WARN DC10.eu.ad.evotec.xyz: LSA protection enabled - RunAsPPL set without UEFI lock
WARN DC07.eu.ad.evotec.xyz: DNS scavenging - no-refresh interval longer than 7 days
ERR DC10.eu.ad.evotec.xyz: Operating system support failed - Windows Server 2012 R2 is out of suppor
t
WARN DC10.eu.ad.evotec.xyz: NTLM audit configuration - audit enabled for incoming traffic only
WARN DC08.eu.ad.evotec.xyz: Root hints reachable - root hints file older than 2 years
WARN DC10.eu.ad.evotec.xyz: Replication latency per partner - latency to DC05 is 42 minutes
WARN DC08.eu.ad.evotec.xyz: Clock skew - clock skew of 48 seconds
WARN DC09.eu.ad.evotec.xyz: DNS forwarders consistency - one forwarder does not answer
ERR DC10.eu.ad.evotec.xyz: USN rollback detection failed - event 2095 logged (USN rollback suspected
)
ERR DC09.eu.ad.evotec.xyz: Clock skew failed - clock skew of 7 minutes against the PDC emulator
ERR DC06.ad.evotec.xyz: krbtgt password age failed - krbtgt password not changed for 812 days
DC07.eu.ad.evotec.xyz FAIL: 21 passed, 4 failed, 4 warnings, 1 skipped in 16s
lanes: 5 running, 7 done (5 failed), 0 queued
DC05.ad.evotec.xyz WARN: 26 passed, 0 failed, 3 warnings, 1 skipped in 18s
DC08.eu.ad.evotec.xyz WARN: 24 passed, 0 failed, 4 warnings, 2 skipped in 16s
ERR DC10.eu.ad.evotec.xyz: DNS scavenging failed - scavenging disabled on all zones
ERR DC10.eu.ad.evotec.xyz: DC locator SRV records failed - _ldap._tcp.dc._msdcs record missing
DC09.eu.ad.evotec.xyz FAIL: 25 passed, 1 failed, 3 warnings, 1 skipped in 21s
DC06.ad.evotec.xyz FAIL: 24 passed, 1 failed, 4 warnings, 1 skipped in 26s
DC10.eu.ad.evotec.xyz FAIL: 17 passed, 5 failed, 7 warnings, 1 skipped in 20s
phase Evaluate WARN (44s)
phase Report RUN
writing report
lanes: 0 running, 12 done (8 failed), 0 queued
OK Report written to Reports\Assessment-ad.evotec.xyz.html (4.2 MB)
phase Report PASS (1.8s)
332 rules · 256 passed · 18 failed · 47 warnings · 11 skipped
Done.

 Run summary
 Target                     Status  Passed  Failed  Warnings  Skipped  Duration
 ─────────────────────────  ──────  ──────  ──────  ────────  ───────  ────────
 ad.evotec.xyz (domain)     ✗ FAIL       9       2         5        0       24s
 eu.ad.evotec.xyz (domain)  ✗ FAIL      13       1         1        1       16s
 DC01.ad.evotec.xyz         ▴ WARN      26       0         3        1       17s
 DC02.ad.evotec.xyz         ▴ WARN      23       0         6        1       17s
 DC03.ad.evotec.xyz         ✗ FAIL      23       3         4        0       19s
 DC04.ad.evotec.xyz         ✗ FAIL      25       1         3        1       19s
 DC05.ad.evotec.xyz         ▴ WARN      26       0         3        1       18s
 DC06.ad.evotec.xyz         ✗ FAIL      24       1         4        1       26s
 DC07.eu.ad.evotec.xyz      ✗ FAIL      21       4         4        1       16s
 DC08.eu.ad.evotec.xyz      ▴ WARN      24       0         4        2       16s
 DC09.eu.ad.evotec.xyz      ✗ FAIL      25       1         3        1       21s
 DC10.eu.ad.evotec.xyz      ✗ FAIL      17       5         7        1       20s
 ─────────────────────────  ──────  ──────  ──────  ────────  ───────  ────────
 Total                                 256      18        47       11

Printed once: query results

Not every tool needs a live view. The DnsClientX and DomainDetective style showcase prints a summary, the records, a delegation tree, mail-security checks and resolver latency once, at the width of the console.

ConsoleMonster.Examples query 100×4124-bitFull
── DNS query results · evotec.xyz ──────────────────────────────────────────────────────────────────

 Domain      evotec.xyz
 Resolver    Cloudflare DNS over HTTPS (1.1.1.1)
 Query time  38 ms for 7 record types
 Records     14
 DNSSEC      ▴ not signed

╭───────────────────┬──────┬───────┬───────────────────────────────────────────────────────────────╮
│ Name              │ Type │   TTL │ Data                                                          │
│ evotec.xyz        │ A    │   300 │ 104.21.48.12                                                  │
│ evotec.xyz        │ A    │   300 │ 172.67.161.94                                                 │
│ evotec.xyz        │ AAAA │   300 │ 2606:4700:3036::6815:300c                                     │
│ evotec.xyz        │ MX   │  3600 │ 10 evotec-xyz.mail.protection.outlook.com                     │
│ evotec.xyz        │ NS   │ 86400 │ dana.ns.cloudflare.com                                        │
│ evotec.xyz        │ NS   │ 86400 │ kirk.ns.cloudflare.com                                        │
│ evotec.xyz        │ TXT  │  3600 │ v=spf1 include:spf.protection.outlook.com                     │
│                   │      │       │ include:_spf.google.com include:sendgrid.net ip4:51.38.120.9  │
│                   │      │       │ -all                                                          │
│ _dmarc.evotec.xyz │ TXT  │  3600 │ v=DMARC1; p=reject; rua=mailto:dmarc@evotec.xyz;              │
│                   │      │       │ ruf=mailto:forensic@evotec.xyz; fo=1                          │
│ evotec.xyz        │ CAA  │  3600 │ 0 issue "letsencrypt.org"                                     │
│ evotec.xyz        │ SOA  │  3600 │ dana.ns.cloudflare.com. dns.cloudflare.com. 2351234567 10000  │
│                   │      │       │ 2400 604800 3600                                              │
╰───────────────────┴──────┴───────┴───────────────────────────────────────────────────────────────╯

╭─ Delegation ──────────────────────────────────╮ ╭─ Mail security ────────────── DomainDetective ─╮
│ . root                                        │ │ ✓ SPF record present and val…        9 lookups │
│ └── xyz.  6 name servers                      │ │ ✓ DMARC policy enforced               p=reject │
│     ├── x.nic.xyz  194.169.218.42             │ │ ✓ DKIM selector1 / selector2          2048-bit │
│     ├── y.nic.xyz  185.24.64.42               │ │ ▴ MTA-STS policy                 not published │
│     └── evotec.xyz.  2 name servers           │ │ ▴ TLS-RPT reporting              not published │
│         ├── ✓ dana.ns.cloudflare.com  108.16… │ │ ✗ DNSSEC chain of trust        zone not signed │
│         ├── ✓ kirk.ns.cloudflare.com  172.64… │ │ – BIMI record                         optional │
│         └── mail  MX target                   │ │ ────────────────────────────────────────────── │
│             └── ✓ evotec-xyz.mail.protection… │ │ Cloudflare      ▆▆▆▆▆▆                   12 ms │
│                                               │ │ Google          ▆▆▆▆▆▆▆▆▆                18 ms │
│                                               │ │ Quad9           ▆▆▆▆▆▆▆▆▆▆▆▆             24 ms │
│                                               │ │ OpenDNS         ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆         31 ms │
│                                               │ │ System resolver ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 47 ms │
╰───────────────────────────────────────────────╯ ╰────────────────────────────────────────────────╯
── DNS query results · evotec.xyz ──────────────────────────────────────────────────────────────────

 Domain      evotec.xyz
 Resolver    Cloudflare DNS over HTTPS (1.1.1.1)
 Query time  38 ms for 7 record types
 Records     14
 DNSSEC      ▴ not signed

╭───────────────────┬──────┬───────┬───────────────────────────────────────────────────────────────╮
│ Name              │ Type │   TTL │ Data                                                          │
│ evotec.xyz        │ A    │   300 │ 104.21.48.12                                                  │
│ evotec.xyz        │ A    │   300 │ 172.67.161.94                                                 │
│ evotec.xyz        │ AAAA │   300 │ 2606:4700:3036::6815:300c                                     │
│ evotec.xyz        │ MX   │  3600 │ 10 evotec-xyz.mail.protection.outlook.com                     │
│ evotec.xyz        │ NS   │ 86400 │ dana.ns.cloudflare.com                                        │
│ evotec.xyz        │ NS   │ 86400 │ kirk.ns.cloudflare.com                                        │
│ evotec.xyz        │ TXT  │  3600 │ v=spf1 include:spf.protection.outlook.com                     │
│                   │      │       │ include:_spf.google.com include:sendgrid.net ip4:51.38.120.9  │
│                   │      │       │ -all                                                          │
│ _dmarc.evotec.xyz │ TXT  │  3600 │ v=DMARC1; p=reject; rua=mailto:dmarc@evotec.xyz;              │
│                   │      │       │ ruf=mailto:forensic@evotec.xyz; fo=1                          │
│ evotec.xyz        │ CAA  │  3600 │ 0 issue "letsencrypt.org"                                     │
│ evotec.xyz        │ SOA  │  3600 │ dana.ns.cloudflare.com. dns.cloudflare.com. 2351234567 10000  │
│                   │      │       │ 2400 604800 3600                                              │
╰───────────────────┴──────┴───────┴───────────────────────────────────────────────────────────────╯

╭─ Delegation ──────────────────────────────────╮ ╭─ Mail security ────────────── DomainDetective ─╮
│ . root                                        │ │ ✓ SPF record present and val…        9 lookups │
│ └── xyz.  6 name servers                      │ │ ✓ DMARC policy enforced               p=reject │
│     ├── x.nic.xyz  194.169.218.42             │ │ ✓ DKIM selector1 / selector2          2048-bit │
│     ├── y.nic.xyz  185.24.64.42               │ │ ▴ MTA-STS policy                 not published │
│     └── evotec.xyz.  2 name servers           │ │ ▴ TLS-RPT reporting              not published │
│         ├── ✓ dana.ns.cloudflare.com  108.16… │ │ ✗ DNSSEC chain of trust        zone not signed │
│         ├── ✓ kirk.ns.cloudflare.com  172.64… │ │ – BIMI record                         optional │
│         └── mail  MX target                   │ │ ────────────────────────────────────────────── │
│             └── ✓ evotec-xyz.mail.protection… │ │ Cloudflare      ▆▆▆▆▆▆                   12 ms │
│                                               │ │ Google          ▆▆▆▆▆▆▆▆▆                18 ms │
│                                               │ │ Quad9           ▆▆▆▆▆▆▆▆▆▆▆▆             24 ms │
│                                               │ │ OpenDNS         ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆         31 ms │
│                                               │ │ System resolver ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 47 ms │
╰───────────────────────────────────────────────╯ ╰────────────────────────────────────────────────╯

How these replays were made

The stress test, the build pipeline and the stream-mode run were recorded by the site tool: it starts each showcase inside a Windows pseudo console of a fixed size, pins the terminal profile with CONSOLEMONSTER_COLOR, CONSOLEMONSTER_GLYPHS, CONSOLEMONSTER_THEME and CONSOLEMONSTER_CULTURE, and saves the VT byte stream with its timing as asciicast. The tool's own VT parser replays that stream into cells, samples it at a fixed rate and keeps only the rows that change. The assessment comes from its JSON-lines recording instead, played into the dashboard in-process, the way ConsoleMonster's recording export does.

Without JavaScript, each player shows its last frame. With reduced motion, nothing plays until you press play.