diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for krank
 
+## 0.3.1 -- 2025-12-07
+
+* Support for GHC up to 9.12
+* Fix build with http-client >= 0.7.16
+* Fix url parsing in markdown
+
 ## 0.2.3 -- 2021-07-18
 
 * #88 krank tries to test files listed by `git ls-files` or `find` by default.
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -21,6 +21,7 @@
 import System.Process
 import Text.Regex.PCRE.Heavy
 import Version (displayVersion)
+import Control.Monad (unless)
 
 data KrankOpts = KrankOpts
   { codeFilePaths :: [FilePath],
diff --git a/krank.cabal b/krank.cabal
--- a/krank.cabal
+++ b/krank.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                krank
-version:             0.3.0
+version:             0.3.1
 synopsis: Krank checks issue tracker link status in your source code
 -- description:
 bug-reports: https://github.com/guibou/krank/issues
@@ -16,7 +16,7 @@
 extra-source-files:  CHANGELOG.md, README.md HACKING.md docs/Checkers/IssueTracker.md
 
 common shared-library
-  build-depends:       base >= 4.9
+  build-depends:       base >= 4.9 && <= 4.23.0.0
                        , PyF >= 0.8.1.0
                        , aeson >= 2
                        , bytestring
@@ -72,6 +72,7 @@
                        Utils.Req
   build-depends: hspec >= 2.7
                , hspec-expectations
+               , hspec-discover
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
 
 executable krank
diff --git a/src/Krank.hs b/src/Krank.hs
--- a/src/Krank.hs
+++ b/src/Krank.hs
@@ -25,6 +25,7 @@
 import qualified Network.HTTP.Req as Req
 import PyF
 import System.IO (stderr)
+import Control.Monad (forM_)
 
 processFile ::
   MonadKrank m =>
diff --git a/src/Krank/Checkers/IssueTracker.hs b/src/Krank/Checkers/IssueTracker.hs
--- a/src/Krank/Checkers/IssueTracker.hs
+++ b/src/Krank/Checkers/IssueTracker.hs
@@ -64,7 +64,7 @@
 gitRepoRe :: RE.Regex
 -- NOTE: \b at the beginning is really import for performances
 -- because it dramatically reduces the number of backtracks
-gitRepoRe = [RE.re|\b(?>https?://)?(?>www\.)?([^/ ]+)/([^ ]+)/([^- ][^/ ]*)(?>/-)?/issues/([0-9]+)|]
+gitRepoRe = [RE.re|\b(?>https?://)?(?>www\.)?([^/ ]+)/([^ /][^ ]*)/([^-/ ][^/ ]*)(?>/-)?/issues/([0-9]+)|]
 
 -- | Extract all issues on one line and returns a list of the raw text associated with an issue
 extractIssuesOnALine :: ByteString -> [(Int, GitIssueRef)]
diff --git a/tests/Test/Krank/Checkers/IssueTrackerSpec.hs b/tests/Test/Krank/Checkers/IssueTrackerSpec.hs
--- a/tests/Test/Krank/Checkers/IssueTrackerSpec.hs
+++ b/tests/Test/Krank/Checkers/IssueTrackerSpec.hs
@@ -17,7 +17,7 @@
 import Data.Coerce
 import Data.Map (Map)
 import qualified Data.Map as Map
-import Data.Text
+import Data.Text (Text)
 import Krank
 import Krank.Checkers.IssueTracker
 import Krank.Types
@@ -104,13 +104,16 @@
   it "handles long gitlab url with groups and with the odd /-" $ do
     let match = check [fmt|{domainName}/gbataille_main/sub_level_1/sub_level_2/deep_in_groups/-/issues/12|]
     match `shouldBe` Just (GitIssueRef domain "gbataille_main/sub_level_1/sub_level_2" "deep_in_groups" 12)
+  it "handle an url embeded in markdown" $ do
+    let match = check [fmt|lalalalalalaalla [Issue XX](https://{domainName}/foo/bar/issues/123) blo blo blu|]
+    match `shouldBe` Just (GitIssueRef domain "foo" "bar" 123)
 
 spec :: Spec
 spec = do
   context "Test.Krank.Checkers.specIssueTracker" $ do
     describe "#githubParser" $
       giturlTests Github
-    describe "#githlabParser" $
+    describe "#gitlabParser" $
       giturlTests (Gitlab (GitlabHost "gitlab.com"))
     describe "#extractIssues" $
       it "handles both github and gitlab" $
diff --git a/tests/Test/Utils/GithubSpec.hs b/tests/Test/Utils/GithubSpec.hs
--- a/tests/Test/Utils/GithubSpec.hs
+++ b/tests/Test/Utils/GithubSpec.hs
@@ -56,7 +56,9 @@
         showGithubException exception `shouldBe` showHTTPException showRawResponse exception
 
 dummyResponse :: Status -> Response ()
-#if MIN_VERSION_http_client(0,7,8)
+#if MIN_VERSION_http_client(0,7,16)
+dummyResponse status = Response status http11 [] () (createCookieJar []) (ResponseClose $ pure ()) (error "WTF") []
+#elif MIN_VERSION_http_client(0,7,8)
 dummyResponse status = Response status http11 [] () (createCookieJar []) (ResponseClose $ pure ()) (error "WTF")
 #else
 dummyResponse status = Response status http11 [] () (createCookieJar []) (ResponseClose $ pure ())
diff --git a/tests/Test/Utils/GitlabSpec.hs b/tests/Test/Utils/GitlabSpec.hs
--- a/tests/Test/Utils/GitlabSpec.hs
+++ b/tests/Test/Utils/GitlabSpec.hs
@@ -63,7 +63,9 @@
         showGitlabException exception `shouldBe` showHTTPException showRawResponse exception
 
 dummyResponse :: Status -> Response ()
-#if MIN_VERSION_http_client(0,7,8)
+#if MIN_VERSION_http_client(0,7,16)
+dummyResponse status = Response status http11 [] () (createCookieJar []) (ResponseClose $ pure ()) (error "WTF") []
+#elif MIN_VERSION_http_client(0,7,8)
 dummyResponse status = Response status http11 [] () (createCookieJar []) (ResponseClose $ pure ()) (error "WTF")
 #else
 dummyResponse status = Response status http11 [] () (createCookieJar []) (ResponseClose $ pure ())
