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/composite-hashable.cabal b/composite-hashable.cabal
new file mode 100644
--- /dev/null
+++ b/composite-hashable.cabal
@@ -0,0 +1,34 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.33.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 0c8bfc8ec3ee0943c5b055ead5ee34438c950c754e4627217c9bcda776d629c6
+
+name:           composite-hashable
+version:        0.7.4.0
+synopsis:       Orphan hashable instances.
+description:    Hashable instance for (:->) and Record.
+category:       Records
+homepage:       https://github.com/ConferOpenSource/composite#readme
+author:         Confer Health, Inc
+maintainer:     oss@vitalbio.com
+copyright:      2017 Confer Health, Inc., 2020 Vital Biosciences
+license:        BSD3
+build-type:     Simple
+
+library
+  exposed-modules:
+      Composite.Record.Hashable
+  other-modules:
+      Paths_composite_hashable
+  hs-source-dirs:
+      src
+  default-extensions: DataKinds FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving LambdaCase MultiParamTypeClasses MultiWayIf OverloadedStrings PatternSynonyms PolyKinds QuasiQuotes RankNTypes ScopedTypeVariables StandaloneDeriving StrictData TemplateHaskell TupleSections TypeFamilies TypeOperators ViewPatterns
+  ghc-options: -Wall -O2
+  build-depends:
+      base >=4.7 && <5
+    , composite-base >=0.7 && <0.8
+    , hashable >=1.1.1 && <1.4
+  default-language: Haskell2010
diff --git a/src/Composite/Record/Hashable.hs b/src/Composite/Record/Hashable.hs
new file mode 100644
--- /dev/null
+++ b/src/Composite/Record/Hashable.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE UndecidableInstances #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+module Composite.Record.Hashable where
+
+import Composite.Record((:->), Record, Rec(RNil, (:&)), getVal)
+import Data.Hashable(Hashable(hashWithSalt))
+
+instance Hashable a => Hashable (s :-> a) where
+  hashWithSalt n x = hashWithSalt n $ getVal x
+
+instance Hashable (Record '[]) where
+  hashWithSalt n RNil = n `hashWithSalt` ()
+
+instance (Hashable x, Hashable (Record xs)) => Hashable (Record (x : xs)) where
+  hashWithSalt n (x :& xs) = n `hashWithSalt` x `hashWithSalt` xs
