ConsoleMonster lets the same rendering script run on Windows PowerShell 5.1 and PowerShell 7, with object-oriented input and ordinary pipeline results. PwshSpectreConsole's installation guide requires PowerShell 7+ and recommends a Nerd Font for its full visual feature set. ConsoleMonster does not require a Nerd Font: it adapts its built-in symbols to the terminal's glyph tier. Neither statement means arbitrary emoji will work in every font.
Command map
| PwshSpectreConsole | ConsoleMonster | Note |
|---|---|---|
Format-SpectreTable | Show-ConsoleTable | Direct display; -AsWidget for composition, -AsString for plain text. |
Format-SpectreTree | Show-ConsoleTree, New-ConsoleTree | Build explicit nodes or supply hierarchical data. |
Format-SpectrePanel | New-ConsolePanel then Show-Console | Builder returns a widget; does not draw it. |
Write-SpectreHost | Write-ConsoleText -Markup | Escape untrusted bracketed text; semantic roles are available. |
Write-SpectreRule | Show-ConsoleRule | New-ConsoleRule constructs a reusable definition. |
Read-SpectreSelection, Read-SpectreSelectionGrouped | Read-ConsoleSelect -Display ... -GroupBy ... | Returns the selected original object. |
Read-SpectreMultiSelection, grouped variant | Read-ConsoleMultiSelect | Returns chosen objects; check cancellation behavior. |
Read-SpectreText, Read-SpectreConfirm | Read-ConsoleText, Read-ConsoleConfirm | Defaults and validation use different parameters. |
Invoke-SpectreCommandWithProgress | Use-ConsoleProgress or Invoke-ConsoleRun | Wrap native progress, or execute per-item work with a run view. |
Invoke-SpectreCommandWithStatus | Show-ConsoleStatusLine with try/finally | Explicitly complete the status line. |
Invoke-SpectreLive | Invoke-ConsoleDashboard | Session handles update named widgets. |
Write-SpectreFigletText | New-ConsoleLogo then Show-Console | Different lettering; no .flf font loading. |
New-SpectreChartItem, Format-SpectreBarChart | Show-ConsoleChart or New-ConsoleBarItem/New-ConsoleBarChart | Ordinary object rows work with the display command. |
Format-SpectreBreakdownChart | New-ConsoleBarChart -Stacked | Proportions, with ConsoleMonster's own legend/layout. |
Format-SpectreGrid, Format-SpectreColumns, Format-SpectreRows | New-ConsoleGrid, New-ConsoleColumns, New-ConsoleRows | Definitions; pipe the result to Show-Console. |
Format-SpectreJson, Format-SpectreException | Show-ConsoleJson, Show-ConsoleError | Display JSON or an error; do not emit new error records. |
Write-SpectreCalendar | No direct equivalent | See the roadmap. |
Shared sample data
Install with Install-Module ConsoleMonster -Scope CurrentUser and run Import-Module ConsoleMonster. For the left-hand examples import PwshSpectreConsole in PowerShell 7. Use these same rows for each example; none changes a real server.
$servers = @(
[pscustomobject] @{ Name = 'FS01'; Site = 'Warsaw'; Pending = 4; Status = 'Pass' }
[pscustomobject] @{ Name = 'SQL01'; Site = 'Dublin'; Pending = 12; Status = 'Warn' }
[pscustomobject] @{ Name = 'WEB01'; Site = 'Berlin'; Pending = 0; Status = 'Pass' }
)
1. Show an inventory table
PwshSpectreConsole
$servers | Format-SpectreTable
ConsoleMonster
$servers | Show-ConsoleTable -Property Name, Site, Pending, Status -Title 'Patch inventory'
$text = $servers | Show-ConsoleTable -Property Name, Pending -AsString
Show-ConsoleTable displays directly, rather than producing native Format-Table records. Keep the rows if later commands need objects. -AsString is plain text; use Export-ConsoleFrame -Format Markdown when you want a document.
Install-Module ConsoleMonster -Scope CurrentUser$servers = @(
[pscustomobject] @{ Name = 'FS01'; Site = 'Warsaw'; Pending = 4; Status = 'Pass' }
[pscustomobject] @{ Name = 'SQL01'; Site = 'Dublin'; Pending = 12; Status = 'Warn' }
[pscustomobject] @{ Name = 'WEB01'; Site = 'Berlin'; Pending = 0; Status = 'Pass' }
)
$servers | Show-ConsoleTable -Property Name, Site, Pending, Status -Title 'Patch inventory'Full program
Import-Module ConsoleMonster
$servers = @(
[pscustomobject] @{ Name = 'FS01'; Site = 'Warsaw'; Pending = 4; Status = 'Pass' }
[pscustomobject] @{ Name = 'SQL01'; Site = 'Dublin'; Pending = 12; Status = 'Warn' }
[pscustomobject] @{ Name = 'WEB01'; Site = 'Berlin'; Pending = 0; Status = 'Pass' }
)
$servers | Show-ConsoleTable -Property Name, Site, Pending, Status -Title 'Patch inventory'Run: ./report.ps1
dotnet new console -n InventoryReport
cd InventoryReport
dotnet add package ConsoleMonstervar servers = new[] {
new { Name = "FS01", Site = "Warsaw", Pending = 4, Status = "Pass" },
new { Name = "SQL01", Site = "Dublin", Pending = 12, Status = "Warn" },
new { Name = "WEB01", Site = "Berlin", Pending = 0, Status = "Pass" }
};
Terminal.Write(Table.For(servers)
.Column(s => s.Name)
.Column(s => s.Site)
.Column(s => s.Pending)
.Column(s => s.Status, column => column.WithPresenter(CellPresenters.StatusWord))
.WithTitle("Patch inventory"));Full program
using ConsoleMonster;
using ConsoleMonster.Presenters;
using ConsoleMonster.Widgets;
var servers = new[] {
new { Name = "FS01", Site = "Warsaw", Pending = 4, Status = "Pass" },
new { Name = "SQL01", Site = "Dublin", Pending = 12, Status = "Warn" },
new { Name = "WEB01", Site = "Berlin", Pending = 0, Status = "Pass" }
};
Terminal.Write(Table.For(servers)
.Column(s => s.Name)
.Column(s => s.Site)
.Column(s => s.Pending)
.Column(s => s.Status, column => column.WithPresenter(CellPresenters.StatusWord))
.WithTitle("Patch inventory"));Run: dotnet run
Patch inventory ╭───────┬────────┬─────────┬────────╮ │ Name │ Site │ Pending │ Status │ ├───────┼────────┼─────────┼────────┤ │ FS01 │ Warsaw │ 4 │ ✓ Pass │ │ SQL01 │ Dublin │ 12 │ ▴ Warn │ │ WEB01 │ Berlin │ 0 │ ✓ Pass │ ╰───────┴────────┴─────────┴────────╯
Patch inventory ╭───────┬────────┬─────────┬────────╮ │ Name │ Site │ Pending │ Status │ ├───────┼────────┼─────────┼────────┤ │ FS01 │ Warsaw │ 4 │ ✓ Pass │ │ SQL01 │ Dublin │ 12 │ ▴ Warn │ │ WEB01 │ Berlin │ 0 │ ✓ Pass │ ╰───────┴────────┴─────────┴────────╯
Patch inventory ╭───────┬────────┬─────────┬────────╮ │ Name │ Site │ Pending │ Status │ ├───────┼────────┼─────────┼────────┤ │ FS01 │ Warsaw │ 4 │ ✓ Pass │ │ SQL01 │ Dublin │ 12 │ ▴ Warn │ │ WEB01 │ Berlin │ 0 │ ✓ Pass │ ╰───────┴────────┴─────────┴────────╯
Patch inventory ╭───────┬────────┬─────────┬────────╮ │ Name │ Site │ Pending │ Status │ ├───────┼────────┼─────────┼────────┤ │ FS01 │ Warsaw │ 4 │ ✓ Pass │ │ SQL01 │ Dublin │ 12 │ ▴ Warn │ │ WEB01 │ Berlin │ 0 │ ✓ Pass │ ╰───────┴────────┴─────────┴────────╯
This full program produces the shown output, including explicit column order and a narrow-window layout.
2. Select a server and collect a ticket
PwshSpectreConsole
$name = Read-SpectreSelection -Message 'Target server' -Choices $servers.Name
$ticket = Read-SpectreText -Message 'Change ticket' -DefaultAnswer 'CHG0042'
$review = Read-SpectreConfirm -Message "Review $name?"
ConsoleMonster
$server = $servers | Read-ConsoleSelect 'Target server' -Display Name -GroupBy Site
$ticket = Read-ConsoleText 'Change ticket' -Default 'CHG0042' -Required
$review = Read-ConsoleConfirm "Review $($server.Name)?" -Default $false
The right-hand selection preserves Site, Pending and Status on the chosen object. Use Read-ConsoleMultiSelect for several rows. Handle the terminating PromptCanceled error on cancellation; do not silently treat cancellation as approval. In unattended runs provide values yourself, or use explicit defaults and -Mode None where appropriate.
3. Report progress while collecting data
PwshSpectreConsole
Invoke-SpectreCommandWithProgress -ScriptBlock {
param($context)
$task = $context.AddTask('Inventory')
foreach ($server in $servers) {
Start-Sleep -Milliseconds 100
$task.Increment(100 / $servers.Count)
}
}
ConsoleMonster
Use-ConsoleProgress {
for ($i = 0; $i -lt $servers.Count; $i++) {
Write-Progress -Activity 'Inventory' -Status $servers[$i].Name `
-PercentComplete ($i * 100 / $servers.Count)
Start-Sleep -Milliseconds 100
}
Write-Progress -Activity 'Inventory' -Completed
}
The sleep represents the collection operation. ConsoleMonster can draw existing Write-Progress calls, so native progress scripts do not need Spectre task objects. For per-server results and concurrency, use live runs; their execution and error contracts differ from a single progress wrapper.
4. A scoped status line
PwshSpectreConsole
$names = Invoke-SpectreCommandWithStatus -Title 'Reading inventory' -ScriptBlock {
$servers.Name
}
ConsoleMonster
try {
Show-ConsoleStatusLine 'Reading inventory' -Spinner
$names = $servers.Name
} finally {
Show-ConsoleStatusLine -Complete
}
Complete the line even when the work throws. This operation is separate from a New-ConsoleStatusList checklist or an Invoke-ConsoleDashboard live layout.
5. Heading and message
PwshSpectreConsole
Write-SpectreFigletText -Text 'Ops'
Write-SpectreRule -Title 'Patch inventory'
Write-SpectreHost '[yellow]SQL01 needs review[/]'
ConsoleMonster
New-ConsoleLogo 'Ops' | Show-Console
Show-ConsoleRule 'Patch inventory'
Write-ConsoleText -Markup '[warn]SQL01 needs review[/]'
The built-in logo lettering is different. Literal text is the default for Write-ConsoleText; -Markup opts into parsing. Use New-ConsoleText to compose styled cells and labels.
6. Chart pending patches
PwshSpectreConsole
$items = foreach ($server in $servers) {
New-SpectreChartItem -Label $server.Name -Value $server.Pending -Color Yellow
}
Format-SpectreBarChart -Data $items -Label 'Pending patches'
ConsoleMonster
$servers | Show-ConsoleChart -Label Name -Property Pending -Type Bar
# For composition, build the chart and pass the widget to a panel/dashboard.
Differences to know
New-*creates definitions,Show-*renders or opens a viewer,Read-*returns answers,Invoke-*executes and waits, andStart-ConsoleRunreturns a running handle. The names describe lifetimes rather than mirror Spectre's method names.Show-* -AsStringand-AsWidgetsuppress host display. Export commands own file formats. The native PowerShell pipeline remains objects until a deliberate display/export boundary.- PowerShell 5.1 uses the .NET Framework build; PowerShell 7 isolates the binary module in its own assembly load context. Test scripts on the hosts you support; running in PowerShell 7 does not establish native 5.1 proof.
- A Nerd Font is unnecessary for built-in rendering. ASCII/plain fallback is available; custom glyphs and emoji still need a font that contains them.
- No automatic conversion exists for Spectre renderables, Figlet fonts or calendar output. Check the roadmap before replacing those paths.
Sources and next steps
Checked 25 October 2026: installation and font guidance, PwshSpectreConsole command reference, and the maintained source and generated command examples. This guide does not describe PwshSpectreConsole as discontinued.
Next: PowerShell conventions, interactive screens, ConsoleMonster command reference or all migration guides.