Each specimen is rendered by the site tool from the C# shown beside it, at a fixed width and the en-US culture. The PowerShell script was run on both hosts in a console of the same width, and the tool compared its cells with the C# frame. Snippets assume using ConsoleMonster.Widgets;, ConsoleMonster.Layout and ConsoleMonster.Styling.
Widgets
Every ConsoleMonster widget with its C# and PowerShell source. Switch the colour and glyph tier to see each one exactly as a console of that kind draws it.
╭─ TestimoX ─────────── ad.evotec.xyz ─╮ │ ✓ Discover 2.1s › ✓ Collect 14s │ │ ⠋ Evaluate 64% │ │ ████████████████████████████████████ │ │ █ Passed 412 82% │ │ █ Warnings 51 10% │ │ █ Failed 23 4% │ │ █ Skipped 14 2% │ │ rules/s ▃▃▃▃▄▄▄▄▅▅▅▆▅▆▇▆▇▇▇█ 57/s │ ╰──────────────────────────────────────╯
╭─ TestimoX ─────────── ad.evotec.xyz ─╮ │ ✓ Discover 2.1s › ✓ Collect 14s │ │ ⠋ Evaluate 64% │ │ ████████████████████████████████████ │ │ █ Passed 412 82% │ │ █ Warnings 51 10% │ │ █ Failed 23 4% │ │ █ Skipped 14 2% │ │ rules/s ▃▃▃▃▄▄▄▄▅▅▅▆▅▆▇▆▇▇▇█ 57/s │ ╰──────────────────────────────────────╯
┌─ TestimoX ─────────── ad.evotec.xyz ─┐ │ √ Discover 2.1s › √ Collect 14s │ │ | Evaluate 64% │ │ ████████████████████████████████████ │ │ █ Passed 412 82% │ │ █ Warnings 51 10% │ │ █ Failed 23 4% │ │ █ Skipped 14 2% │ │ rules/s ░░░▒▒▒▒▒▒▓▓▓▓▓▓▓█▓██ 57/s │ └──────────────────────────────────────┘
+- TestimoX ----------- ad.evotec.xyz -+ | [PASS] Discover 2.1s | | [PASS] Collect 14s | | [BUSY] Evaluate 64% | | ##############################====+- | | # Passed 412 82% | | = Warnings 51 10% | | + Failed 23 4% | | - Skipped 14 2% | | rules/s ----====+++*+*#*###@ 57/s | +--------------------------------------+
Text
Markup, rules and pixel lettering. Text is measured in terminal cells, so emoji and CJK keep the grid.
Text and markup
60 × 2Spectre-style markup: theme roles, colours and decorations, reduced for each tier.
Deployed in 48 s: √ 12 passed ▲ 2 warned ✗ 1 failed Decorations: bold dim underline struck invert
Deployed in 48 s: √ 12 passed ▲ 2 warned ✗ 1 failed Decorations: bold dim underline struck invert
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Terminal.Write(new TextBlock(
"[bold]Deployed[/] in [accent]48 s[/]: " +
"[pass]√ 12 passed[/] [warn]▲ 2 warned[/] [fail]✗ 1 failed[/]"));
Terminal.Write(new TextBlock(
"[italic]Decorations:[/] [bold]bold[/] [dim]dim[/] [underline]underline[/] " +
"[strikethrough]struck[/] [invert] invert [/]"));Write-ConsoleMarkup '[bold]Deployed[/] in [accent]48 s[/]: [pass]√ 12 passed[/] [warn]▲ 2 warned[/] [fail]✗ 1 failed[/]'
Write-ConsoleMarkup '[italic]Decorations:[/] [bold]bold[/] [dim]dim[/] [underline]underline[/] [strikethrough]struck[/] [invert] invert [/]'Rule
60 × 2A horizontal line with an optional title, the separator inside panels and reports.
── Replication ───────────────────────────────────────────── ────────────────────────────────────────────────────────────
── Replication ───────────────────────────────────────────── ────────────────────────────────────────────────────────────
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Terminal.Write(new Rule("[bold]Replication[/]"));
Terminal.Write(new Rule());Write-ConsoleRule '[bold]Replication[/]'
Write-ConsoleRuleLogo
60 × 5Large pixel lettering with a gradient and a tagline, for the top of a tool.
█▄ ▄█ ▄▀▀▀▄ █ █ ▄▀▀▀▀ ▀▀█▀▀ █▀▀▀▀ █▀▀▀▄ █ █ █ █ █ █▀▄ █ ▀▄▄▄ █ █▄▄▄ █▄▄▄▀ █ █ █ █ █ ▀█ █ █ █ █ ▀▄ ▀ ▀ ▀▀▀ ▀ ▀ ▀▀▀▀ ▀ ▀▀▀▀▀ ▀ ▀ zero-dependency console rendering
█▄ ▄█ ▄▀▀▀▄ █ █ ▄▀▀▀▀ ▀▀█▀▀ █▀▀▀▀ █▀▀▀▄ █ █ █ █ █ █▀▄ █ ▀▄▄▄ █ █▄▄▄ █▄▄▄▀ █ █ █ █ █ ▀█ █ █ █ █ ▀▄ ▀ ▀ ▀▀▀ ▀ ▀ ▀▀▀▀ ▀ ▀▀▀▀▀ ▀ ▀ zero-dependency console rendering
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Terminal.Write(new Logo("Monster", "[muted]zero-dependency console rendering[/]"));New-ConsoleLogo 'Monster' -Tagline '[muted]zero-dependency console rendering[/]' | Write-ConsoleWidgetLayout
Containers that place other widgets. Any widget can sit inside any container, including a live dashboard.
Panel
60 × 3A border around any widget, with a title, a caption on the right and a footer.
╭─ Forest ───────────────────────────────── ad.evotec.xyz ─╮ │ Four controllers answered. DC02 lags by 42 minutes. │ ╰────────────────────────────────────────── checked 14:30 ─╯
╭─ Forest ───────────────────────────────── ad.evotec.xyz ─╮ │ Four controllers answered. DC02 lags by 42 minutes. │ ╰────────────────────────────────────────── checked 14:30 ─╯
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
TextBlock body = new TextBlock("Four controllers answered. [warn]DC02[/] lags by 42 minutes.");
Panel panel = new Panel(body, "[bold]Forest[/]") {
Caption = "ad.evotec.xyz",
Footer = "[muted]checked 14:30[/]"
};
Terminal.Write(panel);New-ConsolePanel -Title '[bold]Forest[/]' -Caption 'ad.evotec.xyz' -Footer '[muted]checked 14:30[/]' {
New-ConsoleText -Markup 'Four controllers answered. [warn]DC02[/] lags by 42 minutes.'
} | Write-ConsoleWidgetRows and columns
60 × 5Stack widgets vertically or side by side; columns share the width by weight.
╭─ Results ─────────────────╮ ╭─ Problems ─────────────────╮ │ √ 412 passed │ │ ✗ 23 failed │ │ ▲ 51 warnings │ │ - 14 skipped │ ╰───────────────────────────╯ ╰────────────────────────────╯ ── 2 domains, 10 controllers ───────────────────────────────
╭─ Results ─────────────────╮ ╭─ Problems ─────────────────╮ │ √ 412 passed │ │ ✗ 23 failed │ │ ▲ 51 warnings │ │ - 14 skipped │ ╰───────────────────────────╯ ╰────────────────────────────╯ ── 2 domains, 10 controllers ───────────────────────────────
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Panel results = new Panel(new TextBlock("[pass]√[/] 412 passed\n[warn]▲[/] 51 warnings"), "Results");
Panel problems = new Panel(new TextBlock("[fail]✗[/] 23 failed\n[muted]-[/] 14 skipped"), "Problems");
Rule footer = new Rule("[muted]2 domains, 10 controllers[/]");
Terminal.Write(new Rows(new Columns(results, problems), footer));New-ConsoleRows {
New-ConsoleColumns {
New-ConsolePanel -Title 'Results' { "[pass]√[/] 412 passed`n[warn]▲[/] 51 warnings" }
New-ConsolePanel -Title 'Problems' { "[fail]✗[/] 23 failed`n[muted]-[/] 14 skipped" }
}
New-ConsoleRule '[muted]2 domains, 10 controllers[/]'
} | Write-ConsoleWidgetGrid
60 × 9Equal cells in a fixed number of columns, filled left to right.
╭─ DC01 ─────────────────────╮ ╭─ DC02 ────────────────────╮ │ √ healthy │ │ ▲ lagging │ ╰────────────────────────────╯ ╰───────────────────────────╯ ╭─ DC03 ─────────────────────╮ ╭─ DC04 ────────────────────╮ │ √ healthy │ │ ✗ offline │ ╰────────────────────────────╯ ╰───────────────────────────╯ ╭─ DC05 ─────────────────────╮ │ √ healthy │ ╰────────────────────────────╯
╭─ DC01 ─────────────────────╮ ╭─ DC02 ────────────────────╮ │ √ healthy │ │ ▲ lagging │ ╰────────────────────────────╯ ╰───────────────────────────╯ ╭─ DC03 ─────────────────────╮ ╭─ DC04 ────────────────────╮ │ √ healthy │ │ ✗ offline │ ╰────────────────────────────╯ ╰───────────────────────────╯ ╭─ DC05 ─────────────────────╮ │ √ healthy │ ╰────────────────────────────╯
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Grid grid = new Grid(3,
new Panel(new TextBlock("[pass]√ healthy[/]"), "DC01"),
new Panel(new TextBlock("[warn]▲ lagging[/]"), "DC02"),
new Panel(new TextBlock("[pass]√ healthy[/]"), "DC03"),
new Panel(new TextBlock("[fail]✗ offline[/]"), "DC04"),
new Panel(new TextBlock("[pass]√ healthy[/]"), "DC05"));
Terminal.Write(grid);New-ConsoleGrid -Columns 3 {
New-ConsolePanel -Title 'DC01' { '[pass]√ healthy[/]' }
New-ConsolePanel -Title 'DC02' { '[warn]▲ lagging[/]' }
New-ConsolePanel -Title 'DC03' { '[pass]√ healthy[/]' }
New-ConsolePanel -Title 'DC04' { '[fail]✗ offline[/]' }
New-ConsolePanel -Title 'DC05' { '[pass]√ healthy[/]' }
} | Write-ConsoleWidgetPadding and align
60 × 5Space around a widget, and placement inside the space it is given.
╭─ Align ───────────────────╮ ╭─ Padding ──────────────────╮ │ centred │ │ │ │ │ │ two cells of padding │ │ │ │ │ ╰───────────────────────────╯ ╰────────────────────────────╯
╭─ Align ───────────────────╮ ╭─ Padding ──────────────────╮ │ centred │ │ │ │ │ │ two cells of padding │ │ │ │ │ ╰───────────────────────────╯ ╰────────────────────────────╯
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Panel left = new Panel(new Align(new TextBlock("[bold]centred[/]")), "Align");
Panel right = new Panel(new Padding(new TextBlock("two cells of padding"), 2, 1, 2, 1), "Padding");
Terminal.Write(new Columns(left, right));New-ConsoleColumns {
New-ConsolePanel -Title 'Align' { New-ConsoleAlign { '[bold]centred[/]' } }
New-ConsolePanel -Title 'Padding' {
$text = [ConsoleMonster.Widgets.TextBlock]::new('two cells of padding')
[ConsoleMonster.Layout.Padding]::new($text, 2, 1, 2, 1)
}
} | Write-ConsoleWidgetStack
60 × 5Layers drawn on top of each other: a badge over a chart.
╭─ Stack ───────────────────────────── badge over a chart ─╮ │ ▁▃ LIVE │ │ ▁▃▂▄▅▄▆█▇████████ │ │ ▄▄▄▅▇███████████████████ │ ╰──────────────────────────────────────────────────────────╯
╭─ Stack ───────────────────────────── badge over a chart ─╮ │ ▁▃ LIVE │ │ ▁▃▂▄▅▄▆█▇████████ │ │ ▄▄▄▅▇███████████████████ │ ╰──────────────────────────────────────────────────────────╯
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Sparkline load = new Sparkline { Height = 3, ShowLatest = false };
load.AddRange(new double[] { 12, 14, 13, 18, 22, 26, 25, 31, 36, 34, 40, 44 });
load.AddRange(new double[] { 41, 47, 52, 49, 55, 61, 58, 64, 70, 66, 73, 79 });
Align badge = new Align(new TextBlock("[pass] LIVE [/]"), HorizontalAlignment.Right);
Stack stack = new Stack(load, badge);
Terminal.Write(new Panel(stack, "Stack") { Caption = "badge over a chart" });$load = New-ConsoleSparkline -Height 3 -Value 12, 14, 13, 18, 22, 26, 25, 31, 36, 34, 40, 44, 41, 47, 52, 49, 55, 61, 58, 64, 70, 66, 73, 79
$load.ShowLatest = $false
New-ConsolePanel -Title 'Stack' -Caption 'badge over a chart' {
New-ConsoleStack {
$load
New-ConsoleAlign -Horizontal Right { '[pass] LIVE [/]' }
}
} | Write-ConsoleWidgetStatus and progress
The widgets a live session updates: facts, steps, trees, bars, phases, spinners and the log region.
Key/value list
60 × 5Aligned facts with optional status marks, as a summary beside a run.
Module ConsoleMonster Version 0.0.4 → 2.0.0 Frameworks netstandard2.0, net472, net8.0 Signing – skipped Tests ▴ 1 skipped on PowerShell 7
Module ConsoleMonster Version 0.0.4 → 2.0.0 Frameworks netstandard2.0, net472, net8.0 Signing – skipped Tests ▴ 1 skipped on PowerShell 7
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
KeyValueList facts = new KeyValueList()
.Add("Module", "[bold]ConsoleMonster[/]")
.Add("Version", "0.0.4 [muted]→[/] [bold]2.0.0[/]")
.Add("Frameworks", "netstandard2.0, net472, net8.0")
.Add("Signing", "skipped", StatusKind.Skip)
.Add("Tests", "1 skipped on PowerShell 7", StatusKind.Warn);
Terminal.Write(facts);$facts = New-ConsoleKeyValue -Markup ([ordered] @{
Module = '[bold]ConsoleMonster[/]'
Version = '0.0.4 [muted]→[/] [bold]2.0.0[/]'
Frameworks = 'netstandard2.0, net472, net8.0'
})
$facts.Add('Signing', 'skipped', 'Skip').Add('Tests', '1 skipped on PowerShell 7', 'Warn') | Write-ConsoleWidgetStatus list
60 × 6Steps with a status symbol and a detail on the right.
✓ Restore NuGet packages 1.6 s ✓ Compile ConsoleMonster 4.7 s ▴ Run Pester on PowerShell 7 1 skipped – Sign module files skipped ⠋ Pack ConsoleMonster.2.0.0.nupkg ○ Publish to PowerShell Gallery
✓ Restore NuGet packages 1.6 s ✓ Compile ConsoleMonster 4.7 s ▴ Run Pester on PowerShell 7 1 skipped – Sign module files skipped ⠋ Pack ConsoleMonster.2.0.0.nupkg ○ Publish to PowerShell Gallery
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
StatusList steps = new StatusList()
.Add("Restore NuGet packages", StatusKind.Pass, "1.6 s")
.Add("Compile ConsoleMonster", StatusKind.Pass, "4.7 s")
.Add("Run Pester on PowerShell 7", StatusKind.Warn, "1 skipped")
.Add("Sign module files", StatusKind.Skip, "skipped")
.Add("Pack ConsoleMonster.2.0.0.nupkg", StatusKind.Running)
.Add("Publish to PowerShell Gallery", StatusKind.Pending);
Terminal.Write(steps);$steps = New-ConsoleStatusList
$steps.Add('Restore NuGet packages', 'Pass', '1.6 s').
Add('Compile ConsoleMonster', 'Pass', '4.7 s').
Add('Run Pester on PowerShell 7', 'Warn', '1 skipped').
Add('Sign module files', 'Skip', 'skipped').
Add('Pack ConsoleMonster.2.0.0.nupkg', 'Running').
Add('Publish to PowerShell Gallery', 'Pending') | Write-ConsoleWidgetTree
60 × 8Nested items with guides, status symbols and notes.
evotec.xyz ├── ✓ MX 2 records │ └── evotec-xyz.mail.protection.outlook.com priority 0 ├── ▴ SPF 9 of 10 DNS lookups │ ├── include:spf.protection.outlook.com │ └── include:_spf.salesforce.com ├── ✗ DMARC p=none └── ✓ DKIM selector1, selector2
evotec.xyz ├── ✓ MX 2 records │ └── evotec-xyz.mail.protection.outlook.com priority 0 ├── ▴ SPF 9 of 10 DNS lookups │ ├── include:spf.protection.outlook.com │ └── include:_spf.salesforce.com ├── ✗ DMARC p=none └── ✓ DKIM selector1, selector2
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Tree tree = new Tree("[bold]evotec.xyz[/]");
TreeNode mx = tree.Add("MX", StatusKind.Pass, "2 records");
mx.Add("evotec-xyz.mail.protection.outlook.com", null, "priority 0");
TreeNode spf = tree.Add("SPF", StatusKind.Warn, "9 of 10 DNS lookups");
spf.Add("include:spf.protection.outlook.com");
spf.Add("include:_spf.salesforce.com");
tree.Add("DMARC", StatusKind.Fail, "p=none");
tree.Add("DKIM", StatusKind.Pass, "selector1, selector2");
Terminal.Write(tree);$tree = [ConsoleMonster.Widgets.Tree]::new('[bold]evotec.xyz[/]')
$mx = $tree.Add('MX', 'Pass', '2 records')
$mx.Add('evotec-xyz.mail.protection.outlook.com', $null, 'priority 0') | Out-Null
$spf = $tree.Add('SPF', 'Warn', '9 of 10 DNS lookups')
$spf.Add('include:spf.protection.outlook.com') | Out-Null
$spf.Add('include:_spf.salesforce.com') | Out-Null
$tree.Add('DMARC', 'Fail', 'p=none') | Out-Null
$tree.Add('DKIM', 'Pass', 'selector1, selector2') | Out-Null
$tree | Write-ConsoleWidgetProgress
60 × 4Labelled bars with a percentage and a count, in line or block shape.
Build ━━━━━━━━━━━━━━━━━━━━━━━━╾───────────── 64% 64/100 Tests ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╾──────── 77% 412/530 Docs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 100/100 Upload ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 37% 3/8
Build ━━━━━━━━━━━━━━━━━━━━━━━━╾───────────── 64% 64/100 Tests ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╾──────── 77% 412/530 Docs ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 100/100 Upload ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 37% 3/8
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Terminal.Write(new Rows(
new ProgressBar("Build") { Value = 64, Total = 100 },
new ProgressBar("Tests") { Value = 412, Total = 530 },
new ProgressBar("Docs") { Value = 100, Total = 100, Status = StatusKind.Pass },
new ProgressBar("Upload") { Value = 3, Total = 8, Shape = BarShape.Block }));New-ConsoleRows {
New-ConsoleProgress 'Build' -Value 64 -Total 100
New-ConsoleProgress 'Tests' -Value 412 -Total 530
$docs = New-ConsoleProgress 'Docs' -Value 100 -Total 100
$docs.Status = 'Pass'
$docs
New-ConsoleProgress 'Upload' -Value 3 -Total 8 -Shape Block
} | Write-ConsoleWidgetPhases
60 × 1A pipeline of stages: done, running and waiting.
✓ Discover 2.1s › ✓ Collect 14s › ⠋ Evaluate 64% › ○ Report
✓ Discover 2.1s › ✓ Collect 14s › ⠋ Evaluate 64% › ○ Report
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Phases phases = new Phases()
.Set("Discover", StatusKind.Pass, null, "2.1s")
.Set("Collect", StatusKind.Pass, null, "14s")
.Set("Evaluate", StatusKind.Running, null, "64%")
.Set("Report", StatusKind.Pending);
Terminal.Write(phases);$phases = New-ConsolePhases -Phase Discover, Collect, Evaluate, Report
$phases.Set('Discover', 'Pass', 'Discover', '2.1s').
Set('Collect', 'Pass', 'Collect', '14s').
Set('Evaluate', 'Running', 'Evaluate', '64%') | Write-ConsoleWidgetSpinner
60 × 3An activity with a detail, or its final state once it has finished.
⠋ Resolving DNS records zone 4 of 9 ✓ Schema snapshot cached ✗ Certificate chain expired 3 days ago
⠋ Resolving DNS records zone 4 of 9 ✓ Schema snapshot cached ✗ Certificate chain expired 3 days ago
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Terminal.Write(new Rows(
new Spinner("Resolving DNS records") { Detail = "zone 4 of 9" },
new Spinner("Schema snapshot") { Status = StatusKind.Pass, Detail = "cached" },
new Spinner("Certificate chain") { Status = StatusKind.Fail, Detail = "expired 3 days ago" }));New-ConsoleRows {
New-ConsoleSpinner 'Resolving DNS records' -Detail 'zone 4 of 9'
New-ConsoleSpinner 'Schema snapshot' -Detail 'cached' -Status Pass
New-ConsoleSpinner 'Certificate chain' -Detail 'expired 3 days ago' -Status Fail
} | Write-ConsoleWidgetLog region
60 × 5Timed log lines with levels; in a live session it collects Console and PowerShell output.
00:02 Discovered 4 domain controllers in 2 domains 00:31 WARN DC02: replication partner DC05 last success 3h a… 00:44 ERR DC02: USN rollback check failed (event 2095) 00:52 Collected 186 rule inputs from DC01 00:53 VERB Using cached schema snapshot
00:02 Discovered 4 domain controllers in 2 domains 00:31 WARN DC02: replication partner DC05 last success 3h a… 00:44 ERR DC02: USN rollback check failed (event 2095) 00:52 Collected 186 rule inputs from DC01 00:53 VERB Using cached schema snapshot
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
LogRegion log = new LogRegion { PreferredHeight = 5 };
log.Write("Discovered 4 domain controllers in 2 domains", "info", TimeSpan.FromSeconds(2));
log.Write("DC02: replication partner DC05 last success 3h ago", "warn", TimeSpan.FromSeconds(31));
log.Write("DC02: USN rollback check failed (event 2095)", "err", TimeSpan.FromSeconds(44));
log.Write("Collected 186 rule inputs from DC01", "info", TimeSpan.FromSeconds(52));
log.Write("Using cached schema snapshot", "verbose", TimeSpan.FromSeconds(53));
Terminal.Write(log);$log = New-ConsoleLog -Height 5
$log.Write('Discovered 4 domain controllers in 2 domains', 'info', [timespan]::FromSeconds(2))
$log.Write('DC02: replication partner DC05 last success 3h ago', 'warn', [timespan]::FromSeconds(31))
$log.Write('DC02: USN rollback check failed (event 2095)', 'err', [timespan]::FromSeconds(44))
$log.Write('Collected 186 rule inputs from DC01', 'info', [timespan]::FromSeconds(52))
$log.Write('Using cached schema snapshot', 'verbose', [timespan]::FromSeconds(53))
$log | Write-ConsoleWidgetCharts
Bars, stacked bars, sparklines, histograms and braille line and scatter charts, all scaled to their cells.
Bar chart
60 × 5Labelled bars scaled to the largest value, with the values on the right.
Domain controllers ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 14 Group Policy ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 9 Kerberos ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 6 DNS ▆▆▆▆▆▆▆▆▆▆▆ 4 PKI ▆▆▆▆▆ 2
Domain controllers ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 14 Group Policy ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 9 Kerberos ▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆▆ 6 DNS ▆▆▆▆▆▆▆▆▆▆▆ 4 PKI ▆▆▆▆▆ 2
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
BarChart failures = new BarChart { BarToken = ThemeToken.Fail }
.Add("Domain controllers", 14)
.Add("Group Policy", 9)
.Add("Kerberos", 6)
.Add("DNS", 4)
.Add("PKI", 2);
Terminal.Write(failures);$failures = New-ConsoleBarChart ([ordered] @{
'Domain controllers' = 14
'Group Policy' = 9
'Kerberos' = 6
'DNS' = 4
'PKI' = 2
})
$failures.BarToken = 'Fail'
$failures | Write-ConsoleWidgetStacked bar
60 × 3Parts of a whole in one bar, with a legend of counts and shares.
████████████████████████████████████████████████████████████ █ Passed 412 82% █ Warnings 51 10% █ Failed 23 4% █ Skipped 14 2%
████████████████████████████████████████████████████████████ █ Passed 412 82% █ Warnings 51 10% █ Failed 23 4% █ Skipped 14 2%
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
StackedBar results = new StackedBar()
.Add("Passed", 412, ThemeToken.Pass)
.Add("Warnings", 51, ThemeToken.Warn)
.Add("Failed", 23, ThemeToken.Fail)
.Add("Skipped", 14, ThemeToken.Skip);
Terminal.Write(results);$results = New-ConsoleBarChart -Stacked
$results.Add('Passed', 412, 'Pass').
Add('Warnings', 51, 'Warn').
Add('Failed', 23, 'Fail').
Add('Skipped', 14, 'Skip') | Write-ConsoleWidgetSparkline
60 × 5A compact trend in one or more rows, with the latest value.
rules/s ▂▃▂▃▃▃▄▄▄▅▅▅▅▆▆▆▆▆▇▇▇███ 60/s ▁▂▁▃▃▅▆▅▇█▇ ▁▂▂▄▃▅▇▆█▇███████████ ▇█▇█████████████████████ 60/s
rules/s ▂▃▂▃▃▃▄▄▄▅▅▅▅▆▆▆▆▆▇▇▇███ 60/s ▁▂▁▃▃▅▆▅▇█▇ ▁▂▂▄▃▅▇▆█▇███████████ ▇█▇█████████████████████ 60/s
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
double[] rate = { 18, 21, 19, 24, 27, 26, 31, 29, 34, 38, 36, 41, 39, 44, 47, 45, 50, 48, 53, 57, 54, 59, 62, 60 };
Sparkline compact = new Sparkline { Label = "rules/s", Unit = "/s" };
Sparkline tall = new Sparkline { Height = 3, Unit = "/s" };
compact.AddRange(rate);
tall.AddRange(rate);
Terminal.Write(new Rows(compact, tall) { Gap = 1 });$rate = 18, 21, 19, 24, 27, 26, 31, 29, 34, 38, 36, 41, 39, 44, 47, 45, 50, 48, 53, 57, 54, 59, 62, 60
New-ConsoleRows -Gap 1 {
New-ConsoleSparkline -Label 'rules/s' -Unit '/s' -Value $rate
New-ConsoleSparkline -Height 3 -Unit '/s' -Value $rate
} | Write-ConsoleWidgetHistogram
60 × 6Values counted into buckets with labelled edges.
5│ █████████ │ █████████ ████████ │ █████████ █████████ ████████ │████████ █████████ █████████ ████████ █████████ 0│████████ █████████ █████████ ████████ █████████ █████████ 0s 0.25s 0.5s 1s 2s 4s 8s
5│ █████████ │ █████████ ████████ │ █████████ █████████ ████████ │████████ █████████ █████████ ████████ █████████ 0│████████ █████████ █████████ ████████ █████████ █████████ 0s 0.25s 0.5s 1s 2s 4s 8s
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
Histogram durations = new Histogram(new double[] { 0, 0.25, 0.5, 1, 2, 4, 8 }) { Height = 5, Unit = "s" };
foreach (double seconds in new[] { 0.1, 0.2, 0.3, 0.3, 0.4, 0.6, 0.7, 0.7, 0.8, 0.9, 1.2, 1.4, 1.5, 1.9, 2.4, 3.1, 5.2 }) {
durations.Add(seconds);
}
Terminal.Write(durations);$seconds = 0.1, 0.2, 0.3, 0.3, 0.4, 0.6, 0.7, 0.7, 0.8, 0.9, 1.2, 1.4, 1.5, 1.9, 2.4, 3.1, 5.2
New-ConsoleHistogram -Edge 0, 0.25, 0.5, 1, 2, 4, 8 -Value $seconds -Height 5 -Unit 's' | Write-ConsoleWidgetLine chart
60 × 8Braille line series with an axis and a legend.
31│ ⢀⢄⣀⠤⠒⠢⠔⠊⠑⠢⠒⠒⠢⡠⠤⠤⡀ │⢀⠤⠒⠒⠊⠁ ⠑⠒⠒⠢⣀⣀ ⢀⣀⣀⠤⠊ │⠁ ⠉⠒⠤⠤⠤⡀ ⡠⠔⠤⠊⠁ │ ⠑⠉⠉⠑⠤⠤⠒⢄⡠⠔⠒⠤⠒⠉⠑⠊ │⣀⣀⣀ ⢀⣀⣀⣀⣀⣀⣀⡀ 0│ ⠉⠉⠉⠉⠉⠒⠒⠒⠒⠢⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠒⠒⠒⠊⠉⠉⠉⠉⠁ ⠈⠉⠉⠉⠉⠑⠒⠒⠒⠤⠤⠤⠤⠤⠤⠤ └───────────────────────────────────────────────────────── █ completed █ failed
31│ ⢀⢄⣀⠤⠒⠢⠔⠊⠑⠢⠒⠒⠢⡠⠤⠤⡀ │⢀⠤⠒⠒⠊⠁ ⠑⠒⠒⠢⣀⣀ ⢀⣀⣀⠤⠊ │⠁ ⠉⠒⠤⠤⠤⡀ ⡠⠔⠤⠊⠁ │ ⠑⠉⠉⠑⠤⠤⠒⢄⡠⠔⠒⠤⠒⠉⠑⠊ │⣀⣀⣀ ⢀⣀⣀⣀⣀⣀⣀⡀ 0│ ⠉⠉⠉⠉⠉⠒⠒⠒⠒⠢⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠒⠒⠒⠊⠉⠉⠉⠉⠁ ⠈⠉⠉⠉⠉⠑⠒⠒⠒⠤⠤⠤⠤⠤⠤⠤ └───────────────────────────────────────────────────────── █ completed █ failed
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
LineChart chart = new LineChart { Height = 7 };
chart.AddSeries("completed", ThemeToken.Accent);
chart.AddSeries("failed", ThemeToken.Fail);
for (int i = 0; i < 48; i++) {
chart.Add("completed", 20 + (9 * Math.Sin(i / 7.0)) + (i % 3));
chart.Add("failed", 3 + (2 * Math.Cos(i / 5.0)));
}
Terminal.Write(chart);$chart = New-ConsoleLineChart -Height 7
$null = $chart.AddSeries('completed', 'Accent')
$null = $chart.AddSeries('failed', 'Fail')
foreach ($i in 0..47) {
$null = $chart.Add('completed', 20 + 9 * [math]::Sin($i / 7) + $i % 3)
$null = $chart.Add('failed', 3 + 2 * [math]::Cos($i / 5))
}
$chart | Write-ConsoleWidgetScatter chart
60 × 7The same braille canvas as points instead of lines.
89ms│ ⢀ ⠄ ⠈ ⢀ ⠄ ⠈ │⠂ ⢀ ⡀ ⢀ ⠂ ⢀ ⢀ ⡀ ⡀⠈ ⢀ │ ⠂⡀⠡ ⠐ ⠠ ⠂⡀ ⢁ ⠐ ⠠ ⠂⡀⠁⠄ ⢂ ⠠ ⠐ ⠄ ⠁⡀ ⠈⠠ ⠐⢀ ⠄ ⠂⡀ ⠄⠐⢀ │ ⠈ ⠁ ⠁ ⠈ ⠂ ⠈ ⠁ ⠈ ⠐ ⠁ │ 0ms│ └───────────────────────────────────────────────────────
89ms│ ⢀ ⠄ ⠈ ⢀ ⠄ ⠈ │⠂ ⢀ ⡀ ⢀ ⠂ ⢀ ⢀ ⡀ ⡀⠈ ⢀ │ ⠂⡀⠡ ⠐ ⠠ ⠂⡀ ⢁ ⠐ ⠠ ⠂⡀⠁⠄ ⢂ ⠠ ⠐ ⠄ ⠁⡀ ⠈⠠ ⠐⢀ ⠄ ⠂⡀ ⠄⠐⢀ │ ⠈ ⠁ ⠁ ⠈ ⠂ ⠈ ⠁ ⠈ ⠐ ⠁ │ 0ms│ └───────────────────────────────────────────────────────
Same cells from PowerShell PowerShell 7.6 Windows PowerShell 5.1
LineChart chart = new LineChart { Height = 7, Scatter = true, Unit = "ms" };
chart.AddSeries("latency", ThemeToken.Accent2);
for (int i = 0; i < 60; i++) {
chart.Add("latency", 40 + ((i * 37) % 23) + (i % 7 == 0 ? 30 : 0));
}
Terminal.Write(chart);$chart = New-ConsoleLineChart -Height 7 -Scatter -Unit 'ms'
$null = $chart.AddSeries('latency', 'Accent2')
foreach ($i in 0..59) {
$null = $chart.Add('latency', 40 + ($i * 37) % 23 + $(if ($i % 7 -eq 0) { 30 } else { 0 }))
}
$chart | Write-ConsoleWidget