diff --git a/githud.cabal b/githud.cabal
--- a/githud.cabal
+++ b/githud.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                githud
-version:             3.2.1
+version:             3.2.2
 synopsis:            Heads up, and you see your GIT context
 description:         GIT Heads Up Display for your terminal prompt. More efficient replacement to the great git-radar. Please see README.md for more info
 homepage:            http://github.com/gbataille/gitHUD#readme
@@ -8,7 +8,7 @@
 license-file:        LICENSE
 author:              Grégory Bataille
 maintainer:          gregory.bataille@gmail.com
-copyright:           Grégory Bataille 2015-2019
+copyright:           Grégory Bataille 2015-2020
 category:            Development
 build-type:          Simple
 -- extra-source-files:
@@ -38,6 +38,7 @@
                     , daemons >= 0.3 && < 0.4
                     , data-default >= 0.7 && < 0.8
                     , directory >= 1.3 && < 1.4
+                    , filelock >= 0.1.1.4 && < 0.1.2.0
                     , mtl >= 2.2.2 && < 3
                     , network >=  2.8 && < 3.0
                     , parsec >= 3.1.13 && < 4
diff --git a/src/GitHUD.hs b/src/GitHUD.hs
--- a/src/GitHUD.hs
+++ b/src/GitHUD.hs
@@ -1,28 +1,29 @@
 {-# LANGUAGE OverloadedStrings #-}
 
-module GitHUD (
-    githud,
-    githudd
-    ) where
+module GitHUD
+  ( githud,
+    githudd,
+  )
+where
 
 import Control.Monad (unless, void, when)
 import Control.Monad.Reader (runReader)
 import Data.Text
-import System.Directory (getCurrentDirectory)
-import System.Environment (getArgs)
-import System.Exit (ExitCode(ExitSuccess))
-import System.Posix.Files (fileExist)
-import System.Posix.User (getRealUserID, getUserEntryForID, UserEntry(..))
-import System.Process (readProcessWithExitCode)
-
 import GitHUD.Config.Parse
 import GitHUD.Config.Types
 import GitHUD.Daemon.Runner
+import GitHUD.Git.Command
+import GitHUD.Git.Parse.Base
 import GitHUD.Terminal.Prompt
 import GitHUD.Terminal.Types
-import GitHUD.Git.Parse.Base
-import GitHUD.Git.Command
 import GitHUD.Types
+import System.Directory (getCurrentDirectory)
+import System.Environment (getArgs)
+import System.Exit (ExitCode (ExitSuccess))
+import System.FileLock (SharedExclusive (Exclusive), withTryFileLock)
+import System.Posix.Files (fileExist)
+import System.Posix.User (UserEntry (..), getRealUserID, getUserEntryForID)
+import System.Process (readProcessWithExitCode)
 
 githud :: IO ()
 githud = do
@@ -32,28 +33,36 @@
     shell <- processArguments getArgs
     config <- getAppConfig
     curDir <- getCurrentDirectory
-    runFetcherDaemon curDir
+    tryRunFetcherDaemon curDir (confGithuddLockFilePath config)
     repoState <- getGitRepoState
     let prompt = runReader buildPromptWithConfig $ buildOutputConfig shell repoState config
-
     -- Necessary to use putStrLn to properly terminate the output (needs the CR)
     putStrLn $ unpack (strip (pack prompt))
 
-    where
-      runFetcherDaemon dir = do
-        (code, out, err) <- readProcessWithExitCode "githudd" [dir] ""
-        unless (Prelude.null err) (putStrLn $ "Issue with githudd: " ++ err)
+tryRunFetcherDaemon ::
+  String ->
+  FilePath ->
+  IO ()
+tryRunFetcherDaemon dir lockPath = do
+  withTryFileLock lockPath Exclusive (\f -> runFetcherDaemon dir)
+  return ()
+  where
+    runFetcherDaemon dir = do
+      (code, out, err) <- readProcessWithExitCode "githudd" [dir] ""
+      unless (Prelude.null err) (putStrLn $ "Issue with githudd: " ++ err)
 
-processArguments :: IO [String]
-                 -> IO Shell
+processArguments ::
+  IO [String] ->
+  IO Shell
 processArguments args = getShell <$> args
 
-getShell :: [String]
-         -> Shell
-getShell ("zsh":_) = ZSH
-getShell ("bash":_) = BASH
-getShell ("tmux":_) = TMUX
-getShell ("none":_) = NONE
+getShell ::
+  [String] ->
+  Shell
+getShell ("zsh" : _) = ZSH
+getShell ("bash" : _) = BASH
+getShell ("tmux" : _) = TMUX
+getShell ("none" : _) = NONE
 getShell _ = Other
 
 getAppConfig :: IO Config
@@ -65,13 +74,14 @@
     then parseConfigFile configFilePath
     else return defaultConfig
 
-githudd :: IO()
+githudd :: IO ()
 githudd = do
   mArg <- processDaemonArguments <$> getArgs
   config <- getAppConfig
   runDaemon config mArg
 
-processDaemonArguments :: [String]
-                       -> Maybe String
+processDaemonArguments ::
+  [String] ->
+  Maybe String
 processDaemonArguments [] = Nothing
-processDaemonArguments (fst:_) = Just fst
+processDaemonArguments (fst : _) = Just fst
diff --git a/src/GitHUD/Config/Parse.hs b/src/GitHUD/Config/Parse.hs
--- a/src/GitHUD/Config/Parse.hs
+++ b/src/GitHUD/Config/Parse.hs
@@ -215,6 +215,8 @@
   conf { confGithuddSleepSeconds = intConfigToInt value }
 configItemsFolder conf (Item "githudd_pid_file_path" value) =
   conf { confGithuddPidFilePath = value }
+configItemsFolder conf (Item "githudd_lock_file_path" value) =
+  conf { confGithuddLockFilePath = value }
 configItemsFolder conf (Item "githudd_socket_file_path" value) =
   conf { confGithuddSocketFilePath = value }
 configItemsFolder conf (Item "githudd_log_file_path" value) =
diff --git a/src/GitHUD/Config/Types.hs b/src/GitHUD/Config/Types.hs
--- a/src/GitHUD/Config/Types.hs
+++ b/src/GitHUD/Config/Types.hs
@@ -88,6 +88,7 @@
   , confRunFetcherDaemon :: Bool
   , confGithuddSleepSeconds :: Int
   , confGithuddPidFilePath :: FilePath
+  , confGithuddLockFilePath :: FilePath
   , confGithuddSocketFilePath :: FilePath
 
   , confGithuddLogFilePath :: Redirection
@@ -170,6 +171,7 @@
   , confRunFetcherDaemon = True
   , confGithuddSleepSeconds = 30
   , confGithuddPidFilePath = tempDir ++ "/githudd.pid"
+  , confGithuddLockFilePath = tempDir ++ "/githudd.lock"
   , confGithuddSocketFilePath = tempDir ++ "/githudd.socket"
 
   , confGithuddLogFilePath = DevNull
diff --git a/test/Test/GitHUD/Config/Parse.hs b/test/Test/GitHUD/Config/Parse.hs
--- a/test/Test/GitHUD/Config/Parse.hs
+++ b/test/Test/GitHUD/Config/Parse.hs
@@ -466,6 +466,12 @@
             forConfigItemKey "githudd_pid_file_path" $
               withValue "/tmp"
 
+    , testCase "Key: githudd_lock_file_path" $
+        expectValue "/tmp" $
+          toBeInField confGithuddLockFilePath $
+            forConfigItemKey "githudd_lock_file_path" $
+              withValue "/tmp"
+
     , testCase "Key: githudd_socket_file_path" $
         expectValue "/tmp" $
           toBeInField confGithuddSocketFilePath $
