diff --git a/modules/common/src/main/scala/docspell/common/LenientUri.scala b/modules/common/src/main/scala/docspell/common/LenientUri.scala
index 600d0a61..ca1b5069 100644
--- a/modules/common/src/main/scala/docspell/common/LenientUri.scala
+++ b/modules/common/src/main/scala/docspell/common/LenientUri.scala
@@ -49,6 +49,12 @@ case class LenientUri(
   def withFragment(f: String): LenientUri =
     copy(fragment = Some(f))
 
+  def rootPathToEmpty: LenientUri =
+    path match {
+      case LenientUri.RootPath => copy(path = LenientUri.EmptyPath)
+      case _                   => this
+    }
+
   def toJavaUrl: Either[String, URL] =
     Either.catchNonFatal(new URL(asString)).left.map(_.getMessage)
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala b/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala
index 3e36359b..3966445e 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala
@@ -36,8 +36,8 @@ object Flags {
     )
 
   private def getBaseUrl(cfg: Config): String =
-    if (cfg.baseUrl.isLocal) cfg.baseUrl.path.asString
-    else cfg.baseUrl.asString
+    if (cfg.baseUrl.isLocal) cfg.baseUrl.rootPathToEmpty.path.asString
+    else cfg.baseUrl.rootPathToEmpty.asString
 
   implicit val jsonEncoder: Encoder[Flags] =
     deriveEncoder[Flags]