diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -7,6 +7,18 @@
 
 ## [Unreleased]
 
+## [0.1.0.2] - 2018-09-27
+
+### Changed
+
+- #132 Remove autogenerated cabal file from git @domenkozar
+- NarC now strips the extension @domenkozar
+- added `BinaryCacheAuthenticated` @domenkozar
+- #118 User: add email field @domenkozar
+- Update dependencies to Stackage LTS-12 @domenkozar
+
+### Changed
+
 ## [0.1.0.1] - 2018-07-06
 
 ### Changed
diff --git a/cachix-api.cabal b/cachix-api.cabal
--- a/cachix-api.cabal
+++ b/cachix-api.cabal
@@ -1,11 +1,13 @@
--- This file has been generated from package.yaml by hpack version 0.28.2.
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.31.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 622e58e514481a3a8c55a6b379423676d4d2157334db4c29b45ef8c0954e3bb0
+-- hash: 5eaa9ab936f76cafce3bb324f6f2f2e22d928ac4a49316a827f9b859b06807d7
 
 name:           cachix-api
-version:        0.1.0.1
+version:        0.1.0.2
 synopsis:       Servant HTTP API specification for https://cachix.org
 homepage:       https://github.com/cachix/cachix#readme
 bug-reports:    https://github.com/cachix/cachix/issues
@@ -15,10 +17,9 @@
 license:        Apache-2.0
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.10
 extra-source-files:
-    ChangeLog.md
     README.md
+    ChangeLog.md
 
 source-repository head
   type: git
@@ -28,16 +29,18 @@
   exposed-modules:
       Cachix.Api
       Cachix.Api.Signing
-      Cachix.Api.Swagger
       Cachix.Api.Types
+      Cachix.Types.BinaryCacheAuthenticated
       Cachix.Types.ContentTypes
+      Cachix.Types.NarInfoCreate
       Cachix.Types.Servant
       Cachix.Types.Session
+      Cachix.Types.SwaggerOrphans
   other-modules:
       Paths_cachix_api
   hs-source-dirs:
       src
-  default-extensions: OverloadedStrings
+  default-extensions: OverloadedStrings DeriveGeneric DeriveAnyClass
   ghc-options: -Wall -fwarn-tabs -fwarn-unused-imports -fwarn-missing-signatures -fwarn-name-shadowing -fwarn-incomplete-patterns
   build-depends:
       aeson
@@ -45,8 +48,7 @@
     , base >=4.7 && <5
     , base16-bytestring
     , bytestring
-    , conduit
-    , conduit-combinators
+    , conduit >=1.3.0
     , cookie
     , cryptonite
     , http-api-data
@@ -72,7 +74,7 @@
       Paths_cachix_api
   hs-source-dirs:
       cachix-gen-swagger
-  default-extensions: OverloadedStrings
+  default-extensions: OverloadedStrings DeriveGeneric DeriveAnyClass
   ghc-options: -Wall -fwarn-tabs -fwarn-unused-imports -fwarn-missing-signatures -fwarn-name-shadowing -fwarn-incomplete-patterns -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       aeson
@@ -81,8 +83,7 @@
     , base16-bytestring
     , bytestring
     , cachix-api
-    , conduit
-    , conduit-combinators
+    , conduit >=1.3.0
     , cookie
     , cryptonite
     , http-api-data
@@ -110,7 +111,7 @@
       Paths_cachix_api
   hs-source-dirs:
       test
-  default-extensions: OverloadedStrings
+  default-extensions: OverloadedStrings DeriveGeneric DeriveAnyClass
   ghc-options: -Wall -fwarn-tabs -fwarn-unused-imports -fwarn-missing-signatures -fwarn-name-shadowing -fwarn-incomplete-patterns -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       aeson
@@ -119,8 +120,7 @@
     , base16-bytestring
     , bytestring
     , cachix-api
-    , conduit
-    , conduit-combinators
+    , conduit >=1.3.0
     , cookie
     , cryptonite
     , hspec
diff --git a/src/Cachix/Api.hs b/src/Cachix/Api.hs
--- a/src/Cachix/Api.hs
+++ b/src/Cachix/Api.hs
@@ -28,11 +28,13 @@
 import Servant.Swagger.UI.Core   (SwaggerSchemaUI)
 import Web.Cookie                (SetCookie)
 
