Use kong instead of flag
diff --git a/cmd/termmapper/main.go b/cmd/termmapper/main.go
index c31b6b1..0f619c1 100644
--- a/cmd/termmapper/main.go
+++ b/cmd/termmapper/main.go
@@ -1,7 +1,6 @@
 package main
 
 import (
-	"flag"
 	"fmt"
 	"os"
 	"os/signal"
@@ -9,6 +8,7 @@
 	"syscall"
 
 	"github.com/KorAP/KoralPipe-TermMapper/mapper"
+	"github.com/alecthomas/kong"
 	"github.com/gofiber/fiber/v2"
 	"github.com/rs/zerolog"
 	"github.com/rs/zerolog/log"
@@ -20,38 +20,21 @@
 )
 
 type config struct {
-	port     int
-	config   string
-	logLevel string
+	Port     int    `kong:"short='p',default='8080',help='Port to listen on'"`
+	Config   string `kong:"short='c',required,help='YAML configuration file containing mapping directives'"`
+	LogLevel string `kong:"short='l',default='info',help='Log level (debug, info, warn, error)'"`
 }
 
-func parseFlags() *config {
+func parseConfig() *config {
 	cfg := &config{}
-
-	flag.IntVar(&cfg.port, "port", 8080, "Port to listen on")
-	flag.IntVar(&cfg.port, "p", 8080, "Port to listen on (shorthand)")
-
-	flag.StringVar(&cfg.config, "config", "", "YAML configuration file containing mapping directives")
-	flag.StringVar(&cfg.config, "c", "", "YAML configuration file containing mapping directives (shorthand)")
-
-	flag.StringVar(&cfg.logLevel, "log-level", "info", "Log level (debug, info, warn, error)")
-	flag.StringVar(&cfg.logLevel, "l", "info", "Log level (shorthand)")
-
-	flag.Usage = func() {
-		fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
-		fmt.Fprintf(os.Stderr, "\nA web service for transforming JSON objects using term mapping rules.\n\n")
-		fmt.Fprintf(os.Stderr, "Options:\n")
-		flag.PrintDefaults()
-	}
-
-	flag.Parse()
-
-	if cfg.config == "" {
-		fmt.Fprintln(os.Stderr, "Error: config file is required")
-		flag.Usage()
+	ctx := kong.Parse(cfg,
+		kong.Description("A web service for transforming JSON objects using term mapping rules."),
+		kong.UsageOnError(),
+	)
+	if ctx.Error != nil {
+		fmt.Fprintln(os.Stderr, ctx.Error)
 		os.Exit(1)
 	}
-
 	return cfg
 }
 
@@ -70,13 +53,13 @@
 
 func main() {
 	// Parse command line flags
-	cfg := parseFlags()
+	cfg := parseConfig()
 
 	// Set up logging
-	setupLogger(cfg.logLevel)
+	setupLogger(cfg.LogLevel)
 
 	// Create a new mapper instance
-	m, err := mapper.NewMapper(cfg.config)
+	m, err := mapper.NewMapper(cfg.Config)
 	if err != nil {
 		log.Fatal().Err(err).Msg("Failed to create mapper")
 	}
@@ -92,8 +75,8 @@
 
 	// Start server
 	go func() {
-		log.Info().Int("port", cfg.port).Msg("Starting server")
-		if err := app.Listen(fmt.Sprintf(":%d", cfg.port)); err != nil {
+		log.Info().Int("port", cfg.Port).Msg("Starting server")
+		if err := app.Listen(fmt.Sprintf(":%d", cfg.Port)); err != nil {
 			log.Fatal().Err(err).Msg("Server error")
 		}
 	}()
diff --git a/go.mod b/go.mod
index e6f4c32..c166c3b 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@
 toolchain go1.23.9
 
 require (
+	github.com/alecthomas/kong v1.11.0
 	github.com/alecthomas/participle/v2 v2.1.4
 	github.com/gofiber/fiber/v2 v2.52.8
 	github.com/rs/zerolog v1.34.0
diff --git a/go.sum b/go.sum
index 7d1da80..a793d95 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,7 @@
 github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
 github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
+github.com/alecthomas/kong v1.11.0 h1:y++1gI7jf8O7G7l4LZo5ASFhrhJvzc+WgF/arranEmM=
+github.com/alecthomas/kong v1.11.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
 github.com/alecthomas/participle/v2 v2.1.4 h1:W/H79S8Sat/krZ3el6sQMvMaahJ+XcM9WSI2naI7w2U=
 github.com/alecthomas/participle/v2 v2.1.4/go.mod h1:8tqVbpTX20Ru4NfYQgZf4mP18eXPTBViyMWiArNEgGI=
 github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=