diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,11 @@
-## [_Unreleased_](https://github.com/freckle/stackctl/compare/v1.2.0.0...main)
+## [_Unreleased_](https://github.com/freckle/stackctl/compare/v1.3.0.0...main)
+
+## [v1.3.0.0](https://github.com/freckle/stackctl/compare/v1.2.0.1...v1.3.0.0)
+
+- Fix it so commands like `version` don't need a valid AWS environment
+
+  This changes the `Subcommand` interface and so is a major version update for
+  the purposes of those using Stackctl as a library.
 
 ## [v1.2.0.0](https://github.com/freckle/stackctl/compare/v1.1.3.1...v1.2.0.0)
 
diff --git a/src/Stackctl/Commands.hs b/src/Stackctl/Commands.hs
--- a/src/Stackctl/Commands.hs
+++ b/src/Stackctl/Commands.hs
@@ -8,10 +8,7 @@
 
 import Stackctl.Prelude
 
-import Stackctl.AWS
-import Stackctl.AWS.Scope
 import Stackctl.Colors
-import Stackctl.Config (HasConfig)
 import Stackctl.DirectoryOption
 import Stackctl.FilterOption
 import Stackctl.Spec.Capture
@@ -19,70 +16,68 @@
 import Stackctl.Spec.Changes
 import Stackctl.Spec.Deploy
 import Stackctl.Subcommand
+import Stackctl.VerboseOption
 import Stackctl.Version
 
 cat