+import Cachix.Types.BinaryCacheAuthenticated as BinaryCacheAuthenticated
+import Cachix.Types.NarInfoCreate
 import Cachix.Types.ContentTypes
 import Cachix.Types.Servant      (Get302, Post302, Head)
 import Cachix.Types.Session      (Session)
+import Cachix.Types.SwaggerOrphans ()
 import Cachix.Api.Types
-import Cachix.Api.Swagger        ()
 
 
 type CachixAuth = Auth '[Cookie,JWT] Session
@@ -99,7 +101,7 @@
    , caches :: route :-
        CachixAuth :>
        "cache" :>
-       Get '[JSON] [BinaryCache]
+       Get '[JSON] [BinaryCacheAuthenticated.BinaryCacheAuthenticated]
    , cache :: route :-
        "cache" :>
        Capture "name" Text :>
diff --git a/src/Cachix/Api/Signing.hs b/src/Cachix/Api/Signing.hs
--- a/src/Cachix/Api/Signing.hs
+++ b/src/Cachix/Api/Signing.hs
@@ -19,24 +19,23 @@
 
 
 -- perl/lib/Nix/Manifest.pm:fingerprintPath
--- TODO: Either Text ByteString: assert values
 -- NB: references must be sorted
-fingerprint :: Text -> Text -> Int -> [Text] -> ByteString
+fingerprint :: Text -> Text -> Integer -> [Text] -> ByteString
 fingerprint storePath narHash narSize references = toS $ T.intercalate ";"
   ["1", storePath, narHash, T.pack (show narSize), T.intercalate "," references]
 
 -- Useful sinks for streaming nars
 
-sizeSink :: MonadIO m => Consumer ByteString m Int
-sizeSink = CC.foldM (\p n -> return (p + BS.length n)) 0
+sizeSink :: MonadIO m => ConduitT ByteString o m Integer
+sizeSink = CC.foldM (\p n -> return (p + fromIntegral (BS.length n))) 0
 
-hashSink :: MonadIO m => Consumer ByteString m (Context SHA256)
+hashSink :: MonadIO m => ConduitT ByteString o m (Context SHA256)
 hashSink = CC.foldM (\p n -> return (hashUpdate p n)) hashInit
 
-passthroughSizeSink :: MonadIO m => IORef Int -> Conduit ByteString m ByteString
+passthroughSizeSink :: MonadIO m => IORef Integer -> ConduitT ByteString ByteString m ()
 passthroughSizeSink ioref = passthroughSink sizeSink (liftIO . writeIORef ioref)
 
-passthroughHashSink :: MonadIO m => IORef Text -> Conduit ByteString m ByteString
+passthroughHashSink :: MonadIO m => IORef Text -> ConduitT ByteString ByteString m ()
 passthroughHashSink ioref = passthroughSink hashSink (liftIO . writeIORef ioref . transf)
   where
     -- TODO: use cryptonite B16 to get rid of extra dep and simplify
diff --git a/src/Cachix/Api/Swagger.hs b/src/Cachix/Api/Swagger.hs
deleted file mode 100644
--- a/src/Cachix/Api/Swagger.hs
+++ /dev/null
@@ -1,44 +0,0 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-module Cachix.Api.Swagger
-  () where
-
-import Data.Swagger
-import Data.Proxy
-import Servant.API
-import Servant.Swagger
-import Servant.Streaming
-import Servant.Auth.Swagger ()
-import Web.Cookie           (SetCookie)
-
-import Cachix.Api.Types
-
-
-instance ToSchema NixCacheInfo
-instance ToSchema NarInfo
-instance ToSchema NarInfoCreate
-
-instance ToSchema BinaryCache
-instance ToSchema BinaryCacheCreate
-
-instance ToSchema User
-
-instance ToParamSchema NarC
-instance ToParamSchema NarInfoC
-
-
--- TODO: https://github.com/haskell-servant/servant-auth/pull/42#issuecomment-381279499
-instance ToParamSchema SetCookie where
-  toParamSchema _ = mempty -- TODO: cookie instances for swagger
-
--- https://github.com/plow-technologies/servant-streaming/blob/master/servant-streaming-docs/src/Servant/Streaming/Docs/Internal.hs
--- TODO: these should define the body/response content
-instance (HasSwagger api) => HasSwagger (StreamBodyMonad contentTypes m :> api) where
---instance (HasSwagger api) => HasSwagger (StreamBody contentTypes :> api) where
-  toSwagger _ = toSwagger (Proxy :: Proxy api)
-
-instance HasSwagger (StreamResponseGet contentTypes) where
-  toSwagger _ = mempty -- TODO mkEndpointNoContent
diff --git a/src/Cachix/Api/Types.hs b/src/Cachix/Api/Types.hs
--- a/src/Cachix/Api/Types.hs
+++ b/src/Cachix/Api/Types.hs
@@ -1,10 +1,8 @@
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DeriveAnyClass #-}
 module Cachix.Api.Types where
 
 import Data.Aeson           (FromJSON, ToJSON)
