diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Clinton Mead (c) 2017
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Clinton Mead nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/src/Stack/Lib/Build.hs b/src/Stack/Lib/Build.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/Build.hs
@@ -0,0 +1,18 @@
+module Stack.Lib.Build (build, buildWithResolver, buildWithResolvers) where
+
+import Stack.Types.Config (globalResolver)
+import Stack.Types.Config.Build (defaultBuildOptsCLI)
+import Stack.Lib.LowerLevel.Runners (defaultGlobalOpts)
+import Stack.Lib.Class.IsAbstractResolver (IsAbstractResolver(toAbstractResolver))
+import Stack.Lib.LowerLevel.Build (buildWithOptions)
+
+import Control.Monad (mapM_)
+
+buildWithResolver :: IsAbstractResolver resolver => resolver -> IO ()
+buildWithResolver resolver = buildWithOptions defaultGlobalOpts{globalResolver = Just (toAbstractResolver resolver)} defaultBuildOptsCLI
+
+buildWithResolvers :: (Foldable f, IsAbstractResolver resolver) => f resolver -> IO ()
+buildWithResolvers = mapM_ buildWithResolver
+
+build :: IO ()
+build = buildWithOptions defaultGlobalOpts defaultBuildOptsCLI
diff --git a/src/Stack/Lib/Class/IsAbstractResolver.hs b/src/Stack/Lib/Class/IsAbstractResolver.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/Class/IsAbstractResolver.hs
@@ -0,0 +1,6 @@
+module Stack.Lib.Class.IsAbstractResolver (IsAbstractResolver(toAbstractResolver), AbstractResolver) where
+
+import Stack.Types.Resolver (AbstractResolver)
+
+class IsAbstractResolver t where
+  toAbstractResolver :: t -> AbstractResolver
diff --git a/src/Stack/Lib/LowerLevel/Build.hs b/src/Stack/Lib/LowerLevel/Build.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/LowerLevel/Build.hs
@@ -0,0 +1,13 @@
+module Stack.Lib.LowerLevel.Build (buildWithOptions) where
+
+import Stack.Prelude (RIO)
+import Stack.Types.Config (EnvConfig)
+
+import Stack.Types.Config (GlobalOpts)
+import Stack.Types.Config.Build (BuildOptsCLI)
+import Stack.Lib.LowerLevel.Runners
+import qualified Stack.Build
+
+buildWithOptions :: GlobalOpts -> BuildOptsCLI -> IO ()
+buildWithOptions globalOpts buildOptsCLI =
+  runStackWithGlobalOpts globalOpts ((Stack.Build.build (const (pure ())) Nothing buildOptsCLI) :: RIO EnvConfig ())
diff --git a/src/Stack/Lib/LowerLevel/GlobalOpts.hs b/src/Stack/Lib/LowerLevel/GlobalOpts.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/LowerLevel/GlobalOpts.hs
@@ -0,0 +1,20 @@
+module Stack.Lib.LowerLevel.GlobalOpts (defaultGlobalOpts) where
+
+import Control.Monad.Logger (LogLevel(LevelInfo))
+import Stack.Types.Runner (ColorWhen(ColorNever))
+import Stack.Types.Config (GlobalOpts(..), StackYamlLoc(SYLDefault))
+
+defaultGlobalOpts :: GlobalOpts
+defaultGlobalOpts = GlobalOpts {
+  globalReExecVersion = Nothing,
+  globalDockerEntrypoint = Nothing,
+  globalLogLevel = LevelInfo,
+  globalTimeInLog = True,
+  globalConfigMonoid = mempty,
+  globalResolver = Nothing,
+  globalCompiler = Nothing,
+  globalTerminal = False,
+  globalColorWhen = ColorNever,
+  globalTermWidth = Nothing,
+  globalStackYaml = SYLDefault
+}
diff --git a/src/Stack/Lib/LowerLevel/Runners.hs b/src/Stack/Lib/LowerLevel/Runners.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/LowerLevel/Runners.hs
@@ -0,0 +1,36 @@
+module Stack.Lib.LowerLevel.Runners (
+  runStack,
+  runStackWithResolver,
+  RunStack(runStackWithGlobalOpts),
+  defaultGlobalOpts
+  )
+where
+
+import Stack.Prelude (RIO, runRIO)
+import Stack.Types.Config (EnvConfig, Config, GlobalOpts(globalResolver, globalCompiler), lcConfig, lcLoadBuildConfig)
+import Stack.Runners (loadConfigWithOpts)
+import Stack.Setup (setupEnv)
+
+import Stack.Lib.Type.Resolver (Resolver)
+import Stack.Lib.LowerLevel.GlobalOpts (defaultGlobalOpts)
+import Stack.Lib.Class.IsAbstractResolver (toAbstractResolver)
+
+class RunStack config where
+  runStackWithGlobalOpts :: GlobalOpts -> RIO config a -> IO a
+
+instance RunStack EnvConfig where
+  runStackWithGlobalOpts globalOpts rio = loadConfigWithOpts globalOpts f where
+    f loadConfig = do
+      buildConfig <- lcLoadBuildConfig loadConfig (globalCompiler globalOpts)
+      envConfig <- runRIO buildConfig (setupEnv Nothing)
+      runRIO envConfig rio
+
+instance RunStack Config where
+  runStackWithGlobalOpts globalOpts rio = loadConfigWithOpts globalOpts f where
+    f loadConfig = runRIO (lcConfig loadConfig) rio
+
+runStackWithResolver :: RunStack config => Resolver -> RIO config a -> IO a
+runStackWithResolver resolver = runStackWithGlobalOpts defaultGlobalOpts{globalResolver = Just (toAbstractResolver resolver)}
+
+runStack :: RunStack config => RIO config a -> IO a
+runStack = runStackWithGlobalOpts defaultGlobalOpts
diff --git a/src/Stack/Lib/Snapshots.hs b/src/Stack/Lib/Snapshots.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/Snapshots.hs
@@ -0,0 +1,12 @@
+module Stack.Lib.Snapshots (getSnapshots) where
+
+import qualified Stack.Config
+
+import Stack.Prelude (RIO)
+import Stack.Types.Config (Config)
+
+import Stack.Types.Resolver (Snapshots)
+import Stack.Lib.LowerLevel.Runners (runStack)
+
+getSnapshots :: IO Snapshots
+getSnapshots = runStack (Stack.Config.getSnapshots :: RIO Config Snapshots)
diff --git a/src/Stack/Lib/Type/Resolver.hs b/src/Stack/Lib/Type/Resolver.hs
new file mode 100644
--- /dev/null
+++ b/src/Stack/Lib/Type/Resolver.hs
@@ -0,0 +1,34 @@
+module Stack.Lib.Type.Resolver (
+  Resolver(..)
+  ) where
+
+import Data.Ord (Ordering(LT, EQ, GT))
+import Data.Time.Calendar (Day)
+
+import qualified Stack.Types.Resolver as STR
+import Stack.Lib.Class.IsAbstractResolver (IsAbstractResolver(toAbstractResolver))
+
+data Resolver = LatestNightly | LatestLTS | LatestLTSMajor !Int | ExactLTS !Int !Int | ExactNightly !Day deriving Eq
+
+instance Ord Resolver where
+  LatestNightly `compare` LatestNightly = EQ
+  LatestNightly `compare` _ = GT
+  _ `compare` LatestNightly = LT
+  ExactNightly day1 `compare` ExactNightly day2 = day1 `compare` day2
+  ExactNightly{} `compare` _ = GT
+  _ `compare` ExactNightly{} = LT
+  LatestLTS `compare` LatestLTS = EQ
+  LatestLTS `compare` _ = GT
+  _ `compare` LatestLTS = LT
+  LatestLTSMajor x1 `compare` LatestLTSMajor x2 = x1 `compare` x2
+  ExactLTS x1 y1 `compare` ExactLTS x2 y2 = (x1, y1) `compare` (x2, y2)
+  LatestLTSMajor x1 `compare` ExactLTS x2 _y2 = if x1 >= x2 then GT else LT
+  ExactLTS x1 _y1 `compare` LatestLTSMajor x2 = if x1 > x2 then GT else LT
+
+instance IsAbstractResolver Resolver where
+  toAbstractResolver resolver = case resolver of
+    LatestNightly -> STR.ARLatestNightly
+    LatestLTS -> STR.ARLatestLTS
+    LatestLTSMajor x -> STR.ARLatestLTSMajor x
+    ExactLTS x y -> STR.ARResolver (STR.ResolverSnapshot (STR.LTS x y))
+    ExactNightly date -> STR.ARResolver (STR.ResolverSnapshot (STR.Nightly date))
diff --git a/stack-lib.cabal b/stack-lib.cabal
new file mode 100644
--- /dev/null
+++ b/stack-lib.cabal
@@ -0,0 +1,47 @@
+-- This file has been generated from package.yaml by hpack version 0.20.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 8a944b11e33bfaea9fdb1a2f7d530401e314bb15d90dee1c554f19bbe2594ecd
+
+name:           stack-lib
+version:        0.1.0.0
+synopsis:       Wrapper to use stack as a library
+description:    Some wrapper functions around [stack](https://hackage.haskell.org/package/stack) intended to make it easier to use [stack](https://hackage.haskell.org/package/stack) as a library.
+category:       Development
+homepage:       https://github.com/clintonmead/stack-lib#readme
+bug-reports:    https://github.com/clintonmead/stack-lib/issues
+author:         Clinton Mead
+maintainer:     clintonmead@gmail.com
+copyright:      Copyright: (c) 2017 Clinton Mead
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
+
+source-repository head
+  type: git
+  location: https://github.com/clintonmead/stack-lib
+
+library
+  hs-source-dirs:
+      src
+  ghc-options: -Wall
+  build-depends:
+      base >=4.7 && <5
+    , monad-logger
+    , path
+    , stack
+    , time
+    , transformers
+  exposed-modules:
+      Stack.Lib.Build
+      Stack.Lib.Class.IsAbstractResolver
+      Stack.Lib.LowerLevel.Build
+      Stack.Lib.LowerLevel.GlobalOpts
+      Stack.Lib.LowerLevel.Runners
+      Stack.Lib.Snapshots
+      Stack.Lib.Type.Resolver
+  other-modules:
+      Paths_stack_lib
+  default-language: Haskell2010