-  :: ( HasLogger env
-     , HasAwsScope env
-     , HasConfig env
-     , HasDirectoryOption env
-     , HasFilterOption env
-     , HasColorOption env
+  :: ( HasColorOption options
+     , HasVerboseOption options
+     , HasDirectoryOption options
+     , HasFilterOption options
      )
-  => Subcommand CatOptions env
+  => Subcommand options CatOptions
 cat = Subcommand
   { name = "cat"
   , description = "Pretty-print specifications"
-  , parse = runCatOptions
-  , run = runCat
+  , parse = parseCatOptions
+  , run = runAppSubcommand runCat
   }
 
 capture
-  :: (HasAwsScope env, HasAwsEnv env, HasConfig env, HasDirectoryOption env)
-  => Subcommand CaptureOptions env
+  :: ( HasColorOption options
+     , HasVerboseOption options
+     , HasDirectoryOption options
+     )
+  => Subcommand options CaptureOptions
 capture = Subcommand
   { name = "capture"
   , description = "Capture deployed Stacks as specifications"
-  , parse = runCaptureOptions
-  , run = runCapture
+  , parse = parseCaptureOptions
+  , run = runAppSubcommand runCapture
   }
 
 changes
-  :: ( HasLogger env
-     , HasAwsScope env
-     , HasAwsEnv env
-     , HasConfig env
-     , HasDirectoryOption env
-     , HasFilterOption env
+  :: ( HasColorOption options
+     , HasVerboseOption options
+     , HasDirectoryOption options
+     , HasFilterOption options
      )
-  => Subcommand ChangesOptions env
+  => Subcommand options ChangesOptions
 changes = Subcommand
   { name = "changes"
   , description = "Review changes between specification and deployed state"
-  , parse = runChangesOptions
-  , run = runChanges
+  , parse = parseChangesOptions
+  , run = runAppSubcommand runChanges
   }
 
 deploy
-  :: ( HasLogger env
-     , HasAwsScope env
-     , HasAwsEnv env
-     , HasConfig env
-     , HasDirectoryOption env
-     , HasFilterOption env
+  :: ( HasColorOption options
+     , HasVerboseOption options
+     , HasDirectoryOption options
+     , HasFilterOption options
      )
-  => Subcommand DeployOptions env
+  => Subcommand options DeployOptions
 deploy = Subcommand
   { name = "deploy"
   , description = "Deploy specifications"
-  , parse = runDeployOptions
-  , run = runDeploy
+  , parse = parseDeployOptions
+  , run = runAppSubcommand runDeploy
   }
 
-version :: Subcommand () env
+version :: Subcommand options ()
 version = Subcommand
   { name = "version"
   , description = "Output the version"
   , parse = pure ()
-  , run = \() -> logVersion
+  , run = \() _ -> logVersion
   }
diff --git a/src/Stackctl/Spec/Capture.hs b/src/Stackctl/Spec/Capture.hs
--- a/src/Stackctl/Spec/Capture.hs
+++ b/src/Stackctl/Spec/Capture.hs
@@ -1,6 +1,6 @@
 module Stackctl.Spec.Capture
   ( CaptureOptions(..)
-  , runCaptureOptions
+  , parseCaptureOptions
   , runCapture
   ) where
 
@@ -26,8 +26,8 @@
 
 -- brittany-disable-next-binding
 
-runCaptureOptions :: Parser CaptureOptions
-runCaptureOptions = CaptureOptions
+parseCaptureOptions :: Parser CaptureOptions
+parseCaptureOptions = CaptureOptions
     <$> optional (strOption
       (  short 'n'
       <> long "account-name"
diff --git a/src/Stackctl/Spec/Cat.hs b/src/Stackctl/Spec/Cat.hs
--- a/src/Stackctl/Spec/Cat.hs
+++ b/src/Stackctl/Spec/Cat.hs
@@ -1,6 +1,6 @@
 module Stackctl.Spec.Cat
   ( CatOptions(..)
-  , runCatOptions
+  , parseCatOptions
   , runCat
   ) where
 
@@ -36,8 +36,8 @@
 
 -- brittany-disable-next-binding
 
-runCatOptions :: Parser CatOptions
-runCatOptions = CatOptions
+parseCatOptions :: Parser CatOptions
+parseCatOptions = CatOptions
   <$> switch
     (  long "no-stacks"
     <> help "Only show templates/"
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
@@ -1,6 +1,6 @@
 module Stackctl.Spec.Changes
   ( ChangesOptions(..)
-  , runChangesOptions
+  , parseChangesOptions
   , runChanges
   ) where
 
@@ -31,8 +31,8 @@
 
 -- brittany-disable-next-binding
 
-runChangesOptions :: Parser ChangesOptions
-runChangesOptions = ChangesOptions
+parseChangesOptions :: Parser ChangesOptions
+parseChangesOptions = ChangesOptions
   <$> formatOption
   <*> many parameterOption
   <*> many tagOption
diff --git a/src/Stackctl/Spec/Deploy.hs b/src/Stackctl/Spec/Deploy.hs
--- a/src/Stackctl/Spec/Deploy.hs
+++ b/src/Stackctl/Spec/Deploy.hs
@@ -1,7 +1,7 @@
 module Stackctl.Spec.Deploy
   ( DeployOptions(..)
   , DeployConfirmation(..)
-  , runDeployOptions
+  , parseDeployOptions
   , runDeploy
   ) where
 
@@ -36,8 +36,8 @@
 
 -- brittany-disable-next-binding
 
-runDeployOptions :: Parser DeployOptions
-runDeployOptions = DeployOptions
+parseDeployOptions :: Parser DeployOptions
+parseDeployOptions = DeployOptions
   <$> many parameterOption
   <*> many tagOption
   <*> optional (strOption
diff --git a/src/Stackctl/Subcommand.hs b/src/Stackctl/Subcommand.hs
--- a/src/Stackctl/Subcommand.hs
+++ b/src/Stackctl/Subcommand.hs
@@ -3,47 +3,70 @@
   , subcommand
   , runSubcommand
   , runSubcommand'
+  , runAppSubcommand
   ) where
 
 import Stackctl.Prelude
 
 import qualified Env
 import Options.Applicative
-import qualified Stackctl.CLI as CLI
-import Stackctl.Colors
+import Stackctl.CLI
+import Stackctl.ColorOption
 import Stackctl.Options
 import Stackctl.VerboseOption
 
-data Subcommand options env = Subcommand
+data Subcommand options subOptions = Subcommand
   { name :: Text
   , description :: Text
-  , parse :: Parser options
-  , run :: options -> CLI.AppT env IO ()
+  , parse :: Parser subOptions
+  , run :: subOptions -> options -> IO ()
   }
 
-subcommand :: Subcommand options env -> Mod CommandFields (CLI.AppT env IO ())
+subcommand
+  :: Subcommand options subOptions -> Mod CommandFields (options -> IO ())
 subcommand Subcommand {..} =
   command (unpack name) (run <$> withInfo description parse)
 
-runSubcommand :: Mod CommandFields (CLI.AppT (CLI.App Options) IO ()) -> IO ()
+runSubcommand :: Mod CommandFields (Options -> IO a) -> IO a
 runSubcommand =
   runSubcommand' "Work with Stack specifications" envParser optionsParser
 
 -- brittany-disable-next-binding
 
 runSubcommand'
-  :: (Semigroup options, HasVerboseOption options, HasColorOption options)
+  :: Semigroup options
   => Text
   -> Env.Parser Env.Error options
   -> Parser options
-  -> Mod CommandFields (CLI.AppT (CLI.App options) IO ())
-  -> IO ()
+  -> Mod CommandFields (options -> IO a)
+  -> IO a
 runSubcommand' title parseEnv parseCLI sp = do
   (options, act) <- applyEnv
     <$> Env.parse (Env.header $ unpack title) parseEnv
     <*> execParser (withInfo title $ (,) <$> parseCLI <*> subparser sp)
-  CLI.runAppT options act
+
+  act options
   where applyEnv env = first (env <>)
+
+-- | Use this in the 'run' member of a 'Subcommand' that wants 'AppT'
+--
+-- @
+--   -- ...
+--   , parse = parseFooOptions
+--   , run = 'runAppSubcommand' runFoo
+--   }
+--
+-- runFoo :: (MonadReader env m, HasAws env) => FooOptions -> m ()
+-- runFoo = undefined
+-- @
+--
+runAppSubcommand
+  :: (HasColorOption options, HasVerboseOption options)
+  => (subOptions -> AppT (App options) IO a)
+  -> subOptions
+  -> options
+  -> IO a
+runAppSubcommand f subOptions options = runAppT options $ f subOptions
 
 withInfo :: Text -> Parser a -> ParserInfo a
 withInfo d p = info (p <**> helper) $ progDesc (unpack d) <> fullDesc
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.2.0.0
+version:         1.3.0.0
 license:         MIT
 license-file:    LICENSE
 copyright:       2022 Renaissance Learning Inc
