Custom Waiting Spinner - Spectre Console Series
Spectre Console is a .NET library that allows you to create beautiful console applications with rich output, color, and formatting. Tim Corey begins his “Build a Custom Waiting Spinner - Spectre Console Series” video by reminding us that Spectre Console turns plain C# console applications into more visually appealing and informative tools. In this lesson, Tim shows how to implement a custom loading spinner — a small but powerful feature that can make your console program’s status and progress indicators easier to follow.
Tim explains at 0:16 that the source code for the project is linked below the video. He encourages viewers to test and experiment with it themselves, changing settings or adding features to understand how it works in their own environment. This is especially helpful if you want to support different terminals, like Windows Terminal or PowerShell, which have slightly different behaviors for Unicode characters.
Using a Built-In Spinner
Tim starts with a straightforward example. At 0:37, he writes code using AnsiConsole.Status to show a known spinner style while some work runs in the background. He selects Spinner.Known.Aesthetic but points out that Spectre provides many options in the Spinner.Known list. Tim adds a string “Loading” to display next to the spinner so the user knows what’s happening.
Inside the status block, Tim inserts a Thread.Sleep(10000) — ten seconds — just for testing. This forces the console to show the spinner in action long enough to see it. He explains at 1:23 that once the task completes, the spinner disappears automatically. This is the default pattern Spectre encourages for showing status or progress in a console application.
Moving Toward a Custom Spinner
At 1:41, Tim says, “Okay, let’s create a custom spinner,” showing how to go beyond the built-in options. He explains that sometimes you want to format or style your spinner in a way that matches your own project, your brand colors, or even the type of data you’re processing. By writing your own spinner class, you control the frames, timing, and whether it uses Unicode characters or not.
Creating the Spinner Class
Tim creates a new file named TestSpinner.cs. At 2:05, he makes the class public and sets it to inherit from Spectre’s abstract Spinner class. He uses Visual Studio’s “implement abstract class” feature to generate the required members. This is where you provide your own values — such as speed, frames, and Unicode settings — instead of using defaults.
Tim highlights at 2:18 that these are get-only properties, which makes it simpler to write expression-bodied members. This format keeps your spinner definition compact and easier to maintain or update later.
Controlling the Speed per Frame
At 2:30, Tim sets the timing property to TimeSpan.FromMilliseconds(200). This means the spinner will move at about five frames per second. He explains that you can select a different value if you want the spinner to run faster or slower. Adjusting this setting is an easy way to improve the feel of your loading animation depending on what your command or process is doing.
Handling Unicode Characters
At 3:00, Tim addresses a key issue: Unicode. He notes that when running your project inside Visual Studio’s built-in console, Unicode characters may not render correctly, causing errors or missing symbols. However, if you run the same project in Windows Terminal or PowerShell, Unicode and emoji generally display fine. In his demo, he sets the property to false to avoid this issue, but points out that you can set it to true when your terminal supports it.
This makes it easier to add colorful symbols, arrows, or even emoji-based progress indicators to your app. You could format frames with ✅, 🌧, 🔄, or any characters you want to provide richer information.
Defining the Frames
The next property is the frame list. At 3:34, Tim writes an arrow function returning an array of strings. Each string is one “frame” of the spinner. In his example, he uses a large “O” and several small “o”s to simulate movement across the line.
He copies and pastes the base frame five times, then at 4:12 replaces one “O” in a different position in each frame. This creates a simple animation: the big “O” appears to move from left to right, then loops back to the start. Tim notes at 4:26 you can add more frames to reverse direction, add color formatting (Spectre supports rich markup such as [green]text[/]), or experiment with Unicode characters if your console supports it.
Here’s Tim’s TestSpinner class code:
using Spectre.Console;
namespaces SpectreDemos;
public class TestSpinner : Spinner
{
public override TimeSpan Interval => TimeSpan.FromMilliseconds(200);
public override bool IsUnicode => false;
public override IReadOnlyList<string> Frames =>
[
"Ooooo",
"oOooo",
"ooOoo",
"oooOo",
"ooooO"
]
}using Spectre.Console;
namespaces SpectreDemos;
public class TestSpinner : Spinner
{
public override TimeSpan Interval => TimeSpan.FromMilliseconds(200);
public override bool IsUnicode => false;
public override IReadOnlyList<string> Frames =>
[
"Ooooo",
"oOooo",
"ooOoo",
"oooOo",
"ooooO"
]
}Implementing and Testing the Custom Spinner
Once the class is defined, Tim switches back to his main program. At 4:42, he replaces Spinner.Known.Aesthetic with new TestSpinner(). That’s it — no other code changes required. He then runs the application at 4:52 to show the new spinner in action.

This testing step is important. Tim recommends you run your project in the same terminal your users will use, so you can find issues with encoding, colors, or timing early. Different shells and fonts can affect how your spinner appears.

Adding Unicode, Emojis, and Color
Tim explains at 5:00 that nothing stops you from using emojis or special characters as frames if you enable Unicode. You could build a weather spinner, a green progress bar using Spectre’s markup, or any creative display that fits your application. This is especially useful for commands that take a long time to start or continue running, because users appreciate clear visual feedback.
He also notes that Spectre Console makes it simpler to add colors and formatted text to your spinner. For example, you could write [green]Loading...[/] next to the spinner to emphasize success, or highlight errors with red text when needed.
Performance Tips and Settings
At 5:19, Tim summarizes the key things you need for a custom spinner:
Time: how long each frame shows.
IsUnicode: whether to use Unicode/emoji or plain text.
- Frames: the array of strings you animate.
He cautions that too many frames or too slow a speed means users may never see the last frames unless your process is very long. Selecting the right options here makes your spinner more effective. These settings also make it easier to increment your project over time — you can add more frames or adjust timing without rewriting your whole console application.
Wrapping Up
At 5:38, Tim shows that by inheriting from the Spinner class and providing your own values, you can quickly build a custom loading indicator for your console or PowerShell-based tools. This gives you more control over the information and feel you provide to your users. At 5:47, he reminds viewers the source code and docs are in the video description so you can explore and extend it yourself.
Conclusion
Following Tim Corey’s video, we’ve seen exactly how to implement a custom Spectre Console loading spinner: inherit from Spinner, provide a timing value, specify Unicode support, and define your frames. Then simply replace a known spinner with your new class to add it to your project. Tim also points out ways to add Unicode characters, emojis, and color markup to make your console app’s status and progress displays more informative and beautiful.
By using Spectre Console’s capabilities, you can provide clearer feedback, find and fix issues earlier, and create beautiful console applications that users enjoy.
