diff --git a/main.cpp b/main.cpp
index 4229622bc3425f3c6ce7a9c01ef2b10b5cb374e8..18ba74a311fa257344cdaebdce3a04c2f04644c5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -4,9 +4,11 @@
 #include <rang.hpp>
 #include <FPEManager.hpp>
 #include <SignalManager.hpp>
+#include <ConsoleManager.hpp>
 
 #include <CLI/CLI.hpp>
 #include <cassert>
+#include <limits>
 
 inline double e(double rho, double p, double gamma)
 {
@@ -128,9 +130,13 @@ int main(int argc, char *argv[])
   bool disable_fpe = false;
   app.add_flag("--no-fpe", disable_fpe, "Do not trap floating point exceptions");
   bool disable_signals = false;
-  app.add_flag("--no-signal", disable_signals, "Catches signals");
+  app.add_flag("--no-signal", disable_signals, "Do not catches signals");
+
+  std::string colorize="auto";
+  app.add_set("--colorize", colorize, {"auto", "yes", "no"}, "Colorize console output", true);
+
   int threads=-1;
-  app.add_option("--threads", threads, "Number of Kokkos threads");
+  app.add_option("--threads", threads, "Number of Kokkos threads")->check(CLI::Range(1,std::numeric_limits<decltype(threads)>::max()));
 
   std::atexit([](){std::cout << rang::style::reset;});
   try {
@@ -139,9 +145,12 @@ int main(int argc, char *argv[])
     return app.exit(e);
   }
 
+  ConsoleManager::init(colorize);
   FPEManager::init(not disable_fpe);
   SignalManager::init(not disable_signals);
   
+
+  std::cout << "colorize=" << colorize << '\n';
   std::cout << "Code version: "
 	    << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n';
 
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index aa8f05c8ee7783fc6e6d9c3d613f7f7bf6c539a7..b1a57d9cfbf6446db736f950d4ce158057f59b4d 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -5,6 +5,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
 
 add_library(
   PastisUtils
+  ConsoleManager.cpp
   FPEManager.cpp
   RevisionInfo.cpp
   SignalManager.cpp)
diff --git a/utils/ConsoleManager.cpp b/utils/ConsoleManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b2a9984e49cef42cdb2b8b3464cc0d94d36e5744
--- /dev/null
+++ b/utils/ConsoleManager.cpp
@@ -0,0 +1,44 @@
+#include <ConsoleManager.hpp>
+#include <rang.hpp>
+
+bool ConsoleManager::isTerminal(std::ostream& os)
+{
+  return rang::rang_implementation::isTerminal(os.rdbuf());
+}
+
+void ConsoleManager::init(const std::string& colorize)
+{
+  std::cout << "Console management: color ";
+  if (colorize == "auto") {
+    if (isTerminal(std::cout)) {
+      std::cout << rang::style::bold
+		<< rang::fgB::green
+		<< "enabled"
+		<< rang::fg::reset
+		<< rang::style::reset;
+    } else {
+      std::cout << "disabled";
+    }
+    std::cout << " [auto]\n";
+  } else if (colorize == "yes") {
+    rang::setControlMode(rang::control::Force);
+    std::cout << rang::style::bold
+	      << rang::fgB::green
+	      << "enabled"
+	      << rang::fg::reset
+	      << rang::style::reset;
+    std::cout << " ["
+	      << rang::style::bold
+	      << rang::fgB::red
+	      << "forced"
+	      << rang::fg::reset
+	      << rang::style::reset
+	      << "]\n";
+  } else if (colorize == "no") {
+    rang::setControlMode(rang::control::Off);
+    std::cout << "disabled [forced]\n";
+  } else {
+    std::cerr << "Unknown colorize option: " << colorize << '\n';
+    std::exit(1);
+  }
+}
diff --git a/utils/ConsoleManager.hpp b/utils/ConsoleManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..ccd555e50e73834390b72ea19be574e8e2042e2a
--- /dev/null
+++ b/utils/ConsoleManager.hpp
@@ -0,0 +1,12 @@
+#ifndef CONSOLE_MANAGER_HPP
+#define CONSOLE_MANAGER_HPP
+
+#include <string>
+
+struct ConsoleManager
+{
+  static bool isTerminal(std::ostream& os);
+  static void init(const std::string& colorize);
+};
+
+#endif // CONSOLE_MANAGER_HPP