diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for zenhack-prelude
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Ian Denhardt
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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/Zhp.hs b/Zhp.hs
new file mode 100644
--- /dev/null
+++ b/Zhp.hs
@@ -0,0 +1,255 @@
+module Zhp
+    (
+    -- * Renamed functions
+      sequence
+    , sequence_
+
+    -- * Whole modules we re-export
+    , module Control.Category
+    , module Data.Bits
+    , module Data.Int
+    , module Data.Proxy
+    , module Data.Word
+
+    -- * Individual items re-exported as-is from parts of base.
+    , (&&)
+    , (&)
+    , (<=<)
+    , (=<<)
+    , (>=>)
+    , (^)
+    , (^^)
+    , (||)
+    , (<$!>)
+    , (<$>)
+    , ($!)
+    , getArgs
+    , getProgName
+    , getExecutablePath
+    , lookupEnv
+    , setEnv
+    , unsetEnv
+    , withArgs
+    , withProgName
+    , getEnvironment
+    , ($)
+    , all
+    , Alternative(..)
+    , and
+    , any
+    , appendFile
+    , Applicative(..)
+    , asTypeOf
+    , asum
+    , Bool(..)
+    , Bounded(..)
+    , break
+    , BufferMode(..)
+    , Char
+    , concatMap
+    , const
+    , curry
+    , cycle
+    , catMaybes
+    , fromMaybe
+    , isJust
+    , isNothing
+    , mapMaybe
+    , Double
+    , drop
+    , dropWhile
+    , either
+    , Either(..)
+    , Enum(..)
+    , Eq(..)
+    , error
+    , even
+    , exitFailure
+    , exitSuccess
+    , exitWith
+    , FilePath(..)
+    , filter
+    , flip
+    , Float
+    , Floating(..)
+    , Foldable(foldMap, foldr, foldl', elem, sum, product) -- omit foldl
+    , foldM_
+    , foldM
+    , for
+    , for_
+    , forever
+    , Fractional(..)
+    , fromIntegral
+    , fst
+    , Functor(..)
+    , gcd
+    , getChar
+    , getContents
+    , getLine
+    , guard
+    , Handle
+    , hClose
+    , hFileSize
+    , hFlush
+    , hGetBuffering
+    , hGetChar
+    , hGetContents
+    , hGetLine
+    , hIsEOF
+    , hPrint
+    , hPutChar
+    , hPutStr
+    , hPutStrLn
+    , hSeek
+    , hSetBinaryMode
+    , hSetBuffering
+    , hSetFileSize
+    , Integral(..)
+    , interact
+    , IO(..)
+    , IOError(..)
+    , IOMode(..)
+    , isEOF
+    , IsString(..)
+    , iterate
+    , join
+    , lcm
+    , length
+    , lines
+    , map
+    , maybe
+    , Maybe(..)
+    , Monad((>>=))
+    , MonadIO(..)
+    , Monoid(mempty, mconcat) -- mappend is just (<>) from semigroup.
+    , not
+    , notElem
+    , null
+    , Num(..)
+    , odd
+    , openBinaryFile
+    , openBinaryTempFile
+    , openTempFile
+    , or
+    , Ord(..)
+    , Ordering(..)
+    , otherwise
+    , print
+    , printf
+    , putChar
+    , putStr
+    , putStrLn
+    , Rational
+    , Read(..)
+    , readFile
+    , Real(..)
+    , RealFloat(..)
+    , RealFrac(..)
+    , realToFrac
+    , repeat
+    , replicate
+    , replicateM
+    , replicateM_
+    , reverse
+    , scanl
+    , scanl1
+    , scanr
+    , scanr1
+    , SeekMode(..)
+    , Semigroup(..)
+    , seq
+    , Show(..)
+    , snd
+    , span
+    , splitAt
+    , stderr
+    , stdin
+    , stdout
+    , String(..)
+    , subtract
+    , take
+    , takeWhile
+    , traverse
+    , traverse_
+    , uncurry
+    , undefined
+    , unless
+    , unlines
+    , until
+    , unwords
+    , unzip
+    , unzip3
+    , void
+    , when
+    , withBinaryFile
+    , words
+    , writeFile
+    , zip
+    , zip3
+    , zipWith
+    , zipWith3
+    , isAlphaNum
+    , isAscii
+    , isControl
+    , isDigit
+    , isHexDigit
+    , isLatin1
+    , isLetter
+    , isLower
+    , isOctDigit
+    , isPrint
+    , isSpace
+    , isUpper
+    , toLower
+    , toUpper
+    ) where
+
+
+-- TODO:
+--
+-- * consider not re-exporting 'many' and (<|>); these conflict with parsec.
+-- * Data.Maybe
+
+import Control.Applicative    (Alternative(..))
+import Control.Category
+import Control.Monad          hiding (sequence, sequence_)
+import Control.Monad.IO.Class (MonadIO(..))
+import Data.Bits
+import Data.Char
+    ( isAlphaNum
+    , isAscii
+    , isControl
+    , isDigit
+    , isHexDigit
+    , isLatin1
+    , isLetter
+    , isLower
+    , isOctDigit
+    , isPrint
+    , isSpace
+    , isUpper
+    , toLower
+    , toUpper
+    )
+import Data.Foldable          hiding (sequence_)
+import Data.Function          ((&))
+import Data.Int
+import Data.Maybe
+    (catMaybes, fromMaybe, isJust, isNothing, mapMaybe)
+import Data.Proxy
+import Data.String            (IsString(..))
+import Data.Traversable       hiding (sequence)
+import Data.Word
+import Prelude                hiding (id, sequence, sequence_, (.))
+import System.Environment
+import System.Exit
+import System.IO
+import Text.Printf            (printf)
+
+-- | Alias for 'sequenceA_'
+sequence_ :: (Foldable t, Applicative f) => t (f a) -> f ()
+sequence_ = sequenceA_
+
+-- | Alias for 'sequenceA'
+sequence :: (Traversable t, Applicative f) => t (f a) -> f (t a)
+sequence = sequenceA
diff --git a/zenhack-prelude.cabal b/zenhack-prelude.cabal
new file mode 100644
--- /dev/null
+++ b/zenhack-prelude.cabal
@@ -0,0 +1,25 @@
+cabal-version:       2.2
+name:                zenhack-prelude
+version:             0.1.0.0
+synopsis:            @zenhack's personal custom prelude
+description:
+  This is my own custom prelude. It is not intended to be suitable
+  for all projects, but is designed to be an acceptable dependency
+  for any library project, so that I can use it unconditionally. Its
+  only dependency is base, and it just re-exports things from various
+  modules scattered about the base package that I don't want to have
+  to import.
+homepage:            https://git.zenhack.net/zenhack/custom-haskell-prelude
+license:             MIT
+license-file:        LICENSE
+author:              Ian Denhardt
+maintainer:          ian@zenhack.net
+copyright:           2019 Ian Denhardt
+build-type:          Simple
+extra-source-files:  CHANGELOG.md
+
+library
+  exposed-modules:     Zhp
+  build-depends:
+    base ^>=4.12
+  default-language:    Haskell2010
