diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+- V 0.5.0.0: Cleaned up parser error behaviour:
+    - Parsing errors are now more helpful with better positional information, using a modified `showParsecErr` and a new `showParsecErrOneLine`.
+    - Breaking change: The type of `readCalCurve` changed. It is now safe, returning `Either String CalCurveBP`. The old version is preserved in `readCalCurveUnsafe`.
+- V 0.4.0.2: Support for `optparse-applicative-0.19.0.0`.
 - V 0.4.0.1: Support for `random-1.3`. Now possible, because MonadRandom supports it as well (https://github.com/byorgey/MonadRandom/blob/master/CHANGES.markdown#062-5-march-2025).
 - V 0.4.0.0: Another major update:
     - Added more calibration curves next to `intcal20`: `shcal20` and `marine20`. Renamed the `Currycarbon.CalCurves.IntCal20` module to just `Currycarbon.CalCurves`. In the CLI, `--calCurveFile` is now just `--calCurve`, and it allows to either select the different packaged curves or read arbitrary .14c files.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@
 ```
 
 ```
-currycarbon v0.4.0.0 (UTF-8)
+currycarbon v0.4.0.2 (UTF-8)
 Method: Bchron {distribution = StudentTDist {ndf = 100.0}}
 Curve: IntCal20
 Calibrating...
@@ -74,7 +74,7 @@
                    [[--seed INT] (-n|--nrSamples INT) --samplesFile FILE]
                    [--calCurveSegFile FILE] [--calCurveMatFile FILE]
 
-  Intercept calibration of radiocarbon dates
+  currycarbon calibrates radiocarbon dates
 
 Available options:
   -h,--help                Show this help text
diff --git a/currycarbon.cabal b/currycarbon.cabal
--- a/currycarbon.cabal
+++ b/currycarbon.cabal
@@ -1,7 +1,7 @@
 name:                currycarbon
-version:             0.4.0.1
+version:             0.5.0.0
 synopsis:            A package for simple, fast radiocarbon calibration
-description:         Radiocarbon calibration with the intercept method optimised for fast calibration of many dates.
+description:         Radiocarbon calibration library and command line tool.
 homepage:            https://github.com/nevrome/currycarbon
 category:            Archaeoinformatics
 author:              Clemens Schmid
@@ -54,7 +54,7 @@
     build-depends:      
         currycarbon
       , base >= 4.14 && < 5
-      , optparse-applicative >= 0.16 && < 0.19
+      , optparse-applicative >= 0.16 && < 0.21
       , filepath >= 1.4 && < 1.6
     other-modules:
       Paths_currycarbon
diff --git a/src-executables/Main-currycarbon.hs b/src-executables/Main-currycarbon.hs
--- a/src-executables/Main-currycarbon.hs
+++ b/src-executables/Main-currycarbon.hs
@@ -47,8 +47,7 @@
 
 optParserInfo :: OP.ParserInfo Options
 optParserInfo = OP.info (OP.helper <*> versionOption <*> optParser) (
-    OP.briefDesc <>
-    OP.progDesc "Intercept calibration of radiocarbon dates"
+    OP.progDesc "currycarbon calibrates radiocarbon dates"
     )
 
 versionOption :: OP.Parser (a -> a)
diff --git a/src/Currycarbon/CalCurves.hs b/src/Currycarbon/CalCurves.hs
--- a/src/Currycarbon/CalCurves.hs
+++ b/src/Currycarbon/CalCurves.hs
@@ -4,7 +4,9 @@
 
 import           Currycarbon.ParserHelpers
 import           Currycarbon.Types
+import           Currycarbon.Utils
 
+import           Control.Exception         (throwIO)
 import qualified Data.FileEmbed            as FE
 import qualified Data.Vector.Unboxed       as VU
 import qualified Text.Parsec               as P
@@ -22,8 +24,8 @@
 
 readCalCurveSelection :: String -> Either String CalCurveSelection
 readCalCurveSelection s =
-    case P.runParser parseCalCurveSelection () "" s of
-        Left err -> Left $ showParsecErr err
+    case P.runParser parseCalCurveSelection () s s of
+        Left err -> Left $ showParsecErrOneLine err
         Right x  -> Right x
 
 parseCalCurveSelection :: P.Parser CalCurveSelection
@@ -44,18 +46,29 @@
 -- | Read a calibration curve file. The file must adhere to the .14c file format.
 readCalCurveFromFile :: FilePath -> IO CalCurveBP
 readCalCurveFromFile calCurveFile = do
-    calCurve <- readFile calCurveFile
-    return $ readCalCurve calCurve
+    calCurveString <- readFile calCurveFile
+    case readCalCurve calCurveString of
+        Left err -> throwIO $ CurrycarbonCLIParsingException err
+        Right x  -> return x
 
-readCalCurve :: String -> CalCurveBP
+readCalCurve :: String -> Either String CalCurveBP
 readCalCurve calCurveString = do
-    case P.runParser parseCalCurve () "" calCurveString of
-        Left p  -> error $ "This should never happen." ++ show p
-        Right x -> CalCurveBP
+    case P.runParser parseCalCurve () "calCurve" calCurveString of
+        Left err -> Left $ showParsecErr err
+        Right x  -> Right $ CalCurveBP
             (VU.fromList $ map (\(a,_,_) -> a) x)
             (VU.fromList $ map (\(_,b,_) -> b) x)
             (VU.fromList $ map (\(_,_,c) -> c) x)
 
+readCalCurveUnsafe :: String -> CalCurveBP
+readCalCurveUnsafe calCurveString = do
+    case P.runParser parseCalCurve () "calCurve" calCurveString of
+        Left err -> error $ "Error when reading calCurve " ++ show err
+        Right x  -> CalCurveBP
+            (VU.fromList $ map (\(a,_,_) -> a) x)
+            (VU.fromList $ map (\(_,b,_) -> b) x)
+            (VU.fromList $ map (\(_,_,c) -> c) x)
+
 parseCalCurve :: P.Parser [(YearBP, YearBP, YearRange)]
 parseCalCurve = do
     P.skipMany comments
@@ -79,20 +92,20 @@
 -- | The intcal20 calibration curve
 -- (Reimer et al. 2020, doi: [10.1017/RDC.2020.41](https://doi.org/10.1017/RDC.2020.41))
 intcal20 :: CalCurveBP
-intcal20 = readCalCurve intcal20String
+intcal20 = readCalCurveUnsafe intcal20String
 intcal20String :: String
 intcal20String = $(FE.makeRelativeToProject "data/intcal20.14c" >>= FE.embedStringFile)
 
 -- | The shcal20 calibration curve
 -- (Hogg et al. 2020, doi: [10.1017/RDC.2020.59](https://doi.org/10.1017/RDC.2020.59))
 shcal20 :: CalCurveBP
-shcal20 = readCalCurve shcal20String
+shcal20 = readCalCurveUnsafe shcal20String
 shcal20String :: String
 shcal20String = $(FE.makeRelativeToProject "data/shcal20.14c" >>= FE.embedStringFile)
 
 -- | The shcal20 calibration curve
 -- (Heaton et al. 2020, doi: [10.1017/RDC.2020.68](https://doi.org/10.1017/RDC.2020.68))
 marine20 :: CalCurveBP
-marine20 = readCalCurve marine20String
+marine20 = readCalCurveUnsafe marine20String
 marine20String :: String
 marine20String = $(FE.makeRelativeToProject "data/marine20.14c" >>= FE.embedStringFile)
diff --git a/src/Currycarbon/ParserHelpers.hs b/src/Currycarbon/ParserHelpers.hs
--- a/src/Currycarbon/ParserHelpers.hs
+++ b/src/Currycarbon/ParserHelpers.hs
@@ -158,6 +158,22 @@
 
 showParsecErr :: P.ParseError -> String
 showParsecErr err =
+    let pos = P.errorPos err
+        posStr = P.sourceName pos ++
+                     " (issue in line " ++ show (P.sourceLine pos) ++
+                     ", column " ++ show (P.sourceColumn pos) ++
+                     ")"
+    in posStr ++ ": " ++ cleanParsecErr err
+
+showParsecErrOneLine :: P.ParseError -> String
+showParsecErrOneLine err =
+    let pos = P.errorPos err
+        posStr = P.sourceName pos ++
+                     " (issue in column " ++ show (P.sourceColumn pos) ++ ")"
+    in posStr ++ ": " ++ cleanParsecErr err
+
+cleanParsecErr :: P.ParseError -> String
+cleanParsecErr err =
     P.showErrorMessages
         "or" "unknown parse error"
         "expecting" "unexpected" "end of input"
diff --git a/src/Currycarbon/Parsers.hs b/src/Currycarbon/Parsers.hs
--- a/src/Currycarbon/Parsers.hs
+++ b/src/Currycarbon/Parsers.hs
@@ -26,8 +26,8 @@
 
 readCalibrationMethod :: String -> Either String CalibrationMethod
 readCalibrationMethod s =
-    case P.runParser parseCalibrationMethod () "" s of
-        Left err -> Left $ showParsecErr err
+    case P.runParser parseCalibrationMethod () s s of
+        Left err -> Left $ showParsecErrOneLine err
         Right x  -> Right x
 
 parseCalibrationMethod :: P.Parser CalibrationMethod
@@ -201,8 +201,8 @@
 
 readNamedCalExprs :: String -> Either String [NamedCalExpr]
 readNamedCalExprs s =
-    case P.runParser parseCalExprSepBySemicolon () "" s of
-        Left err -> Left $ showParsecErr err
+    case P.runParser parseCalExprSepBySemicolon () s s of
+        Left err -> Left $ showParsecErrOneLine err
         Right x  -> Right x
         where
         parseCalExprSepBySemicolon :: P.Parser [NamedCalExpr]
@@ -210,8 +210,8 @@
 
 readOneNamedCalExpr :: String -> Either String NamedCalExpr
 readOneNamedCalExpr s =
-    case P.runParser namedExpr () "" s of
-        Left err -> Left $ showParsecErr err
+    case P.runParser namedExpr () s s of
+        Left err -> Left $ showParsecErrOneLine err
         Right x  -> Right x
 
 readNamedCalExprsFromFile :: FilePath -> IO [NamedCalExpr]
@@ -244,7 +244,7 @@
 readUncalC14FromFile :: FilePath -> IO [UncalC14]
 readUncalC14FromFile uncalFile = do
     s <- readFile uncalFile
-    case P.runParser uncalC14SepByNewline () "" s of
+    case P.runParser uncalC14SepByNewline () uncalFile s of
         Left err -> throwIO $ CurrycarbonCLIParsingException $ showParsecErr err
         Right x  -> return x
     where
@@ -253,8 +253,8 @@
 
 readUncalC14 :: String -> Either String [UncalC14]
 readUncalC14 s =
-    case P.runParser uncalC14SepBySemicolon () "" s of
-        Left err -> Left $ showParsecErr err
+    case P.runParser uncalC14SepBySemicolon () s s of
+        Left err -> Left $ showParsecErrOneLine err
         Right x  -> Right x
     where
         uncalC14SepBySemicolon :: P.Parser [UncalC14]
