diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Changelog for sandwich
 
+## Unreleased
+
+## 0.1.4.0
+
+* Windows improvements (fix "invalid argument (invalid character)", fix console unicode output)
+* Add Alternative (ExampleT context m) instance
+
 ## 0.1.3.2
 
 * Prevent spurious messages in IOExceptions from withFile
diff --git a/sandwich.cabal b/sandwich.cabal
--- a/sandwich.cabal
+++ b/sandwich.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           sandwich
-version:        0.1.3.2
+version:        0.1.4.0
 synopsis:       Yet another test framework for Haskell
 description:    Please see the <https://codedownio.github.io/sandwich documentation>.
 category:       Testing
@@ -132,6 +132,9 @@
         brick
       , unix
       , vty
+  if os(windows)
+    build-depends:
+        Win32
   if !os(windows)
     exposed-modules:
         Test.Sandwich.Formatters.TerminalUI
diff --git a/src/Test/Sandwich.hs b/src/Test/Sandwich.hs
--- a/src/Test/Sandwich.hs
+++ b/src/Test/Sandwich.hs
@@ -1,8 +1,9 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE MultiWayIf #-}
 {-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeOperators #-}
 
 module Test.Sandwich (
   -- | Sandwich is a test framework for Haskell. See the <https://codedownio.github.io/sandwich/docs/ documentation> for details and usage examples.
@@ -79,6 +80,7 @@
 import Data.Maybe
 import Data.String.Interpolate
 import qualified Data.Text as T
+import GHC.IO.Encoding
 import Options.Applicative
 import qualified Options.Applicative as OA
 import System.Environment
@@ -107,7 +109,11 @@
 import Test.Sandwich.Types.Spec
 import Test.Sandwich.Types.TestTimer
 
+#ifdef mingw32_HOST_OS
+import System.Win32.Console
+#endif
 
+
 -- | Run the spec with the given 'Options'.
 runSandwich :: Options -> CoreSpec -> IO ()
 runSandwich options spec = void $ runSandwich' Nothing options spec
@@ -172,6 +178,15 @@
 runSandwich' :: Maybe (CommandLineOptions ()) -> Options -> CoreSpec -> IO (ExitReason, Int)
 runSandwich' maybeCommandLineOptions options spec' = do
   baseContext <- baseContextFromOptions options
+
+  -- To prevent weird errors saving files like "commitAndReleaseBuffer: invalid argument (invalid character)",
+  -- especially on Windows
+  -- See https://gitlab.haskell.org/ghc/ghc/issues/8118
+  setLocaleEncoding utf8
+#ifdef mingw32_HOST_OS
+  -- Fix Windows console output. Makes sandwich-hedgehog unicode print properly
+  setConsoleOutputCP 65001
+#endif
 
   -- Wrap the spec in a finalizer for the test timer, when one is present
   let spec = case baseContextTestTimer baseContext of
diff --git a/src/Test/Sandwich/Types/Spec.hs b/src/Test/Sandwich/Types/Spec.hs
--- a/src/Test/Sandwich/Types/Spec.hs
+++ b/src/Test/Sandwich/Types/Spec.hs
@@ -17,6 +17,7 @@
 
 module Test.Sandwich.Types.Spec where
 
+import Control.Applicative
 import Control.Exception.Safe
 import Control.Monad.Base
 import Control.Monad.Except
@@ -47,6 +48,8 @@
 newtype ExampleT context m a = ExampleT { unExampleT :: ReaderT context (LoggingT m) a }
   deriving (Functor, Applicative, Monad, MonadIO, MonadReader context, MonadLogger, MonadLoggerIO, MonadThrow, MonadCatch, MonadMask)
 type ExampleM context = ExampleT context IO
+
+deriving instance (Applicative m, Alternative (LoggingT m)) => Alternative (ExampleT context m)
 
 instance (MonadIO m, MonadUnliftIO m) => MonadUnliftIO (ExampleT context m) where
   withRunInIO inner = ExampleT $ withRunInIO $ \run -> inner (run . unExampleT)
