Skip to content
ConsoleMonster

Colour schemes

Dracula, Nord, Solarized, Gruvbox, Catppuccin and Tokyo Night, drawn faithfully and accessibly, with what the theme checker says about each.

A colour scheme is what every terminal already stores: sixteen ANSI colours, a foreground and a background. ConsoleMonster derives a whole theme from one, so widgets look like the terminal they run in, and keep looking like it in exports and recordings.

Each scheme comes in two forms:

  • Faithful uses the published colours unchanged. It looks exactly like the scheme, and the checker says honestly where it falls short: statuses that look alike with colour blindness, or text below 4.5:1 contrast.
  • Accessible is built from the same colours. It first picks the pass, warning and fail colours from the scheme's own sixteen that stay furthest apart, then adjusts lightness (never hue) where that is not enough. Every accessible variant below passes every check.

Choose one for every session:

Set-ConsoleTheme Dracula -Save                  # faithful
Set-ConsoleTheme Dracula -Accessible -Save      # saved as 'Dracula · accessible'
Set-ConsoleTheme Solarized -Save                # Solarized Dark or Light, whichever suits the terminal
Set-ConsoleTheme 'Catppuccin Latte' -Save       # one variant, whatever the background
Test-ConsoleTheme -Detailed                     # every measurement of the active theme

Show-ConsoleSetting lists the schemes in their own group, each family with its variants and an accessible entry beside each, and redraws the preview on that scheme's background as you move through them. A family name (Solarized, Gruvbox, Catppuccin, Tokyo Night) picks the variant for your terminal's background (dark when it cannot tell); a variant name such as Gruvbox Light or Tokyo Night Dark always chooses that one. Dracula and Nord are dark only. Status words (Set-ConsoleSetting StatusMarkers Words -Save) work with any scheme.

Every figure below is the same program, the settings picker's preview, drawn on the scheme's own background. Under each window is the checker's verdict; open it for the full report.

Dracula

Dracula Faithful60 columns
Dracula: 7 problems
  • Muted text is too faint: 3.0:1, needs 4.5:1
  • Skip text is too faint: 3.0:1, needs 4.5:1
  • Pending text is too faint: 3.0:1, needs 4.5:1
  • Low text is too faint: 3.0:1, needs 4.5:1
  • Gap text is too faint: 3.0:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (6.7, needs 25)
  • Pass and fail look alike with deuteranopia (20.3, needs 25)
  • 20 other checks pass
Dracula Accessible60 columns
Dracula · accessible: passes every check
  • adjusted for contrast: Muted, Skip, Pending, Border, Low, Gap

Dracula's light counterpart is part of Dracula Pro, not the free scheme, so it has no light variant here.

Nord

Nord Faithful60 columns
Nord: 4 problems
  • Fail text is too faint: 3.1:1, needs 4.5:1
  • Critical text is too faint: 3.1:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (12.9, needs 25)
  • Pass and fail look alike with deuteranopia (18.8, needs 25)
  • 23 other checks pass
Nord Accessible60 columns
Nord · accessible: passes every check
  • adjusted for contrast: Accent2, Pass, Fail, SurfaceAccent, Series3, Series6, Critical

Solarized

Solarized Dark Faithful60 columns
Solarized Dark: 5 problems
  • Fail text is too faint: 3.2:1, needs 4.5:1
  • Critical text is too faint: 3.2:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (3.4, needs 25)
  • Pass and fail look alike with deuteranopia (11.3, needs 25)
  • Warning and fail look alike with deuteranopia (15.6, needs 25)
  • 22 other checks pass
Solarized Dark Accessible60 columns
Solarized Dark · accessible: passes every check
  • adjusted for contrast: Accent, Accent2, Pass, Fail, Highlight, Surface, SurfaceAccent, Series1, Series3, Series6, Focus, Critical

In Solarized Dark, bright black is the background colour itself, so muted text uses the scheme's white instead of drawing invisibly.

