diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+Revision History for zxcvbn-dvorak
+==================================
+
+0.1.0.0 (September 12, 2019)
+----------------------------
+
+  * Initial release
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Peter J. Jones <pjones@devalot.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,38 @@
+What?
+-----
+
+This package enhances the [zxcvbn][zxcvbn-hs] password strength
+estimation algorithm by allowing it to detect keyboard patterns made
+with a Dvorak layout.
+
+It also serves as an example of how to generate a keyboard layout for
+[zxcvbn-hs][].
+
+How to Use this Package
+-----------------------
+
+Let's say you want to add the Dvorak keyboard layout to the default
+`en_US` config:
+
+```haskell
+import Text.Password.Strength.Config
+import Text.Password.Strength.Config.Dvorak
+
+myConfig :: Config
+myConfig = dvorak en_US
+```
+
+How this Package is Put Together
+--------------------------------
+
+Essentially:
+
+  1. Edit the raw layout file in `data/keyboards/en-US/dvorak.txt`
+
+  2. Turn that into Haskell with `generate.sh`
+
+
+**NOTE:** The `generate.sh` script requires [Nix][] to be installed.
+
+[zxcvbn-hs]: https://code.devalot.com/sthenauth/zxcvbn-hs
+[nix]: https://nixos.org/nix/download.html
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/src/Text/Password/Strength/Config/Dvorak.hs b/src/Text/Password/Strength/Config/Dvorak.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Password/Strength/Config/Dvorak.hs
@@ -0,0 +1,33 @@
+{-|
+
+Copyright:
+  This file is part of the package zxcvbn-dvorak. It is subject to the
+  license terms in the LICENSE file found in the top-level directory
+  of this distribution and at:
+
+    https://code.devalot.com/sthenauth/zxcvbn-dvorak
+
+  No part of this package, including this file, may be copied,
+  modified, propagated, or distributed except according to the terms
+  contained in the LICENSE file.
+
+License: MIT
+
+Enhance the zxcvbn password strength estimation algorithm by allowing
+by allowing it to detect keyboard patterns from a Dvorak layout.
+
+-}
+module Text.Password.Strength.Config.Dvorak
+  ( dvorak
+  ) where
+
+--------------------------------------------------------------------------------
+-- Imports:
+import Control.Lens ((%~))
+import qualified Text.Password.Strength.Config as Zxcvbn
+import qualified Text.Password.Strength.Config.Dvorak.Generated as Generated
+
+--------------------------------------------------------------------------------
+-- | Add the Dvorak keyboard layout to an existing 'Config'.
+dvorak :: Zxcvbn.Config -> Zxcvbn.Config
+dvorak = Zxcvbn.keyboardGraphs %~ (Generated.dvorak:)
diff --git a/src/Text/Password/Strength/Config/Dvorak/Generated.hs b/src/Text/Password/Strength/Config/Dvorak/Generated.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Password/Strength/Config/Dvorak/Generated.hs
@@ -0,0 +1,19 @@
+-- This file is automatically generated, DO NOT EDIT!
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -Wno-missing-export-lists #-}
+{-# OPTIONS_GHC -Wno-unused-imports #-}
+module Text.Password.Strength.Config.Dvorak.Generated where
+import Data.HashMap.Strict (HashMap)
+import qualified Data.HashMap.Strict as HashMap
+import Data.Text (Text)
+import qualified Codec.Compression.GZip as GZip
+import qualified Data.ByteString.Base64.Lazy as Base64
+import qualified Data.Binary as Binary
+import Data.Binary.Instances ()
+import Text.Password.Strength.Types
+
+dvorak :: AdjacencyTable
+dvorak =
+  let decode = Binary.decode . GZip.decompress . Base64.decodeLenient
+  in  decode "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"
+
diff --git a/zxcvbn-dvorak.cabal b/zxcvbn-dvorak.cabal
new file mode 100644
--- /dev/null
+++ b/zxcvbn-dvorak.cabal
@@ -0,0 +1,56 @@
+cabal-version: 2.2
+
+--------------------------------------------------------------------------------
+name:          zxcvbn-dvorak
+version:       0.1.0.0
+synopsis:      Password strength estimation based on zxcvbn.
+description:   Please see the README below.
+license:       MIT
+license-file:  LICENSE
+author:        Peter Jones <pjones@devalot.com>
+maintainer:    Peter Jones <pjones@devalot.com>
+copyright:     Copyright (c) 2019 Peter Jones
+homepage:      https://code.devalot.com/sthenauth/zxcvbn-dvorak
+bug-reports:   https://github.com/sthenauth/zxcvbn-dvorak/issues
+category:      System
+
+--------------------------------------------------------------------------------
+extra-source-files:
+  CHANGELOG.md
+  README.md
+
+--------------------------------------------------------------------------------
+source-repository head
+  type: git
+  location: https://code.devalot.com/sthenauth/zxcvbn-dvorak.git
+
+--------------------------------------------------------------------------------
+common options
+  default-language: Haskell2010
+  ghc-options: -Wall
+               -Werror=incomplete-record-updates
+               -Werror=incomplete-uni-patterns
+               -Werror=missing-home-modules
+               -Widentities
+               -Wmissing-export-lists
+               -Wredundant-constraints
+
+--------------------------------------------------------------------------------
+common dependencies
+  build-depends: base                 >= 4.9   && < 5.0
+               , base64-bytestring    >= 1.0   && < 1.1
+               , binary               >= 0.8   && < 0.11
+               , binary-instances     >= 0.1   && < 1.0
+               , containers           >= 0.6   && < 0.7
+               , lens                 >= 4.17  && < 4.18
+               , text                 >= 1.2   && < 1.3
+               , unordered-containers >= 0.2   && < 0.3
+               , zlib                 >= 0.6   && < 0.7
+               , zxcvbn-hs            >= 0.2   && < 1.0
+
+--------------------------------------------------------------------------------
+library
+  import: options, dependencies
+  hs-source-dirs: src
+  exposed-modules: Text.Password.Strength.Config.Dvorak
+  other-modules: Text.Password.Strength.Config.Dvorak.Generated
