diff --git a/bits-show.cabal b/bits-show.cabal
new file mode 100644
--- /dev/null
+++ b/bits-show.cabal
@@ -0,0 +1,39 @@
+cabal-version: 3.0
+
+name: bits-show
+version: 0.0.0.0
+synopsis: Showing data as strings of 0 and 1
+category: Bit, Text
+
+description:
+    The @showFiniteBits@ function, for a type belonging to
+    the @FiniteBits@ class, displays the bits as a string.
+
+license: Apache-2.0
+license-file: license.txt
+
+author: Chris Martin
+maintainer: Chris Martin & Julie Moronuki <hello@typeclasses.com>
+
+homepage: https://github.com/typeclasses/bits-show
+bug-reports: https://github.com/typeclasses/bits-show/issues
+
+extra-source-files: *.md
+
+common base
+    default-language: GHC2021
+    build-depends: base ^>= 4.16 || ^>= 4.17 || ^>= 4.18
+
+library
+    import: base
+    exposed-modules: Bits.Show
+    hs-source-dirs: library
+
+test-suite test
+    import: base
+    type: exitcode-stdio-1.0
+    main-is: Main.hs
+    hs-source-dirs: test
+    build-depends:
+      , bits-show
+      , hspec ^>= 2.8.5 || ^>= 2.9 || ^>= 2.10
diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,3 @@
+## 0.0.0.0 -- 2023-03-29
+
+Initial version
diff --git a/library/Bits/Show.hs b/library/Bits/Show.hs
new file mode 100644
--- /dev/null
+++ b/library/Bits/Show.hs
@@ -0,0 +1,33 @@
+module Bits.Show where
+
+import Data.Bits
+import GHC.Exts
+
+class FixedWidthIntegral
+
+{- |
+Examples:
+
+@showFiniteBits (5 :: Int8) = "00000101"@
+
+@showFiniteBits ((-5) :: Int8) = "11111011"@
+-}
+showFiniteBits :: (FiniteBits bits, IsString string) => bits -> string
+showFiniteBits x =
+  fromString
+    (
+      fmap (showBit . testBit x)
+        (takeWhile (>= 0)
+          (
+            iterate
+              (\i -> i - 1)
+              (finiteBitSize x - 1)
+          )
+        )
+    )
+
+{- | @{ True -> '1'; False -> '0' }@ -}
+showBit :: Bool -> Char
+showBit x = case x of
+    True -> '1'
+    False -> '0'
diff --git a/license.txt b/license.txt
new file mode 100644
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,13 @@
+Copyright 2023 Mission Valley Software LLC
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/readme.md b/readme.md
new file mode 100644
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,3 @@
+The `showFiniteBits` function, for a type belonging to the `FiniteBits` class,
+displays the bits as a string. All the bits are shown; e.g. for an `Int32` you
+will always get a string of length 32.
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,20 @@
+import Test.Hspec
+
+import Bits.Show
+import Data.Int
+import Data.Word
+
+main = hspec $ do
+  describe "showFiniteBits" $ do
+    it "Word8"  $ showFiniteBits @Word8    2  `shouldBe` "00000010"
+    it "Int8+"  $ showFiniteBits @Int8     2  `shouldBe` "00000010"
+    it "Int8-"  $ showFiniteBits @Int8   (-2) `shouldBe` "11111110"
+    it "Word16" $ showFiniteBits @Word16   2  `shouldBe` "0000000000000010"
+    it "Int16+" $ showFiniteBits @Int16    2  `shouldBe` "0000000000000010"
+    it "Int16-" $ showFiniteBits @Int16  (-2) `shouldBe` "1111111111111110"
+    it "Word32" $ showFiniteBits @Word32   2  `shouldBe` "00000000000000000000000000000010"
+    it "Int32+" $ showFiniteBits @Int32    2  `shouldBe` "00000000000000000000000000000010"
+    it "Int32-" $ showFiniteBits @Int32  (-2) `shouldBe` "11111111111111111111111111111110"
+    it "Word64" $ showFiniteBits @Word64   2  `shouldBe` "0000000000000000000000000000000000000000000000000000000000000010"
+    it "Int64+" $ showFiniteBits @Int64    2  `shouldBe` "0000000000000000000000000000000000000000000000000000000000000010"
+    it "Int64-" $ showFiniteBits @Int64  (-2) `shouldBe` "1111111111111111111111111111111111111111111111111111111111111110"