Solarized Light Faithful60 columns
Solarized Light: 10 problems
  • Text text is too faint: 4.1:1, needs 4.5:1
  • Pass text is too faint: 3.0:1, needs 4.5:1
  • Warn text is too faint: 3.0:1, needs 4.5:1
  • Fail text is too faint: 4.3:1, needs 4.5:1
  • Info text is too faint: 2.9:1, needs 4.5:1
  • Running text is too faint: 2.9:1, needs 4.5:1
  • Critical text is too faint: 4.3:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (3.4, needs 25)
  • Pass and fail look alike with deuteranopia and protanopia (6.8, needs 25)
  • Warning and fail look alike with deuteranopia and protanopia (10.2, needs 25)
  • 15 other checks pass
Solarized Light Accessible60 columns
Solarized Light · accessible: passes every check
  • adjusted for contrast: Text, Accent, Accent2, Pass, Fail, Warn, Info, Running, Title, Header, Highlight, Surface, SurfaceAccent, Series1, Series2, Series3, Series4, Series5, Series6, Focus, Strong, Critical

Gruvbox

Gruvbox Dark Faithful60 columns
Gruvbox Dark: 10 problems
  • Muted text is too faint: 4.0:1, needs 4.5:1
  • Fail text is too faint: 4.3:1, needs 4.5:1
  • Skip text is too faint: 4.0:1, needs 4.5:1
  • Pending text is too faint: 4.0:1, needs 4.5:1
  • Low text is too faint: 4.0:1, needs 4.5:1
  • Critical text is too faint: 4.3:1, needs 4.5:1
  • Gap text is too faint: 4.0:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (5.5, needs 25)
  • Pass and fail look alike with deuteranopia (1.7, needs 25)
  • Warning and fail look alike with deuteranopia (10.8, needs 25)
  • 17 other checks pass
Gruvbox Dark Accessible60 columns
Gruvbox Dark · accessible: passes every check
  • adjusted for contrast: Muted, Accent, Accent2, Fail, Warn, Skip, Pending, Border, SurfaceAccent, Series1, Series3, Series6, Low, Critical, Gap
Gruvbox Light Faithful60 columns
Gruvbox Light: 12 problems
  • Muted text is too faint: 3.2:1, needs 4.5:1
  • Pass text is too faint: 4.3:1, needs 4.5:1
  • Warn text is too faint: 3.3:1, needs 4.5:1
  • Info text is too faint: 4.4:1, needs 4.5:1
  • Skip text is too faint: 3.2:1, needs 4.5:1
  • Running text is too faint: 4.4:1, needs 4.5:1
  • Pending text is too faint: 3.2:1, needs 4.5:1
  • Low text is too faint: 3.2:1, needs 4.5:1
  • Gap text is too faint: 3.2:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (5.8, needs 25)
  • Pass and fail look alike with deuteranopia (12.1, needs 25)
  • Warning and fail look alike with deuteranopia (23.8, needs 25)
  • 15 other checks pass
Gruvbox Light Accessible60 columns
Gruvbox Light · accessible: passes every check
  • adjusted for contrast: Muted, Pass, Fail, Warn, Info, Skip, Running, Pending, Border, Series2, Series4, Series5, Low, Gap

Catppuccin

Catppuccin Mocha Faithful60 columns
Catppuccin Mocha: 2 problems
  • Pass and warning look alike with protanopia and deuteranopia (4.5, needs 25)
  • Pass and fail look alike with deuteranopia (20.8, needs 25)
  • 25 other checks pass
Catppuccin Mocha Accessible60 columns

Catppuccin Mocha · accessible: passes every check

Catppuccin Latte Faithful60 columns
Catppuccin Latte: 6 problems
  • Pass text is too faint: 3.0:1, needs 4.5:1
  • Warn text is too faint: 2.3:1, needs 4.5:1
  • Info text is too faint: 3.3:1, needs 4.5:1
  • Running text is too faint: 3.3:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (5.2, needs 25)
  • Pass and fail look alike with deuteranopia (9.4, needs 25)
  • 21 other checks pass
