diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -31,6 +31,7 @@
 import qualified Hadolint.Formatter.Format as Format
 import qualified Hadolint.Formatter.Json as Json
 import qualified Hadolint.Formatter.TTY as TTY
+import qualified Hadolint.Formatter.Codacy as Codacy
 import qualified Hadolint.Rules as Rules
 
 type IgnoreRule = Text
@@ -42,6 +43,7 @@
     | TTY
     | CodeclimateJson
     | Checkstyle
+    | Codacy
     deriving (Show, Eq)
 
 data LintOptions = LintOptions
@@ -69,6 +71,7 @@
 toOutputFormat "tty" = Just TTY
 toOutputFormat "codeclimate" = Just CodeclimateJson
 toOutputFormat "checkstyle" = Just Checkstyle
+toOutputFormat "codacy" = Just Codacy
 toOutputFormat _ = Nothing
 
 showFormat :: OutputFormat -> String
@@ -76,6 +79,7 @@
 showFormat TTY = "tty"
 showFormat CodeclimateJson = "codeclimate"
 showFormat Checkstyle = "checkstyle"
+showFormat Codacy = "codacy"
 
 parseOptions :: Parser LintOptions
 parseOptions =
@@ -102,10 +106,10 @@
             (maybeReader toOutputFormat)
             (long "format" <> -- options for the output format
              short 'f' <>
-             help "The output format for the results [tty | json | checkstyle | codeclimate]" <>
+             help "The output format for the results [tty | json | checkstyle | codeclimate | codacy]" <>
              value TTY <> -- The default value
              showDefaultWith showFormat <>
-             completeWith ["tty", "json", "checkstyle", "codeclimate"])
+             completeWith ["tty", "json", "checkstyle", "codeclimate", "codacy"])
     --
     -- | Parse a list of ignored rules
     ignoreList =
@@ -226,6 +230,7 @@
             Json -> Json.printResult res
             Checkstyle -> Checkstyle.printResult res
             CodeclimateJson -> Codeclimate.printResult res >> exitSuccess
+            Codacy -> Codacy.printResult res >> exitSuccess
     lintDockerfile ignoreRules dockerFile = do
         ast <- Docker.parseFile (parseFilename dockerFile)
         return (processedFile ast)
diff --git a/hadolint.cabal b/hadolint.cabal
--- a/hadolint.cabal
+++ b/hadolint.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 3617c4ad1e8f8732140c07b827400df490da5de7511e79c1b509176b5a6d01c6
+-- hash: 4ff12972c5a652d9e4a6df3e276fdb1a565eaf408b15b14f6e7f9c22a20ade5d
 
 name:           hadolint
-version:        1.11.2
+version:        1.12.0
 synopsis:       Dockerfile Linter JavaScript API
 description:    A smarter Dockerfile linter that helps you build best practice Docker images.
 category:       Development
@@ -42,6 +42,7 @@
     , void
   exposed-modules:
       Hadolint.Formatter.Checkstyle
+      Hadolint.Formatter.Codacy
       Hadolint.Formatter.Codeclimate
       Hadolint.Formatter.Format
       Hadolint.Formatter.Json
diff --git a/src/Hadolint/Formatter/Codacy.hs b/src/Hadolint/Formatter/Codacy.hs
new file mode 100644
--- /dev/null
+++ b/src/Hadolint/Formatter/Codacy.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Hadolint.Formatter.Codacy
+    ( printResult
+    , formatResult
+    ) where
+
+import Data.Aeson hiding (Result)
+import qualified Data.ByteString.Lazy.Char8 as B
+import qualified Data.List.NonEmpty as NE
+import Data.Monoid ((<>))
+import Data.Sequence (Seq)
+import qualified Data.Text as Text
+import Hadolint.Formatter.Format (Result(..))
+import Hadolint.Rules (Metadata(..), RuleCheck(..))
+import Text.Megaparsec.Error
+       (ParseError, ShowErrorComponent, ShowToken, errorPos,
+        parseErrorTextPretty)
+import Text.Megaparsec.Pos
+       (sourceLine, sourceName, unPos)
+
+data Issue = Issue
+    { filename :: String
+    , msg :: String
+    , patternId :: String
+    , line :: Int
+    }
+
+instance ToJSON Issue where
+    toJSON Issue {..} =
+        object
+            [ "filename" .= filename
+            , "patternId" .= patternId
+            , "message" .= msg
+            , "line" .= line
+            ]
+
+errorToIssue :: (ShowToken t, Ord t, ShowErrorComponent e) => ParseError t e -> Issue
+errorToIssue err =
+    Issue
+    { filename = sourceName pos
+    , patternId = "DL1000"
+    , msg = parseErrorTextPretty err
+    , line = linenumber
+    }
+  where
+    pos = NE.head (errorPos err)
+    linenumber = unPos (sourceLine pos)
+    
+checkToIssue :: RuleCheck -> Issue
+checkToIssue RuleCheck {..} =
+    Issue
+    { filename = Text.unpack filename
+    , patternId = Text.unpack (code metadata)
+    , msg = Text.unpack (message metadata)
+    , line = linenumber
+    }
+
+formatResult :: (ShowToken t, Ord t, ShowErrorComponent e) => Result t e -> Seq Issue
+formatResult (Result errors checks) = allIssues
+  where
+    allIssues = errorMessages <> checkMessages
+    errorMessages = fmap errorToIssue errors
+    checkMessages = fmap checkToIssue checks
+
+printResult :: (ShowToken t, Ord t, ShowErrorComponent e) => Result t e -> IO ()
+printResult result = mapM_ output (formatResult result)
+  where
+    output value = B.putStrLn (encode value)