-import Data.ByteString      (ByteString)
 import Data.Monoid          ((<>))
+import Data.Swagger         (ToSchema, ToParamSchema)
 import Data.Text            (Text, takeEnd, dropEnd)
 import GHC.Generics         (Generic)
 import Servant.API
@@ -14,7 +12,7 @@
   { storeDir :: Text
   , wantMassQuery :: Integer
   , priority :: Integer
-  } deriving (Generic, Show, FromJSON, ToJSON)
+  } deriving (Generic, Show, FromJSON, ToJSON, ToSchema)
 
 -- narinfo url includes storePath hash and .narinfo suffix
 data NarInfo = NarInfo
@@ -26,7 +24,7 @@
     -- ^ name of the compression algorithm, eg. xz
   , fileHash :: Text
     -- ^ sha256 hash of the compressed nar file
-    -- NOTE: to compute use "nix-hash --type sha256 --flat --base32"
+    -- NOTE: to compute use "nix-hash --type sha256 --flat"
   , fileSize :: Integer
     -- ^ file size of compressed nar file
     -- NOTE: du -b
@@ -44,46 +42,38 @@
     -- NOTE: nix-store -q --deriver
   , sig :: Text
     -- ^ signature of fields: storePath, narHash, narSize, refs
-  } deriving (Generic, Show, FromJSON, ToJSON)
+  } deriving (Generic, Show, FromJSON, ToJSON, ToSchema)
 
--- | Client create type
-data NarInfoCreate = NarInfoCreate
-  { cStoreHash :: Text -- ^ $storePrefix / $storeHash - $storeSuffix
-  , cStoreSuffix :: Text -- ^ $storePrefix / $storeHash - $storeSuffix
-  , cNarHash :: Text
-  , cNarSize :: Int
-  , cFileHash :: Text
-  , cFileSize :: Int
-  , cReferences :: [Text]
-  , cDeriver :: Text
-  , cSig :: Text
-  } deriving (Generic, Show, FromJSON, ToJSON)
 
 data BinaryCache = BinaryCache
   { name :: Text
   , uri :: Text
   , publicSigningKeys :: [Text]
-  } deriving (Show, Generic, FromJSON, ToJSON)
+  } deriving (Show, Generic, FromJSON, ToJSON, ToSchema)
 
 newtype BinaryCacheCreate = BinaryCacheCreate
   { publicSigningKey :: Text
-  } deriving (Show, Generic, FromJSON, ToJSON)
+  } deriving (Show, Generic, FromJSON, ToJSON, ToSchema)
 
--- | checksum of nar.xz file
-newtype NarC = NarC Text deriving Generic
+newtype BinaryCacheError = BinaryCacheError
+  { error :: Text
+  } deriving (Generic, FromJSON, ToJSON)
 
--- | Store path hash
-newtype NarInfoC = NarInfoC Text deriving Generic
+-- | Hash of nar.xz file
+newtype NarC = NarC Text deriving (Generic, ToSchema, ToParamSchema)
 
 instance FromHttpApiData NarC where
   parseUrlPiece s =
     if takeEnd 7 s == ".nar.xz"
-    then Right $ NarC s
+    then Right $ NarC (dropEnd 7 s)
     else Left ""
 
 instance ToHttpApiData NarC where
   toUrlPiece (NarC n) = n <> ".nar.xz"
 
+-- | Store path hash
+newtype NarInfoC = NarInfoC Text deriving (Generic, ToSchema, ToParamSchema)
+
 instance FromHttpApiData NarInfoC where
   parseUrlPiece s =
     if takeEnd 8 s == ".narinfo"
@@ -93,12 +83,8 @@
 instance ToHttpApiData NarInfoC where
   toUrlPiece (NarInfoC n) = n <> ".narinfo"
 
