diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Yolo (c) 2022
+
+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 Yolo 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/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1 @@
+# generic-pretty-instances
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/generic-pretty-instances.cabal b/generic-pretty-instances.cabal
new file mode 100644
--- /dev/null
+++ b/generic-pretty-instances.cabal
@@ -0,0 +1,108 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.34.7.
+--
+-- see: https://github.com/sol/hpack
+
+name:           generic-pretty-instances
+version:        0.1.0.0
+synopsis:       GenericPretty canonical instances
+description:    You can find documentation at <https://hackage.haskell.org/package/generic-pretty-instances>
+category:       Text, Generics, Pretty Printer
+homepage:       https://github.com/coingaming/src
+bug-reports:    https://github.com/coingaming/src/issues
+author:         21it <21it@tuta.io>, Mikhail Prushinskiy <mprushinsky@gmail.com>, Artem Markov <drownbes@gmail.com>
+maintainer:     21it <21it@tuta.io>, Mikhail Prushinskiy <mprushinsky@gmail.com>, Artem Markov <drownbes@gmail.com>
+copyright:      2022 Yolo <hello@coingaming.io>
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+  type: git
+  location: https://github.com/coingaming/src
+
+library
+  exposed-modules:
+      Text.PrettyPrint.GenericPretty.Import
+      Text.PrettyPrint.GenericPretty.Instance
+      Text.PrettyPrint.GenericPretty.Type
+      Text.PrettyPrint.GenericPretty.Util
+  other-modules:
+      Paths_generic_pretty_instances
+  hs-source-dirs:
+      src
+  default-extensions:
+      NoImplicitPrelude
+      OverloadedStrings
+      ScopedTypeVariables
+      StrictData
+      DeriveGeneric
+      DerivingStrategies
+      LambdaCase
+  ghc-options: -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures
+  build-depends:
+      GenericPretty
+    , base >=4.7 && <5
+    , base16-bytestring
+    , bytestring
+    , case-insensitive
+    , persistent
+    , pretty
+    , pretty-simple
+    , proto-lens
+    , proto-lens-runtime
+    , secp256k1-haskell ==0.6.*
+    , text
+    , time
+    , universum
+    , vector
+  if impl(ghc >= 8.10.7)
+    ghc-options: -Wno-unused-packages -Wno-prepositive-qualified-module -Wno-missing-safe-haskell-mode
+  default-language: Haskell2010
+
+test-suite generic-pretty-instances-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  other-modules:
+      Text.PrettyPrint.GenericPretty.Import
+      Text.PrettyPrint.GenericPretty.Instance
+      Text.PrettyPrint.GenericPretty.Type
+      Text.PrettyPrint.GenericPretty.Util
+      GenericPrettyInstancesSpec
+      Paths_generic_pretty_instances
+  hs-source-dirs:
+      src
+      test
+  default-extensions:
+      NoImplicitPrelude
+      OverloadedStrings
+      ScopedTypeVariables
+      StrictData
+      DeriveGeneric
+      DerivingStrategies
+      LambdaCase
+  ghc-options: -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      GenericPretty
+    , base >=4.7 && <5
+    , base16-bytestring
+    , bytestring
+    , case-insensitive
+    , hspec
+    , persistent
+    , pretty
+    , pretty-simple
+    , proto-lens
+    , proto-lens-runtime
+    , secp256k1-haskell ==0.6.*
+    , text
+    , time
+    , universum
+    , vector
+  if impl(ghc >= 8.10.7)
+    ghc-options: -Wno-unused-packages -Wno-prepositive-qualified-module -Wno-missing-safe-haskell-mode
+  default-language: Haskell2010
diff --git a/src/Text/PrettyPrint/GenericPretty/Import.hs b/src/Text/PrettyPrint/GenericPretty/Import.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/PrettyPrint/GenericPretty/Import.hs
@@ -0,0 +1,8 @@
+module Text.PrettyPrint.GenericPretty.Import
+  ( module X,
+  )
+where
+
+import Text.PrettyPrint.GenericPretty.Instance as X ()
+import Text.PrettyPrint.GenericPretty.Type as X
+import Text.PrettyPrint.GenericPretty.Util as X
diff --git a/src/Text/PrettyPrint/GenericPretty/Instance.hs b/src/Text/PrettyPrint/GenericPretty/Instance.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/PrettyPrint/GenericPretty/Instance.hs
@@ -0,0 +1,167 @@
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Text.PrettyPrint.GenericPretty.Instance
+  (
+  )
+where
+
+import qualified Control.Exception as Exception
+import qualified Crypto.Secp256k1 as Secp256k1
+import Data.ByteString.Base16 as B16 (encode)
+import qualified Data.CaseInsensitive as CI
+import qualified Data.Fixed as Fixed
+import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Encoding.Wire as Wire
+import qualified Data.Text as T
+import qualified Data.Text.Lazy as TL
+import qualified Data.Time.Calendar as Calendar
+import Data.Time.Clock (UTCTime)
+import qualified Data.Time.Clock as Clock
+import qualified Data.Time.LocalTime as LocalTime
+import qualified Data.Vector.Unboxed as Unboxed
+import qualified Database.Persist as Psql
+import qualified GHC.Conc.Sync as GHC
+import Text.PrettyPrint.GenericPretty
+import Universum
+
+--
+-- Trivial
+--
+
+deriving stock instance Generic Wire.Tag
+
+instance Out Wire.Tag
+
+deriving stock instance Generic Wire.WireValue
+
+instance Out Wire.WireValue
+
+deriving stock instance Generic Wire.TaggedValue
+
+instance Out Wire.TaggedValue
+
+deriving stock instance Generic Exception.BlockedIndefinitelyOnMVar
+
+instance Out Exception.BlockedIndefinitelyOnMVar
+
+deriving stock instance Generic Calendar.Day
+
+instance Out Calendar.Day
+
+deriving stock instance Generic LocalTime.TimeOfDay
+
+instance Out LocalTime.TimeOfDay
+
+deriving stock instance Generic UTCTime
+
+instance Out UTCTime
+
+deriving stock instance Generic (Fixed.Fixed a)
+
+instance Out (Fixed.Fixed a)
+
+deriving stock instance Generic Psql.PersistValue
+
+instance Out Psql.PersistValue
+
+deriving stock instance Generic Psql.LiteralType
+
+instance Out Psql.LiteralType
+
+instance
+  ( Generic a,
+    Generic (Psql.Key a),
+    Out a,
+    Out (Psql.Key a)
+  ) =>
+  Out (Psql.Entity a)
+
+instance Out Secp256k1.PubKey
+
+instance Out Secp256k1.Sig
+
+instance (Out a) => Out (CI.CI a) where
+  docPrec x = docPrec x . CI.original
+  doc = doc . CI.original
+
+--
+-- Show
+--
+
+instance Out GHC.ThreadId where
+  docPrec = const Universum.show
+  doc = Universum.show
+
+instance Out Clock.DiffTime where
+  docPrec = const Universum.show
+  doc = Universum.show
+
+--
+-- Composite
+--
+
+instance Out Word32 where
+  docPrec n = docPrec n . fromIntegral @Word32 @Integer
+  doc = doc . fromIntegral @Word32 @Integer
+
+instance Out Word64 where
+  docPrec n = docPrec n . fromIntegral @Word64 @Integer
+  doc = doc . fromIntegral @Word64 @Integer
+
+instance Out Int32 where
+  docPrec n = docPrec n . fromIntegral @Int32 @Integer
+  doc = doc . fromIntegral @Int32 @Integer
+
+instance Out Int64 where
+  docPrec n = docPrec n . fromIntegral @Int64 @Integer
+  doc = doc . fromIntegral @Int64 @Integer
+
+instance Out Text where
+  docPrec n = docPrec n . T.unpack
+  doc = doc . T.unpack
+
+instance Out TL.Text where
+  docPrec n = docPrec n . TL.unpack
+  doc = doc . TL.unpack
+
+instance Out ByteString where
+  docPrec n = docPrec n . newBsDoc
+  doc = doc . newBsDoc
+
+instance (Out a) => Out (Vector a) where
+  docPrec n = docPrec n . toList
+  doc = doc . toList
+
+instance
+  (Out a, Unboxed.Unbox a) =>
+  Out (Unboxed.Vector a)
+  where
+  docPrec n = docPrec n . Unboxed.toList
+  doc = doc . Unboxed.toList
+
+instance (Out a, Out b) => Out (Map a b) where
+  docPrec n = docPrec n . toList
+  doc = doc . toList
+
+--
+-- Misc
+--
+
+data ByteStringDoc
+  = ByteStringUtf8 Text
+  | ByteStringHex Text
+  | ByteStringRaw Text
+  deriving stock (Generic)
+
+instance Out ByteStringDoc
+
+newBsDoc :: ByteString -> ByteStringDoc
+newBsDoc bs =
+  case decodeUtf8' bs of
+    Right txt -> ByteStringUtf8 txt
+    Left {} ->
+      case decodeUtf8' $ B16.encode bs of
+        Right txt -> ByteStringHex txt
+        Left {} -> ByteStringRaw $ Universum.show bs
diff --git a/src/Text/PrettyPrint/GenericPretty/Type.hs b/src/Text/PrettyPrint/GenericPretty/Type.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/PrettyPrint/GenericPretty/Type.hs
@@ -0,0 +1,30 @@
+module Text.PrettyPrint.GenericPretty.Type
+  ( PrettyLog (..),
+    SecretVision (..),
+  )
+where
+
+import Text.PrettyPrint.GenericPretty (Out (..))
+import Universum
+
+data PrettyLog a
+  = PrettyLog a
+  | SecretLog SecretVision a
+  deriving stock (Eq, Ord)
+
+data SecretVision
+  = SecretVisible
+  | SecretHidden
+  deriving stock (Eq, Ord, Show, Read, Generic)
+
+instance Out SecretVision
+
+instance (Out a) => Out (PrettyLog a) where
+  docPrec n = \case
+    PrettyLog x -> docPrec n x
+    SecretLog SecretVisible x -> docPrec n x
+    SecretLog SecretHidden _ -> "SECRET"
+  doc = \case
+    PrettyLog x -> doc x
+    SecretLog SecretVisible x -> doc x
+    SecretLog SecretHidden _ -> "SECRET"
diff --git a/src/Text/PrettyPrint/GenericPretty/Util.hs b/src/Text/PrettyPrint/GenericPretty/Util.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/PrettyPrint/GenericPretty/Util.hs
@@ -0,0 +1,87 @@
+module Text.PrettyPrint.GenericPretty.Util
+  ( inspect,
+    inspectStr,
+    inspectGen,
+    inspectPlain,
+    inspectStrPlain,
+    inspectGenPlain,
+    inspectStyle,
+    inspectStyleStr,
+    inspectStyleGen,
+  )
+where
+
+import qualified Data.Text as T
+import qualified Data.Text.Lazy as TL
+import qualified Text.Pretty.Simple as PrettySimple
+import qualified Text.PrettyPrint as Pretty
+import Text.PrettyPrint.GenericPretty (Out)
+import qualified Text.PrettyPrint.GenericPretty as GenericPretty
+import Universum hiding (show)
+
+inspect :: (Out a) => a -> T.Text
+inspect =
+  inspectStyle simpleStyle
+
+inspectStr :: (Out a) => a -> String
+inspectStr =
+  inspectStyleStr simpleStyle
+
+inspectGen :: (Out a, IsString b) => a -> b
+inspectGen =
+  inspectStyleGen simpleStyle
+
+inspectPlain :: (Out a) => a -> T.Text
+inspectPlain =
+  inspectStyle plainStyle
+
+inspectStrPlain :: (Out a) => a -> String
+inspectStrPlain =
+  inspectStyleStr plainStyle
+
+inspectGenPlain :: (Out a, IsString b) => a -> b
+inspectGenPlain =
+  inspectStyleGen plainStyle
+
+inspectStyle ::
+  (Out a) =>
+  PrettySimple.OutputOptions ->
+  a ->
+  T.Text
+inspectStyle style =
+  TL.toStrict
+    . PrettySimple.pStringOpt style
+    . GenericPretty.prettyStyle
+      Pretty.style
+        { Pretty.mode = Pretty.OneLineMode
+        }
+
+inspectStyleStr ::
+  (Out a) =>
+  PrettySimple.OutputOptions ->
+  a ->
+  String
+inspectStyleStr style =
+  T.unpack . inspectStyle style
+
+inspectStyleGen ::
+  ( Out a,
+    IsString b
+  ) =>
+  PrettySimple.OutputOptions ->
+  a ->
+  b
+inspectStyleGen style =
+  fromString . inspectStyleStr style
+
+simpleStyle :: PrettySimple.OutputOptions
+simpleStyle =
+  PrettySimple.defaultOutputOptionsDarkBg
+
+plainStyle :: PrettySimple.OutputOptions
+plainStyle =
+  PrettySimple.defaultOutputOptionsNoColor
+    { PrettySimple.outputOptionsPageWidth = 100000,
+      PrettySimple.outputOptionsCompact = True,
+      PrettySimple.outputOptionsCompactParens = True
+    }
diff --git a/test/GenericPrettyInstancesSpec.hs b/test/GenericPrettyInstancesSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/GenericPrettyInstancesSpec.hs
@@ -0,0 +1,17 @@
+module GenericPrettyInstancesSpec (spec) where
+
+import Test.Hspec
+import Text.PrettyPrint.GenericPretty.Util
+  ( inspect,
+    inspectPlain,
+  )
+import Universum hiding (show)
+
+spec :: Spec
+spec = do
+  it "Bool" $
+    inspect True
+      `shouldBe` "True"
+  it "List" $
+    inspectPlain ([1 .. 5] :: [Int])
+      `shouldBe` "[ 1, 2, 3, 4, 5 ]"
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,2 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
+{-# OPTIONS_GHC -Wno-missing-export-lists #-}