Catppuccin Latte Accessible60 columns
Catppuccin Latte · accessible: passes every check
  • adjusted for contrast: Accent, Accent2, Pass, Fail, Warn, Info, Running, Highlight, SurfaceAccent, Series1, Series2, Series3, Series4, Series5, Focus

Tokyo Night

Tokyo Night Dark Faithful60 columns
Tokyo Night Dark: 1 problem
  • Pass and warning look alike with deuteranopia and protanopia (2.2, needs 25)
  • 26 other checks pass
Tokyo Night Dark Accessible60 columns

Tokyo Night Dark · accessible: passes every check

Tokyo Night Day Faithful60 columns
Tokyo Night Day: 14 problems
  • Muted text is too faint: 3.6:1, needs 4.5:1
  • Pass text is too faint: 4.0:1, needs 4.5:1
  • Warn text is too faint: 3.7:1, needs 4.5:1
  • Fail text is too faint: 3.0:1, needs 4.5:1
  • Info text is too faint: 4.3:1, needs 4.5:1
  • Skip text is too faint: 3.6:1, needs 4.5:1
  • Running text is too faint: 4.3:1, needs 4.5:1
  • Pending text is too faint: 3.6:1, needs 4.5:1
  • Low text is too faint: 3.6:1, needs 4.5:1
  • Critical text is too faint: 3.0:1, needs 4.5:1
  • Gap text is too faint: 3.6:1, needs 4.5:1
  • Pass and warning look alike with protanopia and deuteranopia (3.8, needs 25)
  • Pass and fail look alike with deuteranopia (14.2, needs 25)
  • Warning and fail look alike with deuteranopia (11.3, needs 25)
  • 13 other checks pass
Tokyo Night Day Accessible60 columns
Tokyo Night Day · accessible: passes every check
  • adjusted for contrast: Muted, Accent, Pass, Fail, Warn, Info, Skip, Running, Pending, Border, Highlight, Surface, SurfaceAccent, Series1, Series2, Series4, Series5, Series6, Focus, Low, Critical, Gap

The program behind the figures

Each window runs this program with the scheme's theme. In C#, choose one by name, Terminal.Theme = Theme.FromName("Dracula · accessible");, or walk Theme.Schemes and derive either form with Theme.FromScheme(entry.Scheme, accessible).

C#Program.cs
// The settings picker's preview: every status, a table, a progress bar, a chart and an error line.
DateTime when = new DateTime(2026, 11, 9, 14, 30, 0);
Table table = new Table { CardsBelow = 0 }
    .AddColumn("Check")
    .AddColumn("State")
    .AddColumn("Size", c =>
    {
        c.Presenter = CellPresenters.Bytes;
        c.Alignment = HorizontalAlignment.Right;
    })
    .AddColumn("Changed", c =>
    {
        c.Presenter = CellPresenters.Date;
        c.Priority = -1;
    });
table.AddRow("Backups", TableCell.ForStatus(StatusKind.Pass, "passed"),
    TableCell.FromValue(52_428_800L), TableCell.FromValue(when));
table.AddRow("Certificates", TableCell.ForStatus(StatusKind.Warn, "expiring"),
    TableCell.FromValue(4_096L), TableCell.FromValue(when.AddDays(-3)));
table.AddRow("Replication", TableCell.ForStatus(StatusKind.Fail, "failed"),
    TableCell.FromValue(1_288_490_189L), TableCell.FromValue(when.AddHours(-5)));
StatusList status = new StatusList()
    .Add("Build", StatusKind.Pass, "1 m 12 s")
    .Add("Tests", StatusKind.Warn, "2 skipped")
    .Add("Deploy", StatusKind.Fail, "timed out")
    .Add("Notify", StatusKind.Running);
BarChart chart = new BarChart().Add("web", 42).Add("sql", 87).Add("files", 23);
ProgressBar progress = new ProgressBar("Copying") { Value = 64, Total = 100 };
TextBlock error = TextBlock.FromMarkup(
    "[fail]Error:[/] [muted]Cannot reach[/] [accent]sql01.contoso.test[/]"
        + " [muted](port 1433)[/]");