-
-newtype BinaryCacheError = BinaryCacheError
-  { error :: Text
-  } deriving (Generic, FromJSON, ToJSON)
-
 data User = User
   { fullname :: Text
   , username :: Text
-  } deriving (Generic, FromJSON, ToJSON)
+  , email :: Maybe Text
+  } deriving (Generic, FromJSON, ToJSON, ToSchema)
diff --git a/src/Cachix/Types/BinaryCacheAuthenticated.hs b/src/Cachix/Types/BinaryCacheAuthenticated.hs
new file mode 100644
--- /dev/null
+++ b/src/Cachix/Types/BinaryCacheAuthenticated.hs
@@ -0,0 +1,19 @@
+module Cachix.Types.BinaryCacheAuthenticated
+  ( BinaryCacheAuthenticated(..)
+  ) where
+
+import           Data.Aeson                     ( FromJSON
+                                                , ToJSON
+                                                )
+import Data.Swagger
+import           Data.Text                      ( Text )
+import           GHC.Generics                   ( Generic )
+
+
+-- | Binary Cache response content when user is authenticated
+data BinaryCacheAuthenticated = BinaryCacheAuthenticated
+  { name :: Text
+  , uri :: Text
+  , publicSigningKeys :: [Text]
+  , totalFileSize :: Integer
+  } deriving (Show, Generic, FromJSON, ToJSON, ToSchema)
diff --git a/src/Cachix/Types/NarInfoCreate.hs b/src/Cachix/Types/NarInfoCreate.hs
new file mode 100644
--- /dev/null
+++ b/src/Cachix/Types/NarInfoCreate.hs
@@ -0,0 +1,37 @@
+module Cachix.Types.NarInfoCreate
+  ( NarInfoCreate(..)
+  , NarInfoInvalid
+  , isNarInfoCreateValid
+  ) where
+
+import           Control.Exception             (Exception)
+import           Data.Aeson                     ( FromJSON
+                                                , ToJSON
+                                                )
+import           Data.Swagger
+import           Data.Text                      ( Text )
+import           GHC.Generics                   ( Generic )
+
+-- TODO: get rid of c prefix
+
+-- | Client create type
+data NarInfoCreate = NarInfoCreate
+  { cStoreHash :: Text -- ^ $storePrefix / $storeHash - $storeSuffix
+  , cStoreSuffix :: Text -- ^ $storePrefix / $storeHash - $storeSuffix
+  , cNarHash :: Text
+  , cNarSize :: Integer
+  , cFileHash :: Text
+  , cFileSize :: Integer
+  , cReferences :: [Text]
+  , cDeriver :: Text
+  , cSig :: Text
+  } deriving (Generic, Show, FromJSON, ToJSON, ToSchema)
+
+data NarInfoInvalid =
+  NarSizeIsZero
+  deriving (Show, Exception)
+
+
+isNarInfoCreateValid :: NarInfoCreate -> Either NarInfoInvalid ()
+isNarInfoCreateValid nic | cNarSize nic == 0 = Left NarSizeIsZero
+                         | otherwise = Right ()
diff --git a/src/Cachix/Types/SwaggerOrphans.hs b/src/Cachix/Types/SwaggerOrphans.hs
new file mode 100644
--- /dev/null
+++ b/src/Cachix/Types/SwaggerOrphans.hs
@@ -0,0 +1,29 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+module Cachix.Types.SwaggerOrphans
+  () where
+
+import Data.Proxy
+import Data.Swagger (ToParamSchema(..))
+import Servant.API
+import Servant.Swagger
+import Servant.Streaming
+import Servant.Auth.Swagger ()
+import Web.Cookie           (SetCookie)
+
+
+-- TODO: https://github.com/haskell-servant/servant-auth/pull/42#issuecomment-381279499
+instance ToParamSchema SetCookie where
+  toParamSchema _ = mempty -- TODO: cookie instances for swagger
+
+-- https://github.com/plow-technologies/servant-streaming/blob/master/servant-streaming-docs/src/Servant/Streaming/Docs/Internal.hs
+-- TODO: these should define the body/response content
+instance (HasSwagger api) => HasSwagger (StreamBodyMonad contentTypes m :> api) where
+  toSwagger _ = toSwagger (Proxy :: Proxy api)
+
+instance HasSwagger (StreamResponseGet contentTypes) where
+  toSwagger _ = mempty -- TODO mkEndpointNoContent
