Hi! I wanted to share a new package I made: terminice.
I built it because creating a beautiful, complex CLI shouldn’t mean building an entire terminal UI from scratch. It should be easy to create, easy to style, easy to manage as it grows, and most importantly easy and enjoyable for people to use.
terminice turns more than 30 common terminal interactions into small method calls, with no setup and no framework required.

Need a value from the user?
final name = terminice.text('Project name');
Need a searchable menu?
final template = terminice.searchSelector(
prompt: 'Template',
options: ['CLI', 'Server', 'Package'],
);
Need a file browser, config editor, command palette, progress bar, multi-step form, calendar, or help center? Those are method calls too.
There is no setup, widget tree, context object, or new application architecture. Import the package, call the component you need, and keep using package:args, CommandRunner, dart:io, or whatever already powers your CLI.
dart pub add terminice
Make the entire CLI look like yours
Don’t like the borders? Hide them:
final t = terminice.minimal;
Want the borders, but fewer hints and less visual noise?
final t = terminice.compact;
Want different colors? Pick a built-in theme:
final oceanUi = terminice.ocean;
final matrixUi = terminice.matrix;
final neonUi = terminice.neon;
final arcaneUi = terminice.arcane;
Or combine everything:
final t = terminice.neon.compact;
Now every component created from t follows the same style:
final name = t.text('Project name');
final token = t.password('API token');
final config = t.filePicker('Config file');
final confirmed = t.confirm(message: 'Create the project?');
(you can also create a fully custom, advanced theme, and it will automatically be used across all 30+ components!)
That is one of the main ideas behind Terminice: customize the instance once, and the colors, borders, glyphs, display mode, fallback behavior, and terminal I/O stay consistent across the entire CLI.
You can also create a custom theme in a few seconds by mixing the included colors, glyphs, and display features:
final brandTheme = PromptTheme(
colors: TerminalColors.ocean,
glyphs: TerminalGlyphs.rounded,
features: DisplayFeatures.compact,
);
final t = terminice.themed(brandTheme);
Need finer control? Every color palette, glyph set, and display configuration supports copyWith, so you can change one accent color or one behavior without rebuilding the rest of the theme. The custom theme then affects prompts, menus, pickers, progress indicators, flows, guides, and every other built-in component.
The catalogue
Terminice currently includes more than 30 ready-to-use components.
Prompts
textfor single-line inputpasswordfor masked inputconfirmfor yes/no questionsmultilinefor terminal text editingsliderandrangefor numeric inputratingfor star-based ratingsdatefor keyboard-driven date inputformfor collecting multiple fields together
Selectors
searchSelectorfor long, filterable listschoiceSelectorfor card-style single or multi-select choicescheckboxSelectorfor checklistsgridSelectorfor two-dimensional navigationtagSelectorfor managing multiple tagstoggleGroupfor editable boolean settingscommandPalettefor a fuzzy-searchable action launcher
Pickers
filePickerfor browsing filespathPickerfor choosing directoriescolorPickerfor interactive ANSI color selectiondatePickerfor a full calendar interface
Progress and status
- Full and inline loading spinners
- Full and inline progress bars
- Minimal dot-based progress
info,success,warn,error,detail, and log messagestaskfor wrapping async work with a status indicatorprogressTaskfor determinate async worktrackStreamfor collecting a stream while showing its progress
Complete CLI experiences
flowfor multi-step workflows with context, conditions, validation, and reviewconfigEditorfor searchable, nested application settingscheatSheetfor quick-reference tableshelpCenterfor searchable documentation inside the terminalhotkeyGuidefor keyboard shortcut discoverythemeDemofor previewing themes and colors- Custom components when your CLI needs something package-specific
Every catalogue item has its own detailed documentation with controls, behavior, examples, and API notes. I wanted the README to be useful as a practical reference, rather than leaving developers to discover important behavior through trial and error.
The vision
The goal is not only to make prompts look better. I want Terminice to make beautiful, complex CLIs easier to create, style, manage, test, and use.
to create: add prompts, selectors, pickers, progress, or configuration screens with small method calls—not a new architecture.
to style: choose or create one theme, and let the entire CLI follow it. No repeating colors, borders, glyphs, and display options everywhere.
to manage: keep components, behavior, fallbacks, and tests consistent as the CLI grows.
to use: give people clear hints, predictable controls, validation, cancellation, readable fallbacks, and good defaults.
Terminice sits between a prompt package and a full TUI framework. It is the human-facing layer of an existing Dart CLI: questions, choices, files, settings, progress, and feedback.
It can stay tiny when tiny is all you need:
final email = terminice.text('Email');
That same CLI can later grow into searchable menus, filesystem navigation, validation, progress tracking, configuration screens, or complete flows—without switching packages.
When rich UI is not appropriate, the built-ins can fall back to predictable plain text for limited terminals, non-TTY output, scripts, and unattended execution.
Terminal I/O is abstracted as well, so you can feed scripted input into a component and assert its captured output in tests instead of depending on real stdin/stdout.
So the short version is:
- One import and no setup
- 30+ components covering individual prompts through complete CLI workflows
- 11 built-in style presets
- Chainable themes and
verbose,compact, or borderlessminimaldisplay modes - One shared configuration across the whole CLI
- Custom themes and components when the built-ins are not enough
- Cross-platform support for Linux, macOS, and Windows
- Predictable fallbacks and test utilities for real-world use
Links:
A small personal note
I started working on what eventually became terminice over a year ago, it didn’t begin as one big, carefully planned package. While working on real projects, I kept creating terminal components that I needed- a prompt in one project, a selector in another, a progress indicator somewhere else, then themes, flows, config tools, and testing helpers.
For a while, all of that work was scattered across different projects. Gradually, I started moving the useful pieces into one place, redesigning them around a shared API, and turning them into a unified, robust tool that is genuinely fun and easy to use.
The package is not perfect. There are still many things that need refinement, and probably many things I cannot see because I built them around my own use cases. I want Terminice to become the best tool it can be, but I know I cannot do that alone.
If you build Dart CLIs, I would really appreciate it if you tried it, even in a small project, and told me what you think. If an API feels awkward, a component is missing, the documentation is unclear, or something simply does not feel right, I want to hear about it. Every bug report, idea, criticism, and any feedback is appreciated (: