diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2015 Pedro Tacla Yamada
+
+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/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/frontmatter.cabal b/frontmatter.cabal
new file mode 100644
--- /dev/null
+++ b/frontmatter.cabal
@@ -0,0 +1,45 @@
+name:                frontmatter
+version:             0.1.0.0
+synopsis:            Parses frontmatter as used in Jekyll markdown files.
+description:         Provides a parser that'll parse the frontmatter only and
+                   . one that'll execute a YAML parser on it, so that it's a
+                   . YAML frontmatter parser.
+homepage:            https://github.com/yamadapc/haskell-frontmatter
+license:             MIT
+license-file:        LICENSE
+author:              Pedro Tacla Yamada
+maintainer:          tacla.yamada@gmail.com
+copyright:           Copyright (c) 2015 Pedro Tacla Yamada
+category:            Data
+build-type:          Simple
+cabal-version:       >=1.10
+tested-with: GHC >= 7.8
+
+source-repository head
+  type:     git
+  location: git://github.com/yamadapc/haskell-frontmatter.git
+
+library
+  exposed-modules:     Data.Frontmatter
+                     , Data.Frontmatter.Internal
+                     , Data.Yaml.Frontmatter
+  build-depends:       attoparsec >= 0.11.3.0
+                     , base >= 4 && <5
+                     , bytestring
+                     , yaml
+  hs-source-dirs:      src
+  default-language:    Haskell2010
+
+test-suite hspec
+  main-is: Spec.hs
+  type: exitcode-stdio-1.0
+  build-depends: QuickCheck
+               , attoparsec
+               , base
+               , yaml
+               , bytestring
+               , frontmatter
+               , text
+               , hspec
+  hs-source-dirs: test
+  default-language: Haskell2010
diff --git a/src/Data/Frontmatter.hs b/src/Data/Frontmatter.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Frontmatter.hs
@@ -0,0 +1,59 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+module Data.Frontmatter
+    ( -- * Frontmatter parser
+      frontmatter
+    , frontmatterYaml
+      -- * Utility functions
+    , parseFrontmatter
+    , parseFrontmatterMaybe
+    , parseFrontmatterEither
+    , parseYamlFrontmatter
+    , parseYamlFrontmatterMaybe
+    , parseYamlFrontmatterEither
+      -- * Re-exports
+    , parse
+    , maybeResult
+    , eitherResult
+    , Parser
+    , Result
+    , IResult(..)
+    )
+  where
+
+import           Data.Attoparsec.ByteString
+import           Data.ByteString            (ByteString)
+import           Data.Frontmatter.Internal
+import           Data.Yaml                  (FromJSON)
+import           Data.Yaml.Frontmatter
+
+-- |
+-- Parse a frontmatter from a 'ByteString' returning a 'Result'. Just extracts
+-- whatever is on the frontmatter; doesn't care what it is.
+parseFrontmatter :: ByteString -> Result ByteString
+parseFrontmatter = parse frontmatter
+
+-- |
+-- 'parseFrontmatter' but returning a 'Maybe'
+parseFrontmatterMaybe :: ByteString -> Maybe ByteString
+parseFrontmatterMaybe = maybeResult . parse frontmatter
+
+-- |
+-- 'parseFrontmatter' but returning an 'Either'
+parseFrontmatterEither :: ByteString -> Either String ByteString
+parseFrontmatterEither = eitherResult . parse frontmatter
+
+-- |
+-- Parse a frontmatter from a 'ByteString' returning a 'FromJSON a'. Will parse
+-- both JSON and YAML.
+parseYamlFrontmatter :: FromJSON a => ByteString -> Result a
+parseYamlFrontmatter = parse frontmatterYaml
+
+-- |
+-- 'parseYamlFrontmatter' but returning a 'Maybe'
+parseYamlFrontmatterMaybe :: FromJSON a => ByteString -> Maybe a
+parseYamlFrontmatterMaybe = maybeResult . parse frontmatterYaml
+
+-- |
+-- 'parseYamlFrontmatter' but returning an 'Either'
+parseYamlFrontmatterEither :: FromJSON a => ByteString -> Either String a
+parseYamlFrontmatterEither = eitherResult . parse frontmatterYaml
diff --git a/src/Data/Frontmatter/Internal.hs b/src/Data/Frontmatter/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Frontmatter/Internal.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Data.Frontmatter.Internal where
+
+import           Control.Applicative              ((*>))
+import           Data.Attoparsec.ByteString
+import           Data.Attoparsec.ByteString.Char8
+import           Data.ByteString                  (ByteString)
+import qualified Data.ByteString.Char8            as ByteString (pack)
+
+-- |
+-- A parser for a frontmatter; returns it as a 'ByteString'. Doesn't fail even
+-- if it's empty. When it fails; returns a a IResult with the whole input
+-- rather than consuming it.
+frontmatter :: Parser ByteString
+frontmatter = frontmatter' <?> "frontmatter"
+  where
+    frontmatter' = do
+        f <- frontmatterSeparator *> manyTill anyChar frontmatterSeparator
+        return $ ByteString.pack f
+
+-- |
+-- Internal parser for the frontmatter separator
+frontmatterSeparator :: Parser ()
+frontmatterSeparator = string "---" >> endOfLine
diff --git a/src/Data/Yaml/Frontmatter.hs b/src/Data/Yaml/Frontmatter.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Yaml/Frontmatter.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+module Data.Yaml.Frontmatter where
+
+import           Data.Attoparsec.ByteString
+import           Data.Frontmatter.Internal
+import           Data.Yaml                  (FromJSON, Value, decodeEither)
+
+-- |
+-- Parses a YAML frontmatter or JSON frontmatter from a 'ByteString' as a
+-- 'Value'. Because of how @Data.Yaml@ is implemented using @aeson@, this will
+-- succeed for JSON frontmatters as well as YAML ones.
+frontmatterYaml :: FromJSON a => Parser a
+frontmatterYaml = frontmatterYaml' <?> "frontmatterYaml"
+  where
+    frontmatterYaml' = do
+        f <- frontmatter
+        case decodeEither f of
+            Left e -> fail e
+            Right v -> return v
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