Terminal.Write(new Rows(table, new Columns(status, new Rows(progress, chart)), error) { Gap = 1 });
Full program
using ConsoleMonster;
using ConsoleMonster.Layout;
using ConsoleMonster.Presenters;
using ConsoleMonster.Styling;
using ConsoleMonster.Widgets;

// The settings picker's preview: every status, a table, a progress bar, a chart and an error line.
DateTime when = new DateTime(2026, 11, 9, 14, 30, 0);
Table table = new Table { CardsBelow = 0 }
    .AddColumn("Check")
    .AddColumn("State")
    .AddColumn("Size", c =>
    {
        c.Presenter = CellPresenters.Bytes;
        c.Alignment = HorizontalAlignment.Right;
    })
    .AddColumn("Changed", c =>
    {
        c.Presenter = CellPresenters.Date;
        c.Priority = -1;
    });
table.AddRow("Backups", TableCell.ForStatus(StatusKind.Pass, "passed"),
    TableCell.FromValue(52_428_800L), TableCell.FromValue(when));
table.AddRow("Certificates", TableCell.ForStatus(StatusKind.Warn, "expiring"),
    TableCell.FromValue(4_096L), TableCell.FromValue(when.AddDays(-3)));
table.AddRow("Replication", TableCell.ForStatus(StatusKind.Fail, "failed"),
    TableCell.FromValue(1_288_490_189L), TableCell.FromValue(when.AddHours(-5)));
StatusList status = new StatusList()
    .Add("Build", StatusKind.Pass, "1 m 12 s")
    .Add("Tests", StatusKind.Warn, "2 skipped")
    .Add("Deploy", StatusKind.Fail, "timed out")
    .Add("Notify", StatusKind.Running);
BarChart chart = new BarChart().Add("web", 42).Add("sql", 87).Add("files", 23);
ProgressBar progress = new ProgressBar("Copying") { Value = 64, Total = 100 };
TextBlock error = TextBlock.FromMarkup(
    "[fail]Error:[/] [muted]Cannot reach[/] [accent]sql01.contoso.test[/]"
        + " [muted](port 1433)[/]");
Terminal.Write(new Rows(table, new Columns(status, new Rows(progress, chart)), error) { Gap = 1 });
C# fluentProgram.cs
// The settings picker's preview: every status, a table, a progress bar, a chart and an error line.
DateTime when = new DateTime(2026, 11, 9, 14, 30, 0);
Table table = Ui.Table()
    .CardsBelow(0)
    .AddColumn("Check")
    .AddColumn("State")
    .AddColumn("Size", c =>
    {
        c.Presenter(CellPresenters.Bytes).Alignment(HorizontalAlignment.Right);
    })
    .AddColumn("Changed", c =>
    {
        c.Presenter(CellPresenters.Date).Priority(-1);
    })
    .AddRow("Backups", TableCell.ForStatus(StatusKind.Pass, "passed"),
        TableCell.FromValue(52_428_800L), TableCell.FromValue(when))
    .AddRow("Certificates", TableCell.ForStatus(StatusKind.Warn, "expiring"),
        TableCell.FromValue(4_096L), TableCell.FromValue(when.AddDays(-3)))
    .AddRow("Replication", TableCell.ForStatus(StatusKind.Fail, "failed"),
        TableCell.FromValue(1_288_490_189L), TableCell.FromValue(when.AddHours(-5)));
StatusList status = Ui.StatusList()
    .Add("Build", StatusKind.Pass, "1 m 12 s")
    .Add("Tests", StatusKind.Warn, "2 skipped")
    .Add("Deploy", StatusKind.Fail, "timed out")
    .Add("Notify", StatusKind.Running);
