diff --git a/Criterion/Main/Options.hs b/Criterion/Main/Options.hs
--- a/Criterion/Main/Options.hs
+++ b/Criterion/Main/Options.hs
@@ -19,6 +19,7 @@
     , parseWith
     , config
     , describe
+    , describeWith
     , versionInfo
     ) where
 
@@ -194,9 +195,13 @@
   let ret = (words . map repl . drop 1 $ ps, tidy r)
   either readerError (const (return ret)) $ uncurry validateAccessors ret
 
--- | Flesh out a command line parser.
+-- | Flesh out a command-line parser.
 describe :: Config -> ParserInfo Mode
-describe cfg = info (helper <*> parseWith cfg) $
+describe cfg = describeWith $ parseWith cfg
+
+-- | Flesh out command-line information using a custom 'Parser'.
+describeWith :: Parser a -> ParserInfo a
+describeWith parser = info (helper <*> parser) $
     header ("Microbenchmark suite - " <> versionInfo) <>
     fullDesc <>
     footerDoc (unChunk regressionHelp)
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -5,7 +5,7 @@
 This package provides the Criterion module, a Haskell library for
 measuring and analysing software performance.
 
-<a href="http://www.serpentine.com/criterion/fibber.html" target="_blank"><img src="http://www.serpentine.com/criterion/fibber-screenshot.png"></img></a>
+<a href="http://www.serpentine.com/criterion/fibber.html" target="_blank"><img src="www/fibber-screenshot.png"></a>
 
 To get started, read the <a
 href="http://www.serpentine.com/criterion/tutorial.html"
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,21 @@
+1.5.4.0
+
+* Add `parserWith`, which allows creating a `criterion` command-line interface
+  using a custom `optparse-applicative` `Parser`. This is usefule for sitations
+  where one wants to add additional command-line arguments to the default ones
+  that `criterion` provides.
+
+  For an example of how to use `parserWith`, refer to
+  `examples/ExtensibleCLI.hs`.
+
+* Tweak the way the graph in the HTML overview zooms:
+
+  * Zooming all the way out resets to the default view (instead of continuing
+    to zoom out towards empty space).
+  * Panning all the way to the right resets to the default view in which zero
+    is left-aligned (instead of continuing to pan off the edge of the graph).
+  * Panning and zooming only affecs the x-axis, so all results remain in-frame.
+
 1.5.3.0
 
 * Make more functions (e.g., `runMode`) able to print the `µ` character on
diff --git a/criterion.cabal b/criterion.cabal
--- a/criterion.cabal
+++ b/criterion.cabal
@@ -1,5 +1,5 @@
 name:           criterion
-version:        1.5.3.0
+version:        1.5.4.0
 synopsis:       Robust, reliable performance measurement and analysis
 license:        BSD3
 license-file:   LICENSE
@@ -25,7 +25,7 @@
   GHC==8.0.2,
   GHC==8.2.2,
   GHC==8.4.4,
-  GHC==8.6.2
+  GHC==8.6.3
 
 data-files:
   templates/*.css
diff --git a/examples/ExtensibleCLI.hs b/examples/ExtensibleCLI.hs
new file mode 100644
--- /dev/null
+++ b/examples/ExtensibleCLI.hs
@@ -0,0 +1,38 @@
+module Main where
+
+import Criterion.Main
+import Criterion.Main.Options
+import Options.Applicative
+import Prelude ()
+import Prelude.Compat
+
+data CustomArgs = CustomArgs
+  { -- This data type adds two new arguments, listed below.
+    customArg1    :: Int
+  , customArg2    :: String
+
+    -- The remaining arguments come from criterion itself.
+  , criterionArgs :: Mode
+  }
+
+customParser :: Parser CustomArgs
+customParser = CustomArgs
+  <$> option auto
+      (  long "custom-arg1"
+      <> value 42
+      <> metavar "INT"
+      <> help "Custom argument 1" )
+  <*> strOption
+      (  long "custom-arg2"
+      <> value "Benchmark name"
+      <> metavar "STR"
+      <> help "Custom argument 2" )
+  <*> parseWith defaultConfig
+
+main :: IO ()
+main = do
+  args <- execParser $ describeWith customParser
+  putStrLn $ "custom-arg1: " ++ show (customArg1 args)
+  putStrLn $ "custom-arg2: " ++ customArg2 args
+  runMode (criterionArgs args)
+    [ bench (customArg2 args) $ whnf id $ customArg1 args ]
diff --git a/examples/criterion-examples.cabal b/examples/criterion-examples.cabal
--- a/examples/criterion-examples.cabal
+++ b/examples/criterion-examples.cabal
@@ -18,7 +18,7 @@
   GHC==8.0.2,
   GHC==8.2.2,
   GHC==8.4.4,
-  GHC==8.6.2
+  GHC==8.6.3
 
 flag conduit-vs-pipes
   default: True
@@ -91,6 +91,16 @@
   build-depends:
     base == 4.*,
     criterion
+
+executable extensible-cli
+  main-is: ExtensibleCLI.hs
+
+  ghc-options: -Wall -rtsopts
+  build-depends:
+    base == 4.*,
+    base-compat-batteries,
+    criterion,
+    optparse-applicative
 
 -- Cannot uncomment due to https://github.com/haskell/cabal/issues/1725
 --
diff --git a/templates/default.tpl b/templates/default.tpl
--- a/templates/default.tpl
+++ b/templates/default.tpl
@@ -317,10 +317,11 @@
     max_time = Math.max(max_time, means[0][i] + stddevs[i]);
   }
   var oq = $("#overview");
+  var max_x = max_time * 1.02;
   o = $.plot(oq, xs, { grid: { borderColor: "#777", hoverable: true },
                        legend: { show: xs.length > 1 },
-                       xaxis: { max: max_time * 1.02 },
-                       yaxis: { ticks: ylabels, tickColor: '#ffffff' },
+                       xaxis: { max: max_x, zoomRange: [false, max_x], panRange: [0, max_x] },
+                       yaxis: { ticks: ylabels, tickColor: '#ffffff', zoomRange: false, panRange: false },
                        zoom: { interactive: true, amount: 1.05 },
                        pan: { interactive: true } });
   if (benches.length > 3)
