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-binary.cabal b/composite-binary.cabal
new file mode 100644
--- /dev/null
+++ b/composite-binary.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: a6ec3b30f6193a5ac05adee9358e841a0f1985c3a23c48d9ceafc78ec0621524
+
+name:           composite-binary
+version:        0.7.4.0
+synopsis:       Orphan binary instances.
+description:    Binary 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.Binary
+  other-modules:
+      Paths_composite_binary
+  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
+    , binary >=0.8 && <0.9
+    , composite-base >=0.7 && <0.8
+  default-language: Haskell2010
diff --git a/src/Composite/Record/Binary.hs b/src/Composite/Record/Binary.hs
new file mode 100644
--- /dev/null
+++ b/src/Composite/Record/Binary.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE UndecidableInstances #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+module Composite.Record.Binary where
+
+import Composite.Record((:->), Record, Rec((:&)), val, getVal)
+import Control.Applicative(liftA2)
+import Data.Binary(Binary(put, get))
+import Data.Functor.Identity(runIdentity)
+
+instance Binary a => Binary (s :-> a) where
+  put = put . getVal
+  get = fmap (runIdentity . val) get
+
+instance Binary (Record '[])
+
+instance (Binary x, Binary (Record xs)) => Binary (Record (x : xs)) where
+  put (x :& xs) = put x >> put xs
+  get = liftA2 (:&) get get