BarChart chart = Ui.BarChart().Add("web", 42).Add("sql", 87).Add("files", 23);
ProgressBar progress = Ui.ProgressBar().Label("Copying").Value(64).Total(100);
TextBlock error = Ui.Markup("[fail]Error:[/] [muted]Cannot reach[/] [accent]sql01.contoso.test[/]"
    + " [muted](port 1433)[/]");
Ui.Rows().Gap(1).Content(rowsContent2 =>
{
    rowsContent2.Add(table);
    rowsContent2.Columns(columns => columns.Content(columnsContent =>
    {
        columnsContent.Add(status);
        columnsContent.Rows(r => r.Content(rowsContent =>
        {
            rowsContent.Add(progress);
            rowsContent.Add(chart);
        }));
    }));
    rowsContent2.Add(error);
}).Show();
Full program
using ConsoleMonster;
using ConsoleMonster.Layout;
using ConsoleMonster.Presenters;
using ConsoleMonster.Styling;
using ConsoleMonster.Widgets;

// The settings picker's preview: every status, a table, a progress bar, a chart and an error line.
DateTime when = new DateTime(2026, 11, 9, 14, 30, 0);
Table table = Ui.Table()
    .CardsBelow(0)
    .AddColumn("Check")
    .AddColumn("State")
    .AddColumn("Size", c =>
    {
        c.Presenter(CellPresenters.Bytes).Alignment(HorizontalAlignment.Right);
    })
    .AddColumn("Changed", c =>
    {
        c.Presenter(CellPresenters.Date).Priority(-1);
    })
    .AddRow("Backups", TableCell.ForStatus(StatusKind.Pass, "passed"),
        TableCell.FromValue(52_428_800L), TableCell.FromValue(when))
    .AddRow("Certificates", TableCell.ForStatus(StatusKind.Warn, "expiring"),
        TableCell.FromValue(4_096L), TableCell.FromValue(when.AddDays(-3)))
    .AddRow("Replication", TableCell.ForStatus(StatusKind.Fail, "failed"),
        TableCell.FromValue(1_288_490_189L), TableCell.FromValue(when.AddHours(-5)));
StatusList status = Ui.StatusList()
    .Add("Build", StatusKind.Pass, "1 m 12 s")
    .Add("Tests", StatusKind.Warn, "2 skipped")
    .Add("Deploy", StatusKind.Fail, "timed out")
    .Add("Notify", StatusKind.Running);
BarChart chart = Ui.BarChart().Add("web", 42).Add("sql", 87).Add("files", 23);
ProgressBar progress = Ui.ProgressBar().Label("Copying").Value(64).Total(100);
TextBlock error = Ui.Markup("[fail]Error:[/] [muted]Cannot reach[/] [accent]sql01.contoso.test[/]"
    + " [muted](port 1433)[/]");
Ui.Rows().Gap(1).Content(rowsContent2 =>
{
    rowsContent2.Add(table);
    rowsContent2.Columns(columns => columns.Content(columnsContent =>
    {
        columnsContent.Add(status);
        columnsContent.Rows(r => r.Content(rowsContent =>
        {
            rowsContent.Add(progress);
            rowsContent.Add(chart);
        }));
    }));
    rowsContent2.Add(error);
}).Show();

Sources and licences

Every palette is read from the scheme's own repository, never from an aggregate collection, and is used unchanged in the faithful form.

SchemeSourceLicence
Draculadracula/windows-terminalMIT
Nordnordtheme/nordMIT
Solarized Dark, Solarized Lightaltercation/solarizedMIT
Gruvbox Dark, Gruvbox Lightmorhetz/gruvboxMIT
Catppuccin Mocha, Catppuccin Lattecatppuccin/windows-terminalMIT
Tokyo Night Dark, Tokyo Night Dayfolke/tokyonight.nvimApache-2.0

Next

  • Themes: built-in themes, following your terminal and importing any other scheme with Import-ConsoleTheme.
  • Check a theme: what Test-ConsoleTheme measures and how to read its report.
  • Accessibility: status words, high contrast and the colour-blind safe themes.

Edit this page on GitHub