diff --git a/Monadoro.cabal b/Monadoro.cabal
--- a/Monadoro.cabal
+++ b/Monadoro.cabal
@@ -5,13 +5,13 @@
 -- see: https://github.com/sol/hpack
 
 name:           Monadoro
-version:        0.2.5.0
+version:        0.2.6.0
 synopsis:       A minimalistic CLI Pomodoro timer.
 description:    A Pomodoro timer with two modes: single-pomodoro (default), and four-pomodoro (`--session`).
 category:       Tools
 author:         Patryk Kocielnik
 maintainer:     patryk@kocielnik.pl
-copyright:      2018-2020 Patryk Kocielnik
+copyright:      2018-2021 Patryk Kocielnik
 license:        MIT
 license-file:   LICENSE
 build-type:     Simple
@@ -27,7 +27,6 @@
 library
   exposed-modules:
       CountdownLoop
-      Monadoro
       ParseTime
       Pomodoro
   other-modules:
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -1,6 +1,94 @@
 module Main where
 
-import Monadoro ( monadoro )
+import Data.Char          (isDigit)
+import Data.List          (intersect)
+import Data.Version       (showVersion)
+import Paths_Monadoro     (version)
+import System.Environment (getArgs)
+import Control.Monad      (void)
 
+import CountdownLoop      (countdown)
+import Pomodoro           (session)
+
 main :: IO ()
 main = monadoro
+
+monadoro :: IO ()
+monadoro = getArgs >>= parseArgs
+
+parseArgs :: [String] -> IO ()
+parseArgs xs
+  | xs `containsEither` ["--help", "-h"]    = putStrLn usage
+  | xs `containsEither` ["--version", "-v"] = putStrLn . showVersion $ version
+  | xs `containsEither` ["--session", "-s"] = session
+  | otherwise = do
+    warnAboutErrorsIfAny invalidIntervals
+    runTimer validIntervals
+    where (validIntervals, invalidIntervals) = checkInput xs
+
+warnAboutErrorsIfAny :: [String] -> IO ()
+warnAboutErrorsIfAny [] = return ()
+warnAboutErrorsIfAny errors =
+  putStrLn $ "Unable to parse as interval: " ++ show errors
+
+{-| checkInput
+ 
+Returns valid entries (first list) and invalid entries (second list).
+
+>>> checkInput []
+([],[])
+
+>>> checkInput ["x"]
+([],["x"])
+
+>>> checkInput ["00:00"]
+(["00:00"],[])
+
+>>> checkInput ["00:00", "x"]
+(["00:00"],["x"])
+
+>>> checkInput ["00:00", "x"]
+(["00:00"],["x"])
+
+>>> checkInput ["00:00", "00:01", "x"]
+(["00:00","00:01"],["x"])
+
+-}
+
+checkInput :: [String] -> ([String], [String])
+checkInput [] = ([], [])
+checkInput [x]
+  | isValidTimeInterval x = ([x], [])
+  | otherwise = ([], [x])
+checkInput (x:xs) = (validEntries, invalidEntries)
+  where
+    validEntries =
+      fst (checkInput [x]) ++ fst (checkInput xs)
+    invalidEntries =
+      snd (checkInput [x]) ++ snd (checkInput xs)
+
+{-| isValidTimeInterval
+
+>>> isValidTimeInterval "x"
+False
+
+>>> isValidTimeInterval "00:00"
+True
+
+-}
+
+isValidTimeInterval :: String -> Bool
+isValidTimeInterval (m1:m2:':':s1:[s2])
+  | all isDigit [m1, m2, s1, s2] = True
+isValidTimeInterval _ = False
+
+containsEither :: (Eq a) => [a] -> [a] -> Bool
+containsEither a = not . null . intersect a
+
+usage :: String
+usage = "Usage: monadoro [-vh] [--session] [INTERVAL [...]]"
+
+runTimer :: [String] -> IO ()
+runTimer []     = void (countdown "25:00")
+runTimer [t]    = void (countdown t)
+runTimer (t:ts) = parseArgs [t] >> parseArgs ts
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+monadoro (2.6.0)
+
+	* Filter invalid time intervals from input.
+
 monadoro (2.5.0)
 
 	* Clean up lots of dead code.
diff --git a/src/Monadoro.hs b/src/Monadoro.hs
deleted file mode 100644
--- a/src/Monadoro.hs
+++ /dev/null
@@ -1,33 +0,0 @@
-module Monadoro (monadoro) where
-
-import Data.List          (intersect)
-import Data.Version       (showVersion)
-import Paths_Monadoro     (version)
-import System.Environment (getArgs)
-
-import CountdownLoop      (countdown)
-import Pomodoro           (session)
-
-main :: IO ()
-main = monadoro
-
-monadoro :: IO ()
-monadoro = getArgs >>= parseArgs
-
-parseArgs :: [String] -> IO ()
-parseArgs xs 
-  | xs `containsAnyOf` ["--help", "-h"]    = putStrLn usage
-  | xs `containsAnyOf` ["--version", "-v"] = putStrLn . showVersion $ version
-  | xs `containsAnyOf` ["--session", "-s"] = session
-  | otherwise = runTimer xs
-
-containsAnyOf :: (Eq a) => [a] -> [a] -> Bool
-containsAnyOf a = not . null . intersect a
-
-usage :: String
-usage = "Usage: monadoro [-vh] [--session] [INTERVAL [...]]"
-
-runTimer :: [String] -> IO ()
-runTimer []               = countdown "25:00" >> return ()
-runTimer (t:[])           = countdown t >> return ()
-runTimer (t:ts)           = parseArgs [t] >> parseArgs ts
diff --git a/test/DocTests.hs b/test/DocTests.hs
--- a/test/DocTests.hs
+++ b/test/DocTests.hs
@@ -4,7 +4,7 @@
 
 main :: IO ()
 main = doctest ["-isrc",
+                "app/Main.hs",
                 "src/ParseTime.lhs",
                 "src/CountdownLoop.hs",
-                "src/Pomodoro.lhs",
-                "src/Monadoro.hs"]
+                "src/Pomodoro.lhs"]
