diff --git a/AUTHORS b/AUTHORS
new file mode 100644
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,1 @@
+fr33domlover <fr33domlover@riseup.net>
diff --git a/COPYING b/COPYING
new file mode 100644
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+    HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display,
+     communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+     likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+     subject to the limitations in paragraph 4(a), below;
+  v. rights protecting the extraction, dissemination, use and reuse of data
+     in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+     European Parliament and of the Council of 11 March 1996 on the legal
+     protection of databases, and under any national implementation
+     thereof, including any amended or successor version of such
+     directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+     world based on applicable law or treaty, and any national
+     implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+    surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+    warranties of any kind concerning the Work, express, implied,
+    statutory or otherwise, including without limitation warranties of
+    title, merchantability, fitness for a particular purpose, non
+    infringement, or the absence of latent or other defects, accuracy, or
+    the present or absence of errors, whether or not discoverable, all to
+    the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+    that may apply to the Work or any use thereof, including without
+    limitation any person's Copyright and Related Rights in the Work.
+    Further, Affirmer disclaims responsibility for obtaining any necessary
+    consents, permissions or other rights required for any use of the
+    Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+    party to this document and has no duty or obligation with respect to
+    this CC0 or use of the Work.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,17 @@
+The changes are recorded by the version control system, Darcs. To see a log
+quickly from the terminal, run:
+
+  $ darcs changes --repo http://dev.rel4tion.org/fr33domlover/vcs-web-hook-parse
+
+There is also a web interface at <http://darcs.rel4tion.org> which, among other
+things, can display the history log.
+
+To see the log in a local clone, first get a copy of the repository if you
+haven't yet:
+
+  $ darcs get http://dev.rel4tion.org/fr33domlover/vcs-web-hook-parse
+
+Then move into the newly created directory and run darcs:
+
+  $ cd vcs-web-hook-parse
+  $ darcs changes
diff --git a/INSTALL b/INSTALL
new file mode 100644
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,13 @@
+Install from Hackage:
+
+    $ cabal install vcs-web-hook-parse
+
+Install from unpacked release tarball or source repo:
+
+    $ cd vcs-web-hook-parse
+    $ cabal install
+
+Just play with it without installing:
+
+    $ cabal build
+    $ cabal repl
diff --git a/NEWS b/NEWS
new file mode 100644
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,23 @@
+This file lists the user-visible interesting changes between releases. For a
+full list of changes to the source, see the ChangeLog.
+
+
+
+vcs-web-hook-parse 0.1.0.0 -- 2015-08-10
+========================================
+
+General, build and documentation changes:
+
+* (This is the first release, so everything is new)
+
+New APIs, features and enhancements:
+
+* (This is the first release, so everything is a new feature)
+
+Bug fixes:
+
+* (This is just the first release)
+
+Dependency changes:
+
+* (This is the first release)
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+See the .cabal file for more info and link to project website the version
+control.
+
+The official download location is Hackage:
+
+<http://hackage.haskell.org/package/vcs-web-hook-parse>
+
+This library is free software, and is committed to software freedom. It is
+released to the public domain using the CC0 Public Domain Dedication. For the
+boring "legal" details see the file 'COPYING'.
+
+See the file 'INSTALL' for hints on installation. The file 'ChangeLog' explains
+how to see the history log of the changes done in the code. 'NEWS' provides a
+friendly overview of the changes for each release.
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/Web/Hook/GitLab.hs b/src/Web/Hook/GitLab.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Hook/GitLab.hs
@@ -0,0 +1,300 @@
+{- This file is part of vcs-web-hook-parse.
+ -
+ - Written in 2015 by fr33domlover <fr33domlover@rel4tion.org>.
+ -
+ - ♡ Copying is an act of love. Please copy, reuse and share.
+ -
+ - The author(s) have dedicated all copyright and related and neighboring
+ - rights to this software to the public domain worldwide. This software is
+ - distributed without any warranty.
+ -
+ - You should have received a copy of the CC0 Public Domain Dedication along
+ - with this software. If not, see
+ - <http://creativecommons.org/publicdomain/zero/1.0/>.
+ -}
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Web.Hook.GitLab
+    ( CommitID
+    , Url
+    , Author (..)
+    , User (..)
+    , Commit (..)
+    , MergeEndpoint (..)
+    , Repository (..)
+    , Issue (..)
+    , MergeRequest (..)
+    , Push (..)
+    , IssueEvent (..)
+    , MergeRequestEvent (..)
+    , Event (..)
+    , parse
+    )
+where
+
+import Control.Applicative
+import Control.Monad (mzero)
+import Data.Aeson
+import Data.Aeson.Types (Parser)
+import qualified Data.ByteString.Lazy as B
+import qualified Data.Text as T
+
+type CommitID = T.Text
+
+type Url = T.Text
+
+data Author = Author
+    { authorName  :: T.Text
+    , authorEmail :: T.Text
+    }
+
+data User = User
+    { userName     :: T.Text
+    , userUsername :: T.Text
+    , userAvatar   :: Url
+    }
+
+data Commit = Commit
+    { commitId        :: CommitID
+    , commitMessage   :: T.Text
+    , commitTimestamp :: T.Text
+    , commitUrl       :: Url
+    , commitAuthor    :: Author
+    }
+
+data MergeEndpoint = MergeEndpoint
+    { mepName       :: T.Text
+    , mepSshUrl     :: Url
+    , mepHttpurl    :: Url
+    , mepVisibility :: Int
+    , mepNamespace  :: T.Text
+    }
+
+data Repository = Repository
+    { repoName       :: T.Text
+    , repoUrl        :: Url
+    , repoDesc       :: T.Text
+    , repoHomepage   :: Url
+    , repoGitHttpUrl :: Url
+    , repoGitSshUrl  :: Url
+    , repoVisibility :: Int
+    }
+
+data Issue = Issue
+    { issueInternalId  :: Int
+    , issueTitle       :: T.Text
+    , issueAssigneeId  :: Int
+    , issueAuthorId    :: Int
+    , issueProjectId   :: Int
+    , issueCreatedAt   :: T.Text
+    , issueUpdatedAt   :: T.Text
+    , issuePosition    :: Int
+    , issueBranch      :: Maybe T.Text
+    , issueDescription :: T.Text
+    , issueMilestoneId :: Maybe Int
+    , issueState       :: T.Text
+    , issueId          :: Int
+    , issueUrl         :: Url
+    }
+
+data MergeRequest = MergeRequest
+    { mrInternalId      :: Int
+    , mrTargetBranch    :: T.Text
+    , mrSourceBranch    :: T.Text
+    , mrSourceProjectId :: Int
+    , mrAuthorId        :: Int
+    , mrAssigneeId      :: Maybe Int
+    , mrTitle           :: T.Text
+    , mrCreatedAt       :: T.Text
+    , mrUpdatedAt       :: T.Text
+    --, mrStCommits       :: [Int] -- dummy type; what is this?
+    --, mrStDiffs         :: [Int] -- dummy type; what is this?
+    , mrMilestoneId     :: Maybe Int
+    , mrState           :: T.Text
+    , mrMergeStatus     :: T.Text
+    , mrTargetProjectId :: Int
+    , mrId              :: Int
+    , mrDescription     :: T.Text
+    , mrSource          :: MergeEndpoint
+    , mrTarget          :: MergeEndpoint
+    , mrLastCommit      :: Commit
+    , mrUrl             :: Url
+    }
+
+data Push = Push
+    { pushBefore       :: CommitID
+    , pushAfter        :: CommitID
+    , pushRef          :: T.Text
+    , pushUserId       :: Int
+    , pushUserName     :: T.Text
+    , pushUserEmail    :: T.Text
+    , pushProjectId    :: Int
+    , pushRepository   :: Repository
+    , pushCommits      :: [Commit]
+    , pushCommitsTotal :: Int
+    }
+
+data IssueEvent = IssueEvent
+    { ieUser   :: User
+    , ieIssue  :: Issue
+    , ieAction :: T.Text
+    }
+
+data MergeRequestEvent = MergeRequestEvent
+    { mreUser    :: User
+    , mreRequest :: MergeRequest
+    , mreAction  :: T.Text
+    }
+
+data Event
+    = EventPush Push
+    | EventPushTag Push
+    | EventIssue IssueEvent
+    | EventMergeRequest MergeRequestEvent
+
+instance FromJSON Author where
+    parseJSON (Object v) =
+        Author <$>
+        v .: "name" <*>
+        v .: "email"
+    parseJSON _          = mzero
+
+instance FromJSON User where
+    parseJSON (Object v) =
+        User <$>
+        v .: "name" <*>
+        v .: "username" <*>
+        v .: "avatar_url"
+    parseJSON _          = mzero
+
+instance FromJSON Commit where
+    parseJSON (Object v) =
+        Commit <$>
+        v .: "id" <*>
+        v .: "message" <*>
+        v .: "timestamp" <*>
+        v .: "url" <*>
+        v .: "author"
+    parseJSON _          = mzero
+
+instance FromJSON MergeEndpoint where
+    parseJSON (Object v) =
+        MergeEndpoint <$>
+        v .: "name" <*>
+        v .: "ssh_url" <*>
+        v .: "http_url" <*>
+        v .: "visibility_level" <*>
+        v .: "namespace"
+    parseJSON _          = mzero
+
+instance FromJSON Repository where
+    parseJSON (Object v) =
+        Repository <$>
+        v .: "name" <*>
+        v .: "url" <*>
+        v .: "description" <*>
+        v .: "homepage" <*>
+        v .: "git_http_url" <*>
+        v .: "git_ssh_url" <*>
+        v .: "visibility_level"
+    parseJSON _          = mzero
+
+instance FromJSON Issue where
+    parseJSON (Object v) =
+        Issue <$>
+        v .: "id" <*>
+        v .: "title" <*>
+        v .: "assignee_id" <*>
+        v .: "author_id" <*>
+        v .: "project_id" <*>
+        v .: "created_at" <*>
+        v .: "updated_at" <*>
+        v .: "position" <*>
+        v .: "branch_name" <*>
+        v .: "description" <*>
+        v .: "milestone_id" <*>
+        v .: "state" <*>
+        v .: "iid" <*>
+        v .: "url"
+    parseJSON _          = mzero
+
+instance FromJSON MergeRequest where
+    parseJSON (Object v) =
+        MergeRequest <$>
+        v .: "id" <*>
+        v .: "target_branch" <*>
+        v .: "source_branch" <*>
+        v .: "source_project_id" <*>
+        v .: "author_id" <*>
+        v .: "assignee_id" <*>
+        v .: "title" <*>
+        v .: "created_at" <*>
+        v .: "updated_at" <*>
+        --v .: "st_commits" <*>
+        --v .: "st_diffs" <*>
+        v .: "milestone_id" <*>
+        v .: "state" <*>
+        v .: "merge_status" <*>
+        v .: "target_project_id" <*>
+        v .: "iid" <*>
+        v .: "description" <*>
+        v .: "source" <*>
+        v .: "target" <*>
+        v .: "last_commit" <*>
+        v .: "url"
+    parseJSON _          = mzero
+
+instance FromJSON Push where
+    parseJSON (Object v) =
+        Push <$>
+        v .: "before" <*>
+        v .: "after" <*>
+        v .: "ref" <*>
+        v .: "user_id" <*>
+        v .: "user_name" <*>
+        v .: "user_email" <*>
+        v .: "project_id" <*>
+        v .: "repository" <*>
+        v .: "commits" <*>
+        v .: "total_commits_count"
+    parseJSON _          = mzero
+
+text :: Parser T.Text -> T.Text -> Parser T.Text
+text parser expected = do
+    got <- parser
+    if got == expected
+        then return got
+        else mzero
+
+instance FromJSON IssueEvent where
+    parseJSON (Object o) = do
+        user <- o .: "user"
+        attrs <- o .: "object_attributes"
+        mr <- o .: "object_attributes"
+        action <- attrs .: "action"
+        return $ IssueEvent user mr action
+    parseJSON _          = mzero
+
+instance FromJSON MergeRequestEvent where
+    parseJSON (Object o) = do
+        user <- o .: "user"
+        attrs <- o .: "object_attributes"
+        issue <- o .: "object_attributes"
+        action <- attrs .: "action"
+        return $ MergeRequestEvent user issue action
+    parseJSON _          = mzero
+
+instance FromJSON Event where
+    parseJSON v@(Object o) =
+        let kind = text $ o .: "object_kind"
+        in  kind "push"          *> (EventPush         <$> parseJSON v) <|>
+            kind "tag_push"      *> (EventPushTag      <$> parseJSON v) <|>
+            kind "issue"         *> (EventIssue        <$> parseJSON v) <|>
+            kind "merge_request" *> (EventMergeRequest <$> parseJSON v)
+    parseJSON _          = mzero
+
+-- | Parse a JSON string (the body of the HTTP request) into event information.
+-- If parsing fails, return 'Left' an error message.
+parse :: B.ByteString -> Either String Event
+parse = eitherDecode
diff --git a/src/Web/Hook/Gogs.hs b/src/Web/Hook/Gogs.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Hook/Gogs.hs
@@ -0,0 +1,124 @@
+{- This file is part of vcs-web-hook-parse.
+ -
+ - Written in 2015 by fr33domlover <fr33domlover@rel4tion.org>.
+ -
+ - ♡ Copying is an act of love. Please copy, reuse and share.
+ -
+ - The author(s) have dedicated all copyright and related and neighboring
+ - rights to this software to the public domain worldwide. This software is
+ - distributed without any warranty.
+ -
+ - You should have received a copy of the CC0 Public Domain Dedication along
+ - with this software. If not, see
+ - <http://creativecommons.org/publicdomain/zero/1.0/>.
+ -}
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Web.Hook.Gogs
+    ( CommitID
+    , Url
+    , User (..)
+    , Commit (..)
+    , Repository (..)
+    , Push (..)
+    , parse
+    )
+where
+
+import Control.Applicative
+import Control.Monad (mzero)
+import Data.Aeson
+import qualified Data.ByteString.Lazy as B
+import qualified Data.Text as T
+
+type CommitID = T.Text
+
+type Url = T.Text
+
+data User = User
+    { userName     :: T.Text
+    , userEmail    :: T.Text
+    , userUsername :: T.Text
+    }
+    deriving Show
+
+data Commit = Commit
+    { commitId      :: CommitID
+    , commitMessage :: T.Text
+    , commitUrl     :: Url
+    , commitAuthor  :: User
+    }
+    deriving Show
+
+data Repository = Repository
+    { repoId          :: Int
+    , repoName        :: T.Text
+    , repoUrl         :: Url
+    , repoDescription :: T.Text
+    , repoWebsite     :: Url
+    , repoWatchers    :: Int
+    , repoOwner       :: User
+    , repoPrivate     :: Bool
+    }
+    deriving Show
+
+data Push = Push
+    { pushSecret     :: T.Text
+    , pushRef        :: T.Text
+    , pushCommits    :: [Commit]
+    , pushRepository :: Repository
+    , pushPusher     :: User
+    , pushBefore     :: CommitID
+    , pushAfter      :: CommitID
+    , pushCompareUrl :: Url
+    }
+    deriving Show
+
+instance FromJSON User where
+    parseJSON (Object v) =
+        User <$>
+        v .: "name" <*>
+        v .: "email" <*>
+        v .: "username"
+    parseJSON _          = mzero
+
+instance FromJSON Commit where
+    parseJSON (Object v) =
+        Commit <$>
+        v .: "id" <*>
+        v .: "message" <*>
+        v .: "url" <*>
+        v .: "author"
+    parseJSON _          = mzero
+
+instance FromJSON Repository where
+    parseJSON (Object v) =
+        Repository <$>
+        v .: "id" <*>
+        v .: "name" <*>
+        v .: "url" <*>
+        v .: "description" <*>
+        v .: "website" <*>
+        v .: "watchers" <*>
+        v .: "owner" <*>
+        v .: "private"
+    parseJSON _          = mzero
+
+instance FromJSON Push where
+    parseJSON (Object v) =
+        Push <$>
+        v .: "secret" <*>
+        v .: "ref" <*>
+        v .: "commits" <*>
+        v .: "repository" <*>
+        v .: "pusher" <*>
+        v .: "before" <*>
+        v .: "after" <*>
+        v .: "compare_url"
+    parseJSON _          = mzero
+
+-- | Parse a JSON string (the body of the HTTP request) into event information.
+-- If parsing fails, return 'Left' an error message.
+parse :: B.ByteString -> Either String Push
+parse = eitherDecode
diff --git a/vcs-web-hook-parse.cabal b/vcs-web-hook-parse.cabal
new file mode 100644
--- /dev/null
+++ b/vcs-web-hook-parse.cabal
@@ -0,0 +1,54 @@
+name:                vcs-web-hook-parse
+version:             0.1.0.0
+synopsis:            Parse development platform web hook messages.
+description:
+  A development platform is a server system which hosts (mostly software)
+  projects, version controlled repositories and often provides feature like
+  issue tracking, merge requests, project search, project wikis and more.
+  .
+  Some development platforms can report various events using web hooks, i.e.
+  send HTTP requests containing structured data (e.g. JSON or XML) to a
+  specified URL. Then you can run a server which receives these messages and
+  reports them to IRC or a mailing list (or anything else you like).
+  .
+  This package collects development platform specific types, and functions
+  which parse the HTTP message bodies into values of these types. Then an
+  actual web hook handler can be written using them.
+  .
+  Why have a single package which handles the various platforms? First, because
+  parsing some JSON or XML structures is a simple task requiring very little
+  code (thanks to awesome Haskell libraries), sometimes hardly worth having its
+  own dedicated package. Second, having them all here may allow sharing types
+  and perhaps even developing some common web hook formats in the future.
+  .
+  This package handles only /free-as-in-freedom/ development platforms. In
+  particular, it means g1thub won't be supported (until it becomes free too),
+  while support for all free platforms (DarcsDen, Gogs, Kallithea, GitLab's
+  "community edition", etc.) is very welcome.
+homepage:            http://rel4tion.org/projects/vcs-web-hook-parse/
+bug-reports:         http://rel4tion.org/projects/vcs-web-hook-parse/tickets/
+license:             PublicDomain
+license-file:        COPYING
+author:              fr33domlover
+maintainer:          fr33domlover@riseup.net
+copyright:           ♡ Copying is an act of love. Please copy, reuse and share.
+category:            Web
+build-type:          Simple
+extra-source-files:  AUTHORS ChangeLog COPYING INSTALL NEWS README.md
+cabal-version:       >=1.10
+
+source-repository head
+  type:                darcs
+  location:            http://dev.rel4tion.org/fr33domlover/vcs-web-hook-parse
+
+library
+  exposed-modules:     Web.Hook.GitLab
+                     , Web.Hook.Gogs
+  -- other-modules:       
+  -- other-extensions:    
+  build-depends:       base       >=4.7 && <5
+                     , aeson      >=0.9
+                     , bytestring
+                     , text
+  hs-source-dirs:      src
+  default-language:    Haskell2010
