diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,9 @@
-## [_Unreleased_](https://github.com/freckle/stackctl/compare/v1.1.0.3...main)
+## [_Unreleased_](https://github.com/freckle/stackctl/compare/v1.1.0.4...main)
+
+## [v1.1.0.4](https://github.com/freckle/stackctl/compare/v1.1.0.3...v1.1.0.4)
+
+- Fix bug where only the last spec in a multi-spec case had its changes present
+  in the output file generated by `changes`.
 
 ## [v1.1.0.3](https://github.com/freckle/stackctl/compare/v1.1.0.2...v1.1.0.3)
 
diff --git a/src/Stackctl/Spec/Changes.hs b/src/Stackctl/Spec/Changes.hs
--- a/src/Stackctl/Spec/Changes.hs
+++ b/src/Stackctl/Spec/Changes.hs
@@ -48,6 +48,9 @@
   => ChangesOptions
   -> m ()
 runChanges ChangesOptions {..} = do
+  -- Clear file before starting, as we have to use append for each spec
+  liftIO $ T.writeFile scoOutput ""
+
   specs <- discoverSpecs
 
   for_ specs $ \spec -> do
@@ -60,9 +63,7 @@
           exitFailure
         Right mChangeSet -> do
           colors <- getColorsStdout
-          let name = pack $ stackSpecPathFilePath $ stackSpecSpecPath spec
-          liftIO $ T.writeFile scoOutput $ formatChangeSet
-            colors
-            name
-            scoFormat
-            mChangeSet
+          let
+            name = pack $ stackSpecPathFilePath $ stackSpecSpecPath spec
+            formatted = formatChangeSet colors name scoFormat mChangeSet
+          liftIO $ T.appendFile scoOutput $ formatted <> "\n"
diff --git a/stackctl.cabal b/stackctl.cabal
--- a/stackctl.cabal
+++ b/stackctl.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            stackctl
-version:         1.1.0.3
+version:         1.1.0.4
 license:         MIT
 license-file:    LICENSE
 copyright:       2022 Renaissance Learning Inc
