From 9013f2de5b4b238d8c521b69616c89f5b8ad0262 Mon Sep 17 00:00:00 2001
From: eikek <eike.kettner@posteo.de>
Date: Wed, 22 Sep 2021 17:23:24 +0200
Subject: [PATCH] Update scalafmt settings

---
 .scalafmt.conf                                |  10 +-
 build.sbt                                     |  98 +++++++--------
 .../docspell/analysis/TextAnalyser.scala      |   2 +-
 .../classifier/StanfordTextClassifier.scala   |  12 +-
 .../docspell/analysis/contact/Contact.scala   |   2 +-
 .../scala/docspell/analysis/contact/Tld.scala |   3 +-
 .../docspell/analysis/date/DateFind.scala     |  10 +-
 .../analysis/nlp/BasicCRFAnnotator.scala      |   4 +-
 .../docspell/analysis/nlp/PipelineCache.scala |  12 +-
 .../docspell/analysis/nlp/Properties.scala    |  42 +++----
 .../analysis/split/TextSplitter.scala         |   5 +-
 .../scala/docspell/analysis/split/Word.scala  |   4 +-
 .../nlp/StanfordNerAnnotatorSuite.scala       |  14 +--
 .../scala/docspell/backend/BackendApp.scala   |  86 ++++++-------
 .../scala/docspell/backend/JobFactory.scala   |  18 +--
 .../docspell/backend/auth/AuthToken.scala     |  12 +-
 .../scala/docspell/backend/auth/Login.scala   |  16 +--
 .../docspell/backend/auth/RememberToken.scala |   8 +-
 .../scala/docspell/backend/item/Merge.scala   |   4 +-
 .../backend/ops/OClientSettings.scala         |   2 +-
 .../docspell/backend/ops/OCollective.scala    |  38 +++---
 .../docspell/backend/ops/OCustomFields.scala  |  34 ++---
 .../docspell/backend/ops/OEquipment.scala     |   2 +-
 .../scala/docspell/backend/ops/OFolder.scala  |   6 +-
 .../docspell/backend/ops/OFulltext.scala      |  17 ++-
 .../scala/docspell/backend/ops/OItem.scala    |  33 +++--
 .../docspell/backend/ops/OItemSearch.scala    |  10 +-
 .../scala/docspell/backend/ops/OJob.scala     |   8 +-
 .../scala/docspell/backend/ops/OJoex.scala    |   4 +-
 .../scala/docspell/backend/ops/OMail.scala    |  14 +--
 .../scala/docspell/backend/ops/ONode.scala    |   4 +-
 .../docspell/backend/ops/OOrganization.scala  |   8 +-
 .../docspell/backend/ops/OSimpleSearch.scala  |   3 +-
 .../scala/docspell/backend/ops/OTag.scala     |  15 ++-
 .../scala/docspell/backend/ops/OTotp.scala    |  12 +-
 .../scala/docspell/backend/ops/OUpload.scala  |  11 +-
 .../docspell/backend/ops/OUserTask.scala      |  18 ++-
 .../docspell/backend/ops/SendResult.scala     |  12 +-
 .../docspell/backend/signup/Config.scala      |   2 +-
 .../backend/signup/NewInviteResult.scala      |   8 +-
 .../backend/signup/SignupResult.scala         |  16 +--
 .../scala/docspell/common/AccountSource.scala |   2 +-
 .../main/scala/docspell/common/Binary.scala   |  10 +-
 .../docspell/common/CollectiveState.scala     |   3 +-
 .../scala/docspell/common/ContactKind.scala   |   8 +-
 .../docspell/common/CustomFieldType.scala     |   8 +-
 .../docspell/common/DocspellSystem.scala      |   8 +-
 .../main/scala/docspell/common/EnvMode.scala  |   6 +-
 .../scala/docspell/common/EquipmentUse.scala  |   4 +-
 .../src/main/scala/docspell/common/Glob.scala |   8 +-
 .../scala/docspell/common/ItemState.scala     |  16 +--
 .../main/scala/docspell/common/JobState.scala |  15 ++-
 .../main/scala/docspell/common/JvmInfo.scala  |   4 +-
 .../scala/docspell/common/LenientUri.scala    |  22 ++--
 .../main/scala/docspell/common/LogLevel.scala |   4 +-
 .../scala/docspell/common/MetaProposal.scala  |   3 +-
 .../docspell/common/MetaProposalList.scala    |   4 +-
 .../docspell/common/MetaProposalType.scala    |   8 +-
 .../main/scala/docspell/common/MimeType.scala |  17 ++-
 .../main/scala/docspell/common/NerTag.scala   |  12 +-
 .../main/scala/docspell/common/NlpMode.scala  |   6 +-
 .../main/scala/docspell/common/NodeType.scala |   2 +-
 .../main/scala/docspell/common/OrgUse.scala   |   4 +-
 .../scala/docspell/common/PersonUse.scala     |  10 +-
 .../main/scala/docspell/common/Pools.scala    |   3 +-
 .../scala/docspell/common/SearchMode.scala    |   4 +-
 .../scala/docspell/common/SystemCommand.scala |   4 +-
 .../docspell/common/ThreadFactories.scala     |   2 +-
 .../docspell/common/syntax/StreamSyntax.scala |   2 +-
 .../docspell/common/syntax/StringSyntax.scala |   2 +-
 .../scala/docspell/convert/Conversion.scala   |   6 +-
 .../docspell/convert/extern/ExternConv.scala  |   2 +-
 .../docspell/convert/flexmark/Markdown.scala  |   6 +-
 .../docspell/convert/ConversionTest.scala     |   2 +-
 .../scala/docspell/convert/FileChecks.scala   |   2 +-
 .../convert/extern/ExternConvTest.scala       |   2 +-
 .../docspell/extract/ExtractResult.scala      |   4 +-
 .../main/scala/docspell/extract/ocr/Ocr.scala |  18 ++-
 .../scala/docspell/extract/ocr/OcrType.scala  |   4 +-
 .../docspell/extract/odf/OdfExtract.scala     |   6 +-
 .../scala/docspell/extract/odf/OdfType.scala  |   4 +-
 .../extract/pdfbox/PdfboxExtract.scala        |   2 +-
 .../scala/docspell/extract/poi/PoiType.scala  |   6 +-
 .../docspell/extract/odf/OdfExtractTest.scala |   2 +-
 .../extract/pdfbox/PdfboxExtractTest.scala    |  12 +-
 .../docspell/extract/poi/PoiExtractTest.scala |   4 +-
 .../docspell/extract/rtf/RtfExtractTest.scala |   4 +-
 .../main/scala/docspell/files/ImageSize.scala |   2 +-
 .../scala/docspell/files/TikaMimetype.scala   |   4 +-
 .../scala/docspell/files/ImageSizeTest.scala  |  10 +-
 .../test/scala/docspell/files/ZipTest.scala   |   2 +-
 .../docspell/ftsclient/FtsMigration.scala     |   8 +-
 .../scala/docspell/ftsclient/FtsResult.scala  |   2 +-
 .../main/scala/docspell/ftssolr/Field.scala   |  24 ++--
 .../scala/docspell/ftssolr/JsonCodec.scala    |  20 +--
 .../scala/docspell/ftssolr/QueryData.scala    |  14 +--
 .../docspell/ftssolr/SolrFtsClient.scala      |   4 +-
 .../scala/docspell/ftssolr/SolrQuery.scala    |   2 +-
 .../scala/docspell/ftssolr/SolrSetup.scala    |   4 +-
 .../scala/docspell/ftssolr/SolrUpdate.scala   |   2 +-
 .../scala/docspell/ftssolr/VersionDoc.scala   |   2 +-
 .../scala/docspell/joex/JoexAppImpl.scala     |  26 ++--
 .../main/scala/docspell/joex/JoexServer.scala |   4 +-
 .../docspell/joex/analysis/RegexNerFile.scala |   7 +-
 .../joex/emptytrash/EmptyTrashTask.scala      |   2 +-
 .../docspell/joex/fts/MigrationTask.scala     |   4 +-
 .../scala/docspell/joex/fts/ReIndexTask.scala |   2 +-
 .../scala/docspell/joex/fts/package.scala     |   3 +-
 .../joex/notify/NotifyDueItemsTask.scala      |   6 +-
 .../joex/pagecount/AllPageCountTask.scala     |   2 +-
 .../joex/pdfconv/ConvertAllPdfTask.scala      |   2 +-
 .../docspell/joex/pdfconv/PdfConvTask.scala   |   8 +-
 .../joex/preview/MakePreviewTask.scala        |   2 +-
 .../docspell/joex/process/ConvertPdf.scala    |   2 +-
 .../docspell/joex/process/CreateItem.scala    |  21 ++--
 .../joex/process/CrossCheckProposals.scala    |   4 +-
 .../joex/process/DuplicateCheck.scala         |   4 +-
 .../docspell/joex/process/EvalProposals.scala |   8 +-
 .../joex/process/ExtractArchive.scala         |   6 +-
 .../docspell/joex/process/FindProposal.scala  |   2 +-
 .../docspell/joex/process/LinkProposal.scala  |   8 +-
 .../docspell/joex/process/ReProcessItem.scala |   6 +-
 .../docspell/joex/process/SaveProposals.scala |   3 +-
 .../docspell/joex/process/SetGivenData.scala  |   6 +-
 .../docspell/joex/process/TextAnalysis.scala  |   2 +-
 .../joex/process/TextExtraction.scala         |   6 +-
 .../docspell/joex/routes/JoexRoutes.scala     |   4 +-
 .../joex/scanmailbox/ScanMailboxTask.scala    |  16 +--
 .../docspell/joex/scheduler/Context.scala     |   4 +-
 .../joex/scheduler/PeriodicScheduler.scala    |   2 +-
 .../scheduler/PeriodicSchedulerImpl.scala     |   4 +-
 .../joex/scheduler/SchedulerBuilder.scala     |   6 +-
 .../joex/scheduler/SchedulerImpl.scala        |  18 +--
 .../scala/docspell/joex/scheduler/Task.scala  |   3 +-
 .../docspell/joex/updatecheck/MakeMail.scala  |   4 +-
 .../joex/updatecheck/UpdateCheckTask.scala    |   6 +-
 .../docspell/joex/analysis/NerFileTest.scala  |  10 +-
 .../joex/scheduler/CountingSchemeSpec.scala   |   4 +-
 .../joex/updatecheck/UpdateCheckTest.scala    |  99 +++++++--------
 .../docspell/joexapi/client/JoexClient.scala  |   4 +-
 .../scala/docspell/oidc/AccessToken.scala     |  12 +-
 .../main/scala/docspell/oidc/CodeFlow.scala   |  12 +-
 .../scala/docspell/oidc/CodeFlowConfig.scala  |   2 +-
 .../scala/docspell/oidc/CodeFlowRoutes.scala  |   2 +-
 .../scala/docspell/oidc/SignatureAlgo.scala   |  18 +--
 .../src/main/scala/docspell/query/Date.scala  |   2 +-
 .../docspell/query/FulltextExtract.scala      |  11 +-
 .../main/scala/docspell/query/ItemQuery.scala |  68 +++++-----
 .../docspell/query/internal/BasicParser.scala |   4 +-
 .../docspell/query/internal/Constants.scala   |  84 ++++++-------
 .../docspell/query/internal/ExprParser.scala  |   6 +-
 .../docspell/query/internal/StringUtil.scala  |  11 +-
 .../query/internal/ItemQueryParserTest.scala  |  14 +--
 .../scala/docspell/restserver/Config.scala    |   4 +-
 .../docspell/restserver/RestServer.scala      |  74 +++++------
 .../docspell/restserver/auth/CookieData.scala |   4 +-
 .../docspell/restserver/auth/OpenId.scala     |  10 +-
 .../restserver/auth/RememberCookieData.scala  |   2 +-
 .../restserver/conv/Conversions.scala         |  22 ++--
 .../restserver/http4s/BinaryUtil.scala        |   6 +-
 .../restserver/http4s/ClientRequestInfo.scala |   7 +-
 .../restserver/http4s/QueryParam.scala        |  20 +--
 .../routes/AttachmentMultiRoutes.scala        |   2 +-
 .../restserver/routes/AttachmentRoutes.scala  |  16 +--
 .../routes/CalEventCheckRoutes.scala          |   2 +-
 .../restserver/routes/CheckFileRoutes.scala   |   2 +-
 .../routes/ClientSettingsRoutes.scala         |   4 +-
 .../restserver/routes/CollectiveRoutes.scala  |   6 +-
 .../restserver/routes/CustomFieldRoutes.scala |   8 +-
 .../restserver/routes/EquipmentRoutes.scala   |  16 +--
 .../restserver/routes/FolderRoutes.scala      |  16 +--
 .../routes/FullTextIndexRoutes.scala          |   4 +-
 .../routes/IntegrationEndpointRoutes.scala    |   4 +-
 .../restserver/routes/ItemMultiRoutes.scala   |  74 +++++------
 .../restserver/routes/ItemRoutes.scala        |  54 ++++----
 .../restserver/routes/JobQueueRoutes.scala    |   4 +-
 .../restserver/routes/LoginRoutes.scala       |   4 +-
 .../restserver/routes/MailSendRoutes.scala    |   6 +-
 .../routes/MailSettingsRoutes.scala           |   4 +-
 .../routes/NotifyDueItemsRoutes.scala         |  12 +-
 .../routes/OrganizationRoutes.scala           |  16 +--
 .../restserver/routes/PersonRoutes.scala      |  18 +--
 .../restserver/routes/RegisterRoutes.scala    |   4 +-
 .../restserver/routes/ScanMailboxRoutes.scala |  12 +-
 .../restserver/routes/SentMailRoutes.scala    |   4 +-
 .../restserver/routes/SourceRoutes.scala      |  10 +-
 .../restserver/routes/TagRoutes.scala         |   8 +-
 .../restserver/routes/TotpRoutes.scala        |  10 +-
 .../restserver/routes/UploadRoutes.scala      |   2 +-
 .../restserver/routes/UserRoutes.scala        |  10 +-
 .../restserver/webapp/TemplateRoutes.scala    |   4 +-
 .../restserver/webapp/WebjarRoutes.scala      |   4 +-
 .../main/scala/docspell/store/AddResult.scala |   6 +-
 .../src/main/scala/docspell/store/Store.scala |   2 +-
 .../scala/docspell/store/UpdateResult.scala   |   8 +-
 .../docspell/store/file/AttributeStore.scala  |   2 +-
 .../scala/docspell/store/file/FileStore.scala |   4 +-
 .../scala/docspell/store/impl/StoreImpl.scala |   2 +-
 .../scala/docspell/store/qb/DBFunction.scala  |   4 +-
 .../scala/docspell/store/qb/FromExpr.scala    |   2 +-
 .../scala/docspell/store/qb/Operator.scala    |  14 +--
 .../scala/docspell/store/qb/OrderBy.scala     |   2 +-
 .../main/scala/docspell/store/qb/Select.scala |   9 +-
 .../qb/generator/ItemQueryGenerator.scala     |   6 +-
 .../store/qb/impl/ConditionBuilder.scala      |  12 +-
 .../store/qb/impl/SelectBuilder.scala         |   8 +-
 .../store/queries/AttachCountTable.scala      |   4 +-
 .../docspell/store/queries/QAttachment.scala  |  14 +--
 .../docspell/store/queries/QCollective.scala  |  16 +--
 .../docspell/store/queries/QFolder.scala      |  22 ++--
 .../scala/docspell/store/queries/QItem.scala  |  80 ++++++------
 .../scala/docspell/store/queries/QJob.scala   |  28 ++---
 .../scala/docspell/store/queries/QMails.scala |   6 +-
 .../store/queries/QOrganization.scala         |  16 +--
 .../scala/docspell/store/queries/QUser.scala  |  30 ++---
 .../scala/docspell/store/queue/Marked.scala   |   2 +-
 .../store/queue/PeriodicTaskStore.scala       |  13 +-
 .../docspell/store/records/RAttachment.scala  |  25 ++--
 .../store/records/RAttachmentArchive.scala    |   8 +-
 .../store/records/RAttachmentMeta.scala       |   8 +-
 .../store/records/RAttachmentPreview.scala    |   6 +-
 .../store/records/RAttachmentSource.scala     |   6 +-
 .../store/records/RClassifierModel.scala      |  10 +-
 .../store/records/RClassifierSetting.scala    |  10 +-
 .../store/records/RClientSettings.scala       |  14 +--
 .../docspell/store/records/RCollective.scala  |  10 +-
 .../docspell/store/records/RContact.scala     |  10 +-
 .../docspell/store/records/RCustomField.scala |  10 +-
 .../store/records/RCustomFieldValue.scala     |   6 +-
 .../store/records/REmptyTrashSetting.scala    |   8 +-
 .../docspell/store/records/REquipment.scala   |  16 +--
 .../docspell/store/records/RFileMeta.scala    |   8 +-
 .../docspell/store/records/RFolder.scala      |   8 +-
 .../store/records/RFolderMember.scala         |   6 +-
 .../docspell/store/records/RInvitation.scala  |   6 +-
 .../scala/docspell/store/records/RItem.scala  |  34 ++---
 .../store/records/RItemProposal.scala         |   6 +-
 .../scala/docspell/store/records/RJob.scala   |  30 ++---
 .../docspell/store/records/RJobGroupUse.scala |   4 +-
 .../docspell/store/records/RJobLog.scala      |   8 +-
 .../scala/docspell/store/records/RNode.scala  |   8 +-
 .../store/records/ROrganization.scala         |  24 ++--
 .../store/records/RPeriodicTask.scala         |  26 ++--
 .../docspell/store/records/RPerson.scala      |  20 +--
 .../docspell/store/records/RRememberMe.scala  |  12 +-
 .../docspell/store/records/RSentMail.scala    |  20 +--
 .../store/records/RSentMailItem.scala         |   8 +-
 .../docspell/store/records/RSource.scala      |  22 ++--
 .../scala/docspell/store/records/RTag.scala   |  12 +-
 .../docspell/store/records/RTagItem.scala     |   6 +-
 .../docspell/store/records/RTagSource.scala   |   6 +-
 .../scala/docspell/store/records/RTotp.scala  |   4 +-
 .../scala/docspell/store/records/RUser.scala  |  22 ++--
 .../docspell/store/records/RUserEmail.scala   |  30 ++---
 .../docspell/store/records/RUserImap.scala    |  26 ++--
 .../docspell/store/records/SourceData.scala   |  15 ++-
 .../docspell/store/records/TagItemName.scala  |   2 +-
 .../store/usertask/UserTaskStore.scala        |   9 +-
 .../scala/docspell/store/StoreFixture.scala   |   4 +-
 .../generator/ItemQueryGeneratorTest.scala    |   8 +-
 .../store/migrate/H2MigrateTest.scala         |   2 +-
 .../docspell/store/qb/QueryBuilderTest.scala  |   4 +-
 .../store/qb/impl/SelectBuilderTest.scala     |   6 +-
 .../store/qb/model/CourseRecord.scala         |   8 +-
 .../store/qb/model/PersonRecord.scala         |   4 +-
 .../docspell/store/queries/QJobTest.scala     |  20 +--
 .../src/main/scala/docspell/totp/Key.scala    |   2 +-
 .../src/main/scala/docspell/totp/Mac.scala    |   6 +-
 .../src/main/scala/docspell/totp/Totp.scala   |   2 +-
 .../test/scala/docspell/totp/KeyTest.scala    |   6 +-
 .../test/scala/docspell/totp/TotpTest.scala   |   8 +-
 project/Cmd.scala                             |   2 +-
 project/Dependencies.scala                    | 116 +++++++++---------
 project/NerModelsPlugin.scala                 |   2 +-
 project/StylesPlugin.scala                    |  24 ++--
 project/ZolaPlugin.scala                      |  12 +-
 project/plugins.sbt                           |  26 ++--
 277 files changed, 1579 insertions(+), 1615 deletions(-)

diff --git a/.scalafmt.conf b/.scalafmt.conf
index a0fd81b4..66fb20fd 100644
--- a/.scalafmt.conf
+++ b/.scalafmt.conf
@@ -1,6 +1,7 @@
 version = "3.0.4"
 
-preset = defaultWithAlign
+preset = default
+align.preset = some
 
 maxColumn = 90
 
@@ -12,3 +13,10 @@ rewrite.rules = [
   PreferCurlyFors
   SortModifiers
 ]
+
+assumeStandardLibraryStripMargin = true
+align.stripMargin = true
+
+docstrings.style = SpaceAsterisk
+docstrings.oneline = fold
+docstrings.wrap = "yes"
\ No newline at end of file
diff --git a/build.sbt b/build.sbt
index 66a7f90a..09001f92 100644
--- a/build.sbt
+++ b/build.sbt
@@ -4,7 +4,7 @@ import com.typesafe.sbt.SbtGit.GitKeys._
 import docspell.build._
 import de.heikoseeberger.sbtheader.CommentBlockCreator
 
-val toolsPackage   = taskKey[Seq[File]]("Package the scripts/extension tools")
+val toolsPackage = taskKey[Seq[File]]("Package the scripts/extension tools")
 val elmCompileMode = settingKey[ElmCompileMode]("How to compile elm sources")
 
 // --- Settings
@@ -13,20 +13,20 @@ def inTest(d0: Seq[ModuleID], ds: Seq[ModuleID]*) =
   ds.fold(d0)(_ ++ _).map(_ % Test)
 
 val scalafixSettings = Seq(
-  semanticdbEnabled := true,                        // enable SemanticDB
+  semanticdbEnabled := true, // enable SemanticDB
   semanticdbVersion := scalafixSemanticdb.revision, //"4.4.0"
   ThisBuild / scalafixDependencies ++= Dependencies.organizeImports
 )
 
 val sharedSettings = Seq(
-  organization     := "com.github.eikek",
-  scalaVersion     := "2.13.6",
+  organization := "com.github.eikek",
+  scalaVersion := "2.13.6",
   organizationName := "Eike K. & Contributors",
   licenses += ("AGPL-3.0-or-later", url(
     "https://spdx.org/licenses/AGPL-3.0-or-later.html"
   )),
-  startYear                     := Some(2020),
-  headerLicenseStyle            := HeaderLicenseStyle.SpdxSyntax,
+  startYear := Some(2020),
+  headerLicenseStyle := HeaderLicenseStyle.SpdxSyntax,
   headerSources / excludeFilter := HiddenFileFilter || "*.java" || "StringUtil.scala",
   scalacOptions ++= Seq(
     "-deprecation",
@@ -45,9 +45,9 @@ val sharedSettings = Seq(
   ),
   javacOptions ++= Seq("-target", "1.8", "-source", "1.8"),
   LocalRootProject / toolsPackage := {
-    val v      = version.value
+    val v = version.value
     val logger = streams.value.log
-    val dir    = (LocalRootProject / baseDirectory).value / "tools"
+    val dir = (LocalRootProject / baseDirectory).value / "tools"
     packageTools(logger, dir, v)
   },
   Compile / console / scalacOptions :=
@@ -55,7 +55,7 @@ val sharedSettings = Seq(
   Test / console / scalacOptions :=
     (scalacOptions.value.filter(o => !o.contains("-Xlint") && !o.contains("-W"))),
   libraryDependencySchemes ++= Seq(
-    "com.github.eikek" %% "calev-core"  % VersionScheme.Always,
+    "com.github.eikek" %% "calev-core" % VersionScheme.Always,
     "com.github.eikek" %% "calev-circe" % VersionScheme.Always
   )
 ) ++ scalafixSettings
@@ -66,8 +66,8 @@ val testSettingsMUnit = Seq(
 )
 
 lazy val noPublish = Seq(
-  publish         := {},
-  publishLocal    := {},
+  publish := {},
+  publishLocal := {},
   publishArtifact := false
 )
 
@@ -113,7 +113,7 @@ def webjarSettings(queryJS: Project) = Seq(
   }.taskValue,
   Compile / resourceGenerators += Def.task {
     val logger = streams.value.log
-    val out    = (queryJS / Compile / fullOptJS).value
+    val out = (queryJS / Compile / fullOptJS).value
     logger.info(s"Produced query js file: ${out.data}")
     copyWebjarResources(
       Seq(out.data),
@@ -297,7 +297,7 @@ val files = project
       Dependencies.tika ++
         Dependencies.icu4j,
     Test / sourceGenerators += Def.task {
-      val base  = (Test / resourceDirectory).value
+      val base = (Test / resourceDirectory).value
       val files = (base ** (_.isFile)).pair(sbt.io.Path.relativeTo(base))
       val lines = files.toList.map(_._2).map { s =>
         val ident = s.replaceAll("[^a-zA-Z0-9_]+", "_")
@@ -466,9 +466,9 @@ val restapi = project
     libraryDependencies ++=
       Dependencies.circe,
     openapiTargetLanguage := Language.Scala,
-    openapiPackage        := Pkg("docspell.restapi.model"),
-    openapiSpec           := (Compile / resourceDirectory).value / "docspell-openapi.yml",
-    openapiStaticGen      := OpenApiDocGenerator.Redoc
+    openapiPackage := Pkg("docspell.restapi.model"),
+    openapiSpec := (Compile / resourceDirectory).value / "docspell-openapi.yml",
+    openapiStaticGen := OpenApiDocGenerator.Redoc
   )
   .dependsOn(common)
 
@@ -486,9 +486,9 @@ val joexapi = project
         Dependencies.http4sCirce ++
         Dependencies.http4sClient,
     openapiTargetLanguage := Language.Scala,
-    openapiPackage        := Pkg("docspell.joexapi.model"),
-    openapiSpec           := (Compile / resourceDirectory).value / "joex-openapi.yml",
-    openapiStaticGen      := OpenApiDocGenerator.Redoc
+    openapiPackage := Pkg("docspell.joexapi.model"),
+    openapiSpec := (Compile / resourceDirectory).value / "joex-openapi.yml",
+    openapiStaticGen := OpenApiDocGenerator.Redoc
   )
   .dependsOn(common)
 
@@ -535,9 +535,9 @@ val webapp = project
   .settings(stylesSettings)
   .settings(webjarSettings(query.js))
   .settings(
-    name                  := "docspell-webapp",
+    name := "docspell-webapp",
     openapiTargetLanguage := Language.Elm,
-    openapiPackage        := Pkg("Api.Model"),
+    openapiPackage := Pkg("Api.Model"),
     openapiSpec := (restapi / Compile / resourceDirectory).value / "docspell-openapi.yml",
     openapiElmConfig := ElmConfig().withJson(ElmJson.decodePipeline)
   )
@@ -561,7 +561,7 @@ val joex = project
   .settings(
     name := "docspell-joex",
     description := "The joex component (job executor) for docspell which executes long-running tasks.",
-    packageSummary     := "Docspell Joex",
+    packageSummary := "Docspell Joex",
     packageDescription := description.value,
     libraryDependencies ++=
       Dependencies.fs2 ++
@@ -604,9 +604,9 @@ val restserver = project
   .settings(debianSettings("docspell-server"))
   .settings(buildInfoSettings)
   .settings(
-    name               := "docspell-restserver",
-    description        := "Docspell server providing the user interface and a REST Api.",
-    packageSummary     := "Docspell Rest server",
+    name := "docspell-restserver",
+    description := "Docspell server providing the user interface and a REST Api.",
+    packageSummary := "Docspell Rest server",
     packageDescription := description.value,
     libraryDependencies ++=
       Dependencies.http4sServer ++
@@ -661,15 +661,15 @@ val website = project
   .enablePlugins(ZolaPlugin, GitHubPagesPlugin)
   .settings(sharedSettings)
   .settings(
-    name                := "docspell-website",
-    publishArtifact     := false,
-    publish / skip      := true,
-    gitHubPagesOrgName  := "eikek",
+    name := "docspell-website",
+    publishArtifact := false,
+    publish / skip := true,
+    gitHubPagesOrgName := "eikek",
     gitHubPagesRepoName := "docspell",
-    gitHubPagesSiteDir  := zolaOutputDir.value,
+    gitHubPagesSiteDir := zolaOutputDir.value,
     Compile / resourceGenerators += Def.task {
       val templateOut = baseDirectory.value / "site" / "templates" / "shortcodes"
-      val staticOut   = baseDirectory.value / "site" / "static" / "openapi"
+      val staticOut = baseDirectory.value / "site" / "static" / "openapi"
       IO.createDirectories(Seq(templateOut, staticOut))
       val logger = streams.value.log
 
@@ -692,14 +692,14 @@ val website = project
       IO.write(
         target,
         """|+++
-                          |title = "Changelog"
-                          |description = "See what changed between releases."
-                          |weight = 10
-                          |insert_anchor_links = "right"
-                          |[extra]
-                          |maketoc = false
-                          |+++
-                          |""".stripMargin
+           |title = "Changelog"
+           |description = "See what changed between releases."
+           |weight = 10
+           |insert_anchor_links = "right"
+           |[extra]
+           |maketoc = false
+           |+++
+           |""".stripMargin
       )
       IO.append(target, IO.readBytes(changelog))
       Seq(target)
@@ -798,7 +798,7 @@ def compileElm(
 }
 
 def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = {
-  val target   = out / "Webjars.scala"
+  val target = out / "Webjars.scala"
   val badChars = "-.".toSet
   val fields = wj
     .map(m =>
@@ -808,10 +808,10 @@ def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = {
     )
     .mkString("\n\n")
   val content = s"""package docspell.restserver.webapp
-    |object Webjars {
-    |$fields
-    |}
-    |""".stripMargin
+                   |object Webjars {
+                   |$fields
+                   |}
+                   |""".stripMargin
 
   IO.write(target, content)
   Seq(target)
@@ -824,15 +824,15 @@ def packageTools(logger: Logger, dir: File, version: String): Seq[File] = {
   val archive = target / s"docspell-tools-$version.zip"
   logger.info(s"Packaging tools to $archive ...")
   val webext = target / "docspell-firefox-extension.xpi"
-  val wx     = dir / "webextension"
+  val wx = dir / "webextension"
   IO.zip(
     Seq(
       wx / "_locales/de/messages.json" -> "_locales/de/messages.json",
       wx / "_locales/en/messages.json" -> "_locales/en/messages.json",
-      wx / "docspell.js"               -> "docspell.js",
-      wx / "icons" / "logo-48.png"     -> "icons/logo-48.png",
-      wx / "icons" / "logo-96.png"     -> "icons/logo-96.png",
-      wx / "manifest.json"             -> "manifest.json"
+      wx / "docspell.js" -> "docspell.js",
+      wx / "icons" / "logo-48.png" -> "icons/logo-48.png",
+      wx / "icons" / "logo-96.png" -> "icons/logo-96.png",
+      wx / "manifest.json" -> "manifest.json"
     ),
     webext,
     None
diff --git a/modules/analysis/src/main/scala/docspell/analysis/TextAnalyser.scala b/modules/analysis/src/main/scala/docspell/analysis/TextAnalyser.scala
index 1acc46dc..0158a6af 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/TextAnalyser.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/TextAnalyser.scala
@@ -54,7 +54,7 @@ object TextAnalyser {
               tags0 <- stanfordNer(Nlp.Input(cacheKey, settings, logger, input))
               tags1 <- contactNer(input)
               dates <- dateNer(settings.lang, input)
-              list  = tags0 ++ tags1
+              list = tags0 ++ tags1
               spans = NerLabelSpan.build(list)
             } yield Result(spans ++ list, dates)
 
diff --git a/modules/analysis/src/main/scala/docspell/analysis/classifier/StanfordTextClassifier.scala b/modules/analysis/src/main/scala/docspell/analysis/classifier/StanfordTextClassifier.scala
index e79849c8..9fe4f72f 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/classifier/StanfordTextClassifier.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/classifier/StanfordTextClassifier.scala
@@ -31,10 +31,10 @@ final class StanfordTextClassifier[F[_]: Async](cfg: TextClassifierConfig)
       .withTempDir(cfg.workingDir, "trainclassifier")
       .use { dir =>
         for {
-          rawData   <- writeDataFile(dir, data)
-          _         <- logger.debug(s"Learning from ${rawData.count} items.")
+          rawData <- writeDataFile(dir, data)
+          _ <- logger.debug(s"Learning from ${rawData.count} items.")
           trainData <- splitData(logger, rawData)
-          scores    <- cfg.classifierConfigs.traverse(m => train(logger, trainData, m))
+          scores <- cfg.classifierConfigs.traverse(m => train(logger, trainData, m))
           sorted = scores.sortBy(-_.score)
           res <- handler(sorted.head.model)
         } yield res
@@ -77,7 +77,7 @@ final class StanfordTextClassifier[F[_]: Async](cfg: TextClassifierConfig)
     } yield res
 
   def splitData(logger: Logger[F], in: RawData): F[TrainData] = {
-    val f     = if (cfg.classifierConfigs.size > 1) 0.15 else 0.0
+    val f = if (cfg.classifierConfigs.size > 1) 0.15 else 0.0
     val nTest = (in.count * f).toLong
 
     val td =
@@ -142,8 +142,8 @@ final class StanfordTextClassifier[F[_]: Async](cfg: TextClassifierConfig)
       props: Map[String, String]
   ): Map[String, String] =
     prepend("2.", props) ++ Map(
-      "trainFile"   -> trainData.train.absolutePathAsString,
-      "testFile"    -> trainData.test.absolutePathAsString,
+      "trainFile" -> trainData.train.absolutePathAsString,
+      "testFile" -> trainData.test.absolutePathAsString,
       "serializeTo" -> trainData.modelFile.absolutePathAsString
     ).toList
 
diff --git a/modules/analysis/src/main/scala/docspell/analysis/contact/Contact.scala b/modules/analysis/src/main/scala/docspell/analysis/contact/Contact.scala
index cbe9f14a..fbd8a470 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/contact/Contact.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/contact/Contact.scala
@@ -33,7 +33,7 @@ object Contact {
     if (atIdx <= 0 || str.indexOf('@', atIdx + 1) > 0) false
     else {
       val name = str.substring(0, atIdx)
-      val dom  = str.substring(atIdx + 1)
+      val dom = str.substring(atIdx + 1)
       Domain.isDomain(dom) && name.forall(c => !c.isWhitespace)
     }
   }
diff --git a/modules/analysis/src/main/scala/docspell/analysis/contact/Tld.scala b/modules/analysis/src/main/scala/docspell/analysis/contact/Tld.scala
index 9f4521f6..e1d9d5eb 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/contact/Tld.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/contact/Tld.scala
@@ -14,8 +14,7 @@ private[analysis] object Tld {
   def endsWithTld(str: String): Boolean =
     findTld(str).isDefined
 
-  /** Some selected TLDs.
-    */
+  /** Some selected TLDs. */
   private[this] val known = List(
     ".com",
     ".org",
diff --git a/modules/analysis/src/main/scala/docspell/analysis/date/DateFind.scala b/modules/analysis/src/main/scala/docspell/analysis/date/DateFind.scala
index 7cf77893..dd5f3baf 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/date/DateFind.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/date/DateFind.scala
@@ -177,17 +177,17 @@ object DateFind {
 
     object Result {
       final case class Success[A](value: A, rest: List[Word]) extends Result[A] {
-        val toOption                                 = Some(value)
+        val toOption = Some(value)
         def flatMap[B](f: A => Result[B]): Result[B] = f(value)
-        def map[B](f: A => B): Result[B]             = Success(f(value), rest)
+        def map[B](f: A => B): Result[B] = Success(f(value), rest)
         def next[B](r: Reader[B]): Result[(A, B)] =
           r.read(rest).map(b => (value, b))
       }
       final case object Failure extends Result[Nothing] {
-        val toOption                                       = None
+        val toOption = None
         def flatMap[B](f: Nothing => Result[B]): Result[B] = this
-        def map[B](f: Nothing => B): Result[B]             = this
-        def next[B](r: Reader[B]): Result[(Nothing, B)]    = this
+        def map[B](f: Nothing => B): Result[B] = this
+        def next[B](r: Reader[B]): Result[(Nothing, B)] = this
       }
 
       implicit def resultSemigroup[A: Semigroup]: Semigroup[Result[A]] =
diff --git a/modules/analysis/src/main/scala/docspell/analysis/nlp/BasicCRFAnnotator.scala b/modules/analysis/src/main/scala/docspell/analysis/nlp/BasicCRFAnnotator.scala
index 584d08d3..04dc33cc 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/nlp/BasicCRFAnnotator.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/nlp/BasicCRFAnnotator.scala
@@ -74,9 +74,9 @@ object BasicCRFAnnotator {
   }
 
   final class Cache {
-    private[this] lazy val germanNerClassifier  = makeAnnotator(Language.German)
+    private[this] lazy val germanNerClassifier = makeAnnotator(Language.German)
     private[this] lazy val englishNerClassifier = makeAnnotator(Language.English)
-    private[this] lazy val frenchNerClassifier  = makeAnnotator(Language.French)
+    private[this] lazy val frenchNerClassifier = makeAnnotator(Language.French)
 
     def forLang(language: NLPLanguage): Annotator =
       language match {
diff --git a/modules/analysis/src/main/scala/docspell/analysis/nlp/PipelineCache.scala b/modules/analysis/src/main/scala/docspell/analysis/nlp/PipelineCache.scala
index a1593b7d..caee9e70 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/nlp/PipelineCache.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/nlp/PipelineCache.scala
@@ -38,9 +38,9 @@ object PipelineCache {
       release: F[Unit]
   ): F[PipelineCache[F]] =
     for {
-      data       <- Ref.of(Map.empty[String, Entry[Annotator[F]]])
+      data <- Ref.of(Map.empty[String, Entry[Annotator[F]]])
       cacheClear <- CacheClearing.create(data, clearInterval, release)
-      _          <- Logger.log4s(logger).info("Creating nlp pipeline cache")
+      _ <- Logger.log4s(logger).info("Creating nlp pipeline cache")
     } yield new Impl[F](data, creator, cacheClear)
 
   final private class Impl[F[_]: Async](
@@ -51,7 +51,7 @@ object PipelineCache {
 
     def obtain(key: String, settings: NlpSettings): Resource[F, Annotator[F]] =
       for {
-        _  <- cacheClear.withCache
+        _ <- cacheClear.withCache
         id <- Resource.eval(makeSettingsId(settings))
         nlp <- Resource.eval(
           data.modify(cache => getOrCreate(key, id, cache, settings, creator))
@@ -73,13 +73,13 @@ object PipelineCache {
               s"StanfordNLP settings changed for key $key. Creating new classifier"
             )
             val nlp = creator(settings)
-            val e   = Entry(id, nlp)
+            val e = Entry(id, nlp)
             (cache.updated(key, e), nlp)
           }
 
         case None =>
           val nlp = creator(settings)
-          val e   = Entry(id, nlp)
+          val e = Entry(id, nlp)
           (cache.updated(key, e), nlp)
       }
 
@@ -114,7 +114,7 @@ object PipelineCache {
         release: F[Unit]
     ): F[CacheClearing[F]] =
       for {
-        counter  <- Ref.of(0L)
+        counter <- Ref.of(0L)
         cleaning <- Ref.of(None: Option[Fiber[F, Throwable, Unit]])
         log = Logger.log4s(logger)
         result <-
diff --git a/modules/analysis/src/main/scala/docspell/analysis/nlp/Properties.scala b/modules/analysis/src/main/scala/docspell/analysis/nlp/Properties.scala
index 0ae152de..f5e903bd 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/nlp/Properties.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/nlp/Properties.scala
@@ -44,47 +44,47 @@ object Properties {
 
   def nerGerman(regexNerMappingFile: Option[String], highRecall: Boolean): JProps =
     Properties(
-      "annotators"           -> "tokenize,ssplit,mwt,pos,lemma,ner",
-      "tokenize.language"    -> "de",
-      "mwt.mappingFile"      -> "edu/stanford/nlp/models/mwt/german/german-mwt.tsv",
-      "pos.model"            -> "edu/stanford/nlp/models/pos-tagger/german-ud.tagger",
-      "ner.statisticalOnly"  -> "true",
-      "ner.rulesOnly"        -> "false",
+      "annotators" -> "tokenize,ssplit,mwt,pos,lemma,ner",
+      "tokenize.language" -> "de",
+      "mwt.mappingFile" -> "edu/stanford/nlp/models/mwt/german/german-mwt.tsv",
+      "pos.model" -> "edu/stanford/nlp/models/pos-tagger/german-ud.tagger",
+      "ner.statisticalOnly" -> "true",
+      "ner.rulesOnly" -> "false",
       "ner.applyFineGrained" -> "false",
       "ner.applyNumericClassifiers" -> "false", //only english supported, not needed currently
       "ner.useSUTime" -> "false", //only english, unused in docspell
-      "ner.language"  -> "de",
+      "ner.language" -> "de",
       "ner.model" -> "edu/stanford/nlp/models/ner/german.distsim.crf.ser.gz,edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz"
     ).withRegexNer(regexNerMappingFile).withHighRecall(highRecall)
 
   def nerEnglish(regexNerMappingFile: Option[String]): JProps =
     Properties(
-      "annotators"        -> "tokenize,ssplit,pos,lemma,ner",
+      "annotators" -> "tokenize,ssplit,pos,lemma,ner",
       "tokenize.language" -> "en",
       "pos.model" -> "edu/stanford/nlp/models/pos-tagger/english-left3words-distsim.tagger",
-      "ner.statisticalOnly"         -> "true",
-      "ner.rulesOnly"               -> "false",
-      "ner.applyFineGrained"        -> "false",
+      "ner.statisticalOnly" -> "true",
+      "ner.rulesOnly" -> "false",
+      "ner.applyFineGrained" -> "false",
       "ner.applyNumericClassifiers" -> "false",
-      "ner.useSUTime"               -> "false",
-      "ner.language"                -> "en",
+      "ner.useSUTime" -> "false",
+      "ner.language" -> "en",
       "ner.model" -> "edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz"
     ).withRegexNer(regexNerMappingFile)
 
   def nerFrench(regexNerMappingFile: Option[String], highRecall: Boolean): JProps =
     Properties(
-      "annotators"        -> "tokenize,ssplit,mwt,pos,lemma,ner",
+      "annotators" -> "tokenize,ssplit,mwt,pos,lemma,ner",
       "tokenize.language" -> "fr",
-      "mwt.mappingFile"   -> "edu/stanford/nlp/models/mwt/french/french-mwt.tsv",
-      "mwt.pos.model"     -> "edu/stanford/nlp/models/mwt/french/french-mwt.tagger",
+      "mwt.mappingFile" -> "edu/stanford/nlp/models/mwt/french/french-mwt.tsv",
+      "mwt.pos.model" -> "edu/stanford/nlp/models/mwt/french/french-mwt.tagger",
       "mwt.statisticalMappingFile" -> "edu/stanford/nlp/models/mwt/french/french-mwt-statistical.tsv",
-      "pos.model"            -> "edu/stanford/nlp/models/pos-tagger/french-ud.tagger",
-      "ner.statisticalOnly"  -> "true",
-      "ner.rulesOnly"        -> "false",
+      "pos.model" -> "edu/stanford/nlp/models/pos-tagger/french-ud.tagger",
+      "ner.statisticalOnly" -> "true",
+      "ner.rulesOnly" -> "false",
       "ner.applyFineGrained" -> "false",
       "ner.applyNumericClassifiers" -> "false",
-      "ner.useSUTime"               -> "false",
-      "ner.language"                -> "de",
+      "ner.useSUTime" -> "false",
+      "ner.language" -> "de",
       "ner.model" -> "edu/stanford/nlp/models/ner/french-wikiner-4class.crf.ser.gz,edu/stanford/nlp/models/ner/english.conll.4class.distsim.crf.ser.gz"
     ).withRegexNer(regexNerMappingFile).withHighRecall(highRecall)
 
diff --git a/modules/analysis/src/main/scala/docspell/analysis/split/TextSplitter.scala b/modules/analysis/src/main/scala/docspell/analysis/split/TextSplitter.scala
index 0e88647c..f31d3889 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/split/TextSplitter.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/split/TextSplitter.scala
@@ -8,15 +8,14 @@ package docspell.analysis.split
 
 import fs2.Stream
 
-/** Splits text into words.
-  */
+/** Splits text into words. */
 object TextSplitter {
   private[this] val trimChars =
     ".,…_[]^!<>=&ſ/{}*?()-:#$|~`+%\\\"'; \t\r\n".toSet
 
   def split[F[_]](str: String, sep: Set[Char], start: Int = 0): Stream[F, Word] = {
     val indexes = sep.map(c => str.indexOf(c.toInt)).filter(_ >= 0)
-    val index   = if (indexes.isEmpty) -1 else indexes.min
+    val index = if (indexes.isEmpty) -1 else indexes.min
 
     if (index < 0) Stream.emit(Word(str, start, start + str.length))
     else if (index == 0) split(str.substring(1), sep, start + 1)
diff --git a/modules/analysis/src/main/scala/docspell/analysis/split/Word.scala b/modules/analysis/src/main/scala/docspell/analysis/split/Word.scala
index a2426d5a..6ed6135f 100644
--- a/modules/analysis/src/main/scala/docspell/analysis/split/Word.scala
+++ b/modules/analysis/src/main/scala/docspell/analysis/split/Word.scala
@@ -7,9 +7,9 @@
 package docspell.analysis.split
 
 case class Word(value: String, begin: Int, end: Int) {
-  def isEmpty: Boolean  = value.isEmpty
+  def isEmpty: Boolean = value.isEmpty
   def nonEmpty: Boolean = !isEmpty
-  def length: Int       = value.length
+  def length: Int = value.length
 
   def trimLeft(chars: Set[Char]): Word = {
     val v = value.dropWhile(chars.contains)
diff --git a/modules/analysis/src/test/scala/docspell/analysis/nlp/StanfordNerAnnotatorSuite.scala b/modules/analysis/src/test/scala/docspell/analysis/nlp/StanfordNerAnnotatorSuite.scala
index 96ef5009..eee0a9c5 100644
--- a/modules/analysis/src/test/scala/docspell/analysis/nlp/StanfordNerAnnotatorSuite.scala
+++ b/modules/analysis/src/test/scala/docspell/analysis/nlp/StanfordNerAnnotatorSuite.scala
@@ -91,19 +91,19 @@ class StanfordNerAnnotatorSuite extends FunSuite {
 
     val regexNerContent =
       s"""(?i)volantino ag${"\t"}ORGANIZATION${"\t"}LOCATION,PERSON,MISC${"\t"}3
-      |(?i)volantino${"\t"}ORGANIZATION${"\t"}LOCATION,PERSON,MISC${"\t"}3
-      |(?i)ag${"\t"}ORGANIZATION${"\t"}LOCATION,PERSON,MISC${"\t"}3
-      |(?i)andrea rossi${"\t"}PERSON${"\t"}LOCATION,MISC${"\t"}2
-      |(?i)andrea${"\t"}PERSON${"\t"}LOCATION,MISC${"\t"}2
-      |(?i)rossi${"\t"}PERSON${"\t"}LOCATION,MISC${"\t"}2
-      |""".stripMargin
+         |(?i)volantino${"\t"}ORGANIZATION${"\t"}LOCATION,PERSON,MISC${"\t"}3
+         |(?i)ag${"\t"}ORGANIZATION${"\t"}LOCATION,PERSON,MISC${"\t"}3
+         |(?i)andrea rossi${"\t"}PERSON${"\t"}LOCATION,MISC${"\t"}2
+         |(?i)andrea${"\t"}PERSON${"\t"}LOCATION,MISC${"\t"}2
+         |(?i)rossi${"\t"}PERSON${"\t"}LOCATION,MISC${"\t"}2
+         |""".stripMargin
 
     File
       .withTempDir[IO](File.path(Paths.get("target")), "test-regex-ner")
       .use { dir =>
         for {
           out <- File.writeString[IO](dir / "regex.txt", regexNerContent)
-          ann    = StanfordNerAnnotator.makePipeline(StanfordNerSettings.RegexOnly(out))
+          ann = StanfordNerAnnotator.makePipeline(StanfordNerSettings.RegexOnly(out))
           labels = StanfordNerAnnotator.nerAnnotate(ann, "Hello Andrea Rossi, can you.")
           _ <- IO(
             assertEquals(
diff --git a/modules/backend/src/main/scala/docspell/backend/BackendApp.scala b/modules/backend/src/main/scala/docspell/backend/BackendApp.scala
index cda6bd81..fd12ec40 100644
--- a/modules/backend/src/main/scala/docspell/backend/BackendApp.scala
+++ b/modules/backend/src/main/scala/docspell/backend/BackendApp.scala
@@ -59,54 +59,54 @@ object BackendApp {
       ftsClient: FtsClient[F]
   ): Resource[F, BackendApp[F]] =
     for {
-      utStore        <- UserTaskStore(store)
-      queue          <- JobQueue(store)
-      totpImpl       <- OTotp(store, Totp.default)
-      loginImpl      <- Login[F](store, Totp.default)
-      signupImpl     <- OSignup[F](store)
-      joexImpl       <- OJoex(JoexClient(httpClient), store)
-      collImpl       <- OCollective[F](store, utStore, queue, joexImpl)
-      sourceImpl     <- OSource[F](store)
-      tagImpl        <- OTag[F](store)
-      equipImpl      <- OEquipment[F](store)
-      orgImpl        <- OOrganization(store)
-      uploadImpl     <- OUpload(store, queue, joexImpl)
-      nodeImpl       <- ONode(store)
-      jobImpl        <- OJob(store, joexImpl)
-      createIndex    <- CreateIndex.resource(ftsClient, store)
-      itemImpl       <- OItem(store, ftsClient, createIndex, queue, joexImpl)
+      utStore <- UserTaskStore(store)
+      queue <- JobQueue(store)
+      totpImpl <- OTotp(store, Totp.default)
+      loginImpl <- Login[F](store, Totp.default)
+      signupImpl <- OSignup[F](store)
+      joexImpl <- OJoex(JoexClient(httpClient), store)
+      collImpl <- OCollective[F](store, utStore, queue, joexImpl)
+      sourceImpl <- OSource[F](store)
+      tagImpl <- OTag[F](store)
+      equipImpl <- OEquipment[F](store)
+      orgImpl <- OOrganization(store)
+      uploadImpl <- OUpload(store, queue, joexImpl)
+      nodeImpl <- ONode(store)
+      jobImpl <- OJob(store, joexImpl)
+      createIndex <- CreateIndex.resource(ftsClient, store)
+      itemImpl <- OItem(store, ftsClient, createIndex, queue, joexImpl)
       itemSearchImpl <- OItemSearch(store)
-      fulltextImpl   <- OFulltext(itemSearchImpl, ftsClient, store, queue, joexImpl)
+      fulltextImpl <- OFulltext(itemSearchImpl, ftsClient, store, queue, joexImpl)
       javaEmil =
         JavaMailEmil(Settings.defaultSettings.copy(debug = cfg.mailDebug))
-      mailImpl         <- OMail(store, javaEmil)
-      userTaskImpl     <- OUserTask(utStore, queue, joexImpl)
-      folderImpl       <- OFolder(store)
+      mailImpl <- OMail(store, javaEmil)
+      userTaskImpl <- OUserTask(utStore, queue, joexImpl)
+      folderImpl <- OFolder(store)
       customFieldsImpl <- OCustomFields(store)
       simpleSearchImpl = OSimpleSearch(fulltextImpl, itemSearchImpl)
       clientSettingsImpl <- OClientSettings(store)
     } yield new BackendApp[F] {
-      val login          = loginImpl
-      val signup         = signupImpl
-      val collective     = collImpl
-      val source         = sourceImpl
-      val tag            = tagImpl
-      val equipment      = equipImpl
-      val organization   = orgImpl
-      val upload         = uploadImpl
-      val node           = nodeImpl
-      val job            = jobImpl
-      val item           = itemImpl
-      val itemSearch     = itemSearchImpl
-      val fulltext       = fulltextImpl
-      val mail           = mailImpl
-      val joex           = joexImpl
-      val userTask       = userTaskImpl
-      val folder         = folderImpl
-      val customFields   = customFieldsImpl
-      val simpleSearch   = simpleSearchImpl
+      val login = loginImpl
+      val signup = signupImpl
+      val collective = collImpl
+      val source = sourceImpl
+      val tag = tagImpl
+      val equipment = equipImpl
+      val organization = orgImpl
+      val upload = uploadImpl
+      val node = nodeImpl
+      val job = jobImpl
+      val item = itemImpl
+      val itemSearch = itemSearchImpl
+      val fulltext = fulltextImpl
+      val mail = mailImpl
+      val joex = joexImpl
+      val userTask = userTaskImpl
+      val folder = folderImpl
+      val customFields = customFieldsImpl
+      val simpleSearch = simpleSearchImpl
       val clientSettings = clientSettingsImpl
-      val totp           = totpImpl
+      val totp = totpImpl
     }
 
   def apply[F[_]: Async](
@@ -115,9 +115,9 @@ object BackendApp {
       httpClientEc: ExecutionContext
   )(ftsFactory: Client[F] => Resource[F, FtsClient[F]]): Resource[F, BackendApp[F]] =
     for {
-      store      <- Store.create(cfg.jdbc, cfg.files.chunkSize, connectEC)
+      store <- Store.create(cfg.jdbc, cfg.files.chunkSize, connectEC)
       httpClient <- BlazeClientBuilder[F](httpClientEc).resource
-      ftsClient  <- ftsFactory(httpClient)
-      backend    <- create(cfg, store, httpClient, ftsClient)
+      ftsClient <- ftsFactory(httpClient)
+      backend <- create(cfg, store, httpClient, ftsClient)
     } yield backend
 }
diff --git a/modules/backend/src/main/scala/docspell/backend/JobFactory.scala b/modules/backend/src/main/scala/docspell/backend/JobFactory.scala
index 18316202..4f4c4fc5 100644
--- a/modules/backend/src/main/scala/docspell/backend/JobFactory.scala
+++ b/modules/backend/src/main/scala/docspell/backend/JobFactory.scala
@@ -19,7 +19,7 @@ object JobFactory {
       account: Option[AccountId]
   ): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
       job = RJob.newJob(
         id,
@@ -39,7 +39,7 @@ object JobFactory {
       account: Option[AccountId]
   ): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
       job = RJob.newJob(
         id,
@@ -59,7 +59,7 @@ object JobFactory {
       submitter: Option[Ident]
   ): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
     } yield RJob.newJob(
       id,
@@ -79,7 +79,7 @@ object JobFactory {
       prio: Priority
   ): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
       job = RJob.newJob(
         id,
@@ -102,7 +102,7 @@ object JobFactory {
       prio: Priority
   ): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
       job = RJob.newJob(
         id,
@@ -124,7 +124,7 @@ object JobFactory {
       tracker: Option[Ident]
   ): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
       job = RJob.newJob(
         id,
@@ -163,14 +163,14 @@ object JobFactory {
         )
 
     for {
-      now  <- Timestamp.current[F]
+      now <- Timestamp.current[F]
       jobs <- args.traverse(a => create(now, a))
     } yield jobs
   }
 
   def reIndexAll[F[_]: Sync]: F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
     } yield RJob.newJob(
       id,
@@ -186,7 +186,7 @@ object JobFactory {
 
   def reIndex[F[_]: Sync](account: AccountId): F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
       args = ReIndexTaskArgs(Some(account.collective))
     } yield RJob.newJob(
diff --git a/modules/backend/src/main/scala/docspell/backend/auth/AuthToken.scala b/modules/backend/src/main/scala/docspell/backend/auth/AuthToken.scala
index a76960d1..89d6a070 100644
--- a/modules/backend/src/main/scala/docspell/backend/auth/AuthToken.scala
+++ b/modules/backend/src/main/scala/docspell/backend/auth/AuthToken.scala
@@ -53,8 +53,8 @@ object AuthToken {
       case Array(ms, as, fa, salt, sig) =>
         for {
           millis <- TokenUtil.asInt(ms).toRight("Cannot read authenticator data")
-          acc    <- TokenUtil.b64dec(as).toRight("Cannot read authenticator data")
-          accId  <- AccountId.parse(acc)
+          acc <- TokenUtil.b64dec(as).toRight("Cannot read authenticator data")
+          accId <- AccountId.parse(acc)
           twofac <- Right[String, Boolean](java.lang.Boolean.parseBoolean(fa))
         } yield AuthToken(millis, accId, twofac, salt, sig)
 
@@ -70,15 +70,15 @@ object AuthToken {
     for {
       salt <- Common.genSaltString[F]
       millis = Instant.now.toEpochMilli
-      cd     = AuthToken(millis, accountId, requireSecondFactor, salt, "")
-      sig    = TokenUtil.sign(cd, key)
+      cd = AuthToken(millis, accountId, requireSecondFactor, salt, "")
+      sig = TokenUtil.sign(cd, key)
     } yield cd.copy(sig = sig)
 
   def update[F[_]: Sync](token: AuthToken, key: ByteVector): F[AuthToken] =
     for {
-      now  <- Timestamp.current[F]
+      now <- Timestamp.current[F]
       salt <- Common.genSaltString[F]
       data = AuthToken(now.toMillis, token.account, token.requireSecondFactor, salt, "")
-      sig  = TokenUtil.sign(data, key)
+      sig = TokenUtil.sign(data, key)
     } yield data.copy(sig = sig)
 }
diff --git a/modules/backend/src/main/scala/docspell/backend/auth/Login.scala b/modules/backend/src/main/scala/docspell/backend/auth/Login.scala
index 1e20038b..09e71ebd 100644
--- a/modules/backend/src/main/scala/docspell/backend/auth/Login.scala
+++ b/modules/backend/src/main/scala/docspell/backend/auth/Login.scala
@@ -85,8 +85,8 @@ object Login {
 
     def ok(session: AuthToken, remember: Option[RememberToken]): Result =
       Ok(session, remember)
-    def invalidAuth: Result   = InvalidAuth
-    def invalidTime: Result   = InvalidTime
+    def invalidAuth: Result = InvalidAuth
+    def invalidTime: Result = InvalidTime
     def invalidFactor: Result = InvalidFactor
   }
 
@@ -98,7 +98,7 @@ object Login {
       def loginExternal(config: Config)(accountId: AccountId): F[Result] =
         for {
           data <- store.transact(QLogin.findUser(accountId))
-          _    <- logF.trace(s"Account lookup: $data")
+          _ <- logF.trace(s"Account lookup: $data")
           res <-
             if (data.exists(checkNoPassword(_, Set(AccountSource.OpenId))))
               doLogin(config, accountId, false)
@@ -124,7 +124,7 @@ object Login {
           case Right(acc) =>
             for {
               data <- store.transact(QLogin.findUser(acc))
-              _    <- Sync[F].delay(logger.trace(s"Account lookup: $data"))
+              _ <- Sync[F].delay(logger.trace(s"Account lookup: $data"))
               res <-
                 if (data.exists(check(up.pass))) doLogin(config, acc, up.rememberMe)
                 else Result.invalidAuth.pure[F]
@@ -137,7 +137,7 @@ object Login {
       def loginSecondFactor(config: Config)(sf: SecondFactor): F[Result] = {
         val okResult: F[Result] =
           for {
-            _        <- store.transact(RUser.updateLogin(sf.token.account))
+            _ <- store.transact(RUser.updateLogin(sf.token.account))
             newToken <- AuthToken.user(sf.token.account, false, config.serverSecret)
             rem <- OptionT
               .whenF(sf.rememberMe && config.rememberMe.enabled)(
@@ -180,7 +180,7 @@ object Login {
       def loginRememberMe(config: Config)(token: String): F[Result] = {
         def okResult(acc: AccountId) =
           for {
-            _     <- store.transact(RUser.updateLogin(acc))
+            _ <- store.transact(RUser.updateLogin(acc))
             token <- AuthToken.user(acc, false, config.serverSecret)
           } yield Result.ok(token, None)
 
@@ -270,8 +270,8 @@ object Login {
           config: Config
       ): F[RememberToken] =
         for {
-          rme   <- RRememberMe.generate[F](acc)
-          _     <- store.transact(RRememberMe.insert(rme))
+          rme <- RRememberMe.generate[F](acc)
+          _ <- store.transact(RRememberMe.insert(rme))
           token <- RememberToken.user(rme.id, config.serverSecret)
         } yield token
 
diff --git a/modules/backend/src/main/scala/docspell/backend/auth/RememberToken.scala b/modules/backend/src/main/scala/docspell/backend/auth/RememberToken.scala
index 12e662c5..b1bb1ee6 100644
--- a/modules/backend/src/main/scala/docspell/backend/auth/RememberToken.scala
+++ b/modules/backend/src/main/scala/docspell/backend/auth/RememberToken.scala
@@ -45,8 +45,8 @@ object RememberToken {
       case Array(ms, as, salt, sig) =>
         for {
           millis <- TokenUtil.asInt(ms).toRight("Cannot read authenticator data")
-          rId    <- TokenUtil.b64dec(as).toRight("Cannot read authenticator data")
-          accId  <- Ident.fromString(rId)
+          rId <- TokenUtil.b64dec(as).toRight("Cannot read authenticator data")
+          accId <- Ident.fromString(rId)
         } yield RememberToken(millis, accId, salt, sig)
 
       case _ =>
@@ -57,8 +57,8 @@ object RememberToken {
     for {
       salt <- Common.genSaltString[F]
       millis = Instant.now.toEpochMilli
-      cd     = RememberToken(millis, rememberId, salt, "")
-      sig    = TokenUtil.sign(cd, key)
+      cd = RememberToken(millis, rememberId, salt, "")
+      sig = TokenUtil.sign(cd, key)
     } yield cd.copy(sig = sig)
 
 }
diff --git a/modules/backend/src/main/scala/docspell/backend/item/Merge.scala b/modules/backend/src/main/scala/docspell/backend/item/Merge.scala
index 7ae272db..9d9cbb8a 100644
--- a/modules/backend/src/main/scala/docspell/backend/item/Merge.scala
+++ b/modules/backend/src/main/scala/docspell/backend/item/Merge.scala
@@ -43,7 +43,7 @@ object Merge {
       def merge(givenIds: NonEmptyList[Ident], collective: Ident): F[Result[RItem]] =
         (for {
           items <- loadItems(givenIds, collective)
-          ids    = items.map(_.id)
+          ids = items.map(_.id)
           target = moveMainData(items)
           _ <- EitherT.right[Error](store.transact(RItem.updateAll(target)))
           _ <- EitherT.right[Error](moveTags(ids))
@@ -101,7 +101,7 @@ object Merge {
       def moveCustomFields(items: NonEmptyList[Ident]): F[Unit] =
         for {
           values <- store.transact(QCustomField.findAllValues(items))
-          byField   = values.groupBy(_.field.name)
+          byField = values.groupBy(_.field.name)
           newValues = mergeFields(items.head, byField)
           _ <- newValues.traverse(fv =>
             store.transact(RCustomField.setValue(fv.field, items.head, fv.value))
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OClientSettings.scala b/modules/backend/src/main/scala/docspell/backend/ops/OClientSettings.scala
index 51f63f61..a7e71cbe 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OClientSettings.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OClientSettings.scala
@@ -77,7 +77,7 @@ object OClientSettings {
             )
           )
           userId <- getUserId(account)
-          data   <- OptionT(store.transact(RClientSettings.find(clientId, userId)))
+          data <- OptionT(store.transact(RClientSettings.find(clientId, userId)))
         } yield data).value
 
     })
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala b/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala
index 7fe948cf..1b2825fe 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OCollective.scala
@@ -101,27 +101,27 @@ object OCollective {
   sealed trait PassResetResult
   object PassResetResult {
     case class Success(newPw: Password) extends PassResetResult
-    case object NotFound                extends PassResetResult
-    case object UserNotLocal            extends PassResetResult
+    case object NotFound extends PassResetResult
+    case object UserNotLocal extends PassResetResult
 
     def success(np: Password): PassResetResult = Success(np)
-    def notFound: PassResetResult              = NotFound
-    def userNotLocal: PassResetResult          = UserNotLocal
+    def notFound: PassResetResult = NotFound
+    def userNotLocal: PassResetResult = UserNotLocal
   }
 
   sealed trait PassChangeResult
   object PassChangeResult {
-    case object UserNotFound     extends PassChangeResult
+    case object UserNotFound extends PassChangeResult
     case object PasswordMismatch extends PassChangeResult
-    case object UpdateFailed     extends PassChangeResult
-    case object UserNotLocal     extends PassChangeResult
-    case object Success          extends PassChangeResult
+    case object UpdateFailed extends PassChangeResult
+    case object UserNotLocal extends PassChangeResult
+    case object Success extends PassChangeResult
 
-    def userNotFound: PassChangeResult     = UserNotFound
+    def userNotFound: PassChangeResult = UserNotFound
     def passwordMismatch: PassChangeResult = PasswordMismatch
-    def success: PassChangeResult          = Success
-    def updateFailed: PassChangeResult     = UpdateFailed
-    def userNotLocal: PassChangeResult     = UserNotLocal
+    def success: PassChangeResult = Success
+    def updateFailed: PassChangeResult = UpdateFailed
+    def userNotLocal: PassChangeResult = UserNotLocal
   }
 
   def apply[F[_]: Async](
@@ -149,9 +149,9 @@ object OCollective {
       private def updateLearnClassifierTask(coll: Ident, sett: Settings): F[Unit] =
         for {
           id <- Ident.randomId[F]
-          on    = sett.classifier.map(_.enabled).getOrElse(false)
+          on = sett.classifier.map(_.enabled).getOrElse(false)
           timer = sett.classifier.map(_.schedule).getOrElse(CalEvent.unsafe(""))
-          args  = LearnClassifierArgs(coll)
+          args = LearnClassifierArgs(coll)
           ut = UserTask(
             id,
             LearnClassifierArgs.taskName,
@@ -168,7 +168,7 @@ object OCollective {
         for {
           id <- Ident.randomId[F]
           settings = sett.emptyTrash.getOrElse(EmptyTrash.default)
-          args     = EmptyTrashArgs(coll, settings.minAge)
+          args = EmptyTrashArgs(coll, settings.minAge)
           ut = UserTask(id, EmptyTrashArgs.taskName, true, settings.schedule, None, args)
           _ <- uts.updateOneTask(UserTaskScope(coll), args.makeSubject.some, ut)
           _ <- joex.notifyAllNodes
@@ -187,8 +187,8 @@ object OCollective {
             args
           ).encode.toPeriodicTask(UserTaskScope(collective), args.makeSubject.some)
           job <- ut.toJob
-          _   <- queue.insert(job)
-          _   <- joex.notifyAllNodes
+          _ <- queue.insert(job)
+          _ <- joex.notifyAllNodes
         } yield ()
 
       def startEmptyTrash(args: EmptyTrashArgs): F[Unit] =
@@ -203,8 +203,8 @@ object OCollective {
             args
           ).encode.toPeriodicTask(UserTaskScope(args.collective), args.makeSubject.some)
           job <- ut.toJob
-          _   <- queue.insert(job)
-          _   <- joex.notifyAllNodes
+          _ <- queue.insert(job)
+          _ <- joex.notifyAllNodes
         } yield ()
 
       def findSettings(collective: Ident): F[Option[OCollective.Settings]] =
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala b/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala
index da5089a2..36d89fa0 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OCustomFields.scala
@@ -88,15 +88,15 @@ object OCustomFields {
   sealed trait SetValueResult
   object SetValueResult {
 
-    case object ItemNotFound             extends SetValueResult
-    case object FieldNotFound            extends SetValueResult
+    case object ItemNotFound extends SetValueResult
+    case object FieldNotFound extends SetValueResult
     case class ValueInvalid(msg: String) extends SetValueResult
-    case object Success                  extends SetValueResult
+    case object Success extends SetValueResult
 
-    def itemNotFound: SetValueResult              = ItemNotFound
-    def fieldNotFound: SetValueResult             = FieldNotFound
+    def itemNotFound: SetValueResult = ItemNotFound
+    def fieldNotFound: SetValueResult = FieldNotFound
     def valueInvalid(msg: String): SetValueResult = ValueInvalid(msg)
-    def success: SetValueResult                   = Success
+    def success: SetValueResult = Success
   }
 
   case class RemoveValue(
@@ -109,12 +109,12 @@ object OCustomFields {
   object CustomFieldOrder {
     import docspell.store.qb.DSL._
 
-    final case object NameAsc   extends CustomFieldOrder
-    final case object NameDesc  extends CustomFieldOrder
-    final case object LabelAsc  extends CustomFieldOrder
+    final case object NameAsc extends CustomFieldOrder
+    final case object NameDesc extends CustomFieldOrder
+    final case object LabelAsc extends CustomFieldOrder
     final case object LabelDesc extends CustomFieldOrder
-    final case object TypeAsc   extends CustomFieldOrder
-    final case object TypeDesc  extends CustomFieldOrder
+    final case object TypeAsc extends CustomFieldOrder
+    final case object TypeDesc extends CustomFieldOrder
 
     def parse(str: String): Either[String, CustomFieldOrder] =
       str.toLowerCase match {
@@ -172,7 +172,7 @@ object OCustomFields {
       def create(field: NewCustomField): F[AddResult] = {
         val exists = RCustomField.exists(field.name, field.cid)
         val insert = for {
-          id  <- Ident.randomId[ConnectionIO]
+          id <- Ident.randomId[ConnectionIO]
           now <- Timestamp.current[ConnectionIO]
           rec = RCustomField(id, field.name, field.label, field.cid, field.ftype, now)
           n <- RCustomField.insert(rec)
@@ -188,9 +188,9 @@ object OCustomFields {
         val update =
           for {
             field <- OptionT(RCustomField.findByIdOrName(fieldIdOrName, coll))
-            _     <- OptionT.liftF(logger.info(s"Deleting field: $field"))
-            n     <- OptionT.liftF(RCustomFieldValue.deleteByField(field.id))
-            k     <- OptionT.liftF(RCustomField.deleteById(field.id, coll))
+            _ <- OptionT.liftF(logger.info(s"Deleting field: $field"))
+            n <- OptionT.liftF(RCustomFieldValue.deleteByField(field.id))
+            k <- OptionT.liftF(RCustomField.deleteById(field.id, coll))
           } yield n + k
 
         UpdateResult.fromUpdate(store.transact(update.getOrElse(0)))
@@ -230,8 +230,8 @@ object OCustomFields {
         val update =
           for {
             field <- OptionT(RCustomField.findByIdOrName(in.field, in.collective))
-            _     <- OptionT.liftF(logger.debug(s"Field found by '${in.field}': $field"))
-            n     <- OptionT.liftF(RCustomFieldValue.deleteValue(field.id, in.item))
+            _ <- OptionT.liftF(logger.debug(s"Field found by '${in.field}': $field"))
+            n <- OptionT.liftF(RCustomFieldValue.deleteValue(field.id, in.item))
           } yield n
 
         UpdateResult.fromUpdate(store.transact(update.getOrElse(0)))
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala b/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala
index d6e14972..da0586f5 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OEquipment.scala
@@ -36,7 +36,7 @@ object OEquipment {
 
   sealed trait EquipmentOrder
   object EquipmentOrder {
-    final case object NameAsc  extends EquipmentOrder
+    final case object NameAsc extends EquipmentOrder
     final case object NameDesc extends EquipmentOrder
 
     def parse(str: String): Either[String, EquipmentOrder] =
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OFolder.scala b/modules/backend/src/main/scala/docspell/backend/ops/OFolder.scala
index cc2f8353..cec3f431 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OFolder.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OFolder.scala
@@ -65,9 +65,9 @@ object OFolder {
 
   sealed trait FolderOrder
   object FolderOrder {
-    final case object NameAsc   extends FolderOrder
-    final case object NameDesc  extends FolderOrder
-    final case object OwnerAsc  extends FolderOrder
+    final case object NameAsc extends FolderOrder
+    final case object NameDesc extends FolderOrder
+    final case object OwnerAsc extends FolderOrder
     final case object OwnerDesc extends FolderOrder
 
     def parse(str: String): Either[String, FolderOrder] =
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OFulltext.scala b/modules/backend/src/main/scala/docspell/backend/ops/OFulltext.scala
index bef9a0f1..4cdcd0dd 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OFulltext.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OFulltext.scala
@@ -49,8 +49,7 @@ trait OFulltext[F[_]] {
   def findIndexOnlySummary(account: AccountId, fts: OFulltext.FtsInput): F[SearchSummary]
   def findItemsSummary(q: Query, fts: OFulltext.FtsInput): F[SearchSummary]
 
-  /** Clears the full-text index completely and launches a task that indexes all data.
-    */
+  /** Clears the full-text index completely and launches a task that indexes all data. */
   def reindexAll: F[Unit]
 
   /** Clears the full-text index for the given collective and starts a task indexing all
@@ -92,9 +91,9 @@ object OFulltext {
     Resource.pure[F, OFulltext[F]](new OFulltext[F] {
       def reindexAll: F[Unit] =
         for {
-          _   <- logger.finfo(s"Re-index all.")
+          _ <- logger.finfo(s"Re-index all.")
           job <- JobFactory.reIndexAll[F]
-          _   <- queue.insertIfNew(job) *> joex.notifyAllNodes
+          _ <- queue.insertIfNew(job) *> joex.notifyAllNodes
         } yield ()
 
       def reindexCollective(account: AccountId): F[Unit] =
@@ -124,9 +123,9 @@ object OFulltext {
           FtsQuery.HighlightSetting(ftsQ.highlightPre, ftsQ.highlightPost)
         )
         for {
-          _       <- logger.ftrace(s"Find index only: ${ftsQ.query}/$batch")
+          _ <- logger.ftrace(s"Find index only: ${ftsQ.query}/$batch")
           folders <- store.transact(QFolder.getMemberFolders(account))
-          ftsR    <- fts.search(fq.withFolders(folders))
+          ftsR <- fts.search(fq.withFolders(folders))
           ftsItems = ftsR.results.groupBy(_.itemId)
           select =
             ftsItems.values
@@ -173,7 +172,7 @@ object OFulltext {
 
         for {
           folder <- store.transact(QFolder.getMemberFolders(account))
-          now    <- Timestamp.current[F]
+          now <- Timestamp.current[F]
           itemIds <- fts
             .searchAll(fq.withFolders(folder))
             .flatMap(r => Stream.emits(r.results.map(_.itemId)))
@@ -290,7 +289,7 @@ object OFulltext {
         val qres =
           for {
             items <- sqlResult
-            ids    = items.map(a => ItemId[A].itemId(a))
+            ids = items.map(a => ItemId[A].itemId(a))
             idsNel = NonEmptyList.fromFoldable(ids)
             // must find all index results involving the items.
             // Currently there is one result per item + one result per
@@ -301,7 +300,7 @@ object OFulltext {
             ftsQ = fq.copy(items = ids.toSet, limit = limit)
             ftsR <- fts.search(ftsQ)
             ftsItems = ftsR.results.groupBy(_.itemId)
-            res      = items.collect(convert(ftsR, ftsItems))
+            res = items.collect(convert(ftsR, ftsItems))
           } yield (items.size, res)
 
         Stream.eval(qres) ++ findItemsFts0(q, ftsQ, batch.next, search, convert)
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala
index bda0d75d..a45427fc 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala
@@ -188,23 +188,20 @@ trait OItem[F[_]] {
       notifyJoex: Boolean
   ): F[UpdateResult]
 
-  /** Submits a task that (re)generates the preview image for an attachment.
-    */
+  /** Submits a task that (re)generates the preview image for an attachment. */
   def generatePreview(
       args: MakePreviewArgs,
       account: AccountId,
       notifyJoex: Boolean
   ): F[UpdateResult]
 
-  /** Submits a task that (re)generates the preview images for all attachments.
-    */
+  /** Submits a task that (re)generates the preview images for all attachments. */
   def generateAllPreviews(
       storeMode: MakePreviewArgs.StoreMode,
       notifyJoex: Boolean
   ): F[UpdateResult]
 
-  /** Merges a list of items into one item. The remaining items are deleted.
-    */
+  /** Merges a list of items into one item. The remaining items are deleted. */
   def merge(
       logger: Logger[F],
       items: NonEmptyList[Ident],
@@ -222,8 +219,8 @@ object OItem {
       joex: OJoex[F]
   ): Resource[F, OItem[F]] =
     for {
-      otag   <- OTag(store)
-      oorg   <- OOrganization(store)
+      otag <- OTag(store)
+      oorg <- OOrganization(store)
       oequip <- OEquipment(store)
       logger <- Resource.pure[F, Logger[F]](Logger.log4s(getLogger))
       oitem <- Resource.pure[F, OItem[F]](new OItem[F] {
@@ -312,11 +309,11 @@ object OItem {
             case kws =>
               val db =
                 (for {
-                  _     <- OptionT(RItem.checkByIdAndCollective(item, collective))
+                  _ <- OptionT(RItem.checkByIdAndCollective(item, collective))
                   given <- OptionT.liftF(RTag.findAllByNameOrId(kws, collective))
                   exist <- OptionT.liftF(RTagItem.findAllIn(item, given.map(_.tagId)))
                   remove = given.map(_.tagId).toSet.intersect(exist.map(_.tagId).toSet)
-                  toadd  = given.map(_.tagId).diff(exist.map(_.tagId))
+                  toadd = given.map(_.tagId).diff(exist.map(_.tagId))
                   _ <- OptionT.liftF(RTagItem.setAllTags(item, toadd))
                   _ <- OptionT.liftF(RTagItem.removeAllTags(item, remove.toSeq))
                 } yield UpdateResult.success).getOrElse(UpdateResult.notFound)
@@ -337,9 +334,9 @@ object OItem {
             collective: Ident
         ): F[UpdateResult] =
           UpdateResult.fromUpdate(store.transact(for {
-            k     <- RTagItem.deleteItemTags(items, collective)
+            k <- RTagItem.deleteItemTags(items, collective)
             rtags <- RTag.findAllByNameOrId(tags, collective)
-            res   <- items.traverse(i => RTagItem.setAllTags(i, rtags.map(_.tagId)))
+            res <- items.traverse(i => RTagItem.setAllTags(i, rtags.map(_.tagId)))
             n = res.fold
           } yield k + n))
 
@@ -733,8 +730,8 @@ object OItem {
         ): F[UpdateResult] =
           for {
             job <- JobFactory.convertAllPdfs[F](collective, submitter, Priority.Low)
-            _   <- queue.insertIfNew(job)
-            _   <- if (notifyJoex) joex.notifyAllNodes else ().pure[F]
+            _ <- queue.insertIfNew(job)
+            _ <- if (notifyJoex) joex.notifyAllNodes else ().pure[F]
           } yield UpdateResult.success
 
         def generatePreview(
@@ -744,8 +741,8 @@ object OItem {
         ): F[UpdateResult] =
           for {
             job <- JobFactory.makePreview[F](args, account.some)
-            _   <- queue.insertIfNew(job)
-            _   <- if (notifyJoex) joex.notifyAllNodes else ().pure[F]
+            _ <- queue.insertIfNew(job)
+            _ <- if (notifyJoex) joex.notifyAllNodes else ().pure[F]
           } yield UpdateResult.success
 
         def generateAllPreviews(
@@ -754,8 +751,8 @@ object OItem {
         ): F[UpdateResult] =
           for {
             job <- JobFactory.allPreviews[F](AllPreviewsArgs(None, storeMode), None)
-            _   <- queue.insertIfNew(job)
-            _   <- if (notifyJoex) joex.notifyAllNodes else ().pure[F]
+            _ <- queue.insertIfNew(job)
+            _ <- if (notifyJoex) joex.notifyAllNodes else ().pure[F]
           } yield UpdateResult.success
 
         private def onSuccessIgnoreError(update: F[Unit])(ar: UpdateResult): F[Unit] =
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OItemSearch.scala b/modules/backend/src/main/scala/docspell/backend/ops/OItemSearch.scala
index 24342072..56e417e5 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OItemSearch.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OItemSearch.scala
@@ -94,7 +94,7 @@ object OItemSearch {
   }
   case class AttachmentData[F[_]](ra: RAttachment, meta: RFileMeta, data: Stream[F, Byte])
       extends BinaryData[F] {
-    val name   = ra.name
+    val name = ra.name
     val fileId = ra.fileId
   }
 
@@ -103,7 +103,7 @@ object OItemSearch {
       meta: RFileMeta,
       data: Stream[F, Byte]
   ) extends BinaryData[F] {
-    val name   = rs.name
+    val name = rs.name
     val fileId = rs.fileId
   }
 
@@ -112,7 +112,7 @@ object OItemSearch {
       meta: RFileMeta,
       data: Stream[F, Byte]
   ) extends BinaryData[F] {
-    val name   = rs.name
+    val name = rs.name
     val fileId = rs.fileId
   }
 
@@ -121,7 +121,7 @@ object OItemSearch {
       meta: RFileMeta,
       data: Stream[F, Byte]
   ) extends BinaryData[F] {
-    val name   = rs.name
+    val name = rs.name
     val fileId = rs.fileId
   }
 
@@ -290,7 +290,7 @@ object OItemSearch {
 
       def findByFileSource(checksum: String, sourceId: Ident): F[Option[Vector[RItem]]] =
         store.transact((for {
-          coll  <- OptionT(RSource.findCollective(sourceId))
+          coll <- OptionT(RSource.findCollective(sourceId))
           items <- OptionT.liftF(QItem.findByChecksum(checksum, coll, Set.empty))
         } yield items).value)
 
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala b/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala
index fb9a51ec..4ab45fb4 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OJob.scala
@@ -31,13 +31,13 @@ object OJob {
 
   sealed trait JobCancelResult
   object JobCancelResult {
-    case object Removed         extends JobCancelResult
+    case object Removed extends JobCancelResult
     case object CancelRequested extends JobCancelResult
-    case object JobNotFound     extends JobCancelResult
+    case object JobNotFound extends JobCancelResult
 
-    def removed: JobCancelResult         = Removed
+    def removed: JobCancelResult = Removed
     def cancelRequested: JobCancelResult = CancelRequested
-    def jobNotFound: JobCancelResult     = JobNotFound
+    def jobNotFound: JobCancelResult = JobNotFound
   }
 
   case class JobDetail(job: RJob, logs: Vector[RJobLog])
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OJoex.scala b/modules/backend/src/main/scala/docspell/backend/ops/OJoex.scala
index 07797c35..fb35267c 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OJoex.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OJoex.scala
@@ -32,12 +32,12 @@ object OJoex {
       def notifyAllNodes: F[Unit] =
         for {
           nodes <- store.transact(RNode.findAll(NodeType.Joex))
-          _     <- nodes.toList.traverse(n => client.notifyJoexIgnoreErrors(n.url))
+          _ <- nodes.toList.traverse(n => client.notifyJoexIgnoreErrors(n.url))
         } yield ()
 
       def cancelJob(job: Ident, worker: Ident): F[Boolean] =
         (for {
-          node   <- OptionT(store.transact(RNode.findById(worker)))
+          node <- OptionT(store.transact(RNode.findById(worker)))
           cancel <- OptionT.liftF(client.cancelJob(node.url, job))
         } yield cancel.success).getOrElse(false)
     })
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala b/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala
index c4426469..8d9debfe 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OMail.scala
@@ -162,7 +162,7 @@ object OMail {
       def createSmtpSettings(accId: AccountId, s: SmtpSettings): F[AddResult] =
         (for {
           ru <- OptionT(store.transact(s.toRecord(accId).value))
-          ins    = RUserEmail.insert(ru)
+          ins = RUserEmail.insert(ru)
           exists = RUserEmail.exists(ru.uid, ru.name)
           res <- OptionT.liftF(store.add(ins, exists))
         } yield res).getOrElse(AddResult.Failure(new Exception("User not found")))
@@ -175,7 +175,7 @@ object OMail {
         val op = for {
           um <- OptionT(RUserEmail.getByName(accId, name))
           ru <- data.toRecord(accId)
-          n  <- OptionT.liftF(RUserEmail.update(um.id, ru))
+          n <- OptionT.liftF(RUserEmail.update(um.id, ru))
         } yield n
 
         store.transact(op.value).map(_.getOrElse(0))
@@ -193,7 +193,7 @@ object OMail {
       def createImapSettings(accId: AccountId, data: ImapSettings): F[AddResult] =
         (for {
           ru <- OptionT(store.transact(data.toRecord(accId).value))
-          ins    = RUserImap.insert(ru)
+          ins = RUserImap.insert(ru)
           exists = RUserImap.exists(ru.uid, ru.name)
           res <- OptionT.liftF(store.add(ins, exists))
         } yield res).getOrElse(AddResult.Failure(new Exception("User not found")))
@@ -206,7 +206,7 @@ object OMail {
         val op = for {
           um <- OptionT(RUserImap.getByName(accId, name))
           ru <- data.toRecord(accId)
-          n  <- OptionT.liftF(RUserImap.update(um.id, ru))
+          n <- OptionT.liftF(RUserImap.update(um.id, ru))
         } yield n
 
         store.transact(op.value).map(_.getOrElse(0))
@@ -284,9 +284,9 @@ object OMail {
 
         (for {
           mailCfg <- getSmtpSettings
-          mail    <- createMail(mailCfg)
-          mid     <- OptionT.liftF(sendMail(mailCfg.toMailConfig, mail))
-          res     <- mid.traverse(id => OptionT.liftF(storeMail(id, mailCfg)))
+          mail <- createMail(mailCfg)
+          mid <- OptionT.liftF(sendMail(mailCfg.toMailConfig, mail))
+          res <- mid.traverse(id => OptionT.liftF(storeMail(id, mailCfg)))
           conv = res.fold(identity, _.fold(identity, id => SendResult.Success(id)))
         } yield conv).getOrElse(SendResult.NotFound)
       }
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/ONode.scala b/modules/backend/src/main/scala/docspell/backend/ops/ONode.scala
index 23ed2348..b8e89ee2 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/ONode.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/ONode.scala
@@ -32,8 +32,8 @@ object ONode {
       def register(appId: Ident, nodeType: NodeType, uri: LenientUri): F[Unit] =
         for {
           node <- RNode(appId, nodeType, uri)
-          _    <- logger.finfo(s"Registering node ${node.id.id}")
-          _    <- store.transact(RNode.set(node))
+          _ <- logger.finfo(s"Registering node ${node.id.id}")
+          _ <- store.transact(RNode.set(node))
         } yield ()
 
       def unregister(appId: Ident): F[Unit] =
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala b/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala
index cbc4ed35..e2262161 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OOrganization.scala
@@ -72,7 +72,7 @@ object OOrganization {
 
   sealed trait OrganizationOrder
   object OrganizationOrder {
-    final case object NameAsc  extends OrganizationOrder
+    final case object NameAsc extends OrganizationOrder
     final case object NameDesc extends OrganizationOrder
 
     def parse(str: String): Either[String, OrganizationOrder] =
@@ -94,10 +94,10 @@ object OOrganization {
 
   sealed trait PersonOrder
   object PersonOrder {
-    final case object NameAsc  extends PersonOrder
+    final case object NameAsc extends PersonOrder
     final case object NameDesc extends PersonOrder
-    final case object OrgAsc   extends PersonOrder
-    final case object OrgDesc  extends PersonOrder
+    final case object OrgAsc extends PersonOrder
+    final case object OrgDesc extends PersonOrder
 
     def parse(str: String): Either[String, PersonOrder] =
       str.toLowerCase match {
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OSimpleSearch.scala b/modules/backend/src/main/scala/docspell/backend/ops/OSimpleSearch.scala
index 68ccaac4..60502813 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OSimpleSearch.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OSimpleSearch.scala
@@ -48,8 +48,7 @@ trait OSimpleSearch[F[_]] {
   ): F[StringSearchResult[Items]] =
     OSimpleSearch.applySearch[F, Items](fix, q)((iq, fts) => search(settings)(iq, fts))
 
-  /** Same as `searchByString` but returning a summary instead of the results.
-    */
+  /** Same as `searchByString` but returning a summary instead of the results. */
   final def searchSummaryByString(
       settings: StatsSettings
   )(fix: Query.Fix, q: ItemQueryString)(implicit
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala b/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala
index daa2cea1..07632c9b 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OTag.scala
@@ -29,8 +29,7 @@ trait OTag[F[_]] {
 
   def delete(id: Ident, collective: Ident): F[AddResult]
 
-  /** Load all tags given their ids. Ids that are not available are ignored.
-    */
+  /** Load all tags given their ids. Ids that are not available are ignored. */
   def loadAll(ids: List[Ident]): F[Vector[RTag]]
 }
 
@@ -39,9 +38,9 @@ object OTag {
 
   sealed trait TagOrder
   object TagOrder {
-    final case object NameAsc      extends TagOrder
-    final case object NameDesc     extends TagOrder
-    final case object CategoryAsc  extends TagOrder
+    final case object NameAsc extends TagOrder
+    final case object NameDesc extends TagOrder
+    final case object CategoryAsc extends TagOrder
     final case object CategoryDesc extends TagOrder
 
     def parse(str: String): Either[String, TagOrder] =
@@ -92,9 +91,9 @@ object OTag {
       def delete(id: Ident, collective: Ident): F[AddResult] = {
         val io = for {
           optTag <- RTag.findByIdAndCollective(id, collective)
-          n0     <- optTag.traverse(t => RTagItem.deleteTag(t.tagId))
-          n1     <- optTag.traverse(t => RTagSource.deleteTag(t.tagId))
-          n2     <- optTag.traverse(t => RTag.delete(t.tagId, collective))
+          n0 <- optTag.traverse(t => RTagItem.deleteTag(t.tagId))
+          n1 <- optTag.traverse(t => RTagSource.deleteTag(t.tagId))
+          n2 <- optTag.traverse(t => RTag.delete(t.tagId, collective))
         } yield (n0 |+| n1 |+| n2).getOrElse(0)
         store.transact(io).attempt.map(AddResult.fromUpdate)
       }
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OTotp.scala b/modules/backend/src/main/scala/docspell/backend/ops/OTotp.scala
index 8e01aec7..e0842b94 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OTotp.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OTotp.scala
@@ -56,8 +56,8 @@ object OTotp {
           s"otpauth://totp/$issuer:${accountId.asString}?secret=${key.data.toBase32}&issuer=$issuer"
         )
     }
-    case object AlreadyExists              extends InitResult
-    case object NotFound                   extends InitResult
+    case object AlreadyExists extends InitResult
+    case object NotFound extends InitResult
     final case class Failed(ex: Throwable) extends InitResult
 
     def success(accountId: AccountId, key: Key): InitResult =
@@ -71,7 +71,7 @@ object OTotp {
   sealed trait ConfirmResult
   object ConfirmResult {
     case object Success extends ConfirmResult
-    case object Failed  extends ConfirmResult
+    case object Failed extends ConfirmResult
   }
 
   def apply[F[_]: Async](store: Store[F], totp: Totp): Resource[F, OTotp[F]] =
@@ -80,13 +80,13 @@ object OTotp {
 
       def initialize(accountId: AccountId): F[InitResult] =
         for {
-          _      <- log.info(s"Initializing TOTP for account ${accountId.asString}")
+          _ <- log.info(s"Initializing TOTP for account ${accountId.asString}")
           userId <- store.transact(RUser.findIdByAccount(accountId))
           result <- userId match {
             case Some(uid) =>
               for {
                 record <- RTotp.generate[F](uid, totp.settings.mac)
-                un     <- store.transact(RTotp.updateDisabled(record))
+                un <- store.transact(RTotp.updateDisabled(record))
                 an <-
                   if (un != 0)
                     AddResult.entityExists("Entity exists, but update was ok").pure[F]
@@ -117,7 +117,7 @@ object OTotp {
 
       def confirmInit(accountId: AccountId, otp: OnetimePassword): F[ConfirmResult] =
         for {
-          _   <- log.info(s"Confirm TOTP setup for account ${accountId.asString}")
+          _ <- log.info(s"Confirm TOTP setup for account ${accountId.asString}")
           key <- store.transact(RTotp.findEnabledByLogin(accountId, false))
           now <- Timestamp.current[F]
           res <- key match {
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
index d78adc73..ddc64bb9 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala
@@ -102,8 +102,7 @@ object OUpload {
 
     def noSource: UploadResult = NoSource
 
-    /** When adding files to an item, no item was found using the given item-id.
-      */
+    /** When adding files to an item, no item was found using the given item-id. */
     case object NoItem extends UploadResult
 
     def noItem: UploadResult = NoItem
@@ -126,9 +125,9 @@ object OUpload {
           itemId: Option[Ident]
       ): F[OUpload.UploadResult] =
         (for {
-          _     <- checkExistingItem(itemId, account.collective)
+          _ <- checkExistingItem(itemId, account.collective)
           files <- right(data.files.traverse(saveFile).map(_.flatten))
-          _     <- checkFileList(files)
+          _ <- checkFileList(files)
           lang <- data.meta.language match {
             case Some(lang) => right(lang.pure[F])
             case None =>
@@ -156,8 +155,8 @@ object OUpload {
             if (data.multiple) files.map(f => ProcessItemArgs(meta, List(f)))
             else Vector(ProcessItemArgs(meta, files.toList))
           jobs <- right(makeJobs(args, account, data.priority, data.tracker))
-          _    <- right(logger.fdebug(s"Storing jobs: $jobs"))
-          res  <- right(submitJobs(notifyJoex)(jobs))
+          _ <- right(logger.fdebug(s"Storing jobs: $jobs"))
+          res <- right(submitJobs(notifyJoex)(jobs))
           _ <- right(
             store.transact(
               RSource.incrementCounter(data.meta.sourceAbbrev, account.collective)
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OUserTask.scala b/modules/backend/src/main/scala/docspell/backend/ops/OUserTask.scala
index 488f98d8..2e44b0f5 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/OUserTask.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/OUserTask.scala
@@ -19,8 +19,7 @@ import io.circe.Encoder
 
 trait OUserTask[F[_]] {
 
-  /** Return the settings for all scan-mailbox tasks of the current user.
-    */
+  /** Return the settings for all scan-mailbox tasks of the current user. */
   def getScanMailbox(scope: UserTaskScope): Stream[F, UserTask[ScanMailboxArgs]]
 
   /** Find a scan-mailbox task by the given id. */
@@ -29,16 +28,14 @@ trait OUserTask[F[_]] {
       scope: UserTaskScope
   ): OptionT[F, UserTask[ScanMailboxArgs]]
 
-  /** Updates the scan-mailbox tasks and notifies the joex nodes.
-    */
+  /** Updates the scan-mailbox tasks and notifies the joex nodes. */
   def submitScanMailbox(
       scope: UserTaskScope,
       subject: Option[String],
       task: UserTask[ScanMailboxArgs]
   ): F[Unit]
 
-  /** Return the settings for all the notify-due-items task of the current user.
-    */
+  /** Return the settings for all the notify-due-items task of the current user. */
   def getNotifyDueItems(scope: UserTaskScope): Stream[F, UserTask[NotifyDueItemsArgs]]
 
   /** Find a notify-due-items task by the given id. */
@@ -47,8 +44,7 @@ trait OUserTask[F[_]] {
       scope: UserTaskScope
   ): OptionT[F, UserTask[NotifyDueItemsArgs]]
 
-  /** Updates the notify-due-items tasks and notifies the joex nodes.
-    */
+  /** Updates the notify-due-items tasks and notifies the joex nodes. */
   def submitNotifyDueItems(
       scope: UserTaskScope,
       subject: Option[String],
@@ -80,9 +76,9 @@ object OUserTask {
       ): F[Unit] =
         for {
           ptask <- task.encode.toPeriodicTask(scope, subject)
-          job   <- ptask.toJob
-          _     <- queue.insert(job)
-          _     <- joex.notifyAllNodes
+          job <- ptask.toJob
+          _ <- queue.insert(job)
+          _ <- joex.notifyAllNodes
         } yield ()
 
       def getScanMailbox(scope: UserTaskScope): Stream[F, UserTask[ScanMailboxArgs]] =
diff --git a/modules/backend/src/main/scala/docspell/backend/ops/SendResult.scala b/modules/backend/src/main/scala/docspell/backend/ops/SendResult.scala
index 44e4c6be..97feed6b 100644
--- a/modules/backend/src/main/scala/docspell/backend/ops/SendResult.scala
+++ b/modules/backend/src/main/scala/docspell/backend/ops/SendResult.scala
@@ -12,19 +12,15 @@ sealed trait SendResult
 
 object SendResult {
 
-  /** Mail was successfully sent and stored to db.
-    */
+  /** Mail was successfully sent and stored to db. */
   case class Success(id: Ident) extends SendResult
 
-  /** There was a failure sending the mail. The mail is then not saved to db.
-    */
+  /** There was a failure sending the mail. The mail is then not saved to db. */
   case class SendFailure(ex: Throwable) extends SendResult
 
-  /** The mail was successfully sent, but storing to db failed.
-    */
+  /** The mail was successfully sent, but storing to db failed. */
   case class StoreFailure(ex: Throwable) extends SendResult
 
-  /** Something could not be found required for sending (mail configs, items etc).
-    */
+  /** Something could not be found required for sending (mail configs, items etc). */
   case object NotFound extends SendResult
 }
diff --git a/modules/backend/src/main/scala/docspell/backend/signup/Config.scala b/modules/backend/src/main/scala/docspell/backend/signup/Config.scala
index 2dba64c0..203f5a20 100644
--- a/modules/backend/src/main/scala/docspell/backend/signup/Config.scala
+++ b/modules/backend/src/main/scala/docspell/backend/signup/Config.scala
@@ -41,7 +41,7 @@ object Config {
       Decoder.decodeString.emap(fromString)
   }
 
-  def open: Mode   = Mode.Open
+  def open: Mode = Mode.Open
   def invite: Mode = Mode.Invite
   def closed: Mode = Mode.Closed
 
diff --git a/modules/backend/src/main/scala/docspell/backend/signup/NewInviteResult.scala b/modules/backend/src/main/scala/docspell/backend/signup/NewInviteResult.scala
index 4b1d8391..081adeef 100644
--- a/modules/backend/src/main/scala/docspell/backend/signup/NewInviteResult.scala
+++ b/modules/backend/src/main/scala/docspell/backend/signup/NewInviteResult.scala
@@ -15,11 +15,11 @@ sealed trait NewInviteResult { self: Product =>
 }
 
 object NewInviteResult {
-  case class Success(id: Ident)  extends NewInviteResult
+  case class Success(id: Ident) extends NewInviteResult
   case object InvitationDisabled extends NewInviteResult
-  case object PasswordMismatch   extends NewInviteResult
+  case object PasswordMismatch extends NewInviteResult
 
-  def passwordMismatch: NewInviteResult   = PasswordMismatch
-  def invitationClosed: NewInviteResult   = InvitationDisabled
+  def passwordMismatch: NewInviteResult = PasswordMismatch
+  def invitationClosed: NewInviteResult = InvitationDisabled
   def success(id: Ident): NewInviteResult = Success(id)
 }
diff --git a/modules/backend/src/main/scala/docspell/backend/signup/SignupResult.scala b/modules/backend/src/main/scala/docspell/backend/signup/SignupResult.scala
index 5f48145f..6e3187f0 100644
--- a/modules/backend/src/main/scala/docspell/backend/signup/SignupResult.scala
+++ b/modules/backend/src/main/scala/docspell/backend/signup/SignupResult.scala
@@ -12,17 +12,17 @@ sealed trait SignupResult {}
 
 object SignupResult {
 
-  case object CollectiveExists      extends SignupResult
-  case object InvalidInvitationKey  extends SignupResult
-  case object SignupClosed          extends SignupResult
+  case object CollectiveExists extends SignupResult
+  case object InvalidInvitationKey extends SignupResult
+  case object SignupClosed extends SignupResult
   case class Failure(ex: Throwable) extends SignupResult
-  case object Success               extends SignupResult
+  case object Success extends SignupResult
 
-  def collectiveExists: SignupResult       = CollectiveExists
-  def invalidInvitationKey: SignupResult   = InvalidInvitationKey
-  def signupClosed: SignupResult           = SignupClosed
+  def collectiveExists: SignupResult = CollectiveExists
+  def invalidInvitationKey: SignupResult = InvalidInvitationKey
+  def signupClosed: SignupResult = SignupClosed
   def failure(ex: Throwable): SignupResult = Failure(ex)
-  def success: SignupResult                = Success
+  def success: SignupResult = Success
 
   def fromAddResult(ar: AddResult): SignupResult =
     ar match {
diff --git a/modules/common/src/main/scala/docspell/common/AccountSource.scala b/modules/common/src/main/scala/docspell/common/AccountSource.scala
index 2cad955a..dc6f1454 100644
--- a/modules/common/src/main/scala/docspell/common/AccountSource.scala
+++ b/modules/common/src/main/scala/docspell/common/AccountSource.scala
@@ -18,7 +18,7 @@ sealed trait AccountSource { self: Product =>
 
 object AccountSource {
 
-  case object Local  extends AccountSource
+  case object Local extends AccountSource
   case object OpenId extends AccountSource
 
   val all: NonEmptyList[AccountSource] =
diff --git a/modules/common/src/main/scala/docspell/common/Binary.scala b/modules/common/src/main/scala/docspell/common/Binary.scala
index 65fbdf13..2dc3c354 100644
--- a/modules/common/src/main/scala/docspell/common/Binary.scala
+++ b/modules/common/src/main/scala/docspell/common/Binary.scala
@@ -62,10 +62,10 @@ object Binary {
     private val utf8Bom: Chunk[Byte] = Chunk(0xef.toByte, 0xbb.toByte, 0xbf.toByte)
 
     def decode[F[_]](charset: Charset): Pipe[F, Byte, String] = {
-      val decoder         = charset.newDecoder
+      val decoder = charset.newDecoder
       val maxCharsPerByte = math.ceil(decoder.maxCharsPerByte().toDouble).toInt
       val avgBytesPerChar = math.ceil(1.0 / decoder.averageCharsPerByte().toDouble).toInt
-      val charBufferSize  = 128
+      val charBufferSize = 128
 
       _.repeatPull[String] {
         _.unconsN(charBufferSize * avgBytesPerChar, allowFewer = true).flatMap {
@@ -79,9 +79,9 @@ object Binary {
           case Some((chunk, stream)) =>
             if (chunk.nonEmpty) {
               val chunkWithoutBom = skipByteOrderMark(chunk)
-              val bytes           = chunkWithoutBom.toArray
-              val byteBuffer      = ByteBuffer.wrap(bytes)
-              val charBuffer      = CharBuffer.allocate(bytes.length * maxCharsPerByte)
+              val bytes = chunkWithoutBom.toArray
+              val byteBuffer = ByteBuffer.wrap(bytes)
+              val charBuffer = CharBuffer.allocate(bytes.length * maxCharsPerByte)
               decoder.decode(byteBuffer, charBuffer, false)
               val nextStream = stream.consChunk(Chunk.byteBuffer(byteBuffer.slice()))
               Pull.output1(charBuffer.flip().toString).as(Some(nextStream))
diff --git a/modules/common/src/main/scala/docspell/common/CollectiveState.scala b/modules/common/src/main/scala/docspell/common/CollectiveState.scala
index 5be1a340..53007fe0 100644
--- a/modules/common/src/main/scala/docspell/common/CollectiveState.scala
+++ b/modules/common/src/main/scala/docspell/common/CollectiveState.scala
@@ -23,8 +23,7 @@ object CollectiveState {
   /** A collective that has been explicitely closed. */
   case object Closed extends CollectiveState
 
-  /** A collective blocked by a super user, usually some emergency action.
-    */
+  /** A collective blocked by a super user, usually some emergency action. */
   case object Blocked extends CollectiveState
 
   def fromString(s: String): Either[String, CollectiveState] =
diff --git a/modules/common/src/main/scala/docspell/common/ContactKind.scala b/modules/common/src/main/scala/docspell/common/ContactKind.scala
index d7a40124..7301a1cd 100644
--- a/modules/common/src/main/scala/docspell/common/ContactKind.scala
+++ b/modules/common/src/main/scala/docspell/common/ContactKind.scala
@@ -16,10 +16,10 @@ sealed trait ContactKind { self: Product =>
 object ContactKind {
   val all = List()
 
-  case object Phone   extends ContactKind
-  case object Mobile  extends ContactKind
-  case object Fax     extends ContactKind
-  case object Email   extends ContactKind
+  case object Phone extends ContactKind
+  case object Mobile extends ContactKind
+  case object Fax extends ContactKind
+  case object Email extends ContactKind
   case object Website extends ContactKind
 
   def fromString(s: String): Either[String, ContactKind] =
diff --git a/modules/common/src/main/scala/docspell/common/CustomFieldType.scala b/modules/common/src/main/scala/docspell/common/CustomFieldType.scala
index 25d3842f..39c27c69 100644
--- a/modules/common/src/main/scala/docspell/common/CustomFieldType.scala
+++ b/modules/common/src/main/scala/docspell/common/CustomFieldType.scala
@@ -93,11 +93,11 @@ object CustomFieldType {
       v.setScale(2, BigDecimal.RoundingMode.HALF_EVEN)
   }
 
-  def text: CustomFieldType    = Text
+  def text: CustomFieldType = Text
   def numeric: CustomFieldType = Numeric
-  def date: CustomFieldType    = Date
-  def bool: CustomFieldType    = Bool
-  def money: CustomFieldType   = Money
+  def date: CustomFieldType = Date
+  def bool: CustomFieldType = Bool
+  def money: CustomFieldType = Money
 
   val all: NonEmptyList[CustomFieldType] =
     NonEmptyList.of(Text, Numeric, Date, Bool, Money)
diff --git a/modules/common/src/main/scala/docspell/common/DocspellSystem.scala b/modules/common/src/main/scala/docspell/common/DocspellSystem.scala
index 06b96069..4ecfff2a 100644
--- a/modules/common/src/main/scala/docspell/common/DocspellSystem.scala
+++ b/modules/common/src/main/scala/docspell/common/DocspellSystem.scala
@@ -8,9 +8,9 @@ package docspell.common
 
 object DocspellSystem {
 
-  val user                    = Ident.unsafe("docspell-system")
-  val taskGroup               = user
-  val migrationTaskTracker    = Ident.unsafe("full-text-index-tracker")
-  val allPreviewTaskTracker   = Ident.unsafe("generate-all-previews")
+  val user = Ident.unsafe("docspell-system")
+  val taskGroup = user
+  val migrationTaskTracker = Ident.unsafe("full-text-index-tracker")
+  val allPreviewTaskTracker = Ident.unsafe("generate-all-previews")
   val allPageCountTaskTracker = Ident.unsafe("all-page-count-tracker")
 }
diff --git a/modules/common/src/main/scala/docspell/common/EnvMode.scala b/modules/common/src/main/scala/docspell/common/EnvMode.scala
index e3a1422f..ad326353 100644
--- a/modules/common/src/main/scala/docspell/common/EnvMode.scala
+++ b/modules/common/src/main/scala/docspell/common/EnvMode.scala
@@ -22,15 +22,15 @@ object EnvMode {
   private val envName = "DOCSPELL_ENV"
 
   case object Dev extends EnvMode {
-    val isDev  = true
+    val isDev = true
     val isProd = false
   }
   case object Prod extends EnvMode {
-    val isDev  = false
+    val isDev = false
     val isProd = true
   }
 
-  def dev: EnvMode  = Dev
+  def dev: EnvMode = Dev
   def prod: EnvMode = Prod
 
   def fromString(s: String): Either[String, EnvMode] =
diff --git a/modules/common/src/main/scala/docspell/common/EquipmentUse.scala b/modules/common/src/main/scala/docspell/common/EquipmentUse.scala
index 9155fafc..4dd8ffcf 100644
--- a/modules/common/src/main/scala/docspell/common/EquipmentUse.scala
+++ b/modules/common/src/main/scala/docspell/common/EquipmentUse.scala
@@ -20,10 +20,10 @@ sealed trait EquipmentUse { self: Product =>
 object EquipmentUse {
 
   case object Concerning extends EquipmentUse
-  case object Disabled   extends EquipmentUse
+  case object Disabled extends EquipmentUse
 
   def concerning: EquipmentUse = Concerning
-  def disabled: EquipmentUse   = Disabled
+  def disabled: EquipmentUse = Disabled
 
   val all: NonEmptyList[EquipmentUse] =
     NonEmptyList.of(concerning, disabled)
diff --git a/modules/common/src/main/scala/docspell/common/Glob.scala b/modules/common/src/main/scala/docspell/common/Glob.scala
index 0b9703af..722af9fd 100644
--- a/modules/common/src/main/scala/docspell/common/Glob.scala
+++ b/modules/common/src/main/scala/docspell/common/Glob.scala
@@ -43,12 +43,12 @@ object Glob {
   }
 
   private val separator = '/'
-  private val anyChar   = '|'
+  private val anyChar = '|'
 
   val all = new Glob {
     def matches(caseSensitive: Boolean)(in: String) = true
-    def matchFilenameOrPath(in: String)             = true
-    val asString                                    = "*"
+    def matchFilenameOrPath(in: String) = true
+    val asString = "*"
   }
 
   def pattern(pattern: Pattern): Glob =
@@ -142,7 +142,7 @@ object Glob {
       }
 
       def startsWith(prefix: String, caseSensitive: Boolean): Boolean = {
-        val vstr    = if (caseSensitive) str else str.toLowerCase
+        val vstr = if (caseSensitive) str else str.toLowerCase
         val vprefix = if (caseSensitive) prefix else prefix.toLowerCase
         vstr.startsWith(vprefix)
       }
diff --git a/modules/common/src/main/scala/docspell/common/ItemState.scala b/modules/common/src/main/scala/docspell/common/ItemState.scala
index 5609220f..e58cf43a 100644
--- a/modules/common/src/main/scala/docspell/common/ItemState.scala
+++ b/modules/common/src/main/scala/docspell/common/ItemState.scala
@@ -24,17 +24,17 @@ sealed trait ItemState { self: Product =>
 
 object ItemState {
 
-  case object Premature  extends ItemState
+  case object Premature extends ItemState
   case object Processing extends ItemState
-  case object Created    extends ItemState
-  case object Confirmed  extends ItemState
-  case object Deleted    extends ItemState
+  case object Created extends ItemState
+  case object Confirmed extends ItemState
+  case object Deleted extends ItemState
 
-  def premature: ItemState  = Premature
+  def premature: ItemState = Premature
   def processing: ItemState = Processing
-  def created: ItemState    = Created
-  def confirmed: ItemState  = Confirmed
-  def deleted: ItemState    = Deleted
+  def created: ItemState = Created
+  def confirmed: ItemState = Confirmed
+  def deleted: ItemState = Deleted
 
   def fromString(str: String): Either[String, ItemState] =
     str.toLowerCase match {
diff --git a/modules/common/src/main/scala/docspell/common/JobState.scala b/modules/common/src/main/scala/docspell/common/JobState.scala
index cd257c9a..cdd8fb97 100644
--- a/modules/common/src/main/scala/docspell/common/JobState.scala
+++ b/modules/common/src/main/scala/docspell/common/JobState.scala
@@ -20,8 +20,7 @@ object JobState {
   /** Waiting for being executed. */
   case object Waiting extends JobState {}
 
-  /** A scheduler has picked up this job and will pass it to the next free slot.
-    */
+  /** A scheduler has picked up this job and will pass it to the next free slot. */
   case object Scheduled extends JobState {}
 
   /** Is currently executing */
@@ -39,17 +38,17 @@ object JobState {
   /** Finished with success */
   case object Success extends JobState {}
 
-  val waiting: JobState   = Waiting
-  val stuck: JobState     = Stuck
+  val waiting: JobState = Waiting
+  val stuck: JobState = Stuck
   val scheduled: JobState = Scheduled
-  val running: JobState   = Running
-  val failed: JobState    = Failed
+  val running: JobState = Running
+  val failed: JobState = Failed
   val cancelled: JobState = Cancelled
-  val success: JobState   = Success
+  val success: JobState = Success
 
   val all: NonEmptyList[JobState] =
     NonEmptyList.of(Waiting, Scheduled, Running, Stuck, Failed, Cancelled, Success)
-  val queued: Set[JobState]        = Set(Waiting, Scheduled, Stuck)
+  val queued: Set[JobState] = Set(Waiting, Scheduled, Stuck)
   val done: NonEmptyList[JobState] = NonEmptyList.of(Failed, Cancelled, Success)
   val notDone: NonEmptyList[JobState] = //all - done
     NonEmptyList.of(Waiting, Scheduled, Running, Stuck)
diff --git a/modules/common/src/main/scala/docspell/common/JvmInfo.scala b/modules/common/src/main/scala/docspell/common/JvmInfo.scala
index 7a0b42aa..0aafaee6 100644
--- a/modules/common/src/main/scala/docspell/common/JvmInfo.scala
+++ b/modules/common/src/main/scala/docspell/common/JvmInfo.scala
@@ -39,7 +39,7 @@ object JvmInfo {
     MemoryUsage.createHeap[F].flatMap { mu =>
       Sync[F].delay {
         val rmb = management.ManagementFactory.getRuntimeMXBean()
-        val rt  = Runtime.getRuntime()
+        val rt = Runtime.getRuntime()
         JvmInfo(
           id,
           pidHost = rmb.getName(),
@@ -84,7 +84,7 @@ object JvmInfo {
 
     def createHeap[F[_]: Sync]: F[MemoryUsage] =
       Sync[F].delay {
-        val mxb  = management.ManagementFactory.getMemoryMXBean()
+        val mxb = management.ManagementFactory.getMemoryMXBean()
         val heap = mxb.getHeapMemoryUsage()
         MemoryUsage(
           init = math.max(0, heap.getInit()),
diff --git a/modules/common/src/main/scala/docspell/common/LenientUri.scala b/modules/common/src/main/scala/docspell/common/LenientUri.scala
index 84d98d8c..f76f9b0d 100644
--- a/modules/common/src/main/scala/docspell/common/LenientUri.scala
+++ b/modules/common/src/main/scala/docspell/common/LenientUri.scala
@@ -97,10 +97,10 @@ case class LenientUri(
 
   def asString: String = {
     val schemePart = scheme.toList.mkString(":")
-    val authPart   = authority.map(a => s"//$a").getOrElse("")
-    val pathPart   = path.asString
-    val queryPart  = query.map(q => s"?$q").getOrElse("")
-    val fragPart   = fragment.map(f => s"#$f").getOrElse("")
+    val authPart = authority.map(a => s"//$a").getOrElse("")
+    val pathPart = path.asString
+    val queryPart = query.map(q => s"?$q").getOrElse("")
+    val fragPart = fragment.map(f => s"#$f").getOrElse("")
     s"$schemePart:$authPart$pathPart$queryPart$fragPart"
   }
 }
@@ -116,24 +116,24 @@ object LenientUri {
   }
   case object RootPath extends Path {
     val segments = Nil
-    val isRoot   = true
-    val isEmpty  = false
+    val isRoot = true
+    val isEmpty = false
     def /(seg: String): Path =
       NonEmptyPath(NonEmptyList.of(seg))
     def asString = "/"
   }
   case object EmptyPath extends Path {
     val segments = Nil
-    val isRoot   = false
-    val isEmpty  = true
+    val isRoot = false
+    val isEmpty = true
     def /(seg: String): Path =
       NonEmptyPath(NonEmptyList.of(seg))
     def asString = ""
   }
   case class NonEmptyPath(segs: NonEmptyList[String]) extends Path {
     def segments = segs.toList
-    val isEmpty  = false
-    val isRoot   = false
+    val isEmpty = false
+    val isRoot = false
     def /(seg: String): Path =
       copy(segs = segs.append(seg))
     def asString =
@@ -215,7 +215,7 @@ object LenientUri {
           case -1 =>
             Left(s"No scheme found: $str")
           case n =>
-            val scheme              = makeScheme(p0.substring(0, n))
+            val scheme = makeScheme(p0.substring(0, n))
             val (path, query, frag) = splitPathQF(p0.substring(n + 1))
             scheme match {
               case None =>
diff --git a/modules/common/src/main/scala/docspell/common/LogLevel.scala b/modules/common/src/main/scala/docspell/common/LogLevel.scala
index 99904fc6..efec4d73 100644
--- a/modules/common/src/main/scala/docspell/common/LogLevel.scala
+++ b/modules/common/src/main/scala/docspell/common/LogLevel.scala
@@ -17,8 +17,8 @@ sealed trait LogLevel { self: Product =>
 object LogLevel {
 
   case object Debug extends LogLevel { val toInt = 0 }
-  case object Info  extends LogLevel { val toInt = 1 }
-  case object Warn  extends LogLevel { val toInt = 2 }
+  case object Info extends LogLevel { val toInt = 1 }
+  case object Warn extends LogLevel { val toInt = 2 }
   case object Error extends LogLevel { val toInt = 3 }
 
   def fromInt(n: Int): LogLevel =
diff --git a/modules/common/src/main/scala/docspell/common/MetaProposal.scala b/modules/common/src/main/scala/docspell/common/MetaProposal.scala
index 4a89d5f4..fee0f0c2 100644
--- a/modules/common/src/main/scala/docspell/common/MetaProposal.scala
+++ b/modules/common/src/main/scala/docspell/common/MetaProposal.scala
@@ -81,8 +81,7 @@ object MetaProposal {
     implicit val order: Order[Candidate] =
       Order.by(_.ref)
 
-    /** This deviates from standard order to sort None at last.
-      */
+    /** This deviates from standard order to sort None at last. */
     val weightOrder: Order[Option[Double]] = new Order[Option[Double]] {
       def compare(x: Option[Double], y: Option[Double]) =
         (x, y) match {
diff --git a/modules/common/src/main/scala/docspell/common/MetaProposalList.scala b/modules/common/src/main/scala/docspell/common/MetaProposalList.scala
index 1ac06652..edcdf30a 100644
--- a/modules/common/src/main/scala/docspell/common/MetaProposalList.scala
+++ b/modules/common/src/main/scala/docspell/common/MetaProposalList.scala
@@ -20,7 +20,7 @@ import io.circe.generic.semiauto._
   */
 case class MetaProposalList private (proposals: List[MetaProposal]) {
 
-  def isEmpty: Boolean  = proposals.isEmpty
+  def isEmpty: Boolean = proposals.isEmpty
   def nonEmpty: Boolean = proposals.nonEmpty
 
   def hasResults(mt: MetaProposalType, mts: MetaProposalType*): Boolean =
@@ -115,7 +115,7 @@ object MetaProposalList {
           MetaProposal
       ) => Map[MetaProposalType, MetaProposal]
   ): MetaProposalList = {
-    val init   = Map.empty[MetaProposalType, MetaProposal]
+    val init = Map.empty[MetaProposalType, MetaProposal]
     val merged = ml.foldLeft(init)((map, el) => el.proposals.foldLeft(map)(merge))
     fromMap(merged)
   }
diff --git a/modules/common/src/main/scala/docspell/common/MetaProposalType.scala b/modules/common/src/main/scala/docspell/common/MetaProposalType.scala
index 2e676165..503a7148 100644
--- a/modules/common/src/main/scala/docspell/common/MetaProposalType.scala
+++ b/modules/common/src/main/scala/docspell/common/MetaProposalType.scala
@@ -16,12 +16,12 @@ sealed trait MetaProposalType { self: Product =>
 
 object MetaProposalType {
 
-  case object CorrOrg    extends MetaProposalType
+  case object CorrOrg extends MetaProposalType
   case object CorrPerson extends MetaProposalType
   case object ConcPerson extends MetaProposalType
-  case object ConcEquip  extends MetaProposalType
-  case object DocDate    extends MetaProposalType
-  case object DueDate    extends MetaProposalType
+  case object ConcEquip extends MetaProposalType
+  case object DocDate extends MetaProposalType
+  case object DueDate extends MetaProposalType
 
   val all: List[MetaProposalType] =
     List(CorrOrg, CorrPerson, ConcPerson, ConcEquip, DocDate, DueDate)
diff --git a/modules/common/src/main/scala/docspell/common/MimeType.scala b/modules/common/src/main/scala/docspell/common/MimeType.scala
index c693b35f..c8d76611 100644
--- a/modules/common/src/main/scala/docspell/common/MimeType.scala
+++ b/modules/common/src/main/scala/docspell/common/MimeType.scala
@@ -15,8 +15,7 @@ import docspell.common.syntax.all._
 
 import io.circe.{Decoder, Encoder}
 
-/** A MIME Type impl with just enough features for the use here.
-  */
+/** A MIME Type impl with just enough features for the use here. */
 case class MimeType(primary: String, sub: String, params: Map[String, String]) {
   def withParam(name: String, value: String): MimeType =
     copy(params = params.updated(name, value))
@@ -99,13 +98,13 @@ object MimeType {
     parse(str).throwLeft
 
   val octetStream = application("octet-stream")
-  val pdf         = application("pdf")
-  val zip         = application("zip")
-  val png         = image("png")
-  val jpeg        = image("jpeg")
-  val tiff        = image("tiff")
-  val html        = text("html")
-  val plain       = text("plain")
+  val pdf = application("pdf")
+  val zip = application("zip")
+  val png = image("png")
+  val jpeg = image("jpeg")
+  val tiff = image("tiff")
+  val html = text("html")
+  val plain = text("plain")
   val emls = NonEmptyList.of(
     MimeType("message", "rfc822", Map.empty),
     application("mbox")
diff --git a/modules/common/src/main/scala/docspell/common/NerTag.scala b/modules/common/src/main/scala/docspell/common/NerTag.scala
index 11bf2fc2..3a7b03ef 100644
--- a/modules/common/src/main/scala/docspell/common/NerTag.scala
+++ b/modules/common/src/main/scala/docspell/common/NerTag.scala
@@ -17,12 +17,12 @@ sealed trait NerTag { self: Product =>
 object NerTag {
 
   case object Organization extends NerTag
-  case object Person       extends NerTag
-  case object Location     extends NerTag
-  case object Misc         extends NerTag
-  case object Email        extends NerTag
-  case object Website      extends NerTag
-  case object Date         extends NerTag
+  case object Person extends NerTag
+  case object Location extends NerTag
+  case object Misc extends NerTag
+  case object Email extends NerTag
+  case object Website extends NerTag
+  case object Date extends NerTag
 
   val all: List[NerTag] = List(Organization, Person, Location)
 
diff --git a/modules/common/src/main/scala/docspell/common/NlpMode.scala b/modules/common/src/main/scala/docspell/common/NlpMode.scala
index 39733dd4..fcf8c2dd 100644
--- a/modules/common/src/main/scala/docspell/common/NlpMode.scala
+++ b/modules/common/src/main/scala/docspell/common/NlpMode.scala
@@ -12,10 +12,10 @@ sealed trait NlpMode { self: Product =>
     self.productPrefix
 }
 object NlpMode {
-  case object Full      extends NlpMode
-  case object Basic     extends NlpMode
+  case object Full extends NlpMode
+  case object Basic extends NlpMode
   case object RegexOnly extends NlpMode
-  case object Disabled  extends NlpMode
+  case object Disabled extends NlpMode
 
   def fromString(name: String): Either[String, NlpMode] =
     name.toLowerCase match {
diff --git a/modules/common/src/main/scala/docspell/common/NodeType.scala b/modules/common/src/main/scala/docspell/common/NodeType.scala
index 26ca7007..04be7e9f 100644
--- a/modules/common/src/main/scala/docspell/common/NodeType.scala
+++ b/modules/common/src/main/scala/docspell/common/NodeType.scala
@@ -16,7 +16,7 @@ sealed trait NodeType { self: Product =>
 object NodeType {
 
   case object Restserver extends NodeType
-  case object Joex       extends NodeType
+  case object Joex extends NodeType
 
   def fromString(str: String): Either[String, NodeType] =
     str.toLowerCase match {
diff --git a/modules/common/src/main/scala/docspell/common/OrgUse.scala b/modules/common/src/main/scala/docspell/common/OrgUse.scala
index e7802011..bb07f34c 100644
--- a/modules/common/src/main/scala/docspell/common/OrgUse.scala
+++ b/modules/common/src/main/scala/docspell/common/OrgUse.scala
@@ -20,10 +20,10 @@ sealed trait OrgUse { self: Product =>
 object OrgUse {
 
   case object Correspondent extends OrgUse
-  case object Disabled      extends OrgUse
+  case object Disabled extends OrgUse
 
   def correspondent: OrgUse = Correspondent
-  def disabled: OrgUse      = Disabled
+  def disabled: OrgUse = Disabled
 
   val all: NonEmptyList[OrgUse] =
     NonEmptyList.of(correspondent, disabled)
diff --git a/modules/common/src/main/scala/docspell/common/PersonUse.scala b/modules/common/src/main/scala/docspell/common/PersonUse.scala
index 58f8fdd1..92e62e37 100644
--- a/modules/common/src/main/scala/docspell/common/PersonUse.scala
+++ b/modules/common/src/main/scala/docspell/common/PersonUse.scala
@@ -20,13 +20,13 @@ sealed trait PersonUse { self: Product =>
 object PersonUse {
 
   case object Correspondent extends PersonUse
-  case object Concerning    extends PersonUse
-  case object Both          extends PersonUse
-  case object Disabled      extends PersonUse
+  case object Concerning extends PersonUse
+  case object Both extends PersonUse
+  case object Disabled extends PersonUse
 
-  def concerning: PersonUse    = Concerning
+  def concerning: PersonUse = Concerning
   def correspondent: PersonUse = Correspondent
-  def both: PersonUse          = Both
+  def both: PersonUse = Both
 
   val concerningAndBoth: NonEmptyList[PersonUse] =
     NonEmptyList.of(Concerning, Both)
diff --git a/modules/common/src/main/scala/docspell/common/Pools.scala b/modules/common/src/main/scala/docspell/common/Pools.scala
index ff57fa30..20d2771c 100644
--- a/modules/common/src/main/scala/docspell/common/Pools.scala
+++ b/modules/common/src/main/scala/docspell/common/Pools.scala
@@ -8,8 +8,7 @@ package docspell.common
 
 import scala.concurrent.ExecutionContext
 
-/** Captures thread pools to use in an application.
-  */
+/** Captures thread pools to use in an application. */
 case class Pools(
     connectEC: ExecutionContext,
     httpClientEC: ExecutionContext,
diff --git a/modules/common/src/main/scala/docspell/common/SearchMode.scala b/modules/common/src/main/scala/docspell/common/SearchMode.scala
index dbf4fa0c..395d65a3 100644
--- a/modules/common/src/main/scala/docspell/common/SearchMode.scala
+++ b/modules/common/src/main/scala/docspell/common/SearchMode.scala
@@ -20,9 +20,9 @@ sealed trait SearchMode { self: Product =>
 
 object SearchMode {
 
-  final case object Normal  extends SearchMode
+  final case object Normal extends SearchMode
   final case object Trashed extends SearchMode
-  final case object All     extends SearchMode
+  final case object All extends SearchMode
 
   def fromString(str: String): Either[String, SearchMode] =
     str.toLowerCase match {
diff --git a/modules/common/src/main/scala/docspell/common/SystemCommand.scala b/modules/common/src/main/scala/docspell/common/SystemCommand.scala
index dda7ca3b..2382c36e 100644
--- a/modules/common/src/main/scala/docspell/common/SystemCommand.scala
+++ b/modules/common/src/main/scala/docspell/common/SystemCommand.scala
@@ -49,7 +49,7 @@ object SystemCommand {
     startProcess(cmd, wd, logger, stdin) { proc =>
       Stream.eval {
         for {
-          _    <- writeToProcess(stdin, proc)
+          _ <- writeToProcess(stdin, proc)
           term <- Sync[F].blocking(proc.waitFor(cmd.timeout.seconds, TimeUnit.SECONDS))
           _ <-
             if (term)
@@ -93,7 +93,7 @@ object SystemCommand {
   )(
       f: Process => Stream[F, A]
   ): Stream[F, A] = {
-    val log      = logger.debug(s"Running external command: ${cmd.cmdString}")
+    val log = logger.debug(s"Running external command: ${cmd.cmdString}")
     val hasStdin = stdin.take(1).compile.last.map(_.isDefined)
     val proc = log *> hasStdin.flatMap(flag =>
       Sync[F].blocking {
diff --git a/modules/common/src/main/scala/docspell/common/ThreadFactories.scala b/modules/common/src/main/scala/docspell/common/ThreadFactories.scala
index 289aaed5..18df3742 100644
--- a/modules/common/src/main/scala/docspell/common/ThreadFactories.scala
+++ b/modules/common/src/main/scala/docspell/common/ThreadFactories.scala
@@ -32,7 +32,7 @@ object ThreadFactories {
 
   def ofNameFJ(prefix: String): ForkJoinWorkerThreadFactory =
     new ForkJoinWorkerThreadFactory {
-      val tf      = ForkJoinPool.defaultForkJoinWorkerThreadFactory
+      val tf = ForkJoinPool.defaultForkJoinWorkerThreadFactory
       val counter = new AtomicLong(0)
 
       def newThread(pool: ForkJoinPool): ForkJoinWorkerThread = {
diff --git a/modules/common/src/main/scala/docspell/common/syntax/StreamSyntax.scala b/modules/common/src/main/scala/docspell/common/syntax/StreamSyntax.scala
index 0a4f6ff2..7e05fb17 100644
--- a/modules/common/src/main/scala/docspell/common/syntax/StreamSyntax.scala
+++ b/modules/common/src/main/scala/docspell/common/syntax/StreamSyntax.scala
@@ -27,7 +27,7 @@ trait StreamSyntax {
               optStr
                 .map(_.trim)
                 .toRight(new Exception("Empty string cannot be parsed into a value"))
-            json  <- parse(str).leftMap(_.underlying)
+            json <- parse(str).leftMap(_.underlying)
             value <- json.as[A]
           } yield value
         )
diff --git a/modules/common/src/main/scala/docspell/common/syntax/StringSyntax.scala b/modules/common/src/main/scala/docspell/common/syntax/StringSyntax.scala
index 9643d42a..6fc06440 100644
--- a/modules/common/src/main/scala/docspell/common/syntax/StringSyntax.scala
+++ b/modules/common/src/main/scala/docspell/common/syntax/StringSyntax.scala
@@ -20,7 +20,7 @@ trait StringSyntax {
 
     def parseJsonAs[A](implicit d: Decoder[A]): Either[Throwable, A] =
       for {
-        json  <- parse(s).leftMap(_.underlying)
+        json <- parse(s).leftMap(_.underlying)
         value <- json.as[A]
       } yield value
   }
diff --git a/modules/convert/src/main/scala/docspell/convert/Conversion.scala b/modules/convert/src/main/scala/docspell/convert/Conversion.scala
index e0334a4b..54ee526a 100644
--- a/modules/convert/src/main/scala/docspell/convert/Conversion.scala
+++ b/modules/convert/src/main/scala/docspell/convert/Conversion.scala
@@ -109,12 +109,12 @@ object Conversion {
     })
 
   object Office {
-    val odt      = MimeType.application("vnd.oasis.opendocument.text")
-    val ods      = MimeType.application("vnd.oasis.opendocument.spreadsheet")
+    val odt = MimeType.application("vnd.oasis.opendocument.text")
+    val ods = MimeType.application("vnd.oasis.opendocument.spreadsheet")
     val odtAlias = MimeType.application("x-vnd.oasis.opendocument.text")
     val odsAlias = MimeType.application("x-vnd.oasis.opendocument.spreadsheet")
     val msoffice = MimeType.application("x-tika-msoffice")
-    val ooxml    = MimeType.application("x-tika-ooxml")
+    val ooxml = MimeType.application("x-tika-ooxml")
     val docx =
       MimeType.application("vnd.openxmlformats-officedocument.wordprocessingml.document")
     val xlsx =
diff --git a/modules/convert/src/main/scala/docspell/convert/extern/ExternConv.scala b/modules/convert/src/main/scala/docspell/convert/extern/ExternConv.scala
index f98c99ef..419c3506 100644
--- a/modules/convert/src/main/scala/docspell/convert/extern/ExternConv.scala
+++ b/modules/convert/src/main/scala/docspell/convert/extern/ExternConv.scala
@@ -29,7 +29,7 @@ private[extern] object ExternConv {
       .resource(File.withTempDir[F](wd, s"docspell-$name"))
       .flatMap { dir =>
         val inFile = dir.resolve("infile").absolute.normalize
-        val out    = dir.resolve("out.pdf").absolute.normalize
+        val out = dir.resolve("out.pdf").absolute.normalize
         val sysCfg =
           cmdCfg.replace(
             Map(
diff --git a/modules/convert/src/main/scala/docspell/convert/flexmark/Markdown.scala b/modules/convert/src/main/scala/docspell/convert/flexmark/Markdown.scala
index f91ba370..fcc19927 100644
--- a/modules/convert/src/main/scala/docspell/convert/flexmark/Markdown.scala
+++ b/modules/convert/src/main/scala/docspell/convert/flexmark/Markdown.scala
@@ -35,14 +35,14 @@ object Markdown {
     val r = createRenderer()
     Try {
       val reader = new InputStreamReader(is, cs)
-      val doc    = p.parseReader(reader)
+      val doc = p.parseReader(reader)
       wrapHtml(r.render(doc), cfg)
     }.toEither
   }
 
   def toHtml(md: String, cfg: MarkdownConfig): String = {
-    val p   = createParser()
-    val r   = createRenderer()
+    val p = createParser()
+    val r = createRenderer()
     val doc = p.parse(md)
     wrapHtml(r.render(doc), cfg)
   }
diff --git a/modules/convert/src/test/scala/docspell/convert/ConversionTest.scala b/modules/convert/src/test/scala/docspell/convert/ConversionTest.scala
index 74f21263..fa4360e8 100644
--- a/modules/convert/src/test/scala/docspell/convert/ConversionTest.scala
+++ b/modules/convert/src/test/scala/docspell/convert/ConversionTest.scala
@@ -172,7 +172,7 @@ class ConversionTest extends FunSuite with FileChecks {
       .covary[IO]
       .zipWithIndex
       .evalMap { case (uri, index) =>
-        val load     = uri.readURL[IO](8192)
+        val load = uri.readURL[IO](8192)
         val dataType = DataType.filename(uri.path.segments.last)
         logger.info(s"Processing file ${uri.path.asString}") *>
           conv.toPDF(dataType, Language.German, handler(index))(load)
diff --git a/modules/convert/src/test/scala/docspell/convert/FileChecks.scala b/modules/convert/src/test/scala/docspell/convert/FileChecks.scala
index a0d01e8c..a6a62462 100644
--- a/modules/convert/src/test/scala/docspell/convert/FileChecks.scala
+++ b/modules/convert/src/test/scala/docspell/convert/FileChecks.scala
@@ -52,7 +52,7 @@ trait FileChecks {
       case ConversionResult.SuccessPdfTxt(pdf, txt) =>
         for {
           pout <- pdf.through(storeFile(filePdf)).compile.lastOrError
-          str  <- txt
+          str <- txt
           tout <- IO(Files.write(fileTxt.toNioPath, str.getBytes(StandardCharsets.UTF_8)))
         } yield (pout, File.path(tout))
 
diff --git a/modules/convert/src/test/scala/docspell/convert/extern/ExternConvTest.scala b/modules/convert/src/test/scala/docspell/convert/extern/ExternConvTest.scala
index de5cadc4..3e5d5991 100644
--- a/modules/convert/src/test/scala/docspell/convert/extern/ExternConvTest.scala
+++ b/modules/convert/src/test/scala/docspell/convert/extern/ExternConvTest.scala
@@ -20,7 +20,7 @@ import docspell.files.ExampleFiles
 import munit._
 
 class ExternConvTest extends FunSuite with FileChecks {
-  val utf8   = StandardCharsets.UTF_8
+  val utf8 = StandardCharsets.UTF_8
   val logger = Logger.log4s[IO](org.log4s.getLogger)
   val target = File.path(Paths.get("target"))
 
diff --git a/modules/extract/src/main/scala/docspell/extract/ExtractResult.scala b/modules/extract/src/main/scala/docspell/extract/ExtractResult.scala
index 81511d58..e60d8ea1 100644
--- a/modules/extract/src/main/scala/docspell/extract/ExtractResult.scala
+++ b/modules/extract/src/main/scala/docspell/extract/ExtractResult.scala
@@ -20,14 +20,14 @@ object ExtractResult {
 
   case class UnsupportedFormat(mime: MimeType) extends ExtractResult {
     val textOption = None
-    val pdfMeta    = None
+    val pdfMeta = None
   }
   def unsupportedFormat(mt: MimeType): ExtractResult =
     UnsupportedFormat(mt)
 
   case class Failure(ex: Throwable) extends ExtractResult {
     val textOption = None
-    val pdfMeta    = None
+    val pdfMeta = None
   }
   def failure(ex: Throwable): ExtractResult =
     Failure(ex)
diff --git a/modules/extract/src/main/scala/docspell/extract/ocr/Ocr.scala b/modules/extract/src/main/scala/docspell/extract/ocr/Ocr.scala
index b958ed51..9e5d6a92 100644
--- a/modules/extract/src/main/scala/docspell/extract/ocr/Ocr.scala
+++ b/modules/extract/src/main/scala/docspell/extract/ocr/Ocr.scala
@@ -14,8 +14,7 @@ import docspell.common._
 
 object Ocr {
 
-  /** Extract the text of all pages in the given pdf file.
-    */
+  /** Extract the text of all pages in the given pdf file. */
   def extractPdf[F[_]: Async](
       pdf: Stream[F, Byte],
       logger: Logger[F],
@@ -30,8 +29,7 @@ object Ocr {
         .last
     }
 
-  /** Extract the text from the given image file
-    */
+  /** Extract the text from the given image file */
   def extractImage[F[_]: Async](
       img: Stream[F, Byte],
       logger: Logger[F],
@@ -79,7 +77,7 @@ object Ocr {
       .copy(args = xargs)
       .replace(
         Map(
-          "{{infile}}"  -> "-",
+          "{{infile}}" -> "-",
           "{{outfile}}" -> "%d.tif"
         )
       )
@@ -99,7 +97,7 @@ object Ocr {
   ): Stream[F, Path] = {
     val cmd = ghostscript.replace(
       Map(
-        "{{infile}}"  -> pdf.absolute.toString,
+        "{{infile}}" -> pdf.absolute.toString,
         "{{outfile}}" -> "%d.tif"
       )
     )
@@ -123,7 +121,7 @@ object Ocr {
     val targetFile = img.resolveSibling("u-" + img.fileName.toString).absolute
     val cmd = unpaper.replace(
       Map(
-        "{{infile}}"  -> img.absolute.toString,
+        "{{infile}}" -> img.absolute.toString,
         "{{outfile}}" -> targetFile.toString
       )
     )
@@ -139,8 +137,7 @@ object Ocr {
       }
   }
 
-  /** Run tesseract on the given image file and return the extracted text.
-    */
+  /** Run tesseract on the given image file and return the extracted text. */
   private[extract] def runTesseractFile[F[_]: Async](
       img: Path,
       logger: Logger[F],
@@ -159,8 +156,7 @@ object Ocr {
         .map(_.stdout)
     }
 
-  /** Run tesseract on the given image file and return the extracted text.
-    */
+  /** Run tesseract on the given image file and return the extracted text. */
   private[extract] def runTesseractStdin[F[_]: Async](
       img: Stream[F, Byte],
       logger: Logger[F],
diff --git a/modules/extract/src/main/scala/docspell/extract/ocr/OcrType.scala b/modules/extract/src/main/scala/docspell/extract/ocr/OcrType.scala
index 012d47f1..120892e6 100644
--- a/modules/extract/src/main/scala/docspell/extract/ocr/OcrType.scala
+++ b/modules/extract/src/main/scala/docspell/extract/ocr/OcrType.scala
@@ -11,9 +11,9 @@ import docspell.common.MimeType
 object OcrType {
 
   val jpeg = MimeType.jpeg
-  val png  = MimeType.png
+  val png = MimeType.png
   val tiff = MimeType.tiff
-  val pdf  = MimeType.pdf
+  val pdf = MimeType.pdf
 
   val all = Set(jpeg, png, tiff, pdf)
 
diff --git a/modules/extract/src/main/scala/docspell/extract/odf/OdfExtract.scala b/modules/extract/src/main/scala/docspell/extract/odf/OdfExtract.scala
index e7757b64..fbb627fe 100644
--- a/modules/extract/src/main/scala/docspell/extract/odf/OdfExtract.scala
+++ b/modules/extract/src/main/scala/docspell/extract/odf/OdfExtract.scala
@@ -28,9 +28,9 @@ object OdfExtract {
 
   def get(is: InputStream) =
     Try {
-      val handler  = new BodyContentHandler()
-      val pctx     = new ParseContext()
-      val meta     = new Metadata()
+      val handler = new BodyContentHandler()
+      val pctx = new ParseContext()
+      val meta = new Metadata()
       val ooparser = new OpenDocumentParser()
       ooparser.parse(is, handler, meta, pctx)
       Text(Option(handler.toString))
diff --git a/modules/extract/src/main/scala/docspell/extract/odf/OdfType.scala b/modules/extract/src/main/scala/docspell/extract/odf/OdfType.scala
index e1a8dcf4..a7779f4e 100644
--- a/modules/extract/src/main/scala/docspell/extract/odf/OdfType.scala
+++ b/modules/extract/src/main/scala/docspell/extract/odf/OdfType.scala
@@ -10,8 +10,8 @@ import docspell.common.MimeType
 
 object OdfType {
 
-  val odt      = MimeType.application("vnd.oasis.opendocument.text")
-  val ods      = MimeType.application("vnd.oasis.opendocument.spreadsheet")
+  val odt = MimeType.application("vnd.oasis.opendocument.text")
+  val ods = MimeType.application("vnd.oasis.opendocument.spreadsheet")
   val odtAlias = MimeType.application("x-vnd.oasis.opendocument.text")
   val odsAlias = MimeType.application("x-vnd.oasis.opendocument.spreadsheet")
 
diff --git a/modules/extract/src/main/scala/docspell/extract/pdfbox/PdfboxExtract.scala b/modules/extract/src/main/scala/docspell/extract/pdfbox/PdfboxExtract.scala
index 68e3324d..6a5590dd 100644
--- a/modules/extract/src/main/scala/docspell/extract/pdfbox/PdfboxExtract.scala
+++ b/modules/extract/src/main/scala/docspell/extract/pdfbox/PdfboxExtract.scala
@@ -30,7 +30,7 @@ object PdfboxExtract {
       .withDocumentStream(data) { doc =>
         (for {
           txt <- readText(doc)
-          md  <- readMetaData(doc)
+          md <- readMetaData(doc)
         } yield (txt, Some(md).filter(_.nonEmpty))).pure[F]
       }
       .attempt
diff --git a/modules/extract/src/main/scala/docspell/extract/poi/PoiType.scala b/modules/extract/src/main/scala/docspell/extract/poi/PoiType.scala
index 6ab376e4..f2b27612 100644
--- a/modules/extract/src/main/scala/docspell/extract/poi/PoiType.scala
+++ b/modules/extract/src/main/scala/docspell/extract/poi/PoiType.scala
@@ -11,12 +11,12 @@ import docspell.common.MimeType
 object PoiType {
 
   val msoffice = MimeType.application("x-tika-msoffice")
-  val ooxml    = MimeType.application("x-tika-ooxml")
+  val ooxml = MimeType.application("x-tika-ooxml")
   val docx =
     MimeType.application("vnd.openxmlformats-officedocument.wordprocessingml.document")
   val xlsx = MimeType.application("vnd.openxmlformats-officedocument.spreadsheetml.sheet")
-  val xls  = MimeType.application("vnd.ms-excel")
-  val doc  = MimeType.application("msword")
+  val xls = MimeType.application("vnd.ms-excel")
+  val doc = MimeType.application("msword")
 
   val all = Set(msoffice, ooxml, docx, xlsx, xls, doc)
 
diff --git a/modules/extract/src/test/scala/docspell/extract/odf/OdfExtractTest.scala b/modules/extract/src/test/scala/docspell/extract/odf/OdfExtractTest.scala
index c95681dc..c2dd5089 100644
--- a/modules/extract/src/test/scala/docspell/extract/odf/OdfExtractTest.scala
+++ b/modules/extract/src/test/scala/docspell/extract/odf/OdfExtractTest.scala
@@ -22,7 +22,7 @@ class OdfExtractTest extends FunSuite {
 
   test("test extract from odt") {
     files.foreach { case (file, len) =>
-      val is   = file.toJavaUrl.map(_.openStream()).fold(sys.error, identity)
+      val is = file.toJavaUrl.map(_.openStream()).fold(sys.error, identity)
       val str1 = OdfExtract.get(is).fold(throw _, identity)
       assertEquals(str1.length, len)
 
diff --git a/modules/extract/src/test/scala/docspell/extract/pdfbox/PdfboxExtractTest.scala b/modules/extract/src/test/scala/docspell/extract/pdfbox/PdfboxExtractTest.scala
index 64c4b080..1e46bf69 100644
--- a/modules/extract/src/test/scala/docspell/extract/pdfbox/PdfboxExtractTest.scala
+++ b/modules/extract/src/test/scala/docspell/extract/pdfbox/PdfboxExtractTest.scala
@@ -22,20 +22,20 @@ class PdfboxExtractTest extends FunSuite {
 
   test("extract text from text PDFs by inputstream") {
     textPDFs.foreach { case (file, txt) =>
-      val url      = file.toJavaUrl.fold(sys.error, identity)
-      val str      = PdfboxExtract.getText(url.openStream()).fold(throw _, identity)
+      val url = file.toJavaUrl.fold(sys.error, identity)
+      val str = PdfboxExtract.getText(url.openStream()).fold(throw _, identity)
       val received = removeFormatting(str.value)
-      val expect   = removeFormatting(txt)
+      val expect = removeFormatting(txt)
       assertEquals(received, expect)
     }
   }
 
   test("extract text from text PDFs via Stream") {
     textPDFs.foreach { case (file, txt) =>
-      val data     = file.readURL[IO](8192)
-      val str      = PdfboxExtract.getText(data).unsafeRunSync().fold(throw _, identity)
+      val data = file.readURL[IO](8192)
+      val str = PdfboxExtract.getText(data).unsafeRunSync().fold(throw _, identity)
       val received = removeFormatting(str.value)
-      val expect   = removeFormatting(txt)
+      val expect = removeFormatting(txt)
       assertEquals(received, expect)
     }
   }
diff --git a/modules/extract/src/test/scala/docspell/extract/poi/PoiExtractTest.scala b/modules/extract/src/test/scala/docspell/extract/poi/PoiExtractTest.scala
index cb945a84..52ef15e5 100644
--- a/modules/extract/src/test/scala/docspell/extract/poi/PoiExtractTest.scala
+++ b/modules/extract/src/test/scala/docspell/extract/poi/PoiExtractTest.scala
@@ -17,10 +17,10 @@ import munit._
 class PoiExtractTest extends FunSuite {
 
   val officeFiles = List(
-    ExampleFiles.examples_sample_doc  -> 6241,
+    ExampleFiles.examples_sample_doc -> 6241,
     ExampleFiles.examples_sample_docx -> 6179,
     ExampleFiles.examples_sample_xlsx -> 660,
-    ExampleFiles.examples_sample_xls  -> 660
+    ExampleFiles.examples_sample_xls -> 660
   )
 
   test("extract text from ms office files") {
diff --git a/modules/extract/src/test/scala/docspell/extract/rtf/RtfExtractTest.scala b/modules/extract/src/test/scala/docspell/extract/rtf/RtfExtractTest.scala
index be15c5dc..b277e29e 100644
--- a/modules/extract/src/test/scala/docspell/extract/rtf/RtfExtractTest.scala
+++ b/modules/extract/src/test/scala/docspell/extract/rtf/RtfExtractTest.scala
@@ -14,8 +14,8 @@ class RtfExtractTest extends FunSuite {
 
   test("extract text from rtf using java input-stream") {
     val file = ExampleFiles.examples_sample_rtf
-    val is   = file.toJavaUrl.map(_.openStream()).fold(sys.error, identity)
-    val str  = RtfExtract.get(is).fold(throw _, identity)
+    val is = file.toJavaUrl.map(_.openStream()).fold(sys.error, identity)
+    val str = RtfExtract.get(is).fold(throw _, identity)
     assertEquals(str.length, 7342)
   }
 }
diff --git a/modules/files/src/main/scala/docspell/files/ImageSize.scala b/modules/files/src/main/scala/docspell/files/ImageSize.scala
index 3c929c7c..a671067c 100644
--- a/modules/files/src/main/scala/docspell/files/ImageSize.scala
+++ b/modules/files/src/main/scala/docspell/files/ImageSize.scala
@@ -56,7 +56,7 @@ object ImageSize {
   ): Either[Throwable, Dimension] =
     Try {
       reader.setInput(in)
-      val width  = reader.getWidth(reader.getMinIndex)
+      val width = reader.getWidth(reader.getMinIndex)
       val height = reader.getHeight(reader.getMinIndex)
       Dimension(width, height)
     }.toEither
diff --git a/modules/files/src/main/scala/docspell/files/TikaMimetype.scala b/modules/files/src/main/scala/docspell/files/TikaMimetype.scala
index 2eb9f3ce..7c0be3e5 100644
--- a/modules/files/src/main/scala/docspell/files/TikaMimetype.scala
+++ b/modules/files/src/main/scala/docspell/files/TikaMimetype.scala
@@ -31,9 +31,9 @@ object TikaMimetype {
   private def convert(mt: MediaType): MimeType =
     Option(mt) match {
       case Some(_) =>
-        val params  = mt.getParameters.asScala.toMap
+        val params = mt.getParameters.asScala.toMap
         val primary = mt.getType
-        val sub     = mt.getSubtype
+        val sub = mt.getSubtype
         normalize(MimeType(primary, sub, params))
       case None =>
         MimeType.octetStream
diff --git a/modules/files/src/test/scala/docspell/files/ImageSizeTest.scala b/modules/files/src/test/scala/docspell/files/ImageSizeTest.scala
index 6d13d170..3f88b01d 100644
--- a/modules/files/src/test/scala/docspell/files/ImageSizeTest.scala
+++ b/modules/files/src/test/scala/docspell/files/ImageSizeTest.scala
@@ -22,11 +22,11 @@ class ImageSizeTest extends FunSuite {
     ExampleFiles.camera_letter_en_jpg -> Dimension(1695, 2378),
     ExampleFiles.camera_letter_en_png -> Dimension(1695, 2378),
 //    ExampleFiles.camera_letter_en_tiff -> Dimension(1695, 2378),
-    ExampleFiles.scanner_jfif_jpg    -> Dimension(2480, 3514),
+    ExampleFiles.scanner_jfif_jpg -> Dimension(2480, 3514),
     ExampleFiles.bombs_20K_gray_jpeg -> Dimension(20000, 20000),
-    ExampleFiles.bombs_20K_gray_png  -> Dimension(20000, 20000),
-    ExampleFiles.bombs_20K_rgb_jpeg  -> Dimension(20000, 20000),
-    ExampleFiles.bombs_20K_rgb_png   -> Dimension(20000, 20000)
+    ExampleFiles.bombs_20K_gray_png -> Dimension(20000, 20000),
+    ExampleFiles.bombs_20K_rgb_jpeg -> Dimension(20000, 20000),
+    ExampleFiles.bombs_20K_rgb_png -> Dimension(20000, 20000)
   )
 
   test("get sizes from input-stream") {
@@ -42,7 +42,7 @@ class ImageSizeTest extends FunSuite {
   test("get sizes from stream") {
     files.foreach { case (uri, expect) =>
       val stream = uri.readURL[IO](8192)
-      val dim    = ImageSize.get(stream).unsafeRunSync()
+      val dim = ImageSize.get(stream).unsafeRunSync()
       assertEquals(dim, expect.some)
     }
   }
diff --git a/modules/files/src/test/scala/docspell/files/ZipTest.scala b/modules/files/src/test/scala/docspell/files/ZipTest.scala
index 6eca25cb..6012e1c2 100644
--- a/modules/files/src/test/scala/docspell/files/ZipTest.scala
+++ b/modules/files/src/test/scala/docspell/files/ZipTest.scala
@@ -18,7 +18,7 @@ class ZipTest extends FunSuite {
 
   test("unzip") {
     val zipFile = ExampleFiles.letters_zip.readURL[IO](8192)
-    val uncomp  = zipFile.through(Zip.unzip(8192, Glob.all))
+    val uncomp = zipFile.through(Zip.unzip(8192, Glob.all))
 
     uncomp
       .evalMap { entry =>
diff --git a/modules/fts-client/src/main/scala/docspell/ftsclient/FtsMigration.scala b/modules/fts-client/src/main/scala/docspell/ftsclient/FtsMigration.scala
index bc451031..a5f7b9af 100644
--- a/modules/fts-client/src/main/scala/docspell/ftsclient/FtsMigration.scala
+++ b/modules/fts-client/src/main/scala/docspell/ftsclient/FtsMigration.scala
@@ -28,12 +28,12 @@ object FtsMigration {
 
   sealed trait Result
   object Result {
-    case object WorkDone   extends Result
+    case object WorkDone extends Result
     case object ReIndexAll extends Result
-    case object IndexAll   extends Result
+    case object IndexAll extends Result
 
-    def workDone: Result   = WorkDone
+    def workDone: Result = WorkDone
     def reIndexAll: Result = ReIndexAll
-    def indexAll: Result   = IndexAll
+    def indexAll: Result = IndexAll
   }
 }
diff --git a/modules/fts-client/src/main/scala/docspell/ftsclient/FtsResult.scala b/modules/fts-client/src/main/scala/docspell/ftsclient/FtsResult.scala
index fb9f84fa..8af09caf 100644
--- a/modules/fts-client/src/main/scala/docspell/ftsclient/FtsResult.scala
+++ b/modules/fts-client/src/main/scala/docspell/ftsclient/FtsResult.scala
@@ -24,7 +24,7 @@ object FtsResult {
 
   sealed trait MatchData
   case class AttachmentData(attachId: Ident, attachName: String) extends MatchData
-  case object ItemData                                           extends MatchData
+  case object ItemData extends MatchData
 
   case class ItemMatch(
       id: Ident,
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/Field.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/Field.scala
index 4bbee49b..2b960671 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/Field.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/Field.scala
@@ -20,19 +20,19 @@ object Field {
   def apply(name: String): Field =
     new Field(name)
 
-  val id             = Field("id")
-  val itemId         = Field("itemId")
-  val collectiveId   = Field("collectiveId")
-  val attachmentId   = Field("attachmentId")
-  val discriminator  = Field("discriminator")
+  val id = Field("id")
+  val itemId = Field("itemId")
+  val collectiveId = Field("collectiveId")
+  val attachmentId = Field("attachmentId")
+  val discriminator = Field("discriminator")
   val attachmentName = Field("attachmentName")
-  val content        = Field("content")
-  val content_de     = contentField(Language.German)
-  val content_en     = contentField(Language.English)
-  val content_fr     = contentField(Language.French)
-  val itemName       = Field("itemName")
-  val itemNotes      = Field("itemNotes")
-  val folderId       = Field("folder")
+  val content = Field("content")
+  val content_de = contentField(Language.German)
+  val content_en = contentField(Language.English)
+  val content_fr = contentField(Language.French)
+  val itemName = Field("itemName")
+  val itemNotes = Field("itemNotes")
+  val folderId = Field("folder")
 
   val contentLangFields = Language.all
     .map(contentField)
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/JsonCodec.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/JsonCodec.scala
index 7ab3644e..31c093d9 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/JsonCodec.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/JsonCodec.scala
@@ -77,7 +77,7 @@ trait JsonCodec {
     new Decoder[VersionDoc] {
       final def apply(c: HCursor): Decoder.Result[VersionDoc] =
         for {
-          id      <- c.get[String](VersionDoc.Fields.id.name)
+          id <- c.get[String](VersionDoc.Fields.id.name)
           version <- c.get[Int](VersionDoc.Fields.currentVersion.name)
         } yield VersionDoc(id, version)
     }
@@ -106,10 +106,10 @@ trait JsonCodec {
     new Decoder[FtsResult] {
       final def apply(c: HCursor): Decoder.Result[FtsResult] =
         for {
-          qtime       <- c.downField("responseHeader").get[Duration]("QTime")
-          count       <- c.downField("response").get[Int]("numFound")
-          maxScore    <- c.downField("response").get[Double]("maxScore")
-          results     <- c.downField("response").get[List[FtsResult.ItemMatch]]("docs")
+          qtime <- c.downField("responseHeader").get[Duration]("QTime")
+          count <- c.downField("response").get[Int]("numFound")
+          maxScore <- c.downField("response").get[Double]("maxScore")
+          results <- c.downField("response").get[List[FtsResult.ItemMatch]]("docs")
           highlightng <- c.get[Map[Ident, Map[String, List[String]]]]("highlighting")
           highlight = highlightng.map(kv => kv._1 -> kv._2.values.flatten.toList)
         } yield FtsResult(qtime, count, maxScore, highlight, results)
@@ -120,10 +120,10 @@ trait JsonCodec {
       final def apply(c: HCursor): Decoder.Result[FtsResult.ItemMatch] =
         for {
           itemId <- c.get[Ident](Field.itemId.name)
-          id     <- c.get[Ident](Field.id.name)
-          coll   <- c.get[Ident](Field.collectiveId.name)
-          score  <- c.get[Double]("score")
-          md     <- decodeMatchData(c)
+          id <- c.get[Ident](Field.id.name)
+          coll <- c.get[Ident](Field.collectiveId.name)
+          score <- c.get[Double]("score")
+          md <- decodeMatchData(c)
         } yield FtsResult.ItemMatch(id, itemId, coll, score, md)
     }
 
@@ -135,7 +135,7 @@ trait JsonCodec {
           md <-
             if ("attachment" == disc)
               for {
-                aId   <- c.get[Ident](Field.attachmentId.name)
+                aId <- c.get[Ident](Field.attachmentId.name)
                 aName <- c.get[String](Field.attachmentName.name)
               } yield FtsResult.AttachmentData(aId, aName)
             else Right(FtsResult.ItemData)
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/QueryData.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/QueryData.scala
index f20b0364..ab618070 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/QueryData.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/QueryData.scala
@@ -26,11 +26,11 @@ final case class QueryData(
   def withHighLight(fields: List[Field], pre: String, post: String): QueryData =
     copy(params =
       params ++ Map(
-        "hl"                   -> "on",
+        "hl" -> "on",
         "hl.requireFieldMatch" -> "true",
-        "hl.fl"                -> fields.map(_.name).mkString(","),
-        "hl.simple.pre"        -> pre,
-        "hl.simple.post"       -> post
+        "hl.fl" -> fields.map(_.name).mkString(","),
+        "hl.simple.pre" -> pre,
+        "hl.simple.post" -> post
       )
     )
 }
@@ -46,9 +46,9 @@ object QueryData {
       fields: List[Field],
       fq: FtsQuery
   ): QueryData = {
-    val q       = sanitize(fq.q)
-    val extQ    = search.map(f => s"${f.name}:($q)").mkString(" OR ")
-    val items   = fq.items.map(_.id).mkString(" ")
+    val q = sanitize(fq.q)
+    val extQ = search.map(f => s"${f.name}:($q)").mkString(" OR ")
+    val items = fq.items.map(_.id).mkString(" ")
     val folders = fq.folders.map(_.id).mkString(" ")
     val filterQ = List(
       s"""${Field.collectiveId.name}:"${fq.collective.id}"""",
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrFtsClient.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrFtsClient.scala
index a4b5f7dd..75316900 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrFtsClient.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrFtsClient.scala
@@ -53,9 +53,9 @@ final class SolrFtsClient[F[_]: Async](
       f: List[TextData] => F[Unit]
   ): F[Unit] =
     (for {
-      _      <- Stream.eval(logger.debug("Updating SOLR index"))
+      _ <- Stream.eval(logger.debug("Updating SOLR index"))
       chunks <- data.chunks
-      res    <- Stream.eval(f(chunks.toList).attempt)
+      res <- Stream.eval(f(chunks.toList).attempt)
       _ <- res match {
         case Right(()) => Stream.emit(())
         case Left(ex) =>
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrQuery.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrQuery.scala
index d75e96d1..183a626e 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrQuery.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrQuery.scala
@@ -69,7 +69,7 @@ object SolrQuery {
           Field("current_version_i")
         )
         val query = QueryData(s"id:$id", "", 1, 0, fields, Map.empty)
-        val req   = Method.POST(query.asJson, url)
+        val req = Method.POST(query.asJson, url)
         client.expect[Option[VersionDoc]](req)
       }
     }
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrSetup.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrSetup.scala
index b59375a0..1abf0cce 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrSetup.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrSetup.scala
@@ -60,8 +60,8 @@ object SolrSetup {
         val verDoc = VersionDoc(versionDocId, allMigrations.map(_.value.version).max)
         val solrUp = SolrUpdate(cfg, client)
         val writeVersion = SolrMigration.writeVersion(solrUp, verDoc)
-        val deleteAll    = SolrMigration.deleteData(0, solrUp)
-        val indexAll     = SolrMigration.indexAll[F](Int.MaxValue, "Index all data")
+        val deleteAll = SolrMigration.deleteData(0, solrUp)
+        val indexAll = SolrMigration.indexAll[F](Int.MaxValue, "Index all data")
 
         deleteAll :: (allMigrations
           .filter(_.isSchemaChange) ::: List(indexAll, writeVersion))
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrUpdate.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrUpdate.scala
index 5cbea0b9..336aa473 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrUpdate.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/SolrUpdate.scala
@@ -79,7 +79,7 @@ object SolrUpdate {
         for {
           docIds <- client.expect[DocIdResult](searchReq)
           sets = docIds.toSetFolder(folder)
-          req  = Method.POST(sets.asJson, url)
+          req = Method.POST(sets.asJson, url)
           _ <- client.expect[Unit](req)
         } yield ()
       }
diff --git a/modules/fts-solr/src/main/scala/docspell/ftssolr/VersionDoc.scala b/modules/fts-solr/src/main/scala/docspell/ftssolr/VersionDoc.scala
index d4406299..4cf6b781 100644
--- a/modules/fts-solr/src/main/scala/docspell/ftssolr/VersionDoc.scala
+++ b/modules/fts-solr/src/main/scala/docspell/ftssolr/VersionDoc.scala
@@ -11,7 +11,7 @@ final case class VersionDoc(id: String, currentVersion: Int)
 object VersionDoc {
 
   object Fields {
-    val id             = Field("id")
+    val id = Field("id")
     val currentVersion = Field("current_version_i")
   }
 }
diff --git a/modules/joex/src/main/scala/docspell/joex/JoexAppImpl.scala b/modules/joex/src/main/scala/docspell/joex/JoexAppImpl.scala
index 8f241245..0f13bab4 100644
--- a/modules/joex/src/main/scala/docspell/joex/JoexAppImpl.scala
+++ b/modules/joex/src/main/scala/docspell/joex/JoexAppImpl.scala
@@ -56,7 +56,7 @@ final class JoexAppImpl[F[_]: Async](
 ) extends JoexApp[F] {
 
   def init: F[Unit] = {
-    val run  = scheduler.start.compile.drain
+    val run = scheduler.start.compile.drain
     val prun = periodicScheduler.start.compile.drain
     for {
       _ <- scheduleBackgroundTasks
@@ -122,19 +122,19 @@ object JoexAppImpl {
     for {
       httpClient <- BlazeClientBuilder[F](clientEC).resource
       client = JoexClient(httpClient)
-      store         <- Store.create(cfg.jdbc, cfg.files.chunkSize, connectEC)
-      queue         <- JobQueue(store)
-      pstore        <- PeriodicTaskStore.create(store)
-      nodeOps       <- ONode(store)
-      joex          <- OJoex(client, store)
-      upload        <- OUpload(store, queue, joex)
-      fts           <- createFtsClient(cfg)(httpClient)
-      createIndex   <- CreateIndex.resource(fts, store)
-      itemOps       <- OItem(store, fts, createIndex, queue, joex)
+      store <- Store.create(cfg.jdbc, cfg.files.chunkSize, connectEC)
+      queue <- JobQueue(store)
+      pstore <- PeriodicTaskStore.create(store)
+      nodeOps <- ONode(store)
+      joex <- OJoex(client, store)
+      upload <- OUpload(store, queue, joex)
+      fts <- createFtsClient(cfg)(httpClient)
+      createIndex <- CreateIndex.resource(fts, store)
+      itemOps <- OItem(store, fts, createIndex, queue, joex)
       itemSearchOps <- OItemSearch(store)
-      analyser      <- TextAnalyser.create[F](cfg.textAnalysis.textAnalysisConfig)
-      regexNer      <- RegexNerFile(cfg.textAnalysis.regexNerFileConfig, store)
-      updateCheck   <- UpdateCheck.resource(httpClient)
+      analyser <- TextAnalyser.create[F](cfg.textAnalysis.textAnalysisConfig)
+      regexNer <- RegexNerFile(cfg.textAnalysis.regexNerFileConfig, store)
+      updateCheck <- UpdateCheck.resource(httpClient)
       javaEmil =
         JavaMailEmil(Settings.defaultSettings.copy(debug = cfg.mailDebug))
       sch <- SchedulerBuilder(cfg.scheduler, store)
diff --git a/modules/joex/src/main/scala/docspell/joex/JoexServer.scala b/modules/joex/src/main/scala/docspell/joex/JoexServer.scala
index ae6b62df..202c830f 100644
--- a/modules/joex/src/main/scala/docspell/joex/JoexServer.scala
+++ b/modules/joex/src/main/scala/docspell/joex/JoexServer.scala
@@ -31,7 +31,7 @@ object JoexServer {
   def stream[F[_]: Async](cfg: Config, pools: Pools): Stream[F, Nothing] = {
 
     val app = for {
-      signal   <- Resource.eval(SignallingRef[F, Boolean](false))
+      signal <- Resource.eval(SignallingRef[F, Boolean](false))
       exitCode <- Resource.eval(Ref[F].of(ExitCode.Success))
       joexApp <-
         JoexAppImpl
@@ -39,7 +39,7 @@ object JoexServer {
 
       httpApp = Router(
         "/api/info" -> InfoRoutes(cfg),
-        "/api/v1"   -> JoexRoutes(joexApp)
+        "/api/v1" -> JoexRoutes(joexApp)
       ).orNotFound
 
       // With Middlewares in place
diff --git a/modules/joex/src/main/scala/docspell/joex/analysis/RegexNerFile.scala b/modules/joex/src/main/scala/docspell/joex/analysis/RegexNerFile.scala
index 89c50425..6a816b90 100644
--- a/modules/joex/src/main/scala/docspell/joex/analysis/RegexNerFile.scala
+++ b/modules/joex/src/main/scala/docspell/joex/analysis/RegexNerFile.scala
@@ -22,8 +22,7 @@ import docspell.store.records.RPerson
 import io.circe.syntax._
 import org.log4s.getLogger
 
-/** Maintains a custom regex-ner file per collective for stanford's regexner annotator.
-  */
+/** Maintains a custom regex-ner file per collective for stanford's regexner annotator. */
 trait RegexNerFile[F[_]] {
 
   def makeFile(collective: Ident): F[Option[Path]]
@@ -40,7 +39,7 @@ object RegexNerFile {
       store: Store[F]
   ): Resource[F, RegexNerFile[F]] =
     for {
-      dir    <- File.withTempDir[F](cfg.directory, "regexner-")
+      dir <- File.withTempDir[F](cfg.directory, "regexner-")
       writer <- Resource.eval(Semaphore(1))
     } yield new Impl[F](cfg.copy(directory = dir), store, writer)
 
@@ -56,7 +55,7 @@ object RegexNerFile {
 
     def doMakeFile(collective: Ident): F[Option[Path]] =
       for {
-        now      <- Timestamp.current[F]
+        now <- Timestamp.current[F]
         existing <- NerFile.find[F](collective, cfg.directory)
         result <- existing match {
           case Some(nf) =>
diff --git a/modules/joex/src/main/scala/docspell/joex/emptytrash/EmptyTrashTask.scala b/modules/joex/src/main/scala/docspell/joex/emptytrash/EmptyTrashTask.scala
index 51eeb017..5b1cbd3f 100644
--- a/modules/joex/src/main/scala/docspell/joex/emptytrash/EmptyTrashTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/emptytrash/EmptyTrashTask.scala
@@ -48,7 +48,7 @@ object EmptyTrashTask {
           s"Starting removing all soft-deleted items older than ${maxDate.asString}"
         )
         nDeleted <- deleteAll(ctx.args, maxDate, itemOps, itemSearchOps, ctx)
-        _        <- ctx.logger.info(s"Finished deleting $nDeleted items")
+        _ <- ctx.logger.info(s"Finished deleting $nDeleted items")
       } yield ()
     }
 
diff --git a/modules/joex/src/main/scala/docspell/joex/fts/MigrationTask.scala b/modules/joex/src/main/scala/docspell/joex/fts/MigrationTask.scala
index 54d34e75..dee2fc1f 100644
--- a/modules/joex/src/main/scala/docspell/joex/fts/MigrationTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/fts/MigrationTask.scala
@@ -30,7 +30,7 @@ object MigrationTask {
         Task(ctx =>
           for {
             migs <- migrationTasks[F](fts)
-            res  <- Migration[F](cfg, fts, ctx.store, createIndex, ctx.logger).run(migs)
+            res <- Migration[F](cfg, fts, ctx.store, createIndex, ctx.logger).run(migs)
           } yield res
         )
       )
@@ -40,7 +40,7 @@ object MigrationTask {
 
   def job[F[_]: Sync]: F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
     } yield RJob.newJob(
       id,
diff --git a/modules/joex/src/main/scala/docspell/joex/fts/ReIndexTask.scala b/modules/joex/src/main/scala/docspell/joex/fts/ReIndexTask.scala
index e53872d3..37c1326b 100644
--- a/modules/joex/src/main/scala/docspell/joex/fts/ReIndexTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/fts/ReIndexTask.scala
@@ -19,7 +19,7 @@ object ReIndexTask {
   type Args = ReIndexTaskArgs
 
   val taskName = ReIndexTaskArgs.taskName
-  val tracker  = DocspellSystem.migrationTaskTracker
+  val tracker = DocspellSystem.migrationTaskTracker
 
   def apply[F[_]: Async](
       cfg: Config.FullTextSearch,
diff --git a/modules/joex/src/main/scala/docspell/joex/fts/package.scala b/modules/joex/src/main/scala/docspell/joex/fts/package.scala
index 75ed77a2..3ae39817 100644
--- a/modules/joex/src/main/scala/docspell/joex/fts/package.scala
+++ b/modules/joex/src/main/scala/docspell/joex/fts/package.scala
@@ -10,8 +10,7 @@ import cats.data.Kleisli
 
 package object fts {
 
-  /** Some work that must be done to advance the schema of the fulltext index.
-    */
+  /** Some work that must be done to advance the schema of the fulltext index. */
   type FtsWork[F[_]] = Kleisli[F, FtsContext[F], Unit]
 
 }
diff --git a/modules/joex/src/main/scala/docspell/joex/notify/NotifyDueItemsTask.scala b/modules/joex/src/main/scala/docspell/joex/notify/NotifyDueItemsTask.scala
index 7af7a9db..508e40cc 100644
--- a/modules/joex/src/main/scala/docspell/joex/notify/NotifyDueItemsTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/notify/NotifyDueItemsTask.scala
@@ -32,7 +32,7 @@ object NotifyDueItemsTask {
   def apply[F[_]: Sync](cfg: MailSendConfig, emil: Emil[F]): Task[F, Args, Unit] =
     Task { ctx =>
       for {
-        _       <- ctx.logger.info("Getting mail configuration")
+        _ <- ctx.logger.info("Getting mail configuration")
         mailCfg <- getMailSettings(ctx)
         _ <- ctx.logger.info(
           s"Searching for items due in ${ctx.args.remindDays} days…."
@@ -42,7 +42,7 @@ object NotifyDueItemsTask {
             for {
               _ <- ctx.logger.info(s"Sending notification mail to ${ctx.args.recipients}")
               res <- emil(mailCfg.toMailConfig).send(mail).map(_.head)
-              _   <- ctx.logger.info(s"Sent mail with id: $res")
+              _ <- ctx.logger.info(s"Sent mail with id: $res")
             } yield ()
           }
           .getOrElseF(ctx.logger.info("No items found"))
@@ -72,7 +72,7 @@ object NotifyDueItemsTask {
   ): OptionT[F, Mail[F]] =
     for {
       items <- OptionT.liftF(findItems(ctx)).filter(_.nonEmpty)
-      mail  <- OptionT.liftF(makeMail(sendCfg, cfg, ctx.args, items))
+      mail <- OptionT.liftF(makeMail(sendCfg, cfg, ctx.args, items))
     } yield mail
 
   def findItems[F[_]: Sync](ctx: Context[F, Args]): F[Vector[ListItem]] =
diff --git a/modules/joex/src/main/scala/docspell/joex/pagecount/AllPageCountTask.scala b/modules/joex/src/main/scala/docspell/joex/pagecount/AllPageCountTask.scala
index dd790356..c882d582 100644
--- a/modules/joex/src/main/scala/docspell/joex/pagecount/AllPageCountTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/pagecount/AllPageCountTask.scala
@@ -64,7 +64,7 @@ object AllPageCountTask {
 
   def job[F[_]: Sync]: F[RJob] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
     } yield RJob.newJob(
       id,
diff --git a/modules/joex/src/main/scala/docspell/joex/pdfconv/ConvertAllPdfTask.scala b/modules/joex/src/main/scala/docspell/joex/pdfconv/ConvertAllPdfTask.scala
index 01bf7d22..1df9fcf4 100644
--- a/modules/joex/src/main/scala/docspell/joex/pdfconv/ConvertAllPdfTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/pdfconv/ConvertAllPdfTask.scala
@@ -58,7 +58,7 @@ object ConvertAllPdfTask {
 
     def mkJob(ra: RAttachment): F[RJob] =
       for {
-        id  <- Ident.randomId[F]
+        id <- Ident.randomId[F]
         now <- Timestamp.current[F]
       } yield RJob.newJob(
         id,
diff --git a/modules/joex/src/main/scala/docspell/joex/pdfconv/PdfConvTask.scala b/modules/joex/src/main/scala/docspell/joex/pdfconv/PdfConvTask.scala
index c1f9752a..e3c43c7e 100644
--- a/modules/joex/src/main/scala/docspell/joex/pdfconv/PdfConvTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/pdfconv/PdfConvTask.scala
@@ -39,9 +39,9 @@ object PdfConvTask {
   def apply[F[_]: Async](cfg: Config): Task[F, Args, Unit] =
     Task { ctx =>
       for {
-        _    <- ctx.logger.info(s"Converting pdf file ${ctx.args} using ocrmypdf")
+        _ <- ctx.logger.info(s"Converting pdf file ${ctx.args} using ocrmypdf")
         meta <- checkInputs(cfg, ctx)
-        _    <- meta.traverse(fm => convert(cfg, ctx, fm))
+        _ <- meta.traverse(fm => convert(cfg, ctx, fm))
       } yield ()
     }
 
@@ -92,7 +92,7 @@ object PdfConvTask {
       ctx: Context[F, Args],
       in: RFileMeta
   ): F[Unit] = {
-    val fs   = ctx.store.fileStore
+    val fs = ctx.store.fileStore
     val data = fs.getBytes(in.id)
 
     val storeResult: ConversionResult.Handler[F, Unit] =
@@ -125,7 +125,7 @@ object PdfConvTask {
 
     for {
       lang <- getLanguage(ctx)
-      _    <- ocrMyPdf(lang)
+      _ <- ocrMyPdf(lang)
     } yield ()
   }
 
diff --git a/modules/joex/src/main/scala/docspell/joex/preview/MakePreviewTask.scala b/modules/joex/src/main/scala/docspell/joex/preview/MakePreviewTask.scala
index 55b801e7..14bf18f3 100644
--- a/modules/joex/src/main/scala/docspell/joex/preview/MakePreviewTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/preview/MakePreviewTask.scala
@@ -25,7 +25,7 @@ object MakePreviewTask {
   def apply[F[_]: Sync](pcfg: PreviewConfig): Task[F, Args, Unit] =
     Task { ctx =>
       for {
-        exists  <- previewExists(ctx)
+        exists <- previewExists(ctx)
         preview <- PdfboxPreview(pcfg)
         _ <-
           if (exists)
diff --git a/modules/joex/src/main/scala/docspell/joex/process/ConvertPdf.scala b/modules/joex/src/main/scala/docspell/joex/process/ConvertPdf.scala
index 35a14c7f..44e2613f 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/ConvertPdf.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/ConvertPdf.scala
@@ -80,7 +80,7 @@ object ConvertPdf {
     Conversion.create[F](cfg, sanitizeHtml, ctx.logger).use { conv =>
       mime match {
         case mt =>
-          val data    = ctx.store.fileStore.getBytes(ra.fileId)
+          val data = ctx.store.fileStore.getBytes(ra.fileId)
           val handler = conversionHandler[F](ctx, cfg, ra, item)
           ctx.logger.info(s"Converting file ${ra.name} (${mime.asString}) into a PDF") *>
             conv.toPDF(DataType(mt), ctx.args.meta.language, handler)(
diff --git a/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala b/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala
index df18aef0..a83788d8 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/CreateItem.scala
@@ -17,8 +17,7 @@ import docspell.joex.scheduler.{Context, Task}
 import docspell.store.queries.QItem
 import docspell.store.records._
 
-/** Task that creates the item.
-  */
+/** Task that creates the item. */
 object CreateItem {
 
   def apply[F[_]: Sync]: Task[F, ProcessItemArgs, ItemData] =
@@ -96,14 +95,14 @@ object CreateItem {
 
       for {
         time <- Duration.stopTime[F]
-        it   <- loadItemOrInsertNew
-        _    <- if (it._1 != 1) storeItemError[F](ctx) else ().pure[F]
-        now  <- Timestamp.current[F]
-        fm   <- fileMetas(it._2.id, now)
-        k    <- fm.traverse(insertAttachment(ctx))
-        _    <- logDifferences(ctx, fm, k.sum)
-        dur  <- time
-        _    <- ctx.logger.info(s"Creating item finished in ${dur.formatExact}")
+        it <- loadItemOrInsertNew
+        _ <- if (it._1 != 1) storeItemError[F](ctx) else ().pure[F]
+        now <- Timestamp.current[F]
+        fm <- fileMetas(it._2.id, now)
+        k <- fm.traverse(insertAttachment(ctx))
+        _ <- logDifferences(ctx, fm, k.sum)
+        dur <- time
+        _ <- ctx.logger.info(s"Creating item finished in ${dur.formatExact}")
       } yield ItemData(
         it._2,
         fm,
@@ -127,7 +126,7 @@ object CreateItem {
 
   private def findExisting[F[_]: Sync]: Task[F, ProcessItemArgs, Option[ItemData]] =
     Task { ctx =>
-      val states      = ItemState.invalidStates
+      val states = ItemState.invalidStates
       val fileMetaIds = ctx.args.files.map(_.fileMetaId).toSet
       for {
         cand <- ctx.store.transact(QItem.findByFileIds(fileMetaIds.toSeq, states))
diff --git a/modules/joex/src/main/scala/docspell/joex/process/CrossCheckProposals.scala b/modules/joex/src/main/scala/docspell/joex/process/CrossCheckProposals.scala
index b766ca57..cccd2b90 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/CrossCheckProposals.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/CrossCheckProposals.scala
@@ -24,9 +24,9 @@ object CrossCheckProposals {
   def apply[F[_]: Sync](data: ItemData): Task[F, ProcessItemArgs, ItemData] =
     Task { ctx =>
       val proposals = data.finalProposals
-      val corrOrg   = proposals.find(MetaProposalType.CorrOrg)
+      val corrOrg = proposals.find(MetaProposalType.CorrOrg)
       (for {
-        orgRef   <- OptionT.fromOption[F](corrOrg)
+        orgRef <- OptionT.fromOption[F](corrOrg)
         persRefs <- OptionT.liftF(EvalProposals.findOrganizationRelation(data, ctx))
         clProps <- OptionT.liftF(
           personOrgCheck[F](ctx.logger, data.classifyProposals, persRefs)(orgRef)
diff --git a/modules/joex/src/main/scala/docspell/joex/process/DuplicateCheck.scala b/modules/joex/src/main/scala/docspell/joex/process/DuplicateCheck.scala
index fd617c28..31b2dfac 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/DuplicateCheck.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/DuplicateCheck.scala
@@ -36,7 +36,7 @@ object DuplicateCheck {
   def removeDuplicates[F[_]: Sync](ctx: Context[F, Args]): F[ProcessItemArgs] =
     for {
       fileMetas <- findDuplicates(ctx)
-      _         <- fileMetas.traverse(deleteDuplicate(ctx))
+      _ <- fileMetas.traverse(deleteDuplicate(ctx))
       ids = fileMetas.filter(_.exists).map(_.fm.id).toSet
     } yield ctx.args.copy(files =
       ctx.args.files.filterNot(f => ids.contains(f.fileMetaId))
@@ -61,7 +61,7 @@ object DuplicateCheck {
   ): F[Vector[FileMetaDupes]] =
     ctx.store.transact(for {
       fileMetas <- RFileMeta.findByIds(ctx.args.files.map(_.fileMetaId))
-      dupes     <- fileMetas.traverse(checkDuplicate(ctx))
+      dupes <- fileMetas.traverse(checkDuplicate(ctx))
     } yield dupes)
 
   private def checkDuplicate[F[_]](
diff --git a/modules/joex/src/main/scala/docspell/joex/process/EvalProposals.scala b/modules/joex/src/main/scala/docspell/joex/process/EvalProposals.scala
index bf9df2a1..9ef2ca4e 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/EvalProposals.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/EvalProposals.scala
@@ -22,7 +22,7 @@ object EvalProposals {
   def apply[F[_]: Sync](data: ItemData): Task[F, ProcessItemArgs, ItemData] =
     Task { ctx =>
       for {
-        now        <- Timestamp.current[F]
+        now <- Timestamp.current[F]
         personRefs <- findOrganizationRelation[F](data, ctx)
         metas = data.metas.map(calcCandidateWeight(now.toUtcDate, personRefs))
       } yield data.copy(metas = metas)
@@ -71,10 +71,10 @@ object EvalProposals {
           }
           .getOrElse(2000.0)
       case _ =>
-        val textLen  = rm.content.map(_.length).getOrElse(0)
+        val textLen = rm.content.map(_.length).getOrElse(0)
         val tagCount = cand.origin.size.toDouble
-        val pos      = cand.origin.map(_.startPosition).min
-        val words    = cand.origin.map(_.label.split(' ').length).max.toDouble
+        val pos = cand.origin.map(_.startPosition).min
+        val words = cand.origin.map(_.label.split(' ').length).max.toDouble
         val nerFac =
           cand.origin.map(label => nerTagFactor(label.tag, mp.proposalType)).min
         val corrPerFac = corrOrgPersonFactor(rm, mp, personRefs, cand)
diff --git a/modules/joex/src/main/scala/docspell/joex/process/ExtractArchive.scala b/modules/joex/src/main/scala/docspell/joex/process/ExtractArchive.scala
index 5844a3fa..81e2df4c 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/ExtractArchive.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/ExtractArchive.scala
@@ -136,7 +136,7 @@ object ExtractArchive {
       archive: Option[RAttachmentArchive]
   )(ra: RAttachment, pos: Int): F[Extracted] = {
     val zipData = ctx.store.fileStore.getBytes(ra.fileId)
-    val glob    = ctx.args.meta.fileFilter.getOrElse(Glob.all)
+    val glob = ctx.args.meta.fileFilter.getOrElse(Glob.all)
     ctx.logger.debug(s"Filtering zip entries with '${glob.asString}'") *>
       zipData
         .through(Zip.unzipP[F](8192, glob))
@@ -153,7 +153,7 @@ object ExtractArchive {
   )(ra: RAttachment, pos: Int): F[Extracted] = {
     val email: Stream[F, Byte] = ctx.store.fileStore.getBytes(ra.fileId)
 
-    val glob       = ctx.args.meta.fileFilter.getOrElse(Glob.all)
+    val glob = ctx.args.meta.fileFilter.getOrElse(Glob.all)
     val attachOnly = ctx.args.meta.attachmentsOnly.getOrElse(false)
     ctx.logger.debug(s"Filtering email attachments with '${glob.asString}'") *>
       email
@@ -193,7 +193,7 @@ object ExtractArchive {
   ): Stream[F, Extracted] = {
     val (entry, subPos) = tentry
     val mimeHint = MimeTypeHint.filename(entry.name).withAdvertised(entry.mime.asString)
-    val fileId   = entry.data.through(ctx.store.fileStore.save(mimeHint))
+    val fileId = entry.data.through(ctx.store.fileStore.save(mimeHint))
 
     Stream.eval(ctx.logger.debug(s"Extracted ${entry.name}. Storing as attachment.")) >>
       fileId.evalMap { fid =>
diff --git a/modules/joex/src/main/scala/docspell/joex/process/FindProposal.scala b/modules/joex/src/main/scala/docspell/joex/process/FindProposal.scala
index 249c102f..a6898f51 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/FindProposal.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/FindProposal.scala
@@ -140,7 +140,7 @@ object FindProposal {
       val latestFirst = dates
         .filter(_.date.isBefore(maxFuture.toUtcDate))
         .sortWith((l1, l2) => l1.date.isAfter(l2.date))
-      val nowDate         = now.value.atZone(ZoneId.of("GMT")).toLocalDate
+      val nowDate = now.value.atZone(ZoneId.of("GMT")).toLocalDate
       val (after, before) = latestFirst.span(ndl => ndl.date.isAfter(nowDate))
 
       val dueDates = MetaProposalList.fromSeq1(
diff --git a/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala b/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala
index 7b07edfd..7f5418fc 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala
@@ -146,12 +146,12 @@ object LinkProposal {
   }
   object Result {
 
-    case class NoneFound(proposalType: MetaProposalType)      extends Result
-    case class SingleResult(proposalType: MetaProposalType)   extends Result
+    case class NoneFound(proposalType: MetaProposalType) extends Result
+    case class SingleResult(proposalType: MetaProposalType) extends Result
     case class MultipleResult(proposalType: MetaProposalType) extends Result
 
     def noneFound(proposalType: MetaProposalType): Result = NoneFound(proposalType)
-    def single(proposalType: MetaProposalType): Result    = SingleResult(proposalType)
-    def multiple(proposalType: MetaProposalType): Result  = MultipleResult(proposalType)
+    def single(proposalType: MetaProposalType): Result = SingleResult(proposalType)
+    def multiple(proposalType: MetaProposalType): Result = MultipleResult(proposalType)
   }
 }
diff --git a/modules/joex/src/main/scala/docspell/joex/process/ReProcessItem.scala b/modules/joex/src/main/scala/docspell/joex/process/ReProcessItem.scala
index e594d33f..c2e363c3 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/ReProcessItem.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/ReProcessItem.scala
@@ -55,7 +55,7 @@ object ReProcessItem {
   def loadItem[F[_]: Sync]: Task[F, Args, ItemData] =
     Task { ctx =>
       (for {
-        item   <- OptionT(ctx.store.transact(RItem.findById(ctx.args.itemId)))
+        item <- OptionT(ctx.store.transact(RItem.findById(ctx.args.itemId)))
         attach <- OptionT.liftF(ctx.store.transact(RAttachment.findByItem(item.id)))
         asrc <-
           OptionT.liftF(ctx.store.transact(RAttachmentSource.findByItem(ctx.args.itemId)))
@@ -107,9 +107,9 @@ object ReProcessItem {
               data.item.cid,
               args.itemId.some,
               lang,
-              None,             //direction
+              None, //direction
               data.item.source, //source-id
-              None,             //folder
+              None, //folder
               Seq.empty,
               false,
               None,
diff --git a/modules/joex/src/main/scala/docspell/joex/process/SaveProposals.scala b/modules/joex/src/main/scala/docspell/joex/process/SaveProposals.scala
index a5f12db9..18cbb933 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/SaveProposals.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/SaveProposals.scala
@@ -14,8 +14,7 @@ import docspell.joex.scheduler.{Context, Task}
 import docspell.store.AddResult
 import docspell.store.records._
 
-/** Saves the proposals in the database
-  */
+/** Saves the proposals in the database */
 object SaveProposals {
   type Args = ProcessItemArgs
 
diff --git a/modules/joex/src/main/scala/docspell/joex/process/SetGivenData.scala b/modules/joex/src/main/scala/docspell/joex/process/SetGivenData.scala
index c28a16d5..54283101 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/SetGivenData.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/SetGivenData.scala
@@ -38,8 +38,8 @@ object SetGivenData {
       ops: OItem[F]
   ): Task[F, Args, ItemData] =
     Task { ctx =>
-      val itemId     = data.item.id
-      val folderId   = ctx.args.meta.folderId
+      val itemId = data.item.id
+      val folderId = ctx.args.meta.folderId
       val collective = ctx.args.meta.collective
       for {
         _ <- ctx.logger.info("Starting setting given data")
@@ -62,7 +62,7 @@ object SetGivenData {
       ops: OItem[F]
   ): Task[F, Args, ItemData] =
     Task { ctx =>
-      val itemId     = data.item.id
+      val itemId = data.item.id
       val collective = ctx.args.meta.collective
       val tags =
         (ctx.args.meta.tags.getOrElse(Nil) ++ data.tags ++ data.classifyTags).distinct
diff --git a/modules/joex/src/main/scala/docspell/joex/process/TextAnalysis.scala b/modules/joex/src/main/scala/docspell/joex/process/TextAnalysis.scala
index 6f45fb2d..00e410da 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/TextAnalysis.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/TextAnalysis.scala
@@ -98,7 +98,7 @@ object TextAnalysis {
       names <- ctx.store.transact(
         ClassifierName.findTagClassifiers(ctx.args.meta.collective)
       )
-      _    <- ctx.logger.debug(s"Guessing tags for ${names.size} categories")
+      _ <- ctx.logger.debug(s"Guessing tags for ${names.size} categories")
       tags <- names.traverse(classifyWith)
     } yield tags.flatten
   }
diff --git a/modules/joex/src/main/scala/docspell/joex/process/TextExtraction.scala b/modules/joex/src/main/scala/docspell/joex/process/TextExtraction.scala
index 217b2f08..2836638a 100644
--- a/modules/joex/src/main/scala/docspell/joex/process/TextExtraction.scala
+++ b/modules/joex/src/main/scala/docspell/joex/process/TextExtraction.scala
@@ -47,7 +47,7 @@ object TextExtraction {
           item.item.name.some,
           None
         )
-        _   <- fts.indexData(ctx.logger, (idxItem +: txt.map(_.td)).toSeq: _*)
+        _ <- fts.indexData(ctx.logger, (idxItem +: txt.map(_.td)).toSeq: _*)
         dur <- start
         extractedTags = txt.flatMap(_.tags).distinct.toList
         _ <- ctx.logger.info(s"Text extraction finished in ${dur.formatExact}.")
@@ -104,9 +104,9 @@ object TextExtraction {
   )(ra: RAttachment): F[(RAttachmentMeta, List[String])] =
     for {
       _ <- ctx.logger.debug(s"Extracting text for attachment ${stripAttachmentName(ra)}")
-      dst  <- Duration.stopTime[F]
+      dst <- Duration.stopTime[F]
       fids <- filesToExtract(ctx)(item, ra)
-      res  <- extractTextFallback(ctx, cfg, ra, lang)(fids)
+      res <- extractTextFallback(ctx, cfg, ra, lang)(fids)
       meta = item.changeMeta(
         ra.id,
         lang,
diff --git a/modules/joex/src/main/scala/docspell/joex/routes/JoexRoutes.scala b/modules/joex/src/main/scala/docspell/joex/routes/JoexRoutes.scala
index a916c49e..1a582b98 100644
--- a/modules/joex/src/main/scala/docspell/joex/routes/JoexRoutes.scala
+++ b/modules/joex/src/main/scala/docspell/joex/routes/JoexRoutes.scala
@@ -26,8 +26,8 @@ object JoexRoutes {
     HttpRoutes.of[F] {
       case POST -> Root / "notify" =>
         for {
-          _    <- app.scheduler.notifyChange
-          _    <- app.periodicScheduler.notifyChange
+          _ <- app.scheduler.notifyChange
+          _ <- app.periodicScheduler.notifyChange
           resp <- Ok(BasicResult(true, "Schedulers notified."))
         } yield resp
 
diff --git a/modules/joex/src/main/scala/docspell/joex/scanmailbox/ScanMailboxTask.scala b/modules/joex/src/main/scala/docspell/joex/scanmailbox/ScanMailboxTask.scala
index adbebb0c..7618d572 100644
--- a/modules/joex/src/main/scala/docspell/joex/scanmailbox/ScanMailboxTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scanmailbox/ScanMailboxTask.scala
@@ -40,10 +40,10 @@ object ScanMailboxTask {
         _ <- ctx.logger.info(
           s"=== Start importing mails for user ${ctx.args.account.user.id}"
         )
-        _       <- ctx.logger.debug(s"Settings: ${ctx.args.asJson.noSpaces}")
+        _ <- ctx.logger.debug(s"Settings: ${ctx.args.asJson.noSpaces}")
         mailCfg <- getMailSettings(ctx)
-        folders  = ctx.args.folders.mkString(", ")
-        userId   = ctx.args.account.user
+        folders = ctx.args.folders.mkString(", ")
+        userId = ctx.args.account.user
         imapConn = ctx.args.imapConnection
         _ <- ctx.logger.info(
           s"Reading mails for user ${userId.id} from ${imapConn.id}/$folders"
@@ -76,8 +76,8 @@ object ScanMailboxTask {
       joex: OJoex[F],
       ctx: Context[F, Args]
   ): F[Unit] = {
-    val mailer    = theEmil(mailCfg.toMailConfig)
-    val impl      = new Impl[F](cfg, ctx)
+    val mailer = theEmil(mailCfg.toMailConfig)
+    val impl = new Impl[F](cfg, ctx)
     val inFolders = ctx.args.folders.take(cfg.maxFolders)
 
     val getInitialInput =
@@ -150,7 +150,7 @@ object ScanMailboxTask {
         name: String
     ): MailOp[F, C, ScanResult] =
       for {
-        _      <- Kleisli.liftF(ctx.logger.info(s"Processing folder $name"))
+        _ <- Kleisli.liftF(ctx.logger.info(s"Processing folder $name"))
         folder <- requireFolder(a)(name)
         search <- searchMails(a)(folder)
         items = search.mails.map(MailHeaderItem(_))
@@ -290,7 +290,7 @@ object ScanMailboxTask {
         mail.toByteStream
       )
       for {
-        _   <- ctx.logger.debug(s"Submitting mail '${mail.header.subject}'")
+        _ <- ctx.logger.debug(s"Submitting mail '${mail.header.subject}'")
         dir <- getDirection(mail.header)
         meta = OUpload.UploadMeta(
           Some(dir),
@@ -340,7 +340,7 @@ object ScanMailboxTask {
   }
 
   case class MailHeaderItem(mh: MailHeader, process: Boolean = true) {
-    def skip       = copy(process = false)
+    def skip = copy(process = false)
     def notProcess = !process
   }
 }
diff --git a/modules/joex/src/main/scala/docspell/joex/scheduler/Context.scala b/modules/joex/src/main/scala/docspell/joex/scheduler/Context.scala
index ee0809ba..2989d887 100644
--- a/modules/joex/src/main/scala/docspell/joex/scheduler/Context.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scheduler/Context.scala
@@ -61,9 +61,9 @@ object Context {
       store: Store[F]
   ): F[Context[F, A]] =
     for {
-      _      <- log.ftrace("Creating logger for task run")
+      _ <- log.ftrace("Creating logger for task run")
       logger <- QueueLogger(job.id, job.info, config.logBufferSize, logSink)
-      _      <- log.ftrace("Logger created, instantiating context")
+      _ <- log.ftrace("Logger created, instantiating context")
       ctx = create[F, A](job.id, arg, config, logger, store)
     } yield ctx
 
diff --git a/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicScheduler.scala b/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicScheduler.scala
index 2bf2551f..5366aa13 100644
--- a/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicScheduler.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicScheduler.scala
@@ -44,7 +44,7 @@ object PeriodicScheduler {
   ): Resource[F, PeriodicScheduler[F]] =
     for {
       waiter <- Resource.eval(SignallingRef(true))
-      state  <- Resource.eval(SignallingRef(PeriodicSchedulerImpl.emptyState[F]))
+      state <- Resource.eval(SignallingRef(PeriodicSchedulerImpl.emptyState[F]))
       psch = new PeriodicSchedulerImpl[F](
         cfg,
         sch,
diff --git a/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicSchedulerImpl.scala b/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicSchedulerImpl.scala
index 5a2f9a22..2a47eaf8 100644
--- a/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicSchedulerImpl.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scheduler/PeriodicSchedulerImpl.scala
@@ -62,9 +62,9 @@ final class PeriodicSchedulerImpl[F[_]: Async](
   def mainLoop: Stream[F, Nothing] = {
     val body: F[Boolean] =
       for {
-        _   <- logger.fdebug(s"Going into main loop")
+        _ <- logger.fdebug(s"Going into main loop")
         now <- Timestamp.current[F]
-        _   <- logger.fdebug(s"Looking for next periodic task")
+        _ <- logger.fdebug(s"Looking for next periodic task")
         go <- logThrow("Error getting next task")(
           store
             .takeNext(config.name, None)
diff --git a/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerBuilder.scala b/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerBuilder.scala
index d2870239..4f981a87 100644
--- a/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerBuilder.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerBuilder.scala
@@ -45,10 +45,10 @@ case class SchedulerBuilder[F[_]: Async](
 
   def resource: Resource[F, Scheduler[F]] = {
     val scheduler: Resource[F, SchedulerImpl[F]] = for {
-      jq     <- queue
+      jq <- queue
       waiter <- Resource.eval(SignallingRef(true))
-      state  <- Resource.eval(SignallingRef(SchedulerImpl.emptyState[F]))
-      perms  <- Resource.eval(Semaphore(config.poolSize.toLong))
+      state <- Resource.eval(SignallingRef(SchedulerImpl.emptyState[F]))
+      perms <- Resource.eval(Semaphore(config.poolSize.toLong))
     } yield new SchedulerImpl[F](
       config,
       jq,
diff --git a/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerImpl.scala b/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerImpl.scala
index 084302f9..d01d6756 100644
--- a/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerImpl.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scheduler/SchedulerImpl.scala
@@ -109,8 +109,8 @@ final class SchedulerImpl[F[_]: Async](
         _ <- permits.available.flatMap(a =>
           logger.fdebug(s"Try to acquire permit ($a free)")
         )
-        _    <- permits.acquire
-        _    <- logger.fdebug("New permit acquired")
+        _ <- permits.acquire
+        _ <- logger.fdebug("New permit acquired")
         down <- state.get.map(_.shutdownRequest)
         rjob <-
           if (down)
@@ -159,11 +159,11 @@ final class SchedulerImpl[F[_]: Async](
           _ <-
             logger.fdebug(s"Creating context for job ${job.info} to run cancellation $t")
           ctx <- Context[F, String](job, job.args, config, logSink, store)
-          _   <- t.onCancel.run(ctx)
-          _   <- state.modify(_.markCancelled(job))
-          _   <- onFinish(job, JobState.Cancelled)
-          _   <- ctx.logger.warn("Job has been cancelled.")
-          _   <- logger.fdebug(s"Job ${job.info} has been cancelled.")
+          _ <- t.onCancel.run(ctx)
+          _ <- state.modify(_.markCancelled(job))
+          _ <- onFinish(job, JobState.Cancelled)
+          _ <- ctx.logger.warn("Job has been cancelled.")
+          _ <- logger.fdebug(s"Job ${job.info} has been cancelled.")
         } yield ()
     }
   }
@@ -181,11 +181,11 @@ final class SchedulerImpl[F[_]: Async](
         logger.ferror(s"Unable to start a task for job ${job.info}: $err")
       case Right(t) =>
         for {
-          _   <- logger.fdebug(s"Creating context for job ${job.info} to run $t")
+          _ <- logger.fdebug(s"Creating context for job ${job.info} to run $t")
           ctx <- Context[F, String](job, job.args, config, logSink, store)
           jot = wrapTask(job, t.task, ctx)
           tok <- forkRun(job, jot.run(ctx), t.onCancel.run(ctx), ctx)
-          _   <- state.modify(_.addRunning(job, tok))
+          _ <- state.modify(_.addRunning(job, tok))
         } yield ()
     }
   }
diff --git a/modules/joex/src/main/scala/docspell/joex/scheduler/Task.scala b/modules/joex/src/main/scala/docspell/joex/scheduler/Task.scala
index 4a09634f..04015b80 100644
--- a/modules/joex/src/main/scala/docspell/joex/scheduler/Task.scala
+++ b/modules/joex/src/main/scala/docspell/joex/scheduler/Task.scala
@@ -13,8 +13,7 @@ import cats.implicits._
 
 import docspell.common.Logger
 
-/** The code that is executed by the scheduler
-  */
+/** The code that is executed by the scheduler */
 trait Task[F[_], A, B] {
 
   def run(ctx: Context[F, A]): F[B]
diff --git a/modules/joex/src/main/scala/docspell/joex/updatecheck/MakeMail.scala b/modules/joex/src/main/scala/docspell/joex/updatecheck/MakeMail.scala
index 253d918b..c7a5bb0b 100644
--- a/modules/joex/src/main/scala/docspell/joex/updatecheck/MakeMail.scala
+++ b/modules/joex/src/main/scala/docspell/joex/updatecheck/MakeMail.scala
@@ -29,8 +29,8 @@ object MakeMail {
   ): Mail[F] = {
 
     val templateCtx = TemplateCtx(latestRelease, thisVersion)
-    val md          = templateCtx.render(cfg.body)
-    val subj        = templateCtx.render(cfg.subject)
+    val md = templateCtx.render(cfg.body)
+    val subj = templateCtx.render(cfg.subject)
 
     MailBuilder.build(
       From(smtpCfg.mailFrom),
diff --git a/modules/joex/src/main/scala/docspell/joex/updatecheck/UpdateCheckTask.scala b/modules/joex/src/main/scala/docspell/joex/updatecheck/UpdateCheckTask.scala
index 23b35f56..c89b9fde 100644
--- a/modules/joex/src/main/scala/docspell/joex/updatecheck/UpdateCheckTask.scala
+++ b/modules/joex/src/main/scala/docspell/joex/updatecheck/UpdateCheckTask.scala
@@ -58,9 +58,9 @@ object UpdateCheckTask {
             s"Get SMTP connection for ${cfg.senderAccount.asString} and ${cfg.smtpId}"
           )
           smtpCfg <- findConnection(ctx, cfg)
-          _       <- ctx.logger.debug("Checking for latest release at GitHub")
-          latest  <- updateCheck.latestRelease
-          _       <- ctx.logger.debug(s"Got latest release: $latest.")
+          _ <- ctx.logger.debug("Checking for latest release at GitHub")
+          latest <- updateCheck.latestRelease
+          _ <- ctx.logger.debug(s"Got latest release: $latest.")
           _ <-
             if (cfg.testRun)
               ctx.logger.info(
diff --git a/modules/joex/src/test/scala/docspell/joex/analysis/NerFileTest.scala b/modules/joex/src/test/scala/docspell/joex/analysis/NerFileTest.scala
index c4c80dc1..e947e143 100644
--- a/modules/joex/src/test/scala/docspell/joex/analysis/NerFileTest.scala
+++ b/modules/joex/src/test/scala/docspell/joex/analysis/NerFileTest.scala
@@ -16,12 +16,12 @@ class NerFileTest extends FunSuite {
 
   test("create valid case insensitive patterns") {
     val names = List(
-      "Some company AG"            -> "(?i)some company ag",
-      "Acme GmbH"                  -> "(?i)acme gmbh",
-      "UP"                         -> "(?i)up",
-      "1 & 1"                      -> "(?i)1 & 1",
+      "Some company AG" -> "(?i)some company ag",
+      "Acme GmbH" -> "(?i)acme gmbh",
+      "UP" -> "(?i)up",
+      "1 & 1" -> "(?i)1 & 1",
       "1 & 1 (Telefon / Internet)" -> "(?i)1 & 1 \\(telefon / internet\\)",
-      "X-corp (this)*-*[one]"      -> "(?i)x\\-corp \\(this\\)\\*\\-\\*\\[one\\]"
+      "X-corp (this)*-*[one]" -> "(?i)x\\-corp \\(this\\)\\*\\-\\*\\[one\\]"
     )
 
     for ((name, first) <- names) {
diff --git a/modules/joex/src/test/scala/docspell/joex/scheduler/CountingSchemeSpec.scala b/modules/joex/src/test/scala/docspell/joex/scheduler/CountingSchemeSpec.scala
index 62f62a85..cf819f2f 100644
--- a/modules/joex/src/test/scala/docspell/joex/scheduler/CountingSchemeSpec.scala
+++ b/modules/joex/src/test/scala/docspell/joex/scheduler/CountingSchemeSpec.scala
@@ -13,8 +13,8 @@ import munit._
 class CountingSchemeSpec extends FunSuite {
 
   test("counting") {
-    val cs     = CountingScheme(2, 1)
-    val list   = List.iterate(cs.nextPriority, 6)(_._1.nextPriority).map(_._2)
+    val cs = CountingScheme(2, 1)
+    val list = List.iterate(cs.nextPriority, 6)(_._1.nextPriority).map(_._2)
     val expect = List(Priority.High, Priority.High, Priority.Low)
     assertEquals(list, expect ++ expect)
   }
diff --git a/modules/joex/src/test/scala/docspell/joex/updatecheck/UpdateCheckTest.scala b/modules/joex/src/test/scala/docspell/joex/updatecheck/UpdateCheckTest.scala
index 2a6ada7a..d5751d77 100644
--- a/modules/joex/src/test/scala/docspell/joex/updatecheck/UpdateCheckTest.scala
+++ b/modules/joex/src/test/scala/docspell/joex/updatecheck/UpdateCheckTest.scala
@@ -51,53 +51,54 @@ class UpdateCheckTest extends FunSuite {
 
 object UpdateCheckTest {
 
-  val exampleResponsePartial = """
-    |{
-    |  "url": "https://api.github.com/repos/eikek/docspell/releases/99899888",
-    |  "assets_url": "https://api.github.com/repos/eikek/docspell/releases/99899888/assets",
-    |  "upload_url": "https://uploads.github.com/repos/eikek/docspell/releases/99899888/assets{?name,label}",
-    |  "html_url": "https://github.com/eikek/docspell/releases/tag/v0.26.0",
-    |  "id": 99899888,
-    |  "node_id": "MDc6UmVsZWFzZTQ4NjEwNTY2",
-    |  "tag_name": "v0.26.0",
-    |  "target_commitish": "master",
-    |  "name": "Docspell 0.26.0",
-    |  "draft": false,
-    |  "prerelease": false,
-    |  "created_at": "2021-08-28T10:02:01Z",
-    |  "published_at": "2021-08-28T10:30:38Z",
-    |  "assets": [
-    |    {
-    |      "url": "https://api.github.com/repos/eikek/docspell/releases/assets/43494218",
-    |      "id": 43494218,
-    |      "node_id": "MDEyOlJlbGVhc2VBc3NldDQzNDk0MjE4",
-    |      "name": "docspell-joex-0.26.0.zip",
-    |      "label": "",
-    |      "content_type": "application/zip",
-    |      "state": "uploaded",
-    |      "size": 328163415,
-    |      "download_count": 24,
-    |      "created_at": "2021-08-28T10:16:24Z",
-    |      "updated_at": "2021-08-28T10:16:36Z",
-    |      "browser_download_url": "https://github.com/eikek/docspell/releases/download/v0.26.0/docspell-joex-0.26.0.zip"
-    |    },
-    |    {
-    |      "url": "https://api.github.com/repos/eikek/docspell/releases/assets/43494232",
-    |      "id": 43494232,
-    |      "node_id": "MDEyOlJlbGVhc2VBc3NldDQzNDk0MjMy",
-    |      "name": "docspell-joex_0.26.0_all.deb",
-    |      "label": "",
-    |      "content_type": "application/vnd.debian.binary-package",
-    |      "state": "uploaded",
-    |      "size": 337991872,
-    |      "download_count": 8,
-    |      "created_at": "2021-08-28T10:16:37Z",
-    |      "updated_at": "2021-08-28T10:16:53Z",
-    |      "browser_download_url": "https://github.com/eikek/docspell/releases/download/v0.26.0/docspell-joex_0.26.0_all.deb"
-    |    }
-    |  ],
-    |  "tarball_url": "https://api.github.com/repos/eikek/docspell/tarball/v0.26.0",
-    |  "zipball_url": "https://api.github.com/repos/eikek/docspell/zipball/v0.26.0"
-    |}
-    |""".stripMargin
+  val exampleResponsePartial =
+    """
+      |{
+      |  "url": "https://api.github.com/repos/eikek/docspell/releases/99899888",
+      |  "assets_url": "https://api.github.com/repos/eikek/docspell/releases/99899888/assets",
+      |  "upload_url": "https://uploads.github.com/repos/eikek/docspell/releases/99899888/assets{?name,label}",
+      |  "html_url": "https://github.com/eikek/docspell/releases/tag/v0.26.0",
+      |  "id": 99899888,
+      |  "node_id": "MDc6UmVsZWFzZTQ4NjEwNTY2",
+      |  "tag_name": "v0.26.0",
+      |  "target_commitish": "master",
+      |  "name": "Docspell 0.26.0",
+      |  "draft": false,
+      |  "prerelease": false,
+      |  "created_at": "2021-08-28T10:02:01Z",
+      |  "published_at": "2021-08-28T10:30:38Z",
+      |  "assets": [
+      |    {
+      |      "url": "https://api.github.com/repos/eikek/docspell/releases/assets/43494218",
+      |      "id": 43494218,
+      |      "node_id": "MDEyOlJlbGVhc2VBc3NldDQzNDk0MjE4",
+      |      "name": "docspell-joex-0.26.0.zip",
+      |      "label": "",
+      |      "content_type": "application/zip",
+      |      "state": "uploaded",
+      |      "size": 328163415,
+      |      "download_count": 24,
+      |      "created_at": "2021-08-28T10:16:24Z",
+      |      "updated_at": "2021-08-28T10:16:36Z",
+      |      "browser_download_url": "https://github.com/eikek/docspell/releases/download/v0.26.0/docspell-joex-0.26.0.zip"
+      |    },
+      |    {
+      |      "url": "https://api.github.com/repos/eikek/docspell/releases/assets/43494232",
+      |      "id": 43494232,
+      |      "node_id": "MDEyOlJlbGVhc2VBc3NldDQzNDk0MjMy",
+      |      "name": "docspell-joex_0.26.0_all.deb",
+      |      "label": "",
+      |      "content_type": "application/vnd.debian.binary-package",
+      |      "state": "uploaded",
+      |      "size": 337991872,
+      |      "download_count": 8,
+      |      "created_at": "2021-08-28T10:16:37Z",
+      |      "updated_at": "2021-08-28T10:16:53Z",
+      |      "browser_download_url": "https://github.com/eikek/docspell/releases/download/v0.26.0/docspell-joex_0.26.0_all.deb"
+      |    }
+      |  ],
+      |  "tarball_url": "https://api.github.com/repos/eikek/docspell/tarball/v0.26.0",
+      |  "zipball_url": "https://api.github.com/repos/eikek/docspell/zipball/v0.26.0"
+      |}
+      |""".stripMargin
 }
diff --git a/modules/joexapi/src/main/scala/docspell/joexapi/client/JoexClient.scala b/modules/joexapi/src/main/scala/docspell/joexapi/client/JoexClient.scala
index 723ce383..df2e5065 100644
--- a/modules/joexapi/src/main/scala/docspell/joexapi/client/JoexClient.scala
+++ b/modules/joexapi/src/main/scala/docspell/joexapi/client/JoexClient.scala
@@ -40,7 +40,7 @@ object JoexClient {
 
       def notifyJoex(base: LenientUri): F[BasicResult] = {
         val notifyUrl = base / "api" / "v1" / "notify"
-        val req       = Request[F](Method.POST, uri(notifyUrl))
+        val req = Request[F](Method.POST, uri(notifyUrl))
         logger.fdebug(s"Notify joex at ${notifyUrl.asString}") *>
           client.expect[BasicResult](req)
       }
@@ -61,7 +61,7 @@ object JoexClient {
 
       def cancelJob(base: LenientUri, job: Ident): F[BasicResult] = {
         val cancelUrl = base / "api" / "v1" / "job" / job.id / "cancel"
-        val req       = Request[F](Method.POST, uri(cancelUrl))
+        val req = Request[F](Method.POST, uri(cancelUrl))
         client.expect[BasicResult](req)
       }
 
diff --git a/modules/oidc/src/main/scala/docspell/oidc/AccessToken.scala b/modules/oidc/src/main/scala/docspell/oidc/AccessToken.scala
index 7c93f18f..72a7e181 100644
--- a/modules/oidc/src/main/scala/docspell/oidc/AccessToken.scala
+++ b/modules/oidc/src/main/scala/docspell/oidc/AccessToken.scala
@@ -51,13 +51,13 @@ object AccessToken {
   implicit val decoder: Decoder[AccessToken] =
     Decoder.instance { c =>
       for {
-        atoken  <- c.get[String]("access_token")
-        ttype   <- c.get[String]("token_type")
-        expire  <- c.get[Option[Long]]("expires_in")
-        rtoken  <- c.get[Option[String]]("refresh_token")
+        atoken <- c.get[String]("access_token")
+        ttype <- c.get[String]("token_type")
+        expire <- c.get[Option[Long]]("expires_in")
+        rtoken <- c.get[Option[String]]("refresh_token")
         rexpire <- c.get[Option[Long]]("refresh_expires_in")
-        sstate  <- c.get[Option[String]]("session_state")
-        scope   <- c.get[Option[String]]("scope")
+        sstate <- c.get[Option[String]]("session_state")
+        scope <- c.get[Option[String]]("scope")
       } yield AccessToken(atoken, ttype, expire, rtoken, rexpire, sstate, scope)
     }
 }
diff --git a/modules/oidc/src/main/scala/docspell/oidc/CodeFlow.scala b/modules/oidc/src/main/scala/docspell/oidc/CodeFlow.scala
index 4814cc5f..9a40d9ae 100644
--- a/modules/oidc/src/main/scala/docspell/oidc/CodeFlow.scala
+++ b/modules/oidc/src/main/scala/docspell/oidc/CodeFlow.scala
@@ -40,8 +40,8 @@ object CodeFlow {
       code: String
   ): OptionT[F, Json] = {
     val logger = Logger.log4s[F](log4sLogger)
-    val dsl    = new Http4sClientDsl[F] {}
-    val c      = logRequests[F](logResponses[F](client))
+    val dsl = new Http4sClientDsl[F] {}
+    val c = logRequests[F](logResponses[F](client))
 
     for {
       _ <- OptionT.liftF(
@@ -97,11 +97,11 @@ object CodeFlow {
 
     val req = POST(
       UrlForm(
-        "client_id"     -> cfg.clientId,
+        "client_id" -> cfg.clientId,
         "client_secret" -> cfg.clientSecret,
-        "code"          -> code,
-        "grant_type"    -> "authorization_code",
-        "redirect_uri"  -> redirectUri
+        "code" -> code,
+        "grant_type" -> "authorization_code",
+        "redirect_uri" -> redirectUri
       ),
       Uri.unsafeFromString(cfg.tokenUrl.asString),
       Accept(MediaType.application.json)
diff --git a/modules/oidc/src/main/scala/docspell/oidc/CodeFlowConfig.scala b/modules/oidc/src/main/scala/docspell/oidc/CodeFlowConfig.scala
index 6dacfec0..1be95021 100644
--- a/modules/oidc/src/main/scala/docspell/oidc/CodeFlowConfig.scala
+++ b/modules/oidc/src/main/scala/docspell/oidc/CodeFlowConfig.scala
@@ -31,7 +31,7 @@ object CodeFlowConfig {
       provider: Ident => Option[ProviderConfig]
   ): CodeFlowConfig[F] =
     new CodeFlowConfig[F] {
-      def getEndpointUrl(req: Request[F]): LenientUri     = url(req)
+      def getEndpointUrl(req: Request[F]): LenientUri = url(req)
       def findProvider(id: Ident): Option[ProviderConfig] = provider(id)
     }
 
diff --git a/modules/oidc/src/main/scala/docspell/oidc/CodeFlowRoutes.scala b/modules/oidc/src/main/scala/docspell/oidc/CodeFlowRoutes.scala
index 9aa42029..eee50d96 100644
--- a/modules/oidc/src/main/scala/docspell/oidc/CodeFlowRoutes.scala
+++ b/modules/oidc/src/main/scala/docspell/oidc/CodeFlowRoutes.scala
@@ -69,7 +69,7 @@ object CodeFlowRoutes {
             val codeFromReq = OptionT.fromOption[F](req.params.get("code"))
 
             val userInfo = for {
-              _    <- OptionT.liftF(logger.info(s"Resume OAuth/OIDC flow for ${id.id}"))
+              _ <- OptionT.liftF(logger.info(s"Resume OAuth/OIDC flow for ${id.id}"))
               code <- codeFromReq
               _ <- OptionT.liftF(
                 logger.trace(
diff --git a/modules/oidc/src/main/scala/docspell/oidc/SignatureAlgo.scala b/modules/oidc/src/main/scala/docspell/oidc/SignatureAlgo.scala
index 03cdc60d..3c74c2da 100644
--- a/modules/oidc/src/main/scala/docspell/oidc/SignatureAlgo.scala
+++ b/modules/oidc/src/main/scala/docspell/oidc/SignatureAlgo.scala
@@ -29,12 +29,12 @@ object SignatureAlgo {
   case object RS384 extends SignatureAlgo
   case object RS512 extends SignatureAlgo
 
-  case object ES256   extends SignatureAlgo
-  case object ES384   extends SignatureAlgo
-  case object ES512   extends SignatureAlgo
+  case object ES256 extends SignatureAlgo
+  case object ES384 extends SignatureAlgo
+  case object ES512 extends SignatureAlgo
   case object Ed25519 extends SignatureAlgo
 
-  case object HMD5  extends SignatureAlgo
+  case object HMD5 extends SignatureAlgo
   case object HS224 extends SignatureAlgo
   case object HS256 extends SignatureAlgo
   case object HS384 extends SignatureAlgo
@@ -137,31 +137,31 @@ object SignatureAlgo {
 
       case HMD5 =>
         for {
-          key     <- createSecretKey(sigKey, JwtAlgorithm.HMD5.fullName)
+          key <- createSecretKey(sigKey, JwtAlgorithm.HMD5.fullName)
           decoded <- JwtCirce.decodeJsonAll(token, key, Seq(JwtAlgorithm.HMD5)).toEither
         } yield Jwt.create(decoded)
 
       case HS224 =>
         for {
-          key     <- createSecretKey(sigKey, JwtAlgorithm.HS224.fullName)
+          key <- createSecretKey(sigKey, JwtAlgorithm.HS224.fullName)
           decoded <- JwtCirce.decodeJsonAll(token, key, Seq(JwtAlgorithm.HS224)).toEither
         } yield Jwt.create(decoded)
 
       case HS256 =>
         for {
-          key     <- createSecretKey(sigKey, JwtAlgorithm.HS256.fullName)
+          key <- createSecretKey(sigKey, JwtAlgorithm.HS256.fullName)
           decoded <- JwtCirce.decodeJsonAll(token, key, Seq(JwtAlgorithm.HS256)).toEither
         } yield Jwt.create(decoded)
 
       case HS384 =>
         for {
-          key     <- createSecretKey(sigKey, JwtAlgorithm.HS384.fullName)
+          key <- createSecretKey(sigKey, JwtAlgorithm.HS384.fullName)
           decoded <- JwtCirce.decodeJsonAll(token, key, Seq(JwtAlgorithm.HS384)).toEither
         } yield Jwt.create(decoded)
 
       case HS512 =>
         for {
-          key     <- createSecretKey(sigKey, JwtAlgorithm.HS512.fullName)
+          key <- createSecretKey(sigKey, JwtAlgorithm.HS512.fullName)
           decoded <- JwtCirce.decodeJsonAll(token, key, Seq(JwtAlgorithm.HS512)).toEither
         } yield Jwt.create(decoded)
     }
diff --git a/modules/query/shared/src/main/scala/docspell/query/Date.scala b/modules/query/shared/src/main/scala/docspell/query/Date.scala
index 2c99c3c5..1851a98a 100644
--- a/modules/query/shared/src/main/scala/docspell/query/Date.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/Date.scala
@@ -30,7 +30,7 @@ object Date {
 
   sealed trait CalcDirection
   object CalcDirection {
-    case object Plus  extends CalcDirection
+    case object Plus extends CalcDirection
     case object Minus extends CalcDirection
   }
 
diff --git a/modules/query/shared/src/main/scala/docspell/query/FulltextExtract.scala b/modules/query/shared/src/main/scala/docspell/query/FulltextExtract.scala
index 81a3643b..a12abe36 100644
--- a/modules/query/shared/src/main/scala/docspell/query/FulltextExtract.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/FulltextExtract.scala
@@ -14,8 +14,7 @@ import docspell.query.ItemQuery.Expr.NotExpr
 import docspell.query.ItemQuery.Expr.OrExpr
 import docspell.query.ItemQuery._
 
-/** Currently, fulltext in a query is only supported when in "root AND" position
-  */
+/** Currently, fulltext in a query is only supported when in "root AND" position */
 object FulltextExtract {
 
   sealed trait Result
@@ -26,18 +25,18 @@ object FulltextExtract {
   sealed trait FailureResult extends Result
   object Result {
     final case class SuccessNoFulltext(query: Expr) extends SuccessResult {
-      val getExprPart     = Some(query)
+      val getExprPart = Some(query)
       val getFulltextPart = None
     }
     final case class SuccessNoExpr(fts: String) extends SuccessResult {
-      val getExprPart     = None
+      val getExprPart = None
       val getFulltextPart = Some(fts)
     }
     final case class SuccessBoth(query: Expr, fts: String) extends SuccessResult {
-      val getExprPart     = Some(query)
+      val getExprPart = Some(query)
       val getFulltextPart = Some(fts)
     }
-    final case object TooMany             extends FailureResult
+    final case object TooMany extends FailureResult
     final case object UnsupportedPosition extends FailureResult
   }
 
diff --git a/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala b/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala
index 2144adaf..0fc73acb 100644
--- a/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/ItemQuery.scala
@@ -24,13 +24,13 @@ object ItemQuery {
 
   sealed trait Operator
   object Operator {
-    case object Eq   extends Operator
-    case object Neq  extends Operator
+    case object Eq extends Operator
+    case object Neq extends Operator
     case object Like extends Operator
-    case object Gt   extends Operator
-    case object Lt   extends Operator
-    case object Gte  extends Operator
-    case object Lte  extends Operator
+    case object Gt extends Operator
+    case object Lt extends Operator
+    case object Gte extends Operator
+    case object Lte extends Operator
   }
 
   sealed trait TagOperator
@@ -42,34 +42,34 @@ object ItemQuery {
   sealed trait Attr
   object Attr {
     sealed trait StringAttr extends Attr
-    sealed trait DateAttr   extends Attr
-    sealed trait IntAttr    extends Attr
+    sealed trait DateAttr extends Attr
+    sealed trait IntAttr extends Attr
 
-    case object ItemName    extends StringAttr
-    case object ItemSource  extends StringAttr
-    case object ItemNotes   extends StringAttr
-    case object ItemId      extends StringAttr
-    case object Date        extends DateAttr
-    case object DueDate     extends DateAttr
+    case object ItemName extends StringAttr
+    case object ItemSource extends StringAttr
+    case object ItemNotes extends StringAttr
+    case object ItemId extends StringAttr
+    case object Date extends DateAttr
+    case object DueDate extends DateAttr
     case object CreatedDate extends DateAttr
     case object AttachCount extends IntAttr
 
     object Correspondent {
-      case object OrgId      extends StringAttr
-      case object OrgName    extends StringAttr
-      case object PersonId   extends StringAttr
+      case object OrgId extends StringAttr
+      case object OrgName extends StringAttr
+      case object PersonId extends StringAttr
       case object PersonName extends StringAttr
     }
 
     object Concerning {
-      case object PersonId   extends StringAttr
+      case object PersonId extends StringAttr
       case object PersonName extends StringAttr
-      case object EquipId    extends StringAttr
-      case object EquipName  extends StringAttr
+      case object EquipId extends StringAttr
+      case object EquipName extends StringAttr
     }
 
     object Folder {
-      case object FolderId   extends StringAttr
+      case object FolderId extends StringAttr
       case object FolderName extends StringAttr
     }
   }
@@ -77,8 +77,8 @@ object ItemQuery {
   sealed trait Property
   object Property {
     final case class StringProperty(attr: StringAttr, value: String) extends Property
-    final case class DateProperty(attr: DateAttr, value: Date)       extends Property
-    final case class IntProperty(attr: IntAttr, value: Int)          extends Property
+    final case class DateProperty(attr: DateAttr, value: Date) extends Property
+    final case class IntProperty(attr: IntAttr, value: Int) extends Property
 
     def apply(sa: StringAttr, value: String): Property =
       StringProperty(sa, value)
@@ -97,21 +97,21 @@ object ItemQuery {
 
   object Expr {
     final case class AndExpr(expr: Nel[Expr]) extends Expr
-    final case class OrExpr(expr: Nel[Expr])  extends Expr
+    final case class OrExpr(expr: Nel[Expr]) extends Expr
     final case class NotExpr(expr: Expr) extends Expr {
       override def negate: Expr =
         expr
     }
 
-    final case class SimpleExpr(op: Operator, prop: Property)      extends Expr
-    final case class Exists(field: Attr)                           extends Expr
+    final case class SimpleExpr(op: Operator, prop: Property) extends Expr
+    final case class Exists(field: Attr) extends Expr
     final case class InExpr(attr: StringAttr, values: Nel[String]) extends Expr
     final case class InDateExpr(attr: DateAttr, values: Nel[Date]) extends Expr
-    final case class InboxExpr(inbox: Boolean)                     extends Expr
-    final case class DirectionExpr(incoming: Boolean)              extends Expr
+    final case class InboxExpr(inbox: Boolean) extends Expr
+    final case class DirectionExpr(incoming: Boolean) extends Expr
 
-    final case class TagIdsMatch(op: TagOperator, tags: Nel[String])      extends Expr
-    final case class TagsMatch(op: TagOperator, tags: Nel[String])        extends Expr
+    final case class TagIdsMatch(op: TagOperator, tags: Nel[String]) extends Expr
+    final case class TagsMatch(op: TagOperator, tags: Nel[String]) extends Expr
     final case class TagCategoryMatch(op: TagOperator, cats: Nel[String]) extends Expr
 
     final case class CustomFieldMatch(name: String, op: Operator, value: String)
@@ -119,12 +119,12 @@ object ItemQuery {
     final case class CustomFieldIdMatch(id: String, op: Operator, value: String)
         extends Expr
 
-    final case class Fulltext(query: String)         extends Expr
+    final case class Fulltext(query: String) extends Expr
     final case class ChecksumMatch(checksum: String) extends Expr
-    final case class AttachId(id: String)            extends Expr
+    final case class AttachId(id: String) extends Expr
 
-    final case object ValidItemStates     extends Expr
-    final case object Trashed             extends Expr
+    final case object ValidItemStates extends Expr
+    final case object Trashed extends Expr
     final case object ValidItemsOrTrashed extends Expr
 
     // things that can be expressed with terms above
diff --git a/modules/query/shared/src/main/scala/docspell/query/internal/BasicParser.scala b/modules/query/shared/src/main/scala/docspell/query/internal/BasicParser.scala
index 0a82560f..fd2d9207 100644
--- a/modules/query/shared/src/main/scala/docspell/query/internal/BasicParser.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/internal/BasicParser.scala
@@ -13,7 +13,7 @@ object BasicParser {
   private[this] val whitespace: P[Unit] = P.charIn(" \t\r\n").void
 
   val ws0: Parser0[Unit] = whitespace.rep0.void
-  val ws1: P[Unit]       = whitespace.rep.void
+  val ws1: P[Unit] = whitespace.rep.void
 
   val stringListSep: P[Unit] =
     (ws0.with1.soft ~ P.char(',') ~ ws0).void
@@ -45,7 +45,7 @@ object BasicParser {
     singleString.repSep(stringListSep)
 
   val bool: P[Boolean] = {
-    val trueP  = P.stringIn(List("yes", "true", "Yes", "True")).as(true)
+    val trueP = P.stringIn(List("yes", "true", "Yes", "True")).as(true)
     val falseP = P.stringIn(List("no", "false", "No", "False")).as(false)
     trueP | falseP
   }
diff --git a/modules/query/shared/src/main/scala/docspell/query/internal/Constants.scala b/modules/query/shared/src/main/scala/docspell/query/internal/Constants.scala
index 65514459..dcc286f1 100644
--- a/modules/query/shared/src/main/scala/docspell/query/internal/Constants.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/internal/Constants.scala
@@ -8,51 +8,51 @@ package docspell.query.internal
 
 object Constants {
 
-  val attachCount   = "attach.count"
-  val attachId      = "attach.id"
-  val cat           = "cat"
-  val checksum      = "checksum"
-  val conc          = "conc"
-  val concEquipId   = "conc.equip.id"
+  val attachCount = "attach.count"
+  val attachId = "attach.id"
+  val cat = "cat"
+  val checksum = "checksum"
+  val conc = "conc"
+  val concEquipId = "conc.equip.id"
   val concEquipName = "conc.equip.name"
-  val concPersId    = "conc.pers.id"
-  val concPersName  = "conc.pers.name"
-  val content       = "content"
-  val corr          = "corr"
-  val corrOrgId     = "corr.org.id"
-  val corrOrgName   = "corr.org.name"
-  val corrPersId    = "corr.pers.id"
-  val corrPersName  = "corr.pers.name"
-  val created       = "created"
-  val createdIn     = "createdIn"
-  val customField   = "f"
+  val concPersId = "conc.pers.id"
+  val concPersName = "conc.pers.name"
+  val content = "content"
+  val corr = "corr"
+  val corrOrgId = "corr.org.id"
+  val corrOrgName = "corr.org.name"
+  val corrPersId = "corr.pers.id"
+  val corrPersName = "corr.pers.name"
+  val created = "created"
+  val createdIn = "createdIn"
+  val customField = "f"
   val customFieldId = "f.id"
-  val date          = "date"
-  val dateIn        = "dateIn"
-  val due           = "due"
-  val dueIn         = "dueIn"
-  val exist         = "exist"
-  val folder        = "folder"
-  val folderId      = "folder.id"
-  val id            = "id"
-  val inbox         = "inbox"
-  val incoming      = "incoming"
-  val name          = "name"
-  val names         = "names"
-  val notPrefix     = '!'
-  val notes         = "notes"
-  val source        = "source"
-  val tag           = "tag"
-  val tagId         = "tag.id"
-  val year          = "year"
+  val date = "date"
+  val dateIn = "dateIn"
+  val due = "due"
+  val dueIn = "dueIn"
+  val exist = "exist"
+  val folder = "folder"
+  val folderId = "folder.id"
+  val id = "id"
+  val inbox = "inbox"
+  val incoming = "incoming"
+  val name = "name"
+  val names = "names"
+  val notPrefix = '!'
+  val notes = "notes"
+  val source = "source"
+  val tag = "tag"
+  val tagId = "tag.id"
+  val year = "year"
 
   // operators
-  val eqs  = '='
-  val gt   = '>'
-  val gte  = ">="
-  val in   = "~="
+  val eqs = '='
+  val gt = '>'
+  val gte = ">="
+  val in = "~="
   val like = ':'
-  val lt   = '<'
-  val lte  = "<="
-  val neq  = "!="
+  val lt = '<'
+  val lte = "<="
+  val neq = "!="
 }
diff --git a/modules/query/shared/src/main/scala/docspell/query/internal/ExprParser.scala b/modules/query/shared/src/main/scala/docspell/query/internal/ExprParser.scala
index 00320561..298d41fd 100644
--- a/modules/query/shared/src/main/scala/docspell/query/internal/ExprParser.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/internal/ExprParser.scala
@@ -31,9 +31,9 @@ object ExprParser {
 
   val exprParser: P[Expr] =
     P.recursive[Expr] { recurse =>
-      val andP   = and(recurse)
-      val orP    = or(recurse)
-      val notP   = not(recurse)
+      val andP = and(recurse)
+      val orP = or(recurse)
+      val notP = not(recurse)
       val macros = MacroParser.all
       P.oneOf(macros :: SimpleExprParser.simpleExpr :: andP :: orP :: notP :: Nil)
     }
diff --git a/modules/query/shared/src/main/scala/docspell/query/internal/StringUtil.scala b/modules/query/shared/src/main/scala/docspell/query/internal/StringUtil.scala
index fb81ce14..36ff25f9 100644
--- a/modules/query/shared/src/main/scala/docspell/query/internal/StringUtil.scala
+++ b/modules/query/shared/src/main/scala/docspell/query/internal/StringUtil.scala
@@ -57,24 +57,23 @@ object StringUtil {
     val escapedToken: P[Unit] = {
       val escapes = P.charIn(decodeTable.keys.toSeq)
 
-      val oct  = P.charIn('0' to '7')
+      val oct = P.charIn('0' to '7')
       val octP = P.char('o') ~ oct ~ oct
 
-      val hex  = P.charIn(('0' to '9') ++ ('a' to 'f') ++ ('A' to 'F'))
+      val hex = P.charIn(('0' to '9') ++ ('a' to 'f') ++ ('A' to 'F'))
       val hex2 = hex ~ hex
       val hexP = P.char('x') ~ hex2
 
       val hex4 = hex2 ~ hex2
-      val u4   = P.char('u') ~ hex4
+      val u4 = P.char('u') ~ hex4
       val hex8 = hex4 ~ hex4
-      val u8   = P.char('U') ~ hex8
+      val u8 = P.char('U') ~ hex8
 
       val after = P.oneOf[Any](escapes :: octP :: hexP :: u4 :: u8 :: Nil)
       (P.char('\\') ~ after).void
     }
 
-    /** String content without the delimiter
-      */
+    /** String content without the delimiter */
     def undelimitedString(endP: P[Unit]): P[String] =
       escapedToken.backtrack
         .orElse((!endP).with1 ~ P.anyChar)
diff --git a/modules/query/shared/src/test/scala/docspell/query/internal/ItemQueryParserTest.scala b/modules/query/shared/src/test/scala/docspell/query/internal/ItemQueryParserTest.scala
index 3f26c3f5..37de9db0 100644
--- a/modules/query/shared/src/test/scala/docspell/query/internal/ItemQueryParserTest.scala
+++ b/modules/query/shared/src/test/scala/docspell/query/internal/ItemQueryParserTest.scala
@@ -15,31 +15,31 @@ import munit._
 class ItemQueryParserTest extends FunSuite {
 
   test("reduce ands") {
-    val q    = ItemQueryParser.parseUnsafe("(&(&(&(& name:hello))))")
+    val q = ItemQueryParser.parseUnsafe("(&(&(&(& name:hello))))")
     val expr = ExprUtil.reduce(q.expr)
     assertEquals(expr, ItemQueryParser.parseUnsafe("name:hello").expr)
   }
 
   test("reduce ors") {
-    val q    = ItemQueryParser.parseUnsafe("(|(|(|(| name:hello))))")
+    val q = ItemQueryParser.parseUnsafe("(|(|(|(| name:hello))))")
     val expr = ExprUtil.reduce(q.expr)
     assertEquals(expr, ItemQueryParser.parseUnsafe("name:hello").expr)
   }
 
   test("reduce and/or") {
-    val q    = ItemQueryParser.parseUnsafe("(|(&(&(| name:hello))))")
+    val q = ItemQueryParser.parseUnsafe("(|(&(&(| name:hello))))")
     val expr = ExprUtil.reduce(q.expr)
     assertEquals(expr, ItemQueryParser.parseUnsafe("name:hello").expr)
   }
 
   test("reduce inner and/or") {
-    val q    = ItemQueryParser.parseUnsafe("(& name:hello (| name:world))")
+    val q = ItemQueryParser.parseUnsafe("(& name:hello (| name:world))")
     val expr = ExprUtil.reduce(q.expr)
     assertEquals(expr, ItemQueryParser.parseUnsafe("(& name:hello name:world)").expr)
   }
 
   test("omit and-parens around root structure") {
-    val q      = ItemQueryParser.parseUnsafe("name:hello date>2020-02-02")
+    val q = ItemQueryParser.parseUnsafe("name:hello date>2020-02-02")
     val expect = ItemQueryParser.parseUnsafe("(& name:hello date>2020-02-02 )")
     assertEquals(expect, q)
   }
@@ -51,7 +51,7 @@ class ItemQueryParserTest extends FunSuite {
 
   test("splice inner and nodes") {
     val raw = "(& name:hello (& date:2021-02 name:world) (& name:hello) )"
-    val q   = ItemQueryParser.parseUnsafe(raw)
+    val q = ItemQueryParser.parseUnsafe(raw)
     val expect =
       ItemQueryParser.parseUnsafe("name:hello date:2021-02 name:world name:hello")
     assertEquals(expect.copy(raw = raw.some), q)
@@ -59,7 +59,7 @@ class ItemQueryParserTest extends FunSuite {
 
   test("splice inner or nodes") {
     val raw = "(| name:hello (| date:2021-02 name:world) (| name:hello) )"
-    val q   = ItemQueryParser.parseUnsafe(raw)
+    val q = ItemQueryParser.parseUnsafe(raw)
     val expect =
       ItemQueryParser.parseUnsafe("(| name:hello date:2021-02 name:world name:hello )")
     assertEquals(expect.copy(raw = raw.some), q)
diff --git a/modules/restserver/src/main/scala/docspell/restserver/Config.scala b/modules/restserver/src/main/scala/docspell/restserver/Config.scala
index 9a6b220d..4b64d7e7 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/Config.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/Config.scala
@@ -56,8 +56,8 @@ object Config {
     case class AllowedIps(enabled: Boolean, ips: Set[String]) {
 
       def containsAddress(ipa: IpAddress): Boolean = {
-        val inet         = ipa.toInetAddress
-        val ip           = inet.getHostAddress
+        val inet = ipa.toInetAddress
+        val ip = inet.getHostAddress
         lazy val ipParts = ip.split('.')
 
         def checkSingle(pattern: String): Boolean =
diff --git a/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala b/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala
index 49b8bdde..3cc244fb 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/RestServer.scala
@@ -39,7 +39,7 @@ object RestServer {
           .create[F](cfg, pools.connectEC, pools.httpClientEC)
       httpClient <- BlazeClientBuilder[F](pools.httpClientEC).resource
       httpApp = Router(
-        "/api/info"     -> routes.InfoRoutes(),
+        "/api/info" -> routes.InfoRoutes(),
         "/api/v1/open/" -> openRoutes(cfg, httpClient, restApp),
         "/api/v1/sec/" -> Authenticate(restApp.backend.login, cfg.auth) { token =>
           securedRoutes(cfg, restApp, token)
@@ -47,11 +47,11 @@ object RestServer {
         "/api/v1/admin" -> AdminRoutes(cfg.adminEndpoint) {
           adminRoutes(cfg, restApp)
         },
-        "/api/doc"    -> templates.doc,
+        "/api/doc" -> templates.doc,
         "/app/assets" -> EnvMiddleware(WebjarRoutes.appRoutes[F]),
-        "/app"        -> EnvMiddleware(templates.app),
-        "/sw.js"      -> EnvMiddleware(templates.serviceWorker),
-        "/"           -> redirectTo("/app")
+        "/app" -> EnvMiddleware(templates.app),
+        "/sw.js" -> EnvMiddleware(templates.serviceWorker),
+        "/" -> redirectTo("/app")
       ).orNotFound
 
       finalHttpApp = Logger.httpApp(logHeaders = false, logBody = false)(httpApp)
@@ -75,31 +75,31 @@ object RestServer {
       token: AuthToken
   ): HttpRoutes[F] =
     Router(
-      "auth"                    -> LoginRoutes.session(restApp.backend.login, cfg, token),
-      "tag"                     -> TagRoutes(restApp.backend, token),
-      "equipment"               -> EquipmentRoutes(restApp.backend, token),
-      "organization"            -> OrganizationRoutes(restApp.backend, token),
-      "person"                  -> PersonRoutes(restApp.backend, token),
-      "source"                  -> SourceRoutes(restApp.backend, token),
-      "user/otp"                -> TotpRoutes(restApp.backend, cfg, token),
-      "user"                    -> UserRoutes(restApp.backend, token),
-      "collective"              -> CollectiveRoutes(restApp.backend, token),
-      "queue"                   -> JobQueueRoutes(restApp.backend, token),
-      "item"                    -> ItemRoutes(cfg, restApp.backend, token),
-      "items"                   -> ItemMultiRoutes(restApp.backend, token),
-      "attachment"              -> AttachmentRoutes(restApp.backend, token),
-      "attachments"             -> AttachmentMultiRoutes(restApp.backend, token),
-      "upload"                  -> UploadRoutes.secured(restApp.backend, cfg, token),
-      "checkfile"               -> CheckFileRoutes.secured(restApp.backend, token),
-      "email/send"              -> MailSendRoutes(restApp.backend, token),
-      "email/settings"          -> MailSettingsRoutes(restApp.backend, token),
-      "email/sent"              -> SentMailRoutes(restApp.backend, token),
+      "auth" -> LoginRoutes.session(restApp.backend.login, cfg, token),
+      "tag" -> TagRoutes(restApp.backend, token),
+      "equipment" -> EquipmentRoutes(restApp.backend, token),
+      "organization" -> OrganizationRoutes(restApp.backend, token),
+      "person" -> PersonRoutes(restApp.backend, token),
+      "source" -> SourceRoutes(restApp.backend, token),
+      "user/otp" -> TotpRoutes(restApp.backend, cfg, token),
+      "user" -> UserRoutes(restApp.backend, token),
+      "collective" -> CollectiveRoutes(restApp.backend, token),
+      "queue" -> JobQueueRoutes(restApp.backend, token),
+      "item" -> ItemRoutes(cfg, restApp.backend, token),
+      "items" -> ItemMultiRoutes(restApp.backend, token),
+      "attachment" -> AttachmentRoutes(restApp.backend, token),
+      "attachments" -> AttachmentMultiRoutes(restApp.backend, token),
+      "upload" -> UploadRoutes.secured(restApp.backend, cfg, token),
+      "checkfile" -> CheckFileRoutes.secured(restApp.backend, token),
+      "email/send" -> MailSendRoutes(restApp.backend, token),
+      "email/settings" -> MailSettingsRoutes(restApp.backend, token),
+      "email/sent" -> SentMailRoutes(restApp.backend, token),
       "usertask/notifydueitems" -> NotifyDueItemsRoutes(cfg, restApp.backend, token),
-      "usertask/scanmailbox"    -> ScanMailboxRoutes(restApp.backend, token),
-      "calevent/check"          -> CalEventCheckRoutes(),
-      "fts"            -> FullTextIndexRoutes.secured(cfg, restApp.backend, token),
-      "folder"         -> FolderRoutes(restApp.backend, token),
-      "customfield"    -> CustomFieldRoutes(restApp.backend, token),
+      "usertask/scanmailbox" -> ScanMailboxRoutes(restApp.backend, token),
+      "calevent/check" -> CalEventCheckRoutes(),
+      "fts" -> FullTextIndexRoutes.secured(cfg, restApp.backend, token),
+      "folder" -> FolderRoutes(restApp.backend, token),
+      "customfield" -> CustomFieldRoutes(restApp.backend, token),
       "clientSettings" -> ClientSettingsRoutes(restApp.backend, token)
     )
 
@@ -115,19 +115,19 @@ object RestServer {
         OpenId.codeFlowConfig(cfg),
         client
       ),
-      "auth"        -> LoginRoutes.login(restApp.backend.login, cfg),
-      "signup"      -> RegisterRoutes(restApp.backend, cfg),
-      "upload"      -> UploadRoutes.open(restApp.backend, cfg),
-      "checkfile"   -> CheckFileRoutes.open(restApp.backend),
+      "auth" -> LoginRoutes.login(restApp.backend.login, cfg),
+      "signup" -> RegisterRoutes(restApp.backend, cfg),
+      "upload" -> UploadRoutes.open(restApp.backend, cfg),
+      "checkfile" -> CheckFileRoutes.open(restApp.backend),
       "integration" -> IntegrationEndpointRoutes.open(restApp.backend, cfg)
     )
 
   def adminRoutes[F[_]: Async](cfg: Config, restApp: RestApp[F]): HttpRoutes[F] =
     Router(
-      "fts"         -> FullTextIndexRoutes.admin(cfg, restApp.backend),
-      "user/otp"    -> TotpRoutes.admin(restApp.backend),
-      "user"        -> UserRoutes.admin(restApp.backend),
-      "info"        -> InfoRoutes.admin(cfg),
+      "fts" -> FullTextIndexRoutes.admin(cfg, restApp.backend),
+      "user/otp" -> TotpRoutes.admin(restApp.backend),
+      "user" -> UserRoutes.admin(restApp.backend),
+      "info" -> InfoRoutes.admin(cfg),
       "attachments" -> AttachmentRoutes.admin(restApp.backend)
     )
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/auth/CookieData.scala b/modules/restserver/src/main/scala/docspell/restserver/auth/CookieData.scala
index fc1dbeac..03d5cffa 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/auth/CookieData.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/auth/CookieData.scala
@@ -15,10 +15,10 @@ import org.typelevel.ci.CIString
 
 case class CookieData(auth: AuthToken) {
   def accountId: AccountId = auth.account
-  def asString: String     = auth.asString
+  def asString: String = auth.asString
 
   def asCookie(baseUrl: LenientUri): ResponseCookie = {
-    val sec  = baseUrl.scheme.exists(_.endsWith("s"))
+    val sec = baseUrl.scheme.exists(_.endsWith("s"))
     val path = baseUrl.path / "api" / "v1" / "sec"
     ResponseCookie(
       CookieData.cookieName,
diff --git a/modules/restserver/src/main/scala/docspell/restserver/auth/OpenId.scala b/modules/restserver/src/main/scala/docspell/restserver/auth/OpenId.scala
index c4edc95a..668a405a 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/auth/OpenId.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/auth/OpenId.scala
@@ -40,9 +40,9 @@ object OpenId {
     OnUserInfo { (req, provider, userInfo) =>
       val dsl = new Http4sDsl[F] {}
       import dsl._
-      val logger   = Logger.log4s(log)
-      val baseUrl  = ClientRequestInfo.getBaseUrl(config, req)
-      val uri      = baseUrl.withQuery("openid", "1") / "app" / "login"
+      val logger = Logger.log4s(log)
+      val baseUrl = ClientRequestInfo.getBaseUrl(config, req)
+      val uri = baseUrl.withQuery("openid", "1") / "app" / "login"
       val location = Location(Uri.unsafeFromString(uri.asString))
       val cfg = config.openid
         .find(_.provider.providerId == provider.providerId)
@@ -229,9 +229,9 @@ object OpenId {
 
     sealed trait ExtractResult
     object ExtractResult {
-      final case class Identifier(name: Ident)       extends ExtractResult
+      final case class Identifier(name: Ident) extends ExtractResult
       final case class Account(accountId: AccountId) extends ExtractResult
-      final case class Failure(message: String)      extends ExtractResult
+      final case class Failure(message: String) extends ExtractResult
     }
   }
 }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/auth/RememberCookieData.scala b/modules/restserver/src/main/scala/docspell/restserver/auth/RememberCookieData.scala
index d0d27361..65b4ed9b 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/auth/RememberCookieData.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/auth/RememberCookieData.scala
@@ -15,7 +15,7 @@ case class RememberCookieData(token: RememberToken) {
   def asString: String = token.asString
 
   def asCookie(config: Login.RememberMe, baseUrl: LenientUri): ResponseCookie = {
-    val sec  = baseUrl.scheme.exists(_.endsWith("s"))
+    val sec = baseUrl.scheme.exists(_.endsWith("s"))
     val path = baseUrl.path / "api" / "v1"
     ResponseCookie(
       name = RememberCookieData.cookieName,
diff --git a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala
index 9d6231c1..48ea6526 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala
@@ -236,7 +236,7 @@ trait Conversions {
     )
 
   def mkItemLight(i: OFulltext.FtsItem): ItemLight = {
-    val il        = mkItemLight(i.item)
+    val il = mkItemLight(i.item)
     val highlight = mkHighlight(i.ftsData)
     il.copy(highlighting = highlight)
   }
@@ -253,7 +253,7 @@ trait Conversions {
     AttachmentLight(qa.id, qa.position, qa.name, qa.pageCount)
 
   def mkItemLightWithTags(i: OFulltext.FtsItemWithTags): ItemLight = {
-    val il        = mkItemLightWithTags(i.item)
+    val il = mkItemLightWithTags(i.item)
     val highlight = mkHighlight(i.ftsData)
     il.copy(highlighting = highlight)
   }
@@ -374,8 +374,8 @@ trait Conversions {
       )
     for {
       metaData <- meta
-      _        <- Async[F].delay(logger.debug(s"Parsed upload meta data: $metaData"))
-      tracker  <- Ident.randomId[F]
+      _ <- Async[F].delay(logger.debug(s"Parsed upload meta data: $metaData"))
+      tracker <- Ident.randomId[F]
     } yield UploadData(metaData._1, metaData._2, files, prio, Some(tracker))
   }
 
@@ -398,8 +398,8 @@ trait Conversions {
     def contacts(oid: Ident) =
       v.contacts.traverse(c => newContact(c, oid.some, None))
     for {
-      now  <- Timestamp.current[F]
-      oid  <- Ident.randomId[F]
+      now <- Timestamp.current[F]
+      oid <- Ident.randomId[F]
       cont <- contacts(oid)
       org = ROrganization(
         oid,
@@ -425,7 +425,7 @@ trait Conversions {
     def contacts(oid: Ident) =
       v.contacts.traverse(c => newContact(c, oid.some, None))
     for {
-      now  <- Timestamp.current[F]
+      now <- Timestamp.current[F]
       cont <- contacts(v.id)
       org = ROrganization(
         v.id,
@@ -462,8 +462,8 @@ trait Conversions {
     def contacts(pid: Ident) =
       v.contacts.traverse(c => newContact(c, None, pid.some))
     for {
-      now  <- Timestamp.current[F]
-      pid  <- Ident.randomId[F]
+      now <- Timestamp.current[F]
+      pid <- Ident.randomId[F]
       cont <- contacts(pid)
       pers = RPerson(
         pid,
@@ -489,7 +489,7 @@ trait Conversions {
     def contacts(pid: Ident) =
       v.contacts.traverse(c => newContact(c, None, pid.some))
     for {
-      now  <- Timestamp.current[F]
+      now <- Timestamp.current[F]
       cont <- contacts(v.id)
       pers = RPerson(
         v.id,
@@ -738,7 +738,7 @@ object Conversions extends Conversions {
 
   private def timeId[F[_]: Sync]: F[(Ident, Timestamp)] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current
     } yield (id, now)
 }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/http4s/BinaryUtil.scala b/modules/restserver/src/main/scala/docspell/restserver/http4s/BinaryUtil.scala
index 156d57f3..e97eda8f 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/http4s/BinaryUtil.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/http4s/BinaryUtil.scala
@@ -28,10 +28,10 @@ object BinaryUtil {
   ): F[Response[F]] = {
     import dsl._
 
-    val mt     = MediaType.unsafeParse(data.meta.mimetype.asString)
-    val ctype  = `Content-Type`(mt)
+    val mt = MediaType.unsafeParse(data.meta.mimetype.asString)
+    val ctype = `Content-Type`(mt)
     val cntLen = `Content-Length`.unsafeFromLong(data.meta.length.bytes)
-    val eTag   = ETag(data.meta.checksum.toHex)
+    val eTag = ETag(data.meta.checksum.toHex)
     val disp =
       `Content-Disposition`(
         "inline",
diff --git a/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala b/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala
index 59eddc76..8d962b78 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/http4s/ClientRequestInfo.scala
@@ -16,8 +16,7 @@ import org.http4s._
 import org.http4s.headers._
 import org.typelevel.ci.CIString
 
-/** Obtain information about the client by inspecting the request.
-  */
+/** Obtain information about the client by inspecting the request. */
 object ClientRequestInfo {
 
   def getBaseUrl[F[_]](cfg: Config, req: Request[F]): LenientUri =
@@ -27,8 +26,8 @@ object ClientRequestInfo {
   private def getBaseUrl[F[_]](req: Request[F], serverPort: Int): Option[LenientUri] =
     for {
       scheme <- NonEmptyList.fromList(getProtocol(req).toList)
-      host   <- getHostname(req)
-      port     = xForwardedPort(req).getOrElse(serverPort)
+      host <- getHostname(req)
+      port = xForwardedPort(req).getOrElse(serverPort)
       hostPort = if (port == 80 || port == 443) host else s"$host:$port"
     } yield LenientUri(scheme, Some(hostPort), LenientUri.EmptyPath, None, None)
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala b/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala
index 0fde077f..102325da 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/http4s/QueryParam.scala
@@ -72,17 +72,17 @@ object QueryParam {
 
   object QueryOpt extends OptionalQueryParamDecoderMatcher[QueryString]("q")
 
-  object Query       extends OptionalQueryParamDecoderMatcher[String]("q")
-  object Limit       extends OptionalQueryParamDecoderMatcher[Int]("limit")
-  object Offset      extends OptionalQueryParamDecoderMatcher[Int]("offset")
+  object Query extends OptionalQueryParamDecoderMatcher[String]("q")
+  object Limit extends OptionalQueryParamDecoderMatcher[Int]("limit")
+  object Offset extends OptionalQueryParamDecoderMatcher[Int]("offset")
   object WithDetails extends OptionalQueryParamDecoderMatcher[Boolean]("withDetails")
-  object SearchKind  extends OptionalQueryParamDecoderMatcher[SearchMode]("searchMode")
-  object TagSort     extends OptionalQueryParamDecoderMatcher[TagOrder]("sort")
-  object EquipSort   extends OptionalQueryParamDecoderMatcher[EquipmentOrder]("sort")
-  object OrgSort     extends OptionalQueryParamDecoderMatcher[OrganizationOrder]("sort")
-  object PersonSort  extends OptionalQueryParamDecoderMatcher[PersonOrder]("sort")
-  object FolderSort  extends OptionalQueryParamDecoderMatcher[FolderOrder]("sort")
-  object FieldSort   extends OptionalQueryParamDecoderMatcher[CustomFieldOrder]("sort")
+  object SearchKind extends OptionalQueryParamDecoderMatcher[SearchMode]("searchMode")
+  object TagSort extends OptionalQueryParamDecoderMatcher[TagOrder]("sort")
+  object EquipSort extends OptionalQueryParamDecoderMatcher[EquipmentOrder]("sort")
+  object OrgSort extends OptionalQueryParamDecoderMatcher[OrganizationOrder]("sort")
+  object PersonSort extends OptionalQueryParamDecoderMatcher[PersonOrder]("sort")
+  object FolderSort extends OptionalQueryParamDecoderMatcher[FolderOrder]("sort")
+  object FieldSort extends OptionalQueryParamDecoderMatcher[CustomFieldOrder]("sort")
 
   object WithFallback extends OptionalQueryParamDecoderMatcher[Boolean]("withFallback")
 }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentMultiRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentMultiRoutes.scala
index 662d951e..c6327b21 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentMultiRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentMultiRoutes.scala
@@ -31,7 +31,7 @@ object AttachmentMultiRoutes extends MultiIdSupport {
 
     HttpRoutes.of { case req @ POST -> Root / "delete" =>
       for {
-        json        <- req.as[IdList]
+        json <- req.as[IdList]
         attachments <- readIds[F](json.ids)
         n <- backend.item.deleteAttachmentMultiple(attachments, user.account.collective)
         res = BasicResult(
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentRoutes.scala
index 254944a9..9b5d52aa 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/AttachmentRoutes.scala
@@ -56,7 +56,7 @@ object AttachmentRoutes {
       case req @ GET -> Root / Ident(id) =>
         for {
           fileData <- backend.itemSearch.findAttachment(id, user.account.collective)
-          inm     = req.headers.get[`If-None-Match`].flatMap(_.tags)
+          inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
           matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
           resp <-
             fileData
@@ -79,7 +79,7 @@ object AttachmentRoutes {
       case req @ GET -> Root / Ident(id) / "original" =>
         for {
           fileData <- backend.itemSearch.findAttachmentSource(id, user.account.collective)
-          inm     = req.headers.get[`If-None-Match`].flatMap(_.tags)
+          inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
           matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
           resp <-
             fileData
@@ -104,7 +104,7 @@ object AttachmentRoutes {
         for {
           fileData <-
             backend.itemSearch.findAttachmentArchive(id, user.account.collective)
-          inm     = req.headers.get[`If-None-Match`].flatMap(_.tags)
+          inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
           matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
           resp <-
             fileData
@@ -121,8 +121,8 @@ object AttachmentRoutes {
         for {
           fileData <-
             backend.itemSearch.findAttachmentPreview(id, user.account.collective)
-          inm      = req.headers.get[`If-None-Match`].flatMap(_.tags)
-          matches  = BinaryUtil.matchETag(fileData.map(_.meta), inm)
+          inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
+          matches = BinaryUtil.matchETag(fileData.map(_.meta), inm)
           fallback = flag.getOrElse(false)
           resp <-
             fileData
@@ -162,7 +162,7 @@ object AttachmentRoutes {
         // this route exists to provide a stable url
         // it redirects currently to viewerjs
         val attachUrl = s"/api/v1/sec/attachment/${id.id}"
-        val path      = s"/app/assets${Webjars.viewerjs}/index.html#$attachUrl"
+        val path = s"/app/assets${Webjars.viewerjs}/index.html#$attachUrl"
         SeeOther(Location(Uri(path = Uri.Path.unsafeFromString(path))))
 
       case GET -> Root / Ident(id) / "meta" =>
@@ -174,8 +174,8 @@ object AttachmentRoutes {
 
       case req @ POST -> Root / Ident(id) / "name" =>
         for {
-          nn   <- req.as[OptionalText]
-          res  <- backend.item.setAttachmentName(id, nn.text, user.account.collective)
+          nn <- req.as[OptionalText]
+          res <- backend.item.setAttachmentName(id, nn.text, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Name updated."))
         } yield resp
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/CalEventCheckRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/CalEventCheckRoutes.scala
index 2b966423..39689f73 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/CalEventCheckRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/CalEventCheckRoutes.scala
@@ -27,7 +27,7 @@ object CalEventCheckRoutes {
     HttpRoutes.of { case req @ POST -> Root =>
       for {
         data <- req.as[CalEventCheck]
-        res  <- testEvent(data.event)
+        res <- testEvent(data.event)
         resp <- Ok(res)
       } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/CheckFileRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/CheckFileRoutes.scala
index 5b26e4d2..1e471b48 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/CheckFileRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/CheckFileRoutes.scala
@@ -43,7 +43,7 @@ object CheckFileRoutes {
     HttpRoutes.of { case GET -> Root / Ident(id) / checksum =>
       for {
         items <- backend.itemSearch.findByFileSource(checksum, id)
-        resp  <- items.map(convert).map(Ok(_)).getOrElse(NotFound())
+        resp <- items.map(convert).map(Ok(_)).getOrElse(NotFound())
       } yield resp
     }
   }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ClientSettingsRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ClientSettingsRoutes.scala
index 3373b141..962f6f13 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/ClientSettingsRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ClientSettingsRoutes.scala
@@ -30,8 +30,8 @@ object ClientSettingsRoutes {
       case req @ PUT -> Root / Ident(clientId) =>
         for {
           data <- req.as[Json]
-          _    <- backend.clientSettings.save(clientId, user.account, data)
-          res  <- Ok(BasicResult(true, "Settings stored"))
+          _ <- backend.clientSettings.save(clientId, user.account, data)
+          res <- Ok(BasicResult(true, "Settings stored"))
         } yield res
 
       case GET -> Root / Ident(clientId) =>
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/CollectiveRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/CollectiveRoutes.scala
index 963cf267..75690d64 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/CollectiveRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/CollectiveRoutes.scala
@@ -33,14 +33,14 @@ object CollectiveRoutes {
     HttpRoutes.of {
       case GET -> Root / "insights" =>
         for {
-          ins  <- backend.collective.insights(user.account.collective)
+          ins <- backend.collective.insights(user.account.collective)
           resp <- Ok(Conversions.mkItemInsights(ins))
         } yield resp
 
       case GET -> Root / "tagcloud" =>
         for {
           cloud <- backend.collective.tagCloud(user.account.collective)
-          resp  <- Ok(Conversions.mkTagCloud(cloud))
+          resp <- Ok(Conversions.mkTagCloud(cloud))
         } yield resp
 
       case req @ POST -> Root / "settings" =>
@@ -109,7 +109,7 @@ object CollectiveRoutes {
 
       case POST -> Root / "classifier" / "startonce" =>
         for {
-          _    <- backend.collective.startLearnClassifier(user.account.collective)
+          _ <- backend.collective.startLearnClassifier(user.account.collective)
           resp <- Ok(BasicResult(true, "Task submitted"))
         } yield resp
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/CustomFieldRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/CustomFieldRoutes.scala
index edfd1ec8..2a32b0be 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/CustomFieldRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/CustomFieldRoutes.scala
@@ -48,26 +48,26 @@ object CustomFieldRoutes {
       case req @ POST -> Root =>
         for {
           data <- req.as[NewCustomField]
-          res  <- backend.customFields.create(convertNewField(user, data))
+          res <- backend.customFields.create(convertNewField(user, data))
           resp <- Ok(convertResult(res))
         } yield resp
 
       case GET -> Root / Ident(id) =>
         (for {
           field <- OptionT(backend.customFields.findById(user.account.collective, id))
-          res   <- OptionT.liftF(Ok(convertField(field)))
+          res <- OptionT.liftF(Ok(convertField(field)))
         } yield res).getOrElseF(NotFound(BasicResult(false, "Not found")))
 
       case req @ PUT -> Root / Ident(id) =>
         for {
           data <- req.as[NewCustomField]
-          res  <- backend.customFields.change(convertChangeField(id, user, data))
+          res <- backend.customFields.change(convertChangeField(id, user, data))
           resp <- Ok(convertResult(res))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          res  <- backend.customFields.delete(user.account.collective, id)
+          res <- backend.customFields.delete(user.account.collective, id)
           resp <- Ok(convertResult(res))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/EquipmentRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/EquipmentRoutes.scala
index 30a8f379..ce9e3217 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/EquipmentRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/EquipmentRoutes.scala
@@ -42,30 +42,30 @@ object EquipmentRoutes {
 
       case req @ POST -> Root =>
         for {
-          data  <- req.as[Equipment]
+          data <- req.as[Equipment]
           equip <- newEquipment(data, user.account.collective)
-          res   <- backend.equipment.add(equip)
-          resp  <- Ok(basicResult(res, "Equipment created"))
+          res <- backend.equipment.add(equip)
+          resp <- Ok(basicResult(res, "Equipment created"))
         } yield resp
 
       case req @ PUT -> Root =>
         for {
-          data  <- req.as[Equipment]
+          data <- req.as[Equipment]
           equip <- changeEquipment(data, user.account.collective)
-          res   <- backend.equipment.update(equip)
-          resp  <- Ok(basicResult(res, "Equipment updated."))
+          res <- backend.equipment.update(equip)
+          resp <- Ok(basicResult(res, "Equipment updated."))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          del  <- backend.equipment.delete(id, user.account.collective)
+          del <- backend.equipment.delete(id, user.account.collective)
           resp <- Ok(basicResult(del, "Equipment deleted."))
         } yield resp
 
       case GET -> Root / Ident(id) =>
         (for {
           equip <- OptionT(backend.equipment.find(user.account, id))
-          resp  <- OptionT.liftF(Ok(mkEquipment(equip)))
+          resp <- OptionT.liftF(Ok(mkEquipment(equip)))
         } yield resp).getOrElseF(NotFound())
     }
   }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/FolderRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/FolderRoutes.scala
index 277b94ea..b177f3c8 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/FolderRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/FolderRoutes.scala
@@ -37,15 +37,15 @@ object FolderRoutes {
         val login =
           owning.filter(identity).map(_ => user.account.user)
         for {
-          all  <- backend.folder.findAll(user.account, login, q.map(_.q), order)
+          all <- backend.folder.findAll(user.account, login, q.map(_.q), order)
           resp <- Ok(FolderList(all.map(mkFolder).toList))
         } yield resp
 
       case req @ POST -> Root =>
         for {
-          data    <- req.as[NewFolder]
+          data <- req.as[NewFolder]
           nfolder <- newFolder(data, user.account)
-          res     <- backend.folder.add(nfolder, Some(user.account.user))
+          res <- backend.folder.add(nfolder, Some(user.account.user))
           resp <-
             Ok(Conversions.idResult(res, nfolder.id, "Folder successfully created."))
         } yield resp
@@ -53,31 +53,31 @@ object FolderRoutes {
       case GET -> Root / Ident(id) =>
         (for {
           folder <- OptionT(backend.folder.findById(id, user.account))
-          resp   <- OptionT.liftF(Ok(mkFolderDetail(folder)))
+          resp <- OptionT.liftF(Ok(mkFolderDetail(folder)))
         } yield resp).getOrElseF(NotFound())
 
       case req @ PUT -> Root / Ident(id) =>
         for {
           data <- req.as[NewFolder]
-          res  <- backend.folder.changeName(id, user.account, data.name)
+          res <- backend.folder.changeName(id, user.account, data.name)
           resp <- Ok(mkFolderChangeResult(res))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          res  <- backend.folder.delete(id, user.account)
+          res <- backend.folder.delete(id, user.account)
           resp <- Ok(mkFolderChangeResult(res))
         } yield resp
 
       case PUT -> Root / Ident(id) / "member" / Ident(userId) =>
         for {
-          res  <- backend.folder.addMember(id, user.account, userId)
+          res <- backend.folder.addMember(id, user.account, userId)
           resp <- Ok(mkFolderChangeResult(res))
         } yield resp
 
       case DELETE -> Root / Ident(id) / "member" / Ident(userId) =>
         for {
-          res  <- backend.folder.removeMember(id, user.account, userId)
+          res <- backend.folder.removeMember(id, user.account, userId)
           resp <- Ok(mkFolderChangeResult(res))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/FullTextIndexRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/FullTextIndexRoutes.scala
index f1119c53..1a512693 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/FullTextIndexRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/FullTextIndexRoutes.scala
@@ -33,7 +33,7 @@ object FullTextIndexRoutes {
 
       HttpRoutes.of { case POST -> Root / "reIndex" =>
         for {
-          res  <- backend.fulltext.reindexCollective(user.account).attempt
+          res <- backend.fulltext.reindexCollective(user.account).attempt
           resp <- Ok(Conversions.basicResult(res, "Full-text index will be re-created."))
         } yield resp
       }
@@ -47,7 +47,7 @@ object FullTextIndexRoutes {
 
       HttpRoutes.of { case POST -> Root / "reIndexAll" =>
         for {
-          res  <- backend.fulltext.reindexAll.attempt
+          res <- backend.fulltext.reindexAll.attempt
           resp <- Ok(Conversions.basicResult(res, "Full-text index will be re-created."))
         } yield resp
       }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/IntegrationEndpointRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/IntegrationEndpointRoutes.scala
index e0589a0a..687f1127 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/IntegrationEndpointRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/IntegrationEndpointRoutes.scala
@@ -50,7 +50,7 @@ object IntegrationEndpointRoutes {
 
       case req @ GET -> Root / "item" / Ident(collective) =>
         (for {
-          _   <- validate(req, collective)
+          _ <- validate(req, collective)
           res <- EitherT.liftF[F, Response[F], Response[F]](Ok(()))
         } yield res).fold(identity, identity)
 
@@ -112,7 +112,7 @@ object IntegrationEndpointRoutes {
       )
       account = AccountId(coll, DocspellSystem.user)
       result <- backend.upload.submit(updata, account, true, None)
-      res    <- Ok(basicResult(result))
+      res <- Ok(basicResult(result))
     } yield res
   }
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala
index 3b1f8ebd..ae08e6c4 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala
@@ -59,7 +59,7 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ PUT -> Root / "tags" =>
         for {
-          json  <- req.as[ItemsAndRefs]
+          json <- req.as[ItemsAndRefs]
           items <- readIds[F](json.items)
           res <- backend.item.setTagsMultipleItems(
             items,
@@ -71,7 +71,7 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ POST -> Root / "tags" =>
         for {
-          json  <- req.as[ItemsAndRefs]
+          json <- req.as[ItemsAndRefs]
           items <- readIds[F](json.items)
           res <- backend.item.linkTagsMultipleItems(
             items,
@@ -83,7 +83,7 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ POST -> Root / "tagsremove" =>
         for {
-          json  <- req.as[ItemsAndRefs]
+          json <- req.as[ItemsAndRefs]
           items <- readIds[F](json.items)
           res <- backend.item.removeTagsMultipleItems(
             items,
@@ -95,7 +95,7 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ PUT -> Root / "name" =>
         for {
-          json  <- req.as[ItemsAndName]
+          json <- req.as[ItemsAndName]
           items <- readIds[F](json.items)
           res <- backend.item.setNameMultiple(
             items,
@@ -107,15 +107,15 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ PUT -> Root / "folder" =>
         for {
-          json  <- req.as[ItemsAndRef]
+          json <- req.as[ItemsAndRef]
           items <- readIds[F](json.items)
-          res  <- backend.item.setFolderMultiple(items, json.ref, user.account.collective)
+          res <- backend.item.setFolderMultiple(items, json.ref, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Folder updated"))
         } yield resp
 
       case req @ PUT -> Root / "direction" =>
         for {
-          json  <- req.as[ItemsAndDirection]
+          json <- req.as[ItemsAndDirection]
           items <- readIds[F](json.items)
           res <- backend.item.setDirection(items, json.direction, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Direction updated"))
@@ -123,65 +123,65 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ PUT -> Root / "date" =>
         for {
-          json  <- req.as[ItemsAndDate]
+          json <- req.as[ItemsAndDate]
           items <- readIds[F](json.items)
-          res   <- backend.item.setItemDate(items, json.date, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Item date updated"))
+          res <- backend.item.setItemDate(items, json.date, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Item date updated"))
         } yield resp
 
       case req @ PUT -> Root / "duedate" =>
         for {
-          json  <- req.as[ItemsAndDate]
+          json <- req.as[ItemsAndDate]
           items <- readIds[F](json.items)
-          res   <- backend.item.setItemDueDate(items, json.date, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Item due date updated"))
+          res <- backend.item.setItemDueDate(items, json.date, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Item due date updated"))
         } yield resp
 
       case req @ PUT -> Root / "corrOrg" =>
         for {
-          json  <- req.as[ItemsAndRef]
+          json <- req.as[ItemsAndRef]
           items <- readIds[F](json.items)
-          res   <- backend.item.setCorrOrg(items, json.ref, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Correspondent organization updated"))
+          res <- backend.item.setCorrOrg(items, json.ref, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Correspondent organization updated"))
         } yield resp
 
       case req @ PUT -> Root / "corrPerson" =>
         for {
-          json  <- req.as[ItemsAndRef]
+          json <- req.as[ItemsAndRef]
           items <- readIds[F](json.items)
-          res   <- backend.item.setCorrPerson(items, json.ref, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Correspondent person updated"))
+          res <- backend.item.setCorrPerson(items, json.ref, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Correspondent person updated"))
         } yield resp
 
       case req @ PUT -> Root / "concPerson" =>
         for {
-          json  <- req.as[ItemsAndRef]
+          json <- req.as[ItemsAndRef]
           items <- readIds[F](json.items)
-          res   <- backend.item.setConcPerson(items, json.ref, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Concerned person updated"))
+          res <- backend.item.setConcPerson(items, json.ref, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Concerned person updated"))
         } yield resp
 
       case req @ PUT -> Root / "concEquipment" =>
         for {
-          json  <- req.as[ItemsAndRef]
+          json <- req.as[ItemsAndRef]
           items <- readIds[F](json.items)
-          res   <- backend.item.setConcEquip(items, json.ref, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
+          res <- backend.item.setConcEquip(items, json.ref, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
         } yield resp
 
       case req @ POST -> Root / "reprocess" =>
         for {
-          json  <- req.as[IdList]
+          json <- req.as[IdList]
           items <- readIds[F](json.ids)
-          res   <- backend.item.reprocessAll(items, user.account, true)
-          resp  <- Ok(Conversions.basicResult(res, "Re-process task(s) submitted."))
+          res <- backend.item.reprocessAll(items, user.account, true)
+          resp <- Ok(Conversions.basicResult(res, "Re-process task(s) submitted."))
         } yield resp
 
       case req @ POST -> Root / "deleteAll" =>
         for {
-          json  <- req.as[IdList]
+          json <- req.as[IdList]
           items <- readIds[F](json.ids)
-          n     <- backend.item.setDeletedState(items, user.account.collective)
+          n <- backend.item.setDeletedState(items, user.account.collective)
           res = BasicResult(
             n > 0,
             if (n > 0) "Item(s) deleted" else "Item deletion failed."
@@ -191,15 +191,15 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ POST -> Root / "restoreAll" =>
         for {
-          json  <- req.as[IdList]
+          json <- req.as[IdList]
           items <- readIds[F](json.ids)
-          res   <- backend.item.restore(items, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Item(s) deleted"))
+          res <- backend.item.restore(items, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Item(s) deleted"))
         } yield resp
 
       case req @ PUT -> Root / "customfield" =>
         for {
-          json  <- req.as[ItemsAndFieldValue]
+          json <- req.as[ItemsAndFieldValue]
           items <- readIds[F](json.items)
           res <- backend.customFields.setValueMultiple(
             items,
@@ -210,7 +210,7 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ POST -> Root / "customfieldremove" =>
         for {
-          json  <- req.as[ItemsAndName]
+          json <- req.as[ItemsAndName]
           items <- readIds[F](json.items)
           field <- readId[F](json.name)
           res <- backend.customFields.deleteValue(
@@ -221,10 +221,10 @@ object ItemMultiRoutes extends MultiIdSupport {
 
       case req @ POST -> Root / "merge" =>
         for {
-          json  <- req.as[IdList]
+          json <- req.as[IdList]
           items <- readIds[F](json.ids)
           logger = Logger.log4s(log4sLogger)
-          res  <- backend.item.merge(logger, items, user.account.collective)
+          res <- backend.item.merge(logger, items, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Items merged"))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala
index a5e981d9..8ea503bd 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala
@@ -65,7 +65,7 @@ object ItemRoutes {
 
       case GET -> Root / "searchStats" :? QP.Query(q) :? QP.SearchKind(searchMode) =>
         val itemQuery = ItemQueryString(q)
-        val fixQuery  = Query.Fix(user.account, None, None)
+        val fixQuery = Query.Fix(user.account, None, None)
         val settings = OSimpleSearch.StatsSettings(
           useFTS = cfg.fullTextSearch.enabled,
           searchMode = searchMode.getOrElse(SearchMode.Normal)
@@ -97,7 +97,7 @@ object ItemRoutes {
         for {
           userQuery <- req.as[ItemQuery]
           itemQuery = ItemQueryString(userQuery.query)
-          fixQuery  = Query.Fix(user.account, None, None)
+          fixQuery = Query.Fix(user.account, None, None)
           settings = OSimpleSearch.StatsSettings(
             useFTS = cfg.fullTextSearch.enabled,
             searchMode = userQuery.searchMode.getOrElse(SearchMode.Normal)
@@ -140,26 +140,26 @@ object ItemRoutes {
 
       case POST -> Root / Ident(id) / "confirm" =>
         for {
-          res  <- backend.item.setState(id, ItemState.Confirmed, user.account.collective)
+          res <- backend.item.setState(id, ItemState.Confirmed, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Item data confirmed"))
         } yield resp
 
       case POST -> Root / Ident(id) / "unconfirm" =>
         for {
-          res  <- backend.item.setState(id, ItemState.Created, user.account.collective)
+          res <- backend.item.setState(id, ItemState.Created, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Item back to created."))
         } yield resp
 
       case POST -> Root / Ident(id) / "restore" =>
         for {
-          res  <- backend.item.restore(NonEmptyList.of(id), user.account.collective)
+          res <- backend.item.restore(NonEmptyList.of(id), user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Item restored."))
         } yield resp
 
       case req @ PUT -> Root / Ident(id) / "tags" =>
         for {
           tags <- req.as[StringList].map(_.items)
-          res  <- backend.item.setTags(id, tags, user.account.collective)
+          res <- backend.item.setTags(id, tags, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Tags updated"))
         } yield resp
 
@@ -167,21 +167,21 @@ object ItemRoutes {
         for {
           data <- req.as[Tag]
           rtag <- Conversions.newTag(data, user.account.collective)
-          res  <- backend.item.addNewTag(id, rtag)
+          res <- backend.item.addNewTag(id, rtag)
           resp <- Ok(Conversions.basicResult(res, "Tag added."))
         } yield resp
 
       case req @ PUT -> Root / Ident(id) / "taglink" =>
         for {
           tags <- req.as[StringList]
-          res  <- backend.item.linkTags(id, tags.items, user.account.collective)
+          res <- backend.item.linkTags(id, tags.items, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Tags linked"))
         } yield resp
 
       case req @ POST -> Root / Ident(id) / "tagtoggle" =>
         for {
           tags <- req.as[StringList]
-          res  <- backend.item.toggleTags(id, tags.items, user.account.collective)
+          res <- backend.item.toggleTags(id, tags.items, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Tags linked"))
         } yield resp
 
@@ -210,8 +210,8 @@ object ItemRoutes {
       case req @ PUT -> Root / Ident(id) / "folder" =>
         for {
           idref <- req.as[OptionalId]
-          res   <- backend.item.setFolder(id, idref.id, user.account.collective)
-          resp  <- Ok(Conversions.basicResult(res, "Folder updated"))
+          res <- backend.item.setFolder(id, idref.id, user.account.collective)
+          resp <- Ok(Conversions.basicResult(res, "Folder updated"))
         } yield resp
 
       case req @ PUT -> Root / Ident(id) / "corrOrg" =>
@@ -228,8 +228,8 @@ object ItemRoutes {
       case req @ POST -> Root / Ident(id) / "corrOrg" =>
         for {
           data <- req.as[Organization]
-          org  <- Conversions.newOrg(data, user.account.collective)
-          res  <- backend.item.addCorrOrg(id, org)
+          org <- Conversions.newOrg(data, user.account.collective)
+          res <- backend.item.addCorrOrg(id, org)
           resp <- Ok(Conversions.basicResult(res, "Correspondent organization updated"))
         } yield resp
 
@@ -248,7 +248,7 @@ object ItemRoutes {
         for {
           data <- req.as[Person]
           pers <- Conversions.newPerson(data, user.account.collective)
-          res  <- backend.item.addCorrPerson(id, pers)
+          res <- backend.item.addCorrPerson(id, pers)
           resp <- Ok(Conversions.basicResult(res, "Correspondent person updated"))
         } yield resp
 
@@ -267,7 +267,7 @@ object ItemRoutes {
         for {
           data <- req.as[Person]
           pers <- Conversions.newPerson(data, user.account.collective)
-          res  <- backend.item.addConcPerson(id, pers)
+          res <- backend.item.addConcPerson(id, pers)
           resp <- Ok(Conversions.basicResult(res, "Concerned person updated"))
         } yield resp
 
@@ -284,16 +284,16 @@ object ItemRoutes {
 
       case req @ POST -> Root / Ident(id) / "concEquipment" =>
         for {
-          data  <- req.as[Equipment]
+          data <- req.as[Equipment]
           equip <- Conversions.newEquipment(data, user.account.collective)
-          res   <- backend.item.addConcEquip(id, equip)
-          resp  <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
+          res <- backend.item.addConcEquip(id, equip)
+          resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated"))
         } yield resp
 
       case req @ PUT -> Root / Ident(id) / "notes" =>
         for {
           text <- req.as[OptionalText]
-          res  <- backend.item.setNotes(id, text.text.notEmpty, user.account.collective)
+          res <- backend.item.setNotes(id, text.text.notEmpty, user.account.collective)
           resp <- Ok(Conversions.basicResult(res, "Notes updated"))
         } yield resp
 
@@ -311,7 +311,7 @@ object ItemRoutes {
       case req @ PUT -> Root / Ident(id) / "duedate" =>
         for {
           date <- req.as[OptionalDate]
-          _    <- logger.fdebug(s"Setting item due date to ${date.date}")
+          _ <- logger.fdebug(s"Setting item due date to ${date.date}")
           res <- backend.item.setItemDueDate(
             NonEmptyList.of(id),
             date.date,
@@ -323,7 +323,7 @@ object ItemRoutes {
       case req @ PUT -> Root / Ident(id) / "date" =>
         for {
           date <- req.as[OptionalDate]
-          _    <- logger.fdebug(s"Setting item date to ${date.date}")
+          _ <- logger.fdebug(s"Setting item date to ${date.date}")
           res <- backend.item.setItemDate(
             NonEmptyList.of(id),
             date.date,
@@ -342,8 +342,8 @@ object ItemRoutes {
       case req @ POST -> Root / Ident(id) / "attachment" / "movebefore" =>
         for {
           data <- req.as[MoveAttachment]
-          _    <- logger.fdebug(s"Move item (${id.id}) attachment $data")
-          res  <- backend.item.moveAttachmentBefore(id, data.source, data.target)
+          _ <- logger.fdebug(s"Move item (${id.id}) attachment $data")
+          res <- backend.item.moveAttachmentBefore(id, data.source, data.target)
           resp <- Ok(Conversions.basicResult(res, "Attachment moved."))
         } yield resp
 
@@ -352,8 +352,8 @@ object ItemRoutes {
           NotFound(BasicResult(false, "Not found"))
         for {
           preview <- backend.itemSearch.findItemPreview(id, user.account.collective)
-          inm      = req.headers.get[`If-None-Match`].flatMap(_.tags)
-          matches  = BinaryUtil.matchETag(preview.map(_.meta), inm)
+          inm = req.headers.get[`If-None-Match`].flatMap(_.tags)
+          matches = BinaryUtil.matchETag(preview.map(_.meta), inm)
           fallback = flag.getOrElse(false)
           resp <-
             preview
@@ -380,8 +380,8 @@ object ItemRoutes {
         for {
           data <- req.as[IdList]
           ids = data.ids.flatMap(s => Ident.fromString(s).toOption)
-          _    <- logger.fdebug(s"Re-process item ${id.id}")
-          res  <- backend.item.reprocess(id, ids, user.account, true)
+          _ <- logger.fdebug(s"Re-process item ${id.id}")
+          res <- backend.item.reprocess(id, ids, user.account, true)
           resp <- Ok(Conversions.basicResult(res, "Re-process task submitted."))
         } yield resp
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/JobQueueRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/JobQueueRoutes.scala
index 8e43ab1b..21e0ca53 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/JobQueueRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/JobQueueRoutes.scala
@@ -37,13 +37,13 @@ object JobQueueRoutes {
       case POST -> Root / Ident(id) / "cancel" =>
         for {
           result <- backend.job.cancelJob(id, user.account.collective)
-          resp   <- Ok(Conversions.basicResult(result))
+          resp <- Ok(Conversions.basicResult(result))
         } yield resp
 
       case req @ POST -> Root / Ident(id) / "priority" =>
         for {
           prio <- req.as[JobPriority]
-          res  <- backend.job.setPriority(id, user.account.collective, prio.priority)
+          res <- backend.job.setPriority(id, user.account.collective, prio.priority)
           resp <- Ok(Conversions.basicResult(res, "Job priority changed"))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/LoginRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/LoginRoutes.scala
index b296d8f6..fa7cab5b 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/LoginRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/LoginRoutes.scala
@@ -69,7 +69,7 @@ object LoginRoutes {
 
       case req @ POST -> Root / "logout" =>
         for {
-          _   <- RememberCookieData.fromCookie(req).traverse(S.removeRememberToken)
+          _ <- RememberCookieData.fromCookie(req).traverse(S.removeRememberToken)
           res <- Ok()
         } yield res
           .removeCookie(CookieData.deleteCookie(getBaseUrl(cfg, req)))
@@ -90,7 +90,7 @@ object LoginRoutes {
     import dsl._
     res match {
       case Login.Result.Ok(token, remember) =>
-        val cd  = CookieData(token)
+        val cd = CookieData(token)
         val rem = remember.map(RememberCookieData.apply)
         for {
           resp <- Ok(
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/MailSendRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/MailSendRoutes.scala
index efc418d8..d8591aa0 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/MailSendRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/MailSendRoutes.scala
@@ -44,9 +44,9 @@ object MailSendRoutes {
 
   def convertIn(item: Ident, s: SimpleMail): Either[String, ItemMail] =
     for {
-      rec     <- s.recipients.traverse(MailAddress.parse)
-      cc      <- s.cc.traverse(MailAddress.parse)
-      bcc     <- s.bcc.traverse(MailAddress.parse)
+      rec <- s.recipients.traverse(MailAddress.parse)
+      cc <- s.cc.traverse(MailAddress.parse)
+      bcc <- s.bcc.traverse(MailAddress.parse)
       fileIds <- s.attachmentIds.traverse(Ident.fromString)
       sel =
         if (s.addAllAttachments) AttachSelection.All
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/MailSettingsRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/MailSettingsRoutes.scala
index 359679fd..4f0cd169 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/MailSettingsRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/MailSettingsRoutes.scala
@@ -49,13 +49,13 @@ object MailSettingsRoutes {
 
       case GET -> Root / "smtp" / Ident(name) =>
         (for {
-          ems  <- backend.mail.findSmtpSettings(user.account, name)
+          ems <- backend.mail.findSmtpSettings(user.account, name)
           resp <- OptionT.liftF(Ok(convert(ems)))
         } yield resp).getOrElseF(NotFound())
 
       case GET -> Root / "imap" / Ident(name) =>
         (for {
-          ems  <- backend.mail.findImapSettings(user.account, name)
+          ems <- backend.mail.findImapSettings(user.account, name)
           resp <- OptionT.liftF(Ok(convert(ems)))
         } yield resp).getOrElseF(NotFound())
 
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/NotifyDueItemsRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/NotifyDueItemsRoutes.scala
index f974cb23..6ccb2a65 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/NotifyDueItemsRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/NotifyDueItemsRoutes.scala
@@ -32,22 +32,22 @@ object NotifyDueItemsRoutes {
       user: AuthToken
   ): HttpRoutes[F] = {
     val dsl = new Http4sDsl[F] {}
-    val ut  = backend.userTask
+    val ut = backend.userTask
     import dsl._
 
     HttpRoutes.of {
       case GET -> Root / Ident(id) =>
         (for {
           task <- ut.findNotifyDueItems(id, UserTaskScope(user.account))
-          res  <- OptionT.liftF(taskToSettings(user.account, backend, task))
+          res <- OptionT.liftF(taskToSettings(user.account, backend, task))
           resp <- OptionT.liftF(Ok(res))
         } yield resp).getOrElseF(NotFound())
 
       case req @ POST -> Root / "startonce" =>
         for {
-          data  <- req.as[NotificationSettings]
+          data <- req.as[NotificationSettings]
           newId <- Ident.randomId[F]
-          task  <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
+          task <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
           res <-
             ut.executeNow(UserTaskScope(user.account), None, task)
               .attempt
@@ -83,9 +83,9 @@ object NotifyDueItemsRoutes {
 
       case req @ POST -> Root =>
         for {
-          data  <- req.as[NotificationSettings]
+          data <- req.as[NotificationSettings]
           newId <- Ident.randomId[F]
-          task  <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
+          task <- makeTask(newId, getBaseUrl(cfg, req), user.account, data)
           res <-
             ut.submitNotifyDueItems(UserTaskScope(user.account), None, task)
               .attempt
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/OrganizationRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/OrganizationRoutes.scala
index b5b885b0..25d0218b 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/OrganizationRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/OrganizationRoutes.scala
@@ -50,29 +50,29 @@ object OrganizationRoutes {
 
       case req @ POST -> Root =>
         for {
-          data   <- req.as[Organization]
+          data <- req.as[Organization]
           newOrg <- newOrg(data, user.account.collective)
-          added  <- backend.organization.addOrg(newOrg)
-          resp   <- Ok(basicResult(added, "New organization saved."))
+          added <- backend.organization.addOrg(newOrg)
+          resp <- Ok(basicResult(added, "New organization saved."))
         } yield resp
 
       case req @ PUT -> Root =>
         for {
-          data   <- req.as[Organization]
-          upOrg  <- changeOrg(data, user.account.collective)
+          data <- req.as[Organization]
+          upOrg <- changeOrg(data, user.account.collective)
           update <- backend.organization.updateOrg(upOrg)
-          resp   <- Ok(basicResult(update, "Organization updated."))
+          resp <- Ok(basicResult(update, "Organization updated."))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
           delOrg <- backend.organization.deleteOrg(id, user.account.collective)
-          resp   <- Ok(basicResult(delOrg, "Organization deleted."))
+          resp <- Ok(basicResult(delOrg, "Organization deleted."))
         } yield resp
 
       case GET -> Root / Ident(id) =>
         (for {
-          org  <- OptionT(backend.organization.findOrg(user.account, id))
+          org <- OptionT(backend.organization.findOrg(user.account, id))
           resp <- OptionT.liftF(Ok(mkOrg(org)))
         } yield resp).getOrElseF(NotFound())
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/PersonRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/PersonRoutes.scala
index c8997eed..ab2046f3 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/PersonRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/PersonRoutes.scala
@@ -57,30 +57,30 @@ object PersonRoutes {
 
       case req @ POST -> Root =>
         for {
-          data   <- req.as[Person]
+          data <- req.as[Person]
           newPer <- newPerson(data, user.account.collective)
-          added  <- backend.organization.addPerson(newPer)
-          resp   <- Ok(basicResult(added, "New person saved."))
+          added <- backend.organization.addPerson(newPer)
+          resp <- Ok(basicResult(added, "New person saved."))
         } yield resp
 
       case req @ PUT -> Root =>
         for {
-          data   <- req.as[Person]
-          upPer  <- changePerson(data, user.account.collective)
+          data <- req.as[Person]
+          upPer <- changePerson(data, user.account.collective)
           update <- backend.organization.updatePerson(upPer)
-          resp   <- Ok(basicResult(update, "Person updated."))
+          resp <- Ok(basicResult(update, "Person updated."))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          _      <- logger.fdebug(s"Deleting person ${id.id}")
+          _ <- logger.fdebug(s"Deleting person ${id.id}")
           delOrg <- backend.organization.deletePerson(id, user.account.collective)
-          resp   <- Ok(basicResult(delOrg, "Person deleted."))
+          resp <- Ok(basicResult(delOrg, "Person deleted."))
         } yield resp
 
       case GET -> Root / Ident(id) =>
         (for {
-          org  <- OptionT(backend.organization.findPerson(user.account, id))
+          org <- OptionT(backend.organization.findPerson(user.account, id))
           resp <- OptionT.liftF(Ok(mkPerson(org)))
         } yield resp).getOrElseF(NotFound())
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/RegisterRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/RegisterRoutes.scala
index 53522f9f..d8efaacb 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/RegisterRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/RegisterRoutes.scala
@@ -32,14 +32,14 @@ object RegisterRoutes {
       case req @ POST -> Root / "register" =>
         for {
           data <- req.as[Registration]
-          res  <- backend.signup.register(cfg.backend.signup)(convert(data))
+          res <- backend.signup.register(cfg.backend.signup)(convert(data))
           resp <- Ok(convert(res))
         } yield resp
 
       case req @ POST -> Root / "newinvite" =>
         for {
           data <- req.as[GenInvite]
-          res  <- backend.signup.newInvite(cfg.backend.signup)(data.password)
+          res <- backend.signup.newInvite(cfg.backend.signup)(data.password)
           resp <- Ok(convert(res))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ScanMailboxRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ScanMailboxRoutes.scala
index 883320b7..0f7a3f7f 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/ScanMailboxRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ScanMailboxRoutes.scala
@@ -29,22 +29,22 @@ object ScanMailboxRoutes {
       user: AuthToken
   ): HttpRoutes[F] = {
     val dsl = new Http4sDsl[F] {}
-    val ut  = backend.userTask
+    val ut = backend.userTask
     import dsl._
 
     HttpRoutes.of {
       case GET -> Root / Ident(id) =>
         (for {
           task <- ut.findScanMailbox(id, UserTaskScope(user.account))
-          res  <- OptionT.liftF(taskToSettings(user.account, backend, task))
+          res <- OptionT.liftF(taskToSettings(user.account, backend, task))
           resp <- OptionT.liftF(Ok(res))
         } yield resp).getOrElseF(NotFound())
 
       case req @ POST -> Root / "startonce" =>
         for {
-          data  <- req.as[ScanMailboxSettings]
+          data <- req.as[ScanMailboxSettings]
           newId <- Ident.randomId[F]
-          task  <- makeTask(newId, user.account, data)
+          task <- makeTask(newId, user.account, data)
           res <-
             ut.executeNow(UserTaskScope(user.account), None, task)
               .attempt
@@ -80,9 +80,9 @@ object ScanMailboxRoutes {
 
       case req @ POST -> Root =>
         for {
-          data  <- req.as[ScanMailboxSettings]
+          data <- req.as[ScanMailboxSettings]
           newId <- Ident.randomId[F]
-          task  <- makeTask(newId, user.account, data)
+          task <- makeTask(newId, user.account, data)
           res <-
             ut.submitScanMailbox(UserTaskScope(user.account), None, task)
               .attempt
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/SentMailRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/SentMailRoutes.scala
index 69c94e5a..16045709 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/SentMailRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/SentMailRoutes.scala
@@ -30,7 +30,7 @@ object SentMailRoutes {
     HttpRoutes.of {
       case GET -> Root / "item" / Ident(id) =>
         for {
-          all  <- backend.mail.getSentMailsForItem(user.account, id)
+          all <- backend.mail.getSentMailsForItem(user.account, id)
           resp <- Ok(SentMails(all.map(convert).toList))
         } yield resp
 
@@ -42,7 +42,7 @@ object SentMailRoutes {
 
       case DELETE -> Root / "mail" / Ident(mailId) =>
         for {
-          n    <- backend.mail.deleteSentMail(user.account, mailId)
+          n <- backend.mail.deleteSentMail(user.account, mailId)
           resp <- Ok(BasicResult(n > 0, s"Mails deleted: $n"))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/SourceRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/SourceRoutes.scala
index be7e539f..f67fd772 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/SourceRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/SourceRoutes.scala
@@ -36,10 +36,10 @@ object SourceRoutes {
 
       case req @ POST -> Root =>
         for {
-          data  <- req.as[SourceTagIn]
-          src   <- newSource(data.source, user.account.collective)
+          data <- req.as[SourceTagIn]
+          src <- newSource(data.source, user.account.collective)
           added <- backend.source.add(src, data.tags)
-          resp  <- Ok(basicResult(added, "Source added."))
+          resp <- Ok(basicResult(added, "Source added."))
         } yield resp
 
       case req @ PUT -> Root =>
@@ -47,12 +47,12 @@ object SourceRoutes {
           data <- req.as[SourceTagIn]
           src = changeSource(data.source, user.account.collective)
           updated <- backend.source.update(src, data.tags)
-          resp    <- Ok(basicResult(updated, "Source updated."))
+          resp <- Ok(basicResult(updated, "Source updated."))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          del  <- backend.source.delete(id, user.account.collective)
+          del <- backend.source.delete(id, user.account.collective)
           resp <- Ok(basicResult(del, "Source deleted."))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/TagRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/TagRoutes.scala
index 4dee2118..e503b034 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/TagRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/TagRoutes.scala
@@ -42,8 +42,8 @@ object TagRoutes {
       case req @ POST -> Root =>
         for {
           data <- req.as[Tag]
-          tag  <- newTag(data, user.account.collective)
-          res  <- backend.tag.add(tag)
+          tag <- newTag(data, user.account.collective)
+          res <- backend.tag.add(tag)
           resp <- Ok(basicResult(res, "Tag successfully created."))
         } yield resp
 
@@ -51,13 +51,13 @@ object TagRoutes {
         for {
           data <- req.as[Tag]
           tag = changeTag(data, user.account.collective)
-          res  <- backend.tag.update(tag)
+          res <- backend.tag.update(tag)
           resp <- Ok(basicResult(res, "Tag successfully updated."))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          del  <- backend.tag.delete(id, user.account.collective)
+          del <- backend.tag.delete(id, user.account.collective)
           resp <- Ok(basicResult(del, "Tag successfully deleted."))
         } yield resp
     }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/TotpRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/TotpRoutes.scala
index 2001e3c1..255ce2c2 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/TotpRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/TotpRoutes.scala
@@ -51,14 +51,14 @@ object TotpRoutes {
               InternalServerError(BasicResult(false, ex.getMessage))
             case s @ OTotp.InitResult.Success(_, key) =>
               val issuer = cfg.appName
-              val uri    = s.authenticatorUrl(issuer)
+              val uri = s.authenticatorUrl(issuer)
               Ok(OtpResult(uri, key.data.toBase32, "totp", issuer))
           }
         } yield resp
 
       case req @ POST -> Root / "confirm" =>
         for {
-          data   <- req.as[OtpConfirm]
+          data <- req.as[OtpConfirm]
           result <- backend.totp.confirmInit(user.account, OnetimePassword(data.otp.pass))
           resp <- result match {
             case OTotp.ConfirmResult.Success =>
@@ -71,7 +71,7 @@ object TotpRoutes {
       case POST -> Root / "disable" =>
         for {
           result <- backend.totp.disable(user.account)
-          resp   <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
+          resp <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
         } yield resp
     }
   }
@@ -82,9 +82,9 @@ object TotpRoutes {
 
     HttpRoutes.of { case req @ POST -> Root / "resetOTP" =>
       for {
-        data   <- req.as[ResetPassword]
+        data <- req.as[ResetPassword]
         result <- backend.totp.disable(data.account)
-        resp   <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
+        resp <- Ok(Conversions.basicResult(result, "TOTP setup disabled."))
       } yield resp
     }
   }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala
index 38509cac..70c67945 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala
@@ -90,7 +90,7 @@ object UploadRoutes {
         cfg.backend.files.validMimeTypes
       )
       result <- backend.upload.submitEither(updata, accOrSrc, true, itemId)
-      res    <- Ok(basicResult(result))
+      res <- Ok(basicResult(result))
     } yield res
   }
 }
diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/UserRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/UserRoutes.scala
index a43c604c..35944fca 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/routes/UserRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/routes/UserRoutes.scala
@@ -47,10 +47,10 @@ object UserRoutes {
 
       case req @ POST -> Root =>
         for {
-          data  <- req.as[User]
+          data <- req.as[User]
           nuser <- newUser(data, user.account.collective)
           added <- backend.collective.add(nuser)
-          resp  <- Ok(basicResult(added, "User created."))
+          resp <- Ok(basicResult(added, "User created."))
         } yield resp
 
       case req @ PUT -> Root =>
@@ -58,12 +58,12 @@ object UserRoutes {
           data <- req.as[User]
           nuser = changeUser(data, user.account.collective)
           update <- backend.collective.update(nuser)
-          resp   <- Ok(basicResult(update, "User updated."))
+          resp <- Ok(basicResult(update, "User updated."))
         } yield resp
 
       case DELETE -> Root / Ident(id) =>
         for {
-          ar   <- backend.collective.deleteUser(id, user.account.collective)
+          ar <- backend.collective.deleteUser(id, user.account.collective)
           resp <- Ok(basicResult(ar, "User deleted."))
         } yield resp
 
@@ -83,7 +83,7 @@ object UserRoutes {
 
     HttpRoutes.of { case req @ POST -> Root / "resetPassword" =>
       for {
-        input  <- req.as[ResetPassword]
+        input <- req.as[ResetPassword]
         result <- backend.collective.resetPassword(input.account)
         resp <- Ok(result match {
           case OCollective.PassResetResult.Success(np) =>
diff --git a/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala
index ff2e1b67..1e0021c3 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala
@@ -27,7 +27,7 @@ import yamusca.imports._
 object TemplateRoutes {
   private[this] val logger = getLogger
 
-  val `text/html`              = new MediaType("text", "html")
+  val `text/html` = new MediaType("text", "html")
   val `application/javascript` = new MediaType("application", "javascript")
 
   trait InnerRoutes[F[_]] {
@@ -41,7 +41,7 @@ object TemplateRoutes {
       loadResource("/index.html").flatMap(loadTemplate(_))
     )
     val docTemplate = memo(loadResource("/doc.html").flatMap(loadTemplate(_)))
-    val swTemplate  = memo(loadResource("/sw.js").flatMap(loadTemplate(_)))
+    val swTemplate = memo(loadResource("/sw.js").flatMap(loadTemplate(_)))
 
     val dsl = new Http4sDsl[F] {}
     import dsl._
diff --git a/modules/restserver/src/main/scala/docspell/restserver/webapp/WebjarRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/webapp/WebjarRoutes.scala
index e7f19b2f..5ac1df60 100644
--- a/modules/restserver/src/main/scala/docspell/restserver/webapp/WebjarRoutes.scala
+++ b/modules/restserver/src/main/scala/docspell/restserver/webapp/WebjarRoutes.scala
@@ -36,8 +36,8 @@ object WebjarRoutes {
   def appRoutes[F[_]: Async]: HttpRoutes[F] =
     Kleisli {
       case req if req.method == Method.GET =>
-        val p             = req.pathInfo.renderString
-        val last          = req.pathInfo.segments.lastOption.map(_.encoded).getOrElse("")
+        val p = req.pathInfo.renderString
+        val last = req.pathInfo.segments.lastOption.map(_.encoded).getOrElse("")
         val containsColon = req.pathInfo.segments.exists(_.encoded.contains(".."))
         if (containsColon || !suffixes.exists(last.endsWith(_)))
           OptionT.pure(Response.notFound[F])
diff --git a/modules/store/src/main/scala/docspell/store/AddResult.scala b/modules/store/src/main/scala/docspell/store/AddResult.scala
index 578877de..9d52df3e 100644
--- a/modules/store/src/main/scala/docspell/store/AddResult.scala
+++ b/modules/store/src/main/scala/docspell/store/AddResult.scala
@@ -27,14 +27,14 @@ object AddResult {
     )
 
   case object Success extends AddResult {
-    def toEither  = Right(())
+    def toEither = Right(())
     val isSuccess = true
     def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A =
       fa(this)
   }
 
   case class EntityExists(msg: String) extends AddResult {
-    def toEither  = Left(new Exception(msg))
+    def toEither = Left(new Exception(msg))
     val isSuccess = false
     def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A =
       fb(this)
@@ -45,7 +45,7 @@ object AddResult {
   def entityExists(msg: String): AddResult = EntityExists(msg)
 
   case class Failure(ex: Throwable) extends AddResult {
-    def toEither  = Left(ex)
+    def toEither = Left(ex)
     val isSuccess = false
     def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A =
       fc(this)
diff --git a/modules/store/src/main/scala/docspell/store/Store.scala b/modules/store/src/main/scala/docspell/store/Store.scala
index 6c351b74..f68e353c 100644
--- a/modules/store/src/main/scala/docspell/store/Store.scala
+++ b/modules/store/src/main/scala/docspell/store/Store.scala
@@ -36,7 +36,7 @@ object Store {
       chunkSize: Int,
       connectEC: ExecutionContext
   ): Resource[F, Store[F]] = {
-    val acquire                           = Sync[F].delay(new HikariDataSource())
+    val acquire = Sync[F].delay(new HikariDataSource())
     val free: HikariDataSource => F[Unit] = ds => Sync[F].delay(ds.close())
 
     for {
diff --git a/modules/store/src/main/scala/docspell/store/UpdateResult.scala b/modules/store/src/main/scala/docspell/store/UpdateResult.scala
index f0e171ea..4d7855c3 100644
--- a/modules/store/src/main/scala/docspell/store/UpdateResult.scala
+++ b/modules/store/src/main/scala/docspell/store/UpdateResult.scala
@@ -13,12 +13,12 @@ sealed trait UpdateResult
 
 object UpdateResult {
 
-  case object Success                     extends UpdateResult
-  case object NotFound                    extends UpdateResult
+  case object Success extends UpdateResult
+  case object NotFound extends UpdateResult
   final case class Failure(ex: Throwable) extends UpdateResult
 
-  def success: UpdateResult                = Success
-  def notFound: UpdateResult               = NotFound
+  def success: UpdateResult = Success
+  def notFound: UpdateResult = NotFound
   def failure(ex: Throwable): UpdateResult = Failure(ex)
 
   def fromUpdateRows(n: Int): UpdateResult =
diff --git a/modules/store/src/main/scala/docspell/store/file/AttributeStore.scala b/modules/store/src/main/scala/docspell/store/file/AttributeStore.scala
index 89f5d9fa..ab9c7a8c 100644
--- a/modules/store/src/main/scala/docspell/store/file/AttributeStore.scala
+++ b/modules/store/src/main/scala/docspell/store/file/AttributeStore.scala
@@ -22,7 +22,7 @@ final private[file] class AttributeStore[F[_]: Sync](xa: Transactor[F])
   def saveAttr(id: BinaryId, attrs: F[BinaryAttributes]): F[Unit] =
     for {
       now <- Timestamp.current[F]
-      a   <- attrs
+      a <- attrs
       fm = RFileMeta(
         Ident.unsafe(id.id),
         now,
diff --git a/modules/store/src/main/scala/docspell/store/file/FileStore.scala b/modules/store/src/main/scala/docspell/store/file/FileStore.scala
index b95b8fcc..295d4bdf 100644
--- a/modules/store/src/main/scala/docspell/store/file/FileStore.scala
+++ b/modules/store/src/main/scala/docspell/store/file/FileStore.scala
@@ -42,8 +42,8 @@ object FileStore {
       chunkSize: Int
   ): FileStore[F] = {
     val attrStore = new AttributeStore[F](xa)
-    val cfg       = JdbcStoreConfig("filechunk", chunkSize, TikaContentTypeDetect.default)
-    val binStore  = GenericJdbcStore[F](ds, Log4sLogger[F](logger), cfg, attrStore)
+    val cfg = JdbcStoreConfig("filechunk", chunkSize, TikaContentTypeDetect.default)
+    val binStore = GenericJdbcStore[F](ds, Log4sLogger[F](logger), cfg, attrStore)
     new Impl[F](binStore, attrStore)
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/impl/StoreImpl.scala b/modules/store/src/main/scala/docspell/store/impl/StoreImpl.scala
index 1fc6ca87..f0f622bb 100644
--- a/modules/store/src/main/scala/docspell/store/impl/StoreImpl.scala
+++ b/modules/store/src/main/scala/docspell/store/impl/StoreImpl.scala
@@ -33,7 +33,7 @@ final class StoreImpl[F[_]: Async](
 
   def add(insert: ConnectionIO[Int], exists: ConnectionIO[Boolean]): F[AddResult] =
     for {
-      save  <- transact(insert).attempt
+      save <- transact(insert).attempt
       exist <- save.swap.traverse(ex => transact(exists).map(b => (ex, b)))
     } yield exist.swap match {
       case Right(_) => AddResult.Success
diff --git a/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala b/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala
index 3a1a0cba..82a5eb26 100644
--- a/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/DBFunction.scala
@@ -45,8 +45,8 @@ object DBFunction {
 
   sealed trait Operator
   object Operator {
-    case object Plus  extends Operator
+    case object Plus extends Operator
     case object Minus extends Operator
-    case object Mult  extends Operator
+    case object Mult extends Operator
   }
 }
diff --git a/modules/store/src/main/scala/docspell/store/qb/FromExpr.scala b/modules/store/src/main/scala/docspell/store/qb/FromExpr.scala
index e653289f..dea96cf0 100644
--- a/modules/store/src/main/scala/docspell/store/qb/FromExpr.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/FromExpr.scala
@@ -81,7 +81,7 @@ object FromExpr {
   sealed trait Join
   object Join {
     final case class InnerJoin(table: Relation, cond: Condition) extends Join
-    final case class LeftJoin(table: Relation, cond: Condition)  extends Join
+    final case class LeftJoin(table: Relation, cond: Condition) extends Join
   }
 
 }
diff --git a/modules/store/src/main/scala/docspell/store/qb/Operator.scala b/modules/store/src/main/scala/docspell/store/qb/Operator.scala
index 7f8af379..8e07b7d2 100644
--- a/modules/store/src/main/scala/docspell/store/qb/Operator.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/Operator.scala
@@ -10,13 +10,13 @@ sealed trait Operator
 
 object Operator {
 
-  case object Eq        extends Operator
-  case object LowerEq   extends Operator
-  case object Neq       extends Operator
-  case object Gt        extends Operator
-  case object Lt        extends Operator
-  case object Gte       extends Operator
-  case object Lte       extends Operator
+  case object Eq extends Operator
+  case object LowerEq extends Operator
+  case object Neq extends Operator
+  case object Gt extends Operator
+  case object Lt extends Operator
+  case object Gte extends Operator
+  case object Lte extends Operator
   case object LowerLike extends Operator
 
 }
diff --git a/modules/store/src/main/scala/docspell/store/qb/OrderBy.scala b/modules/store/src/main/scala/docspell/store/qb/OrderBy.scala
index 2afa3b47..3ba99e93 100644
--- a/modules/store/src/main/scala/docspell/store/qb/OrderBy.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/OrderBy.scala
@@ -20,7 +20,7 @@ object OrderBy {
 
   sealed trait OrderType
   object OrderType {
-    case object Asc  extends OrderType
+    case object Asc extends OrderType
     case object Desc extends OrderType
   }
 }
diff --git a/modules/store/src/main/scala/docspell/store/qb/Select.scala b/modules/store/src/main/scala/docspell/store/qb/Select.scala
index c8d4b3b6..65ec0c6e 100644
--- a/modules/store/src/main/scala/docspell/store/qb/Select.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/Select.scala
@@ -12,17 +12,14 @@ import docspell.store.qb.impl.SelectBuilder
 
 import doobie._
 
-/** A sql select statement that allows to change certain parts of the query.
-  */
+/** A sql select statement that allows to change certain parts of the query. */
 sealed trait Select {
 
-  /** Builds the sql select statement into a doobie fragment.
-    */
+  /** Builds the sql select statement into a doobie fragment. */
   def build: Fragment =
     SelectBuilder(this)
 
-  /** When using this as a sub-select, an alias is required.
-    */
+  /** When using this as a sub-select, an alias is required. */
   def as(alias: String): SelectExpr.SelectQuery =
     SelectExpr.SelectQuery(this, Some(alias))
 
diff --git a/modules/store/src/main/scala/docspell/store/qb/generator/ItemQueryGenerator.scala b/modules/store/src/main/scala/docspell/store/qb/generator/ItemQueryGenerator.scala
index c62f25d0..f5e63394 100644
--- a/modules/store/src/main/scala/docspell/store/qb/generator/ItemQueryGenerator.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/generator/ItemQueryGenerator.scala
@@ -95,8 +95,8 @@ object ItemQueryGenerator {
         }
 
       case Expr.SimpleExpr(op, Property.DateProperty(attr, value)) =>
-        val dt       = dateToTimestamp(today)(value)
-        val col      = timestampColumn(tables)(attr)
+        val dt = dateToTimestamp(today)(value)
+        val col = timestampColumn(tables)(attr)
         val noLikeOp = if (op == Operator.Like) Operator.Eq else op
         Condition.CompareFVal(col, makeOp(noLikeOp), dt)
 
@@ -286,7 +286,7 @@ object ItemQueryGenerator {
   private def itemsWithCustomField(
       sel: RCustomField.Table => Condition
   )(coll: Ident, op: QOp, value: String): Select = {
-    val cf  = RCustomField.as("cf")
+    val cf = RCustomField.as("cf")
     val cfv = RCustomFieldValue.as("cfv")
 
     val baseSelect =
diff --git a/modules/store/src/main/scala/docspell/store/qb/impl/ConditionBuilder.scala b/modules/store/src/main/scala/docspell/store/qb/impl/ConditionBuilder.scala
index c4b687c2..96c3dfe3 100644
--- a/modules/store/src/main/scala/docspell/store/qb/impl/ConditionBuilder.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/impl/ConditionBuilder.scala
@@ -14,10 +14,10 @@ import _root_.doobie.implicits._
 import _root_.doobie.{Query => _, _}
 
 object ConditionBuilder {
-  val or         = fr" OR"
-  val and        = fr" AND"
-  val comma      = fr","
-  val parenOpen  = Fragment.const0("(")
+  val or = fr" OR"
+  val and = fr" AND"
+  val comma = fr","
+  val parenOpen = Fragment.const0("(")
   val parenClose = Fragment.const0(")")
 
   final def reduce(c: Condition): Condition =
@@ -70,7 +70,7 @@ object ConditionBuilder {
   final def build(expr: Condition): Fragment =
     reduce(expr) match {
       case c @ Condition.CompareVal(col, op, value) =>
-        val opFrag  = operator(op)
+        val opFrag = operator(op)
         val valFrag = buildValue(value)(c.P)
         val colFrag = op match {
           case Operator.LowerLike =>
@@ -83,7 +83,7 @@ object ConditionBuilder {
         colFrag ++ opFrag ++ valFrag
 
       case c @ Condition.CompareFVal(dbf, op, value) =>
-        val opFrag  = operator(op)
+        val opFrag = operator(op)
         val valFrag = buildValue(value)(c.P)
         val dbfFrag = op match {
           case Operator.LowerLike =>
diff --git a/modules/store/src/main/scala/docspell/store/qb/impl/SelectBuilder.scala b/modules/store/src/main/scala/docspell/store/qb/impl/SelectBuilder.scala
index f6ef191f..e77bfe6f 100644
--- a/modules/store/src/main/scala/docspell/store/qb/impl/SelectBuilder.scala
+++ b/modules/store/src/main/scala/docspell/store/qb/impl/SelectBuilder.scala
@@ -14,11 +14,11 @@ import _root_.doobie.implicits._
 import _root_.doobie.{Query => _, _}
 
 object SelectBuilder {
-  val comma     = fr","
-  val asc       = fr" ASC"
-  val desc      = fr" DESC"
+  val comma = fr","
+  val asc = fr" ASC"
+  val desc = fr" DESC"
   val intersect = fr" INTERSECT"
-  val union     = fr" UNION ALL"
+  val union = fr" UNION ALL"
 
   def apply(q: Select): Fragment =
     build(q)
diff --git a/modules/store/src/main/scala/docspell/store/queries/AttachCountTable.scala b/modules/store/src/main/scala/docspell/store/queries/AttachCountTable.scala
index b856e23d..53a3272a 100644
--- a/modules/store/src/main/scala/docspell/store/queries/AttachCountTable.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/AttachCountTable.scala
@@ -11,10 +11,10 @@ import docspell.store.qb.Column
 import docspell.store.qb.TableDef
 
 final case class AttachCountTable(aliasName: String) extends TableDef {
-  val tableName             = "attachs"
+  val tableName = "attachs"
   val alias: Option[String] = Some(aliasName)
 
-  val num    = Column[Int]("num", this)
+  val num = Column[Int]("num", this)
   val itemId = Column[Ident]("item_id", this)
 
   def as(alias: String): AttachCountTable =
diff --git a/modules/store/src/main/scala/docspell/store/queries/QAttachment.scala b/modules/store/src/main/scala/docspell/store/queries/QAttachment.scala
index 008da1bb..78abf6a3 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QAttachment.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QAttachment.scala
@@ -24,11 +24,11 @@ import doobie._
 object QAttachment {
   private[this] val logger = org.log4s.getLogger
 
-  private val a    = RAttachment.as("a")
+  private val a = RAttachment.as("a")
   private val item = RItem.as("i")
-  private val am   = RAttachmentMeta.as("am")
-  private val c    = RCollective.as("c")
-  private val im   = RItemProposal.as("im")
+  private val am = RAttachmentMeta.as("am")
+  private val c = RCollective.as("c")
+  private val im = RItemProposal.as("im")
 
   def deletePreview[F[_]: Sync](store: Store[F])(attachId: Ident): F[Int] = {
     val findPreview =
@@ -100,7 +100,7 @@ object QAttachment {
   def deleteArchive[F[_]: Sync](store: Store[F])(attachId: Ident): F[Int] =
     (for {
       aa <- OptionT(store.transact(RAttachmentArchive.findById(attachId)))
-      n  <- OptionT.liftF(store.transact(RAttachmentArchive.deleteAll(aa.fileId)))
+      n <- OptionT.liftF(store.transact(RAttachmentArchive.deleteAll(aa.fileId)))
       _ <- OptionT.liftF(
         Stream
           .emit(aa.fileId)
@@ -118,8 +118,8 @@ object QAttachment {
       _ <- logger.finfo[F](
         s"Have ${ras.size} attachments to delete. Must first delete archive entries"
       )
-      a  <- ras.traverse(a => deleteArchive(store)(a.id))
-      _  <- logger.fdebug[F](s"Deleted ${a.sum} archive entries")
+      a <- ras.traverse(a => deleteArchive(store)(a.id))
+      _ <- logger.fdebug[F](s"Deleted ${a.sum} archive entries")
       ns <- ras.traverse(deleteAttachment[F](store))
     } yield ns.sum
 
diff --git a/modules/store/src/main/scala/docspell/store/queries/QCollective.scala b/modules/store/src/main/scala/docspell/store/queries/QCollective.scala
index 91ed43d6..84d9c8fe 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QCollective.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QCollective.scala
@@ -18,12 +18,12 @@ import doobie.implicits._
 
 object QCollective {
   private val ti = RTagItem.as("ti")
-  private val t  = RTag.as("t")
+  private val t = RTag.as("t")
   private val ro = ROrganization.as("o")
   private val rp = RPerson.as("p")
   private val re = REquipment.as("e")
   private val rc = RContact.as("c")
-  private val i  = RItem.as("i")
+  private val i = RItem.as("i")
 
   case class Names(org: Vector[String], pers: Vector[String], equip: Vector[String])
   object Names {
@@ -114,9 +114,9 @@ object QCollective {
     for {
       incoming <- q0
       outgoing <- q1
-      size     <- fileSize
-      tags     <- tagCloud(coll)
-      deleted  <- q2
+      size <- fileSize
+      tags <- tagCloud(coll)
+      deleted <- q2
     } yield InsightData(incoming, outgoing, deleted, size.getOrElse(0L), tags)
   }
 
@@ -136,10 +136,10 @@ object QCollective {
       query: Option[String],
       kind: Option[ContactKind]
   ): Stream[ConnectionIO, RContact] = {
-    val orgCond     = Select(select(ro.oid), from(ro), ro.cid === coll)
-    val persCond    = Select(select(rp.pid), from(rp), rp.cid === coll)
+    val orgCond = Select(select(ro.oid), from(ro), ro.cid === coll)
+    val persCond = Select(select(rp.pid), from(rp), rp.cid === coll)
     val valueFilter = query.map(s => rc.value.like(s"%${s.toLowerCase}%"))
-    val kindFilter  = kind.map(k => rc.kind === k)
+    val kindFilter = kind.map(k => rc.kind === k)
 
     Select(
       select(rc.all),
diff --git a/modules/store/src/main/scala/docspell/store/queries/QFolder.scala b/modules/store/src/main/scala/docspell/store/queries/QFolder.scala
index fe16a5da..e5f5a1e8 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QFolder.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QFolder.scala
@@ -64,7 +64,7 @@ object QFolder {
       } yield FolderChangeResult.success
 
     (for {
-      uid    <- OptionT(findUserId(account))
+      uid <- OptionT(findUserId(account))
       folder <- OptionT(RFolder.findById(id))
       res <- OptionT.liftF(
         if (folder.owner == uid) tryDelete
@@ -87,7 +87,7 @@ object QFolder {
       } yield res
 
     (for {
-      uid    <- OptionT(findUserId(account))
+      uid <- OptionT(findUserId(account))
       folder <- OptionT(RFolder.findById(folder))
       res <- OptionT.liftF(
         if (folder.owner == uid) tryUpdate(folder.copy(name = name))
@@ -110,7 +110,7 @@ object QFolder {
       } yield res
 
     (for {
-      uid    <- OptionT(findUserId(account))
+      uid <- OptionT(findUserId(account))
       folder <- OptionT(RFolder.findById(folder))
       res <- OptionT.liftF(
         if (folder.owner == uid) tryRemove
@@ -134,7 +134,7 @@ object QFolder {
       } yield res
 
     (for {
-      uid    <- OptionT(findUserId(account))
+      uid <- OptionT(findUserId(account))
       folder <- OptionT(RFolder.findById(folder))
       res <- OptionT.liftF(
         if (folder.owner == uid) tryAdd
@@ -144,7 +144,7 @@ object QFolder {
   }
 
   def findById(id: Ident, account: AccountId): ConnectionIO[Option[FolderDetail]] = {
-    val user   = RUser.as("u")
+    val user = RUser.as("u")
     val member = RFolderMember.as("m")
     val folder = RFolder.as("s")
 
@@ -194,12 +194,12 @@ object QFolder {
 // inner join user_ u on u.uid = s.owner
 // where s.cid = 'eike';
 
-    val user     = RUser.as("u")
-    val member   = RFolderMember.as("m")
-    val folder   = RFolder.as("s")
+    val user = RUser.as("u")
+    val member = RFolderMember.as("m")
+    val folder = RFolder.as("s")
     val memlogin = TableDef("memberlogin")
     val mlFolder = Column[Ident]("folder", memlogin)
-    val mlLogin  = Column[Ident]("login", memlogin)
+    val mlLogin = Column[Ident]("login", memlogin)
 
     withCte(
       memlogin -> union(
@@ -251,8 +251,8 @@ object QFolder {
   /** Select all folder_id where the given account is member or owner. */
   def findMemberFolderIds(account: AccountId): Select = {
     val user = RUser.as("u")
-    val f    = RFolder.as("f")
-    val m    = RFolderMember.as("m")
+    val f = RFolder.as("f")
+    val m = RFolderMember.as("m")
     union(
       Select(
         select(f.id),
diff --git a/modules/store/src/main/scala/docspell/store/queries/QItem.scala b/modules/store/src/main/scala/docspell/store/queries/QItem.scala
index 7c9bb408..2671fcaa 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QItem.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QItem.scala
@@ -31,17 +31,17 @@ object QItem {
   private[this] val logger = getLogger
 
   private val equip = REquipment.as("e")
-  private val org   = ROrganization.as("o")
+  private val org = ROrganization.as("o")
   private val pers0 = RPerson.as("pers0")
   private val pers1 = RPerson.as("pers1")
-  private val f     = RFolder.as("f")
-  private val i     = RItem.as("i")
-  private val cf    = RCustomField.as("cf")
-  private val cv    = RCustomFieldValue.as("cvf")
-  private val a     = RAttachment.as("a")
-  private val m     = RAttachmentMeta.as("m")
-  private val tag   = RTag.as("t")
-  private val ti    = RTagItem.as("ti")
+  private val f = RFolder.as("f")
+  private val i = RItem.as("i")
+  private val cf = RCustomField.as("cf")
+  private val cv = RCustomFieldValue.as("cvf")
+  private val a = RAttachment.as("a")
+  private val m = RAttachmentMeta.as("m")
+  private val tag = RTag.as("t")
+  private val ti = RTagItem.as("ti")
 
   def countAttachmentsAndItems(items: Nel[Ident]): ConnectionIO[Int] =
     Select(count(a.id).s, from(a), a.itemId.in(items)).build
@@ -82,19 +82,19 @@ object QItem {
       ]
       .option
     logger.trace(s"Find item query: $cq")
-    val attachs      = RAttachment.findByItemWithMeta(id)
-    val sources      = RAttachmentSource.findByItemWithMeta(id)
-    val archives     = RAttachmentArchive.findByItemWithMeta(id)
-    val tags         = RTag.findByItem(id)
+    val attachs = RAttachment.findByItemWithMeta(id)
+    val sources = RAttachmentSource.findByItemWithMeta(id)
+    val archives = RAttachmentArchive.findByItemWithMeta(id)
+    val tags = RTag.findByItem(id)
     val customfields = findCustomFieldValuesForItem(id)
 
     for {
       data <- q
-      att  <- attachs
+      att <- attachs
       srcs <- sources
       arch <- archives
-      ts   <- tags
-      cfs  <- customfields
+      ts <- tags
+      cfs <- customfields
     } yield data.map(d =>
       ItemData(d._1, d._2, d._3, d._4, d._5, d._6, d._7, ts, att, srcs, arch, cfs)
     )
@@ -187,10 +187,10 @@ object QItem {
 
   def searchStats(today: LocalDate)(q: Query): ConnectionIO[SearchSummary] =
     for {
-      count   <- searchCountSummary(today)(q)
-      tags    <- searchTagSummary(today)(q)
-      cats    <- searchTagCategorySummary(today)(q)
-      fields  <- searchFieldSummary(today)(q)
+      count <- searchCountSummary(today)(q)
+      tags <- searchTagSummary(today)(q)
+      cats <- searchTagCategorySummary(today)(q)
+      fields <- searchFieldSummary(today)(q)
       folders <- searchFolderSummary(today)(q)
     } yield SearchSummary(count, tags, cats, fields, folders)
 
@@ -214,7 +214,7 @@ object QItem {
 
     for {
       existing <- catCloud
-      allCats  <- RTag.listCategories(q.fix.account.collective)
+      allCats <- RTag.listCategories(q.fix.account.collective)
       other = allCats.diff(existing.flatMap(_.category))
     } yield existing ++ other.map(n => CategoryCount(n.some, 0))
   }
@@ -239,7 +239,7 @@ object QItem {
     // are not included they are fetched separately
     for {
       existing <- tagCloud
-      other    <- RTag.findOthers(q.fix.account.collective, existing.map(_.tag.tagId))
+      other <- RTag.findOthers(q.fix.account.collective, existing.map(_.tag.tagId))
     } yield existing ++ other.map(TagCount(_, 0))
   }
 
@@ -332,10 +332,10 @@ object QItem {
 
       object Tids extends TableDef {
         val tableName = "tids"
-        val alias     = Some("tw")
-        val itemId    = Column[Ident]("item_id", this)
-        val weight    = Column[Double]("weight", this)
-        val all       = Vector[Column[_]](itemId, weight)
+        val alias = Some("tw")
+        val itemId = Column[Ident]("item_id", this)
+        val weight = Column[Double]("weight", this)
+        val all = Vector[Column[_]](itemId, weight)
       }
 
       val cte =
@@ -389,10 +389,10 @@ object QItem {
 
     for {
       resolvedTags <- Stream.eval(Ref.of[ConnectionIO, Map[Ident, RTag]](Map.empty))
-      item         <- search
-      tagItems     <- Stream.eval(RTagItem.findByItem(item.id))
-      tags         <- Stream.eval(tagItems.traverse(ti => findTag(resolvedTags, ti)))
-      attachs      <- Stream.eval(findAttachmentLight(item.id))
+      item <- search
+      tagItems <- Stream.eval(RTagItem.findByItem(item.id))
+      tags <- Stream.eval(tagItems.traverse(ti => findTag(resolvedTags, ti)))
+      attachs <- Stream.eval(findAttachmentLight(item.id))
       ftags = tags.flatten.filter(t => t.collective == collective)
       cfields <- Stream.eval(findCustomFieldValuesForItem(item.id))
     } yield ListItemWithTags(
@@ -418,7 +418,7 @@ object QItem {
       mn <- store.transact(RSentMail.deleteByItem(itemId))
       cf <- store.transact(RCustomFieldValue.deleteByItem(itemId))
       im <- store.transact(RItemProposal.deleteByItem(itemId))
-      n  <- store.transact(RItem.deleteByIdAndCollective(itemId, collective))
+      n <- store.transact(RItem.deleteByIdAndCollective(itemId, collective))
     } yield tn + rn + n + mn + cf + im
 
   private def findByFileIdsQuery(
@@ -476,13 +476,13 @@ object QItem {
       collective: Ident,
       excludeFileMeta: Set[Ident]
   ): Select = {
-    val m1  = RFileMeta.as("m1")
-    val m2  = RFileMeta.as("m2")
-    val m3  = RFileMeta.as("m3")
-    val i   = RItem.as("i")
-    val a   = RAttachment.as("a")
-    val s   = RAttachmentSource.as("s")
-    val r   = RAttachmentArchive.as("r")
+    val m1 = RFileMeta.as("m1")
+    val m2 = RFileMeta.as("m2")
+    val m3 = RFileMeta.as("m3")
+    val i = RItem.as("i")
+    val a = RAttachment.as("a")
+    val s = RAttachmentSource.as("s")
+    val r = RAttachmentArchive.as("r")
     val fms = Nel.of(m1, m2, m3)
     Select(
       select(i.all),
@@ -551,9 +551,9 @@ object QItem {
       maxLen: Int,
       pageSep: String
   ): ConnectionIO[TextAndTag] = {
-    val tags     = TableDef("tags").as("tt")
+    val tags = TableDef("tags").as("tt")
     val tagsItem = Column[Ident]("itemid", tags)
-    val tagsTid  = Column[Ident]("tid", tags)
+    val tagsTid = Column[Ident]("tid", tags)
     val tagsName = Column[String]("tname", tags)
 
     readTextAndTag(collective, itemId, pageSep) {
diff --git a/modules/store/src/main/scala/docspell/store/queries/QJob.scala b/modules/store/src/main/scala/docspell/store/queries/QJob.scala
index 1f2fdb99..1baa9cd2 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QJob.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QJob.scala
@@ -77,16 +77,16 @@ object QJob {
       _ <- logger.ftrace[F](
         s"About to take next job (worker ${worker.id}), try $currentTry"
       )
-      now   <- Timestamp.current[F]
+      now <- Timestamp.current[F]
       group <- store.transact(selectNextGroup(worker, now, retryPause))
-      _     <- logger.ftrace[F](s"Choose group ${group.map(_.id)}")
-      prio  <- group.map(priority).getOrElse((Priority.Low: Priority).pure[F])
-      _     <- logger.ftrace[F](s"Looking for job of prio $prio")
+      _ <- logger.ftrace[F](s"Choose group ${group.map(_.id)}")
+      prio <- group.map(priority).getOrElse((Priority.Low: Priority).pure[F])
+      _ <- logger.ftrace[F](s"Looking for job of prio $prio")
       job <-
         group
           .map(g => store.transact(selectNextJob(g, prio, retryPause, now)))
           .getOrElse((None: Option[RJob]).pure[F])
-      _   <- logger.ftrace[F](s"Found job: ${job.map(_.info)}")
+      _ <- logger.ftrace[F](s"Found job: ${job.map(_.info)}")
       res <- job.traverse(j => markJob(j))
     } yield res.map(_.map(_.some)).getOrElse {
       if (group.isDefined)
@@ -101,7 +101,7 @@ object QJob {
       initialPause: Duration
   ): ConnectionIO[Option[Ident]] = {
     val JC = RJob.as("a")
-    val G  = RJobGroupUse.as("b")
+    val G = RJobGroupUse.as("b")
 
     val stuckTrigger = stuckTriggerValue(JC, initialPause, now)
     val stateCond =
@@ -109,7 +109,7 @@ object QJob {
 
     object AllGroups extends TableDef {
       val tableName = "allgroups"
-      val alias     = Some("ag")
+      val alias = Some("ag")
 
       val group: Column[Ident] = JC.group.copy(table = this)
 
@@ -162,7 +162,7 @@ object QJob {
       if (prio == Priority.High) JC.priority.desc
       else JC.priority.asc
     val waiting = JobState.waiting
-    val stuck   = JobState.stuck
+    val stuck = JobState.stuck
 
     val stuckTrigger = stuckTriggerValue(JC, initialPause, now)
     val sql =
@@ -179,31 +179,31 @@ object QJob {
   def setCancelled[F[_]: Async](id: Ident, store: Store[F]): F[Unit] =
     for {
       now <- Timestamp.current[F]
-      _   <- store.transact(RJob.setCancelled(id, now))
+      _ <- store.transact(RJob.setCancelled(id, now))
     } yield ()
 
   def setFailed[F[_]: Async](id: Ident, store: Store[F]): F[Unit] =
     for {
       now <- Timestamp.current[F]
-      _   <- store.transact(RJob.setFailed(id, now))
+      _ <- store.transact(RJob.setFailed(id, now))
     } yield ()
 
   def setSuccess[F[_]: Async](id: Ident, store: Store[F]): F[Unit] =
     for {
       now <- Timestamp.current[F]
-      _   <- store.transact(RJob.setSuccess(id, now))
+      _ <- store.transact(RJob.setSuccess(id, now))
     } yield ()
 
   def setStuck[F[_]: Async](id: Ident, store: Store[F]): F[Unit] =
     for {
       now <- Timestamp.current[F]
-      _   <- store.transact(RJob.setStuck(id, now))
+      _ <- store.transact(RJob.setStuck(id, now))
     } yield ()
 
   def setRunning[F[_]: Async](id: Ident, workerId: Ident, store: Store[F]): F[Unit] =
     for {
       now <- Timestamp.current[F]
-      _   <- store.transact(RJob.setRunning(id, workerId, now))
+      _ <- store.transact(RJob.setRunning(id, workerId, now))
     } yield ()
 
   def setFinalState[F[_]: Async](id: Ident, state: JobState, store: Store[F]): F[Unit] =
@@ -233,7 +233,7 @@ object QJob {
       collective: Ident,
       max: Long
   ): Stream[ConnectionIO, (RJob, Vector[RJobLog])] = {
-    val JC      = RJob.T
+    val JC = RJob.T
     val waiting = NonEmptyList.of(JobState.Waiting, JobState.Stuck, JobState.Scheduled)
     val running = NonEmptyList.of(JobState.Running)
     //val done                   = JobState.all.filterNot(js => ).diff(waiting).diff(running)
diff --git a/modules/store/src/main/scala/docspell/store/queries/QMails.scala b/modules/store/src/main/scala/docspell/store/queries/QMails.scala
index 8834538f..f0081492 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QMails.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QMails.scala
@@ -18,10 +18,10 @@ import doobie.implicits._
 
 object QMails {
 
-  private val item     = RItem.as("i")
-  private val smail    = RSentMail.as("sm")
+  private val item = RItem.as("i")
+  private val smail = RSentMail.as("sm")
   private val mailitem = RSentMailItem.as("mi")
-  private val user     = RUser.as("u")
+  private val user = RUser.as("u")
 
   def delete(coll: Ident, mailId: Ident): ConnectionIO[Int] =
     (for {
diff --git a/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala b/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala
index fc55ee6b..10c457a8 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala
@@ -20,8 +20,8 @@ import doobie._
 import doobie.implicits._
 
 object QOrganization {
-  private val p   = RPerson.as("p")
-  private val c   = RContact.as("c")
+  private val p = RPerson.as("p")
+  private val c = RContact.as("c")
   private val org = ROrganization.as("o")
 
   def findOrgAndContact(
@@ -144,7 +144,7 @@ object QOrganization {
       cid: Ident
   ): Store[F] => F[AddResult] = {
     val insert = for {
-      n  <- ROrganization.insert(org)
+      n <- ROrganization.insert(org)
       cs <- contacts.toList.traverse(RContact.insert)
     } yield n + cs.sum
 
@@ -159,7 +159,7 @@ object QOrganization {
       cid: Ident
   ): Store[F] => F[AddResult] = {
     val insert = for {
-      n  <- RPerson.insert(person)
+      n <- RPerson.insert(person)
       cs <- contacts.toList.traverse(RContact.insert)
     } yield n + cs.sum
 
@@ -174,8 +174,8 @@ object QOrganization {
       cid: Ident
   ): Store[F] => F[AddResult] = {
     val insert = for {
-      n  <- ROrganization.update(org)
-      d  <- RContact.deleteOrg(org.oid)
+      n <- ROrganization.update(org)
+      d <- RContact.deleteOrg(org.oid)
       cs <- contacts.toList.traverse(RContact.insert)
     } yield n + cs.sum + d
 
@@ -190,8 +190,8 @@ object QOrganization {
       cid: Ident
   ): Store[F] => F[AddResult] = {
     val insert = for {
-      n  <- RPerson.update(person)
-      d  <- RContact.deletePerson(person.pid)
+      n <- RPerson.update(person)
+      d <- RContact.deletePerson(person.pid)
       cs <- contacts.toList.traverse(RContact.insert)
     } yield n + cs.sum + d
 
diff --git a/modules/store/src/main/scala/docspell/store/queries/QUser.scala b/modules/store/src/main/scala/docspell/store/queries/QUser.scala
index 24f78d50..c261b670 100644
--- a/modules/store/src/main/scala/docspell/store/queries/QUser.scala
+++ b/modules/store/src/main/scala/docspell/store/queries/QUser.scala
@@ -25,9 +25,9 @@ object QUser {
 
   def getUserData(accountId: AccountId): ConnectionIO[UserData] = {
     val folder = RFolder.as("f")
-    val mail   = RSentMail.as("m")
-    val mitem  = RSentMailItem.as("mi")
-    val user   = RUser.as("u")
+    val mail = RSentMail.as("m")
+    val mitem = RSentMailItem.as("mi")
+    val user = RUser.as("u")
 
     for {
       uid <- loadUserId(accountId).map(_.getOrElse(Ident.unsafe("")))
@@ -49,21 +49,21 @@ object QUser {
   def deleteUserAndData(accountId: AccountId): ConnectionIO[Int] =
     for {
       uid <- loadUserId(accountId).map(_.getOrElse(Ident.unsafe("")))
-      _   <- logger.info(s"Remove user ${accountId.asString} (uid=${uid.id})")
+      _ <- logger.info(s"Remove user ${accountId.asString} (uid=${uid.id})")
 
       n1 <- deleteUserFolders(uid)
 
       n2 <- deleteUserSentMails(uid)
-      _  <- logger.info(s"Removed $n2 sent mails")
+      _ <- logger.info(s"Removed $n2 sent mails")
 
       n3 <- deleteRememberMe(accountId)
-      _  <- logger.info(s"Removed $n3 remember me tokens")
+      _ <- logger.info(s"Removed $n3 remember me tokens")
 
       n4 <- deleteTotp(uid)
-      _  <- logger.info(s"Removed $n4 totp secrets")
+      _ <- logger.info(s"Removed $n4 totp secrets")
 
       n5 <- deleteMailSettings(uid)
-      _  <- logger.info(s"Removed $n5 mail settings")
+      _ <- logger.info(s"Removed $n5 mail settings")
 
       nu <- RUser.deleteById(uid)
     } yield nu + n1 + n2 + n3 + n4 + n5
@@ -80,16 +80,16 @@ object QUser {
       _ <- logger.info(s"Removing folders: ${folders.map(_.id)}")
 
       ri <- folders.traverse(RItem.removeFolder)
-      _  <- logger.info(s"Removed folders from items: $ri")
+      _ <- logger.info(s"Removed folders from items: $ri")
       rs <- folders.traverse(RSource.removeFolder)
-      _  <- logger.info(s"Removed folders from sources: $rs")
+      _ <- logger.info(s"Removed folders from sources: $rs")
       rf <- folders.traverse(RFolderMember.deleteAll)
-      _  <- logger.info(s"Removed folders from members: $rf")
+      _ <- logger.info(s"Removed folders from members: $rf")
 
       n1 <- DML.delete(member, member.user === uid)
-      _  <- logger.info(s"Removed $n1 members for owning folders.")
+      _ <- logger.info(s"Removed $n1 members for owning folders.")
       n2 <- DML.delete(folder, folder.owner === uid)
-      _  <- logger.info(s"Removed $n2 folders.")
+      _ <- logger.info(s"Removed $n2 folders.")
 
     } yield n1 + n2 + ri.sum + rs.sum + rf.sum
   }
@@ -98,8 +98,8 @@ object QUser {
     val mail = RSentMail.as("m")
     for {
       ids <- run(select(mail.id), from(mail), mail.uid === uid).query[Ident].to[List]
-      n1  <- ids.traverse(RSentMailItem.deleteMail)
-      n2  <- ids.traverse(RSentMail.delete)
+      n1 <- ids.traverse(RSentMailItem.deleteMail)
+      n2 <- ids.traverse(RSentMail.delete)
     } yield n1.sum + n2.sum
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/queue/Marked.scala b/modules/store/src/main/scala/docspell/store/queue/Marked.scala
index 56a37a42..af7f32db 100644
--- a/modules/store/src/main/scala/docspell/store/queue/Marked.scala
+++ b/modules/store/src/main/scala/docspell/store/queue/Marked.scala
@@ -17,6 +17,6 @@ object Marked {
   final case object NotMarkable extends Marked[Nothing]
 
   def found[A](v: A): Marked[A] = Found(v)
-  def notFound[A]: Marked[A]    = NotFound
+  def notFound[A]: Marked[A] = NotFound
   def notMarkable[A]: Marked[A] = NotMarkable
 }
diff --git a/modules/store/src/main/scala/docspell/store/queue/PeriodicTaskStore.scala b/modules/store/src/main/scala/docspell/store/queue/PeriodicTaskStore.scala
index ce9dce68..8213f319 100644
--- a/modules/store/src/main/scala/docspell/store/queue/PeriodicTaskStore.scala
+++ b/modules/store/src/main/scala/docspell/store/queue/PeriodicTaskStore.scala
@@ -33,16 +33,13 @@ trait PeriodicTaskStore[F[_]] {
 
   def findNonFinalJob(pjobId: Ident): F[Option[RJob]]
 
-  /** Insert a task or update if it already exists.
-    */
+  /** Insert a task or update if it already exists. */
   def insert(task: RPeriodicTask): F[Unit]
 
-  /** Adds the task only if it not already exists.
-    */
+  /** Adds the task only if it not already exists. */
   def add(task: RPeriodicTask): F[AddResult]
 
-  /** Find all joex nodes as registered in the database.
-    */
+  /** Find all joex nodes as registered in the database. */
   def findJoexNodes: F[Vector[RNode]]
 }
 
@@ -109,9 +106,9 @@ object PeriodicTaskStore {
         }
 
         for {
-          n1  <- update
+          n1 <- update
           ins <- if (n1 == 0) insertAttempt else true.pure[F]
-          _   <- if (ins) 1.pure[F] else update
+          _ <- if (ins) 1.pure[F] else update
         } yield ()
       }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RAttachment.scala b/modules/store/src/main/scala/docspell/store/records/RAttachment.scala
index b864a537..b8695176 100644
--- a/modules/store/src/main/scala/docspell/store/records/RAttachment.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RAttachment.scala
@@ -30,13 +30,13 @@ object RAttachment {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "attachment"
 
-    val id       = Column[Ident]("attachid", this)
-    val itemId   = Column[Ident]("itemid", this)
-    val fileId   = Column[Ident]("filemetaid", this)
+    val id = Column[Ident]("attachid", this)
+    val itemId = Column[Ident]("itemid", this)
+    val fileId = Column[Ident]("filemetaid", this)
     val position = Column[Int]("position", this)
-    val created  = Column[Timestamp]("created", this)
-    val name     = Column[String]("name", this)
-    val all      = NonEmptyList.of[Column[_]](id, itemId, fileId, position, created, name)
+    val created = Column[Timestamp]("created", this)
+    val name = Column[String]("name", this)
+    val all = NonEmptyList.of[Column[_]](id, itemId, fileId, position, created, name)
   }
 
   val T = Table(None)
@@ -131,7 +131,7 @@ object RAttachment {
     val update = DML.update(T, T.id === attachId, DML.set(T.name.setTo(aname)))
     for {
       exists <- existsByIdAndCollective(attachId, collective)
-      n      <- if (exists) update else 0.pure[ConnectionIO]
+      n <- if (exists) update else 0.pure[ConnectionIO]
     } yield n
   }
 
@@ -227,8 +227,7 @@ object RAttachment {
     ).orderBy(a.position.asc).build.query[(RAttachment, RFileMeta)].to[Vector]
   }
 
-  /** Deletes the attachment and its related source and meta records.
-    */
+  /** Deletes the attachment and its related source and meta records. */
   def delete(attachId: Ident): ConnectionIO[Int] =
     for {
       n0 <- RAttachmentMeta.delete(attachId)
@@ -294,10 +293,10 @@ object RAttachment {
       chunkSize: Int
   ): Stream[ConnectionIO, RAttachment] = {
     val pdfType = "application/pdf%"
-    val a       = RAttachment.as("a")
-    val s       = RAttachmentSource.as("s")
-    val i       = RItem.as("i")
-    val m       = RFileMeta.as("m")
+    val a = RAttachment.as("a")
+    val s = RAttachmentSource.as("s")
+    val i = RItem.as("i")
+    val m = RFileMeta.as("m")
 
     Select(
       select(a.all),
diff --git a/modules/store/src/main/scala/docspell/store/records/RAttachmentArchive.scala b/modules/store/src/main/scala/docspell/store/records/RAttachmentArchive.scala
index e8f71479..719ef71a 100644
--- a/modules/store/src/main/scala/docspell/store/records/RAttachmentArchive.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RAttachmentArchive.scala
@@ -31,11 +31,11 @@ object RAttachmentArchive {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "attachment_archive"
 
-    val id        = Column[Ident]("id", this)
-    val fileId    = Column[Ident]("file_id", this)
-    val name      = Column[String]("filename", this)
+    val id = Column[Ident]("id", this)
+    val fileId = Column[Ident]("file_id", this)
+    val name = Column[String]("filename", this)
     val messageId = Column[String]("message_id", this)
-    val created   = Column[Timestamp]("created", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, fileId, name, messageId, created)
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/RAttachmentMeta.scala b/modules/store/src/main/scala/docspell/store/records/RAttachmentMeta.scala
index f1ca7ecf..6c8c07ee 100644
--- a/modules/store/src/main/scala/docspell/store/records/RAttachmentMeta.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RAttachmentMeta.scala
@@ -40,12 +40,12 @@ object RAttachmentMeta {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "attachmentmeta"
 
-    val id        = Column[Ident]("attachid", this)
-    val content   = Column[String]("content", this)
+    val id = Column[Ident]("attachid", this)
+    val content = Column[String]("content", this)
     val nerlabels = Column[List[NerLabel]]("nerlabels", this)
     val proposals = Column[MetaProposalList]("itemproposals", this)
-    val pages     = Column[Int]("page_count", this)
-    val language  = Column[Language]("language", this)
+    val pages = Column[Int]("page_count", this)
+    val language = Column[Language]("language", this)
     val all =
       NonEmptyList.of[Column[_]](
         id,
diff --git a/modules/store/src/main/scala/docspell/store/records/RAttachmentPreview.scala b/modules/store/src/main/scala/docspell/store/records/RAttachmentPreview.scala
index e850014b..b216d4e8 100644
--- a/modules/store/src/main/scala/docspell/store/records/RAttachmentPreview.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RAttachmentPreview.scala
@@ -29,9 +29,9 @@ object RAttachmentPreview {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "attachment_preview"
 
-    val id      = Column[Ident]("id", this)
-    val fileId  = Column[Ident]("file_id", this)
-    val name    = Column[String]("filename", this)
+    val id = Column[Ident]("id", this)
+    val fileId = Column[Ident]("file_id", this)
+    val name = Column[String]("filename", this)
     val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, fileId, name, created)
diff --git a/modules/store/src/main/scala/docspell/store/records/RAttachmentSource.scala b/modules/store/src/main/scala/docspell/store/records/RAttachmentSource.scala
index aa76b61e..f551eac7 100644
--- a/modules/store/src/main/scala/docspell/store/records/RAttachmentSource.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RAttachmentSource.scala
@@ -29,9 +29,9 @@ object RAttachmentSource {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "attachment_source"
 
-    val id      = Column[Ident]("id", this)
-    val fileId  = Column[Ident]("file_id", this)
-    val name    = Column[String]("filename", this)
+    val id = Column[Ident]("id", this)
+    val fileId = Column[Ident]("file_id", this)
+    val name = Column[String]("filename", this)
     val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, fileId, name, created)
diff --git a/modules/store/src/main/scala/docspell/store/records/RClassifierModel.scala b/modules/store/src/main/scala/docspell/store/records/RClassifierModel.scala
index ba4328a1..ace5ccad 100644
--- a/modules/store/src/main/scala/docspell/store/records/RClassifierModel.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RClassifierModel.scala
@@ -33,17 +33,17 @@ object RClassifierModel {
       fileId: Ident
   ): F[RClassifierModel] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
     } yield RClassifierModel(id, cid, name, fileId, now)
 
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "classifier_model"
 
-    val id      = Column[Ident]("id", this)
-    val cid     = Column[Ident]("cid", this)
-    val name    = Column[String]("name", this)
-    val fileId  = Column[Ident]("file_id", this)
+    val id = Column[Ident]("id", this)
+    val cid = Column[Ident]("cid", this)
+    val name = Column[String]("name", this)
+    val fileId = Column[Ident]("file_id", this)
     val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, cid, name, fileId, created)
diff --git a/modules/store/src/main/scala/docspell/store/records/RClassifierSetting.scala b/modules/store/src/main/scala/docspell/store/records/RClassifierSetting.scala
index d367f4ce..1e908c03 100644
--- a/modules/store/src/main/scala/docspell/store/records/RClassifierSetting.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RClassifierSetting.scala
@@ -43,12 +43,12 @@ object RClassifierSetting {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "classifier_setting"
 
-    val cid        = Column[Ident]("cid", this)
-    val schedule   = Column[CalEvent]("schedule", this)
-    val itemCount  = Column[Int]("item_count", this)
-    val created    = Column[Timestamp]("created", this)
+    val cid = Column[Ident]("cid", this)
+    val schedule = Column[CalEvent]("schedule", this)
+    val itemCount = Column[Int]("item_count", this)
+    val created = Column[Timestamp]("created", this)
     val categories = Column[List[String]]("categories", this)
-    val listType   = Column[ListType]("category_list_type", this)
+    val listType = Column[ListType]("category_list_type", this)
     val all = NonEmptyList
       .of[Column[_]](cid, schedule, itemCount, created, categories, listType)
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/RClientSettings.scala b/modules/store/src/main/scala/docspell/store/records/RClientSettings.scala
index 70a1043d..94ef0026 100644
--- a/modules/store/src/main/scala/docspell/store/records/RClientSettings.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RClientSettings.scala
@@ -31,18 +31,18 @@ object RClientSettings {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "client_settings"
 
-    val id           = Column[Ident]("id", this)
-    val clientId     = Column[Ident]("client_id", this)
-    val userId       = Column[Ident]("user_id", this)
+    val id = Column[Ident]("id", this)
+    val clientId = Column[Ident]("client_id", this)
+    val userId = Column[Ident]("user_id", this)
     val settingsData = Column[Json]("settings_data", this)
-    val updated      = Column[Timestamp]("updated", this)
-    val created      = Column[Timestamp]("created", this)
+    val updated = Column[Timestamp]("updated", this)
+    val created = Column[Timestamp]("created", this)
     val all =
       NonEmptyList.of[Column[_]](id, clientId, userId, settingsData, updated, created)
   }
 
   def as(alias: String): Table = Table(Some(alias))
-  val T                        = Table(None)
+  val T = Table(None)
 
   def insert(v: RClientSettings): ConnectionIO[Int] = {
     val t = Table(None)
@@ -67,7 +67,7 @@ object RClientSettings {
 
   def upsert(clientId: Ident, userId: Ident, data: Json): ConnectionIO[Int] =
     for {
-      id  <- Ident.randomId[ConnectionIO]
+      id <- Ident.randomId[ConnectionIO]
       now <- Timestamp.current[ConnectionIO]
       nup <- updateSettings(clientId, userId, data, now)
       nin <-
diff --git a/modules/store/src/main/scala/docspell/store/records/RCollective.scala b/modules/store/src/main/scala/docspell/store/records/RCollective.scala
index 440f3dd0..dd0afce2 100644
--- a/modules/store/src/main/scala/docspell/store/records/RCollective.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RCollective.scala
@@ -28,11 +28,11 @@ object RCollective {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "collective"
 
-    val id          = Column[Ident]("cid", this)
-    val state       = Column[CollectiveState]("state", this)
-    val language    = Column[Language]("doclang", this)
+    val id = Column[Ident]("cid", this)
+    val state = Column[CollectiveState]("state", this)
+    val language = Column[Language]("doclang", this)
     val integration = Column[Boolean]("integration_enabled", this)
-    val created     = Column[Timestamp]("created", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, state, language, integration, created)
   }
@@ -103,7 +103,7 @@ object RCollective {
 
   private def getRawSettings(coll: Ident): ConnectionIO[Option[Settings]] = {
     import RClassifierSetting.stringListMeta
-    val c  = RCollective.as("c")
+    val c = RCollective.as("c")
     val cs = RClassifierSetting.as("cs")
     val es = REmptyTrashSetting.as("es")
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RContact.scala b/modules/store/src/main/scala/docspell/store/records/RContact.scala
index 542554a8..e6e79734 100644
--- a/modules/store/src/main/scala/docspell/store/records/RContact.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RContact.scala
@@ -30,11 +30,11 @@ object RContact {
     val tableName = "contact"
 
     val contactId = Column[Ident]("contactid", this)
-    val value     = Column[String]("value", this)
-    val kind      = Column[ContactKind]("kind", this)
-    val personId  = Column[Ident]("pid", this)
-    val orgId     = Column[Ident]("oid", this)
-    val created   = Column[Timestamp]("created", this)
+    val value = Column[String]("value", this)
+    val kind = Column[ContactKind]("kind", this)
+    val personId = Column[Ident]("pid", this)
+    val orgId = Column[Ident]("oid", this)
+    val created = Column[Timestamp]("created", this)
     val all = NonEmptyList.of[Column[_]](contactId, value, kind, personId, orgId, created)
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RCustomField.scala b/modules/store/src/main/scala/docspell/store/records/RCustomField.scala
index efd9957f..89db8192 100644
--- a/modules/store/src/main/scala/docspell/store/records/RCustomField.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RCustomField.scala
@@ -29,11 +29,11 @@ object RCustomField {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "custom_field"
 
-    val id      = Column[Ident]("id", this)
-    val name    = Column[Ident]("name", this)
-    val label   = Column[String]("label", this)
-    val cid     = Column[Ident]("cid", this)
-    val ftype   = Column[CustomFieldType]("ftype", this)
+    val id = Column[Ident]("id", this)
+    val name = Column[Ident]("name", this)
+    val label = Column[String]("label", this)
+    val cid = Column[Ident]("cid", this)
+    val ftype = Column[CustomFieldType]("ftype", this)
     val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, name, label, cid, ftype, created)
diff --git a/modules/store/src/main/scala/docspell/store/records/RCustomFieldValue.scala b/modules/store/src/main/scala/docspell/store/records/RCustomFieldValue.scala
index 5a4ad3a9..16cae1d9 100644
--- a/modules/store/src/main/scala/docspell/store/records/RCustomFieldValue.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RCustomFieldValue.scala
@@ -26,10 +26,10 @@ object RCustomFieldValue {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "custom_field_value"
 
-    val id     = Column[Ident]("id", this)
+    val id = Column[Ident]("id", this)
     val itemId = Column[Ident]("item_id", this)
-    val field  = Column[Ident]("field", this)
-    val value  = Column[String]("field_value", this)
+    val field = Column[Ident]("field", this)
+    val value = Column[String]("field_value", this)
 
     val all = NonEmptyList.of[Column[_]](id, itemId, field, value)
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/REmptyTrashSetting.scala b/modules/store/src/main/scala/docspell/store/records/REmptyTrashSetting.scala
index d4dc032a..24fcb0f7 100644
--- a/modules/store/src/main/scala/docspell/store/records/REmptyTrashSetting.scala
+++ b/modules/store/src/main/scala/docspell/store/records/REmptyTrashSetting.scala
@@ -30,11 +30,11 @@ object REmptyTrashSetting {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "empty_trash_setting"
 
-    val cid      = Column[Ident]("cid", this)
+    val cid = Column[Ident]("cid", this)
     val schedule = Column[CalEvent]("schedule", this)
-    val minAge   = Column[Duration]("min_age", this)
-    val created  = Column[Timestamp]("created", this)
-    val all      = NonEmptyList.of[Column[_]](cid, schedule, minAge, created)
+    val minAge = Column[Duration]("min_age", this)
+    val created = Column[Timestamp]("created", this)
+    val all = NonEmptyList.of[Column[_]](cid, schedule, minAge, created)
   }
 
   val T = Table(None)
diff --git a/modules/store/src/main/scala/docspell/store/records/REquipment.scala b/modules/store/src/main/scala/docspell/store/records/REquipment.scala
index d30ed50c..14e5cc46 100644
--- a/modules/store/src/main/scala/docspell/store/records/REquipment.scala
+++ b/modules/store/src/main/scala/docspell/store/records/REquipment.scala
@@ -29,14 +29,14 @@ object REquipment {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "equipment"
 
-    val eid     = Column[Ident]("eid", this)
-    val cid     = Column[Ident]("cid", this)
-    val name    = Column[String]("name", this)
+    val eid = Column[Ident]("eid", this)
+    val cid = Column[Ident]("cid", this)
+    val name = Column[String]("name", this)
     val created = Column[Timestamp]("created", this)
     val updated = Column[Timestamp]("updated", this)
-    val notes   = Column[String]("notes", this)
-    val use     = Column[EquipmentUse]("equip_use", this)
-    val all     = NonEmptyList.of[Column[_]](eid, cid, name, created, updated, notes, use)
+    val notes = Column[String]("notes", this)
+    val use = Column[EquipmentUse]("equip_use", this)
+    val all = NonEmptyList.of[Column[_]](eid, cid, name, created, updated, notes, use)
   }
 
   val T = Table(None)
@@ -73,13 +73,13 @@ object REquipment {
   }
 
   def existsByName(coll: Ident, ename: String): ConnectionIO[Boolean] = {
-    val t   = Table(None)
+    val t = Table(None)
     val sql = run(select(count(t.eid)), from(t), where(t.cid === coll, t.name === ename))
     sql.query[Int].unique.map(_ > 0)
   }
 
   def findById(id: Ident): ConnectionIO[Option[REquipment]] = {
-    val t   = Table(None)
+    val t = Table(None)
     val sql = run(select(t.all), from(t), t.eid === id)
     sql.query[REquipment].option
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/RFileMeta.scala b/modules/store/src/main/scala/docspell/store/records/RFileMeta.scala
index 6b142510..02ace94b 100644
--- a/modules/store/src/main/scala/docspell/store/records/RFileMeta.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RFileMeta.scala
@@ -29,11 +29,11 @@ object RFileMeta {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "filemeta"
 
-    val id        = Column[Ident]("file_id", this)
+    val id = Column[Ident]("file_id", this)
     val timestamp = Column[Timestamp]("created", this)
-    val mimetype  = Column[MimeType]("mimetype", this)
-    val length    = Column[ByteSize]("length", this)
-    val checksum  = Column[ByteVector]("checksum", this)
+    val mimetype = Column[MimeType]("mimetype", this)
+    val length = Column[ByteSize]("length", this)
+    val checksum = Column[ByteVector]("checksum", this)
 
     val all = NonEmptyList
       .of[Column[_]](id, timestamp, mimetype, length, checksum)
diff --git a/modules/store/src/main/scala/docspell/store/records/RFolder.scala b/modules/store/src/main/scala/docspell/store/records/RFolder.scala
index 5f618fdc..562f324e 100644
--- a/modules/store/src/main/scala/docspell/store/records/RFolder.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RFolder.scala
@@ -36,11 +36,11 @@ object RFolder {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "folder"
 
-    val id         = Column[Ident]("id", this)
-    val name       = Column[String]("name", this)
+    val id = Column[Ident]("id", this)
+    val name = Column[String]("name", this)
     val collective = Column[Ident]("cid", this)
-    val owner      = Column[Ident]("owner", this)
-    val created    = Column[Timestamp]("created", this)
+    val owner = Column[Ident]("owner", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, name, collective, owner, created)
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/RFolderMember.scala b/modules/store/src/main/scala/docspell/store/records/RFolderMember.scala
index 3aff7da1..1cced8ba 100644
--- a/modules/store/src/main/scala/docspell/store/records/RFolderMember.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RFolderMember.scala
@@ -35,9 +35,9 @@ object RFolderMember {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "folder_member"
 
-    val id      = Column[Ident]("id", this)
-    val folder  = Column[Ident]("folder_id", this)
-    val user    = Column[Ident]("user_id", this)
+    val id = Column[Ident]("id", this)
+    val folder = Column[Ident]("folder_id", this)
+    val user = Column[Ident]("user_id", this)
     val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, folder, user, created)
diff --git a/modules/store/src/main/scala/docspell/store/records/RInvitation.scala b/modules/store/src/main/scala/docspell/store/records/RInvitation.scala
index 727a482a..7bfdad71 100644
--- a/modules/store/src/main/scala/docspell/store/records/RInvitation.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RInvitation.scala
@@ -23,9 +23,9 @@ object RInvitation {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "invitation"
 
-    val id      = Column[Ident]("id", this)
+    val id = Column[Ident]("id", this)
     val created = Column[Timestamp]("created", this)
-    val all     = NonEmptyList.of[Column[_]](id, created)
+    val all = NonEmptyList.of[Column[_]](id, created)
   }
 
   val T = Table(None)
@@ -56,7 +56,7 @@ object RInvitation {
       .unique
     for {
       inv <- get
-      _   <- delete(invite)
+      _ <- delete(invite)
     } yield inv > 0
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RItem.scala b/modules/store/src/main/scala/docspell/store/records/RItem.scala
index f09c4539..6a6d9d68 100644
--- a/modules/store/src/main/scala/docspell/store/records/RItem.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RItem.scala
@@ -49,7 +49,7 @@ object RItem {
   ): F[RItem] =
     for {
       now <- Timestamp.current[F]
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
     } yield RItem(
       id,
       cid,
@@ -74,23 +74,23 @@ object RItem {
     import docspell.store.qb.Column
     val tableName = "item"
 
-    val id            = Column[Ident]("itemid", this)
-    val cid           = Column[Ident]("cid", this)
-    val name          = Column[String]("name", this)
-    val itemDate      = Column[Timestamp]("itemdate", this)
-    val source        = Column[String]("source", this)
-    val incoming      = Column[Direction]("incoming", this)
-    val state         = Column[ItemState]("state", this)
-    val corrOrg       = Column[Ident]("corrorg", this)
-    val corrPerson    = Column[Ident]("corrperson", this)
-    val concPerson    = Column[Ident]("concperson", this)
+    val id = Column[Ident]("itemid", this)
+    val cid = Column[Ident]("cid", this)
+    val name = Column[String]("name", this)
+    val itemDate = Column[Timestamp]("itemdate", this)
+    val source = Column[String]("source", this)
+    val incoming = Column[Direction]("incoming", this)
+    val state = Column[ItemState]("state", this)
+    val corrOrg = Column[Ident]("corrorg", this)
+    val corrPerson = Column[Ident]("corrperson", this)
+    val concPerson = Column[Ident]("concperson", this)
     val concEquipment = Column[Ident]("concequipment", this)
-    val inReplyTo     = Column[Ident]("inreplyto", this)
-    val dueDate       = Column[Timestamp]("duedate", this)
-    val created       = Column[Timestamp]("created", this)
-    val updated       = Column[Timestamp]("updated", this)
-    val notes         = Column[String]("notes", this)
-    val folder        = Column[Ident]("folder_id", this)
+    val inReplyTo = Column[Ident]("inreplyto", this)
+    val dueDate = Column[Timestamp]("duedate", this)
+    val created = Column[Timestamp]("created", this)
+    val updated = Column[Timestamp]("updated", this)
+    val notes = Column[String]("notes", this)
+    val folder = Column[Ident]("folder_id", this)
     val all = NonEmptyList.of[Column[_]](
       id,
       cid,
diff --git a/modules/store/src/main/scala/docspell/store/records/RItemProposal.scala b/modules/store/src/main/scala/docspell/store/records/RItemProposal.scala
index b66eb67d..bde0a168 100644
--- a/modules/store/src/main/scala/docspell/store/records/RItemProposal.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RItemProposal.scala
@@ -26,10 +26,10 @@ object RItemProposal {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "item_proposal"
 
-    val itemId            = Column[Ident]("itemid", this)
+    val itemId = Column[Ident]("itemid", this)
     val classifyProposals = Column[MetaProposalList]("classifier_proposals", this)
-    val classifyTags      = Column[List[IdRef]]("classifier_tags", this)
-    val created           = Column[Timestamp]("created", this)
+    val classifyTags = Column[List[IdRef]]("classifier_tags", this)
+    val created = Column[Timestamp]("created", this)
     val all = NonEmptyList.of[Column[_]](itemId, classifyProposals, classifyTags, created)
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RJob.scala b/modules/store/src/main/scala/docspell/store/records/RJob.scala
index 0c89a407..65d5718d 100644
--- a/modules/store/src/main/scala/docspell/store/records/RJob.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RJob.scala
@@ -80,22 +80,22 @@ object RJob {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "job"
 
-    val id            = Column[Ident]("jid", this)
-    val task          = Column[Ident]("task", this)
-    val group         = Column[Ident]("group_", this)
-    val args          = Column[String]("args", this)
-    val subject       = Column[String]("subject", this)
-    val submitted     = Column[Timestamp]("submitted", this)
-    val submitter     = Column[Ident]("submitter", this)
-    val priority      = Column[Priority]("priority", this)
-    val state         = Column[JobState]("state", this)
-    val retries       = Column[Int]("retries", this)
-    val progress      = Column[Int]("progress", this)
-    val tracker       = Column[Ident]("tracker", this)
-    val worker        = Column[Ident]("worker", this)
-    val started       = Column[Timestamp]("started", this)
+    val id = Column[Ident]("jid", this)
+    val task = Column[Ident]("task", this)
+    val group = Column[Ident]("group_", this)
+    val args = Column[String]("args", this)
+    val subject = Column[String]("subject", this)
+    val submitted = Column[Timestamp]("submitted", this)
+    val submitter = Column[Ident]("submitter", this)
+    val priority = Column[Priority]("priority", this)
+    val state = Column[JobState]("state", this)
+    val retries = Column[Int]("retries", this)
+    val progress = Column[Int]("progress", this)
+    val tracker = Column[Ident]("tracker", this)
+    val worker = Column[Ident]("worker", this)
+    val started = Column[Timestamp]("started", this)
     val startedmillis = Column[Long]("startedmillis", this)
-    val finished      = Column[Timestamp]("finished", this)
+    val finished = Column[Timestamp]("finished", this)
     val all = NonEmptyList.of[Column[_]](
       id,
       task,
diff --git a/modules/store/src/main/scala/docspell/store/records/RJobGroupUse.scala b/modules/store/src/main/scala/docspell/store/records/RJobGroupUse.scala
index 9980994a..4a9f572b 100644
--- a/modules/store/src/main/scala/docspell/store/records/RJobGroupUse.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RJobGroupUse.scala
@@ -22,9 +22,9 @@ object RJobGroupUse {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "jobgroupuse"
 
-    val group  = Column[Ident]("groupid", this)
+    val group = Column[Ident]("groupid", this)
     val worker = Column[Ident]("workerid", this)
-    val all    = NonEmptyList.of[Column[_]](group, worker)
+    val all = NonEmptyList.of[Column[_]](group, worker)
   }
 
   val T = Table(None)
diff --git a/modules/store/src/main/scala/docspell/store/records/RJobLog.scala b/modules/store/src/main/scala/docspell/store/records/RJobLog.scala
index 264162a1..974a35ae 100644
--- a/modules/store/src/main/scala/docspell/store/records/RJobLog.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RJobLog.scala
@@ -27,12 +27,12 @@ object RJobLog {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "joblog"
 
-    val id      = Column[Ident]("id", this)
-    val jobId   = Column[Ident]("jid", this)
-    val level   = Column[LogLevel]("level", this)
+    val id = Column[Ident]("id", this)
+    val jobId = Column[Ident]("jid", this)
+    val level = Column[LogLevel]("level", this)
     val created = Column[Timestamp]("created", this)
     val message = Column[String]("message", this)
-    val all     = NonEmptyList.of[Column[_]](id, jobId, level, created, message)
+    val all = NonEmptyList.of[Column[_]](id, jobId, level, created, message)
 
     // separate column only for sorting, so not included in `all` and
     // the case class
diff --git a/modules/store/src/main/scala/docspell/store/records/RNode.scala b/modules/store/src/main/scala/docspell/store/records/RNode.scala
index 7de7f3da..fdcb8dd4 100644
--- a/modules/store/src/main/scala/docspell/store/records/RNode.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RNode.scala
@@ -34,11 +34,11 @@ object RNode {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "node"
 
-    val id       = Column[Ident]("id", this)
+    val id = Column[Ident]("id", this)
     val nodeType = Column[NodeType]("type", this)
-    val url      = Column[LenientUri]("url", this)
-    val updated  = Column[Timestamp]("updated", this)
-    val created  = Column[Timestamp]("created", this)
+    val url = Column[LenientUri]("url", this)
+    val updated = Column[Timestamp]("updated", this)
+    val created = Column[Timestamp]("created", this)
     val notFound = Column[Int]("not_found", this)
     val all = NonEmptyList.of[Column[_]](id, nodeType, url, updated, created, notFound)
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/ROrganization.scala b/modules/store/src/main/scala/docspell/store/records/ROrganization.scala
index 67b61d67..c1fa07b2 100644
--- a/modules/store/src/main/scala/docspell/store/records/ROrganization.scala
+++ b/modules/store/src/main/scala/docspell/store/records/ROrganization.scala
@@ -39,18 +39,18 @@ object ROrganization {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "organization"
 
-    val oid       = Column[Ident]("oid", this)
-    val cid       = Column[Ident]("cid", this)
-    val name      = Column[String]("name", this)
-    val street    = Column[String]("street", this)
-    val zip       = Column[String]("zip", this)
-    val city      = Column[String]("city", this)
-    val country   = Column[String]("country", this)
-    val notes     = Column[String]("notes", this)
-    val created   = Column[Timestamp]("created", this)
-    val updated   = Column[Timestamp]("updated", this)
+    val oid = Column[Ident]("oid", this)
+    val cid = Column[Ident]("cid", this)
+    val name = Column[String]("name", this)
+    val street = Column[String]("street", this)
+    val zip = Column[String]("zip", this)
+    val city = Column[String]("city", this)
+    val country = Column[String]("country", this)
+    val notes = Column[String]("notes", this)
+    val created = Column[Timestamp]("created", this)
+    val updated = Column[Timestamp]("updated", this)
     val shortName = Column[String]("short_name", this)
-    val use       = Column[OrgUse]("org_use", this)
+    val use = Column[OrgUse]("org_use", this)
     val all =
       Nel.of[Column[_]](
         oid,
@@ -99,7 +99,7 @@ object ROrganization {
       )
     for {
       now <- Timestamp.current[ConnectionIO]
-      n   <- sql(now)
+      n <- sql(now)
     } yield n
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RPeriodicTask.scala b/modules/store/src/main/scala/docspell/store/records/RPeriodicTask.scala
index 9ba722c8..9aa68306 100644
--- a/modules/store/src/main/scala/docspell/store/records/RPeriodicTask.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RPeriodicTask.scala
@@ -128,20 +128,20 @@ object RPeriodicTask {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "periodic_task"
 
-    val id        = Column[Ident]("id", this)
-    val enabled   = Column[Boolean]("enabled", this)
-    val task      = Column[Ident]("task", this)
-    val group     = Column[Ident]("group_", this)
-    val args      = Column[String]("args", this)
-    val subject   = Column[String]("subject", this)
+    val id = Column[Ident]("id", this)
+    val enabled = Column[Boolean]("enabled", this)
+    val task = Column[Ident]("task", this)
+    val group = Column[Ident]("group_", this)
+    val args = Column[String]("args", this)
+    val subject = Column[String]("subject", this)
     val submitter = Column[Ident]("submitter", this)
-    val priority  = Column[Priority]("priority", this)
-    val worker    = Column[Ident]("worker", this)
-    val marked    = Column[Timestamp]("marked", this)
-    val timer     = Column[CalEvent]("timer", this)
-    val nextrun   = Column[Timestamp]("nextrun", this)
-    val created   = Column[Timestamp]("created", this)
-    val summary   = Column[String]("summary", this)
+    val priority = Column[Priority]("priority", this)
+    val worker = Column[Ident]("worker", this)
+    val marked = Column[Timestamp]("marked", this)
+    val timer = Column[CalEvent]("timer", this)
+    val nextrun = Column[Timestamp]("nextrun", this)
+    val created = Column[Timestamp]("created", this)
+    val summary = Column[String]("summary", this)
     val all = NonEmptyList.of[Column[_]](
       id,
       enabled,
diff --git a/modules/store/src/main/scala/docspell/store/records/RPerson.scala b/modules/store/src/main/scala/docspell/store/records/RPerson.scala
index 2365d022..4d264c2d 100644
--- a/modules/store/src/main/scala/docspell/store/records/RPerson.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RPerson.scala
@@ -40,18 +40,18 @@ object RPerson {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "person"
 
-    val pid     = Column[Ident]("pid", this)
-    val cid     = Column[Ident]("cid", this)
-    val name    = Column[String]("name", this)
-    val street  = Column[String]("street", this)
-    val zip     = Column[String]("zip", this)
-    val city    = Column[String]("city", this)
+    val pid = Column[Ident]("pid", this)
+    val cid = Column[Ident]("cid", this)
+    val name = Column[String]("name", this)
+    val street = Column[String]("street", this)
+    val zip = Column[String]("zip", this)
+    val city = Column[String]("city", this)
     val country = Column[String]("country", this)
-    val notes   = Column[String]("notes", this)
+    val notes = Column[String]("notes", this)
     val created = Column[Timestamp]("created", this)
     val updated = Column[Timestamp]("updated", this)
-    val oid     = Column[Ident]("oid", this)
-    val use     = Column[PersonUse]("person_use", this)
+    val oid = Column[Ident]("oid", this)
+    val use = Column[PersonUse]("person_use", this)
     val all = Nel.of[Column[_]](
       pid,
       cid,
@@ -99,7 +99,7 @@ object RPerson {
       )
     for {
       now <- Timestamp.current[ConnectionIO]
-      n   <- sql(now)
+      n <- sql(now)
     } yield n
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RRememberMe.scala b/modules/store/src/main/scala/docspell/store/records/RRememberMe.scala
index fb7b0e96..2067f8fb 100644
--- a/modules/store/src/main/scala/docspell/store/records/RRememberMe.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RRememberMe.scala
@@ -23,12 +23,12 @@ object RRememberMe {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "rememberme"
 
-    val id       = Column[Ident]("id", this)
-    val cid      = Column[Ident]("cid", this)
+    val id = Column[Ident]("id", this)
+    val cid = Column[Ident]("cid", this)
     val username = Column[Ident]("login", this)
-    val created  = Column[Timestamp]("created", this)
-    val uses     = Column[Int]("uses", this)
-    val all      = NonEmptyList.of[Column[_]](id, cid, username, created, uses)
+    val created = Column[Timestamp]("created", this)
+    val uses = Column[Int]("uses", this)
+    val all = NonEmptyList.of[Column[_]](id, cid, username, created, uses)
   }
 
   val T = Table(None)
@@ -69,7 +69,7 @@ object RRememberMe {
       .option
     for {
       inv <- get
-      _   <- incrementUse(rid)
+      _ <- incrementUse(rid)
     } yield inv
   }
 
diff --git a/modules/store/src/main/scala/docspell/store/records/RSentMail.scala b/modules/store/src/main/scala/docspell/store/records/RSentMail.scala
index c7511079..6c04524b 100644
--- a/modules/store/src/main/scala/docspell/store/records/RSentMail.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RSentMail.scala
@@ -44,7 +44,7 @@ object RSentMail {
       body: String
   ): F[RSentMail] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- Timestamp.current[F]
     } yield RSentMail(
       id,
@@ -88,15 +88,15 @@ object RSentMail {
 
     val tableName = "sentmail"
 
-    val id         = Column[Ident]("id", this)
-    val uid        = Column[Ident]("uid", this)
-    val messageId  = Column[String]("message_id", this)
-    val sender     = Column[MailAddress]("sender", this)
-    val connName   = Column[Ident]("conn_name", this)
-    val subject    = Column[String]("subject", this)
+    val id = Column[Ident]("id", this)
+    val uid = Column[Ident]("uid", this)
+    val messageId = Column[String]("message_id", this)
+    val sender = Column[MailAddress]("sender", this)
+    val connName = Column[Ident]("conn_name", this)
+    val subject = Column[String]("subject", this)
     val recipients = Column[List[MailAddress]]("recipients", this)
-    val body       = Column[String]("body", this)
-    val created    = Column[Timestamp]("created", this)
+    val body = Column[String]("body", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](
       id,
@@ -131,7 +131,7 @@ object RSentMail {
   def deleteByItem(item: Ident): ConnectionIO[Int] =
     for {
       list <- RSentMailItem.findSentMailIdsByItem(item)
-      n1   <- RSentMailItem.deleteAllByItem(item)
+      n1 <- RSentMailItem.deleteAllByItem(item)
       n0 <- NonEmptyList.fromList(list.toList) match {
         case Some(nel) => DML.delete(T, T.id.in(nel))
         case None      => 0.pure[ConnectionIO]
diff --git a/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala b/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala
index fbc8cf4e..a4a1c1c5 100644
--- a/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala
@@ -32,17 +32,17 @@ object RSentMailItem {
       created: Option[Timestamp] = None
   ): F[RSentMailItem] =
     for {
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
       now <- created.map(_.pure[F]).getOrElse(Timestamp.current[F])
     } yield RSentMailItem(id, itemId, sentmailId, now)
 
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "sentmailitem"
 
-    val id         = Column[Ident]("id", this)
-    val itemId     = Column[Ident]("item_id", this)
+    val id = Column[Ident]("id", this)
+    val itemId = Column[Ident]("item_id", this)
     val sentMailId = Column[Ident]("sentmail_id", this)
-    val created    = Column[Timestamp]("created", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](
       id,
diff --git a/modules/store/src/main/scala/docspell/store/records/RSource.scala b/modules/store/src/main/scala/docspell/store/records/RSource.scala
index d482a46d..629ae832 100644
--- a/modules/store/src/main/scala/docspell/store/records/RSource.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RSource.scala
@@ -39,18 +39,18 @@ object RSource {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "source"
 
-    val sid         = Column[Ident]("sid", this)
-    val cid         = Column[Ident]("cid", this)
-    val abbrev      = Column[String]("abbrev", this)
+    val sid = Column[Ident]("sid", this)
+    val cid = Column[Ident]("cid", this)
+    val abbrev = Column[String]("abbrev", this)
     val description = Column[String]("description", this)
-    val counter     = Column[Int]("counter", this)
-    val enabled     = Column[Boolean]("enabled", this)
-    val priority    = Column[Priority]("priority", this)
-    val created     = Column[Timestamp]("created", this)
-    val folder      = Column[Ident]("folder_id", this)
-    val fileFilter  = Column[Glob]("file_filter", this)
-    val language    = Column[Language]("doc_lang", this)
-    val attachOnly  = Column[Boolean]("attachments_only", this)
+    val counter = Column[Int]("counter", this)
+    val enabled = Column[Boolean]("enabled", this)
+    val priority = Column[Priority]("priority", this)
+    val created = Column[Timestamp]("created", this)
+    val folder = Column[Ident]("folder_id", this)
+    val fileFilter = Column[Glob]("file_filter", this)
+    val language = Column[Language]("doc_lang", this)
+    val attachOnly = Column[Boolean]("attachments_only", this)
 
     val all =
       NonEmptyList.of[Column[_]](
diff --git a/modules/store/src/main/scala/docspell/store/records/RTag.scala b/modules/store/src/main/scala/docspell/store/records/RTag.scala
index 155a0a05..44b0e617 100644
--- a/modules/store/src/main/scala/docspell/store/records/RTag.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RTag.scala
@@ -28,12 +28,12 @@ object RTag {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "tag"
 
-    val tid      = Column[Ident]("tid", this)
-    val cid      = Column[Ident]("cid", this)
-    val name     = Column[String]("name", this)
+    val tid = Column[Ident]("tid", this)
+    val cid = Column[Ident]("cid", this)
+    val name = Column[String]("name", this)
     val category = Column[String]("category", this)
-    val created  = Column[Timestamp]("created", this)
-    val all      = NonEmptyList.of[Column[_]](tid, cid, name, category, created)
+    val created = Column[Timestamp]("created", this)
+    val all = NonEmptyList.of[Column[_]](tid, cid, name, category, created)
   }
   val T = Table(None)
   def as(alias: String): Table =
@@ -97,7 +97,7 @@ object RTag {
 
   def findByItem(itemId: Ident): ConnectionIO[Vector[RTag]] = {
     val ti = RTagItem.as("i")
-    val t  = RTag.as("t")
+    val t = RTag.as("t")
     val sql =
       Select(
         select(t.all),
diff --git a/modules/store/src/main/scala/docspell/store/records/RTagItem.scala b/modules/store/src/main/scala/docspell/store/records/RTagItem.scala
index d911da09..38ac22dc 100644
--- a/modules/store/src/main/scala/docspell/store/records/RTagItem.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RTagItem.scala
@@ -23,9 +23,9 @@ object RTagItem {
     val tableName = "tagitem"
 
     val tagItemId = Column[Ident]("tagitemid", this)
-    val itemId    = Column[Ident]("itemid", this)
-    val tagId     = Column[Ident]("tid", this)
-    val all       = NonEmptyList.of[Column[_]](tagItemId, itemId, tagId)
+    val itemId = Column[Ident]("itemid", this)
+    val tagId = Column[Ident]("tid", this)
+    val all = NonEmptyList.of[Column[_]](tagItemId, itemId, tagId)
   }
   val T = Table(None)
   def as(alias: String): Table =
diff --git a/modules/store/src/main/scala/docspell/store/records/RTagSource.scala b/modules/store/src/main/scala/docspell/store/records/RTagSource.scala
index f47896cf..01ad9b7a 100644
--- a/modules/store/src/main/scala/docspell/store/records/RTagSource.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RTagSource.scala
@@ -23,10 +23,10 @@ object RTagSource {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "tagsource"
 
-    val id       = Column[Ident]("id", this)
+    val id = Column[Ident]("id", this)
     val sourceId = Column[Ident]("source_id", this)
-    val tagId    = Column[Ident]("tag_id", this)
-    val all      = NonEmptyList.of[Column[_]](id, sourceId, tagId)
+    val tagId = Column[Ident]("tag_id", this)
+    val all = NonEmptyList.of[Column[_]](id, sourceId, tagId)
   }
 
   private val t = Table(None)
diff --git a/modules/store/src/main/scala/docspell/store/records/RTotp.scala b/modules/store/src/main/scala/docspell/store/records/RTotp.scala
index 327193aa..6b942852 100644
--- a/modules/store/src/main/scala/docspell/store/records/RTotp.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RTotp.scala
@@ -29,9 +29,9 @@ object RTotp {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "totp"
 
-    val userId  = Column[Ident]("user_id", this)
+    val userId = Column[Ident]("user_id", this)
     val enabled = Column[Boolean]("enabled", this)
-    val secret  = Column[Key]("secret", this)
+    val secret = Column[Key]("secret", this)
     val created = Column[Timestamp]("created", this)
 
     val all = Nel.of(userId, enabled, secret, created)
diff --git a/modules/store/src/main/scala/docspell/store/records/RUser.scala b/modules/store/src/main/scala/docspell/store/records/RUser.scala
index ddeb4708..dc8f66d8 100644
--- a/modules/store/src/main/scala/docspell/store/records/RUser.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RUser.scala
@@ -54,16 +54,16 @@ object RUser {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "user_"
 
-    val uid        = Column[Ident]("uid", this)
-    val login      = Column[Ident]("login", this)
-    val cid        = Column[Ident]("cid", this)
-    val password   = Column[Password]("password", this)
-    val state      = Column[UserState]("state", this)
-    val source     = Column[AccountSource]("account_source", this)
-    val email      = Column[String]("email", this)
+    val uid = Column[Ident]("uid", this)
+    val login = Column[Ident]("login", this)
+    val cid = Column[Ident]("cid", this)
+    val password = Column[Password]("password", this)
+    val state = Column[UserState]("state", this)
+    val source = Column[AccountSource]("account_source", this)
+    val email = Column[String]("email", this)
     val loginCount = Column[Int]("logincount", this)
-    val lastLogin  = Column[Timestamp]("lastlogin", this)
-    val created    = Column[Timestamp]("created", this)
+    val lastLogin = Column[Timestamp]("lastlogin", this)
+    val created = Column[Timestamp]("created", this)
 
     val all =
       NonEmptyList.of[Column[_]](
@@ -121,13 +121,13 @@ object RUser {
   }
 
   def findById(userId: Ident): ConnectionIO[Option[RUser]] = {
-    val t   = Table(None)
+    val t = Table(None)
     val sql = run(select(t.all), from(t), t.uid === userId)
     sql.query[RUser].option
   }
 
   def findAll(coll: Ident, order: Table => Column[_]): ConnectionIO[Vector[RUser]] = {
-    val t   = Table(None)
+    val t = Table(None)
     val sql = Select(select(t.all), from(t), t.cid === coll).orderBy(order(t)).build
     sql.query[RUser].to[Vector]
   }
diff --git a/modules/store/src/main/scala/docspell/store/records/RUserEmail.scala b/modules/store/src/main/scala/docspell/store/records/RUserEmail.scala
index e15030de..639c70b9 100644
--- a/modules/store/src/main/scala/docspell/store/records/RUserEmail.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RUserEmail.scala
@@ -61,7 +61,7 @@ object RUserEmail {
   ): F[RUserEmail] =
     for {
       now <- Timestamp.current[F]
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
     } yield RUserEmail(
       id,
       uid,
@@ -90,8 +90,8 @@ object RUserEmail {
       mailReplyTo: Option[MailAddress]
   ): OptionT[ConnectionIO, RUserEmail] =
     for {
-      now  <- OptionT.liftF(Timestamp.current[ConnectionIO])
-      id   <- OptionT.liftF(Ident.randomId[ConnectionIO])
+      now <- OptionT.liftF(Timestamp.current[ConnectionIO])
+      id <- OptionT.liftF(Ident.randomId[ConnectionIO])
       user <- OptionT(RUser.findByAccount(accId))
     } yield RUserEmail(
       id,
@@ -111,18 +111,18 @@ object RUserEmail {
 
     val tableName = "useremail"
 
-    val id            = Column[Ident]("id", this)
-    val uid           = Column[Ident]("uid", this)
-    val name          = Column[Ident]("name", this)
-    val smtpHost      = Column[String]("smtp_host", this)
-    val smtpPort      = Column[Int]("smtp_port", this)
-    val smtpUser      = Column[String]("smtp_user", this)
-    val smtpPass      = Column[Password]("smtp_password", this)
-    val smtpSsl       = Column[SSLType]("smtp_ssl", this)
+    val id = Column[Ident]("id", this)
+    val uid = Column[Ident]("uid", this)
+    val name = Column[Ident]("name", this)
+    val smtpHost = Column[String]("smtp_host", this)
+    val smtpPort = Column[Int]("smtp_port", this)
+    val smtpUser = Column[String]("smtp_user", this)
+    val smtpPass = Column[Password]("smtp_password", this)
+    val smtpSsl = Column[SSLType]("smtp_ssl", this)
     val smtpCertCheck = Column[Boolean]("smtp_certcheck", this)
-    val mailFrom      = Column[MailAddress]("mail_from", this)
-    val mailReplyTo   = Column[MailAddress]("mail_replyto", this)
-    val created       = Column[Timestamp]("created", this)
+    val mailFrom = Column[MailAddress]("mail_from", this)
+    val mailReplyTo = Column[MailAddress]("mail_replyto", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](
       id,
@@ -181,7 +181,7 @@ object RUserEmail {
       nameQ: Option[String],
       exact: Boolean
   ): Query0[RUserEmail] = {
-    val user  = RUser.as("u")
+    val user = RUser.as("u")
     val email = as("m")
 
     val nameFilter = nameQ.map(s =>
diff --git a/modules/store/src/main/scala/docspell/store/records/RUserImap.scala b/modules/store/src/main/scala/docspell/store/records/RUserImap.scala
index 4bd0c1b0..a6f1885c 100644
--- a/modules/store/src/main/scala/docspell/store/records/RUserImap.scala
+++ b/modules/store/src/main/scala/docspell/store/records/RUserImap.scala
@@ -60,7 +60,7 @@ object RUserImap {
   ): F[RUserImap] =
     for {
       now <- Timestamp.current[F]
-      id  <- Ident.randomId[F]
+      id <- Ident.randomId[F]
     } yield RUserImap(
       id,
       uid,
@@ -87,8 +87,8 @@ object RUserImap {
       imapOAuth2: Boolean
   ): OptionT[ConnectionIO, RUserImap] =
     for {
-      now  <- OptionT.liftF(Timestamp.current[ConnectionIO])
-      id   <- OptionT.liftF(Ident.randomId[ConnectionIO])
+      now <- OptionT.liftF(Timestamp.current[ConnectionIO])
+      id <- OptionT.liftF(Ident.randomId[ConnectionIO])
       user <- OptionT(RUser.findByAccount(accId))
     } yield RUserImap(
       id,
@@ -107,17 +107,17 @@ object RUserImap {
   final case class Table(alias: Option[String]) extends TableDef {
     val tableName = "userimap"
 
-    val id            = Column[Ident]("id", this)
-    val uid           = Column[Ident]("uid", this)
-    val name          = Column[Ident]("name", this)
-    val imapHost      = Column[String]("imap_host", this)
-    val imapPort      = Column[Int]("imap_port", this)
-    val imapUser      = Column[String]("imap_user", this)
-    val imapPass      = Column[Password]("imap_password", this)
-    val imapSsl       = Column[SSLType]("imap_ssl", this)
+    val id = Column[Ident]("id", this)
+    val uid = Column[Ident]("uid", this)
+    val name = Column[Ident]("name", this)
+    val imapHost = Column[String]("imap_host", this)
+    val imapPort = Column[Int]("imap_port", this)
+    val imapUser = Column[String]("imap_user", this)
+    val imapPass = Column[Password]("imap_password", this)
+    val imapSsl = Column[SSLType]("imap_ssl", this)
     val imapCertCheck = Column[Boolean]("imap_certcheck", this)
-    val imapOAuth2    = Column[Boolean]("imap_oauth2", this)
-    val created       = Column[Timestamp]("created", this)
+    val imapOAuth2 = Column[Boolean]("imap_oauth2", this)
+    val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](
       id,
diff --git a/modules/store/src/main/scala/docspell/store/records/SourceData.scala b/modules/store/src/main/scala/docspell/store/records/SourceData.scala
index 03fd40ed..aee01672 100644
--- a/modules/store/src/main/scala/docspell/store/records/SourceData.scala
+++ b/modules/store/src/main/scala/docspell/store/records/SourceData.scala
@@ -17,8 +17,7 @@ import docspell.store.qb._
 import doobie._
 import doobie.implicits._
 
-/** Combines a source record (RSource) and a list of associated tags.
-  */
+/** Combines a source record (RSource) and a list of associated tags. */
 case class SourceData(source: RSource, tags: Vector[RTag])
 
 object SourceData {
@@ -56,9 +55,9 @@ object SourceData {
 
     for {
       resolvedTags <- Stream.eval(Ref.of[ConnectionIO, Map[Ident, RTag]](Map.empty))
-      source       <- select
-      tagSources   <- Stream.eval(RTagSource.findBySource(source.sid))
-      tags         <- Stream.eval(tagSources.traverse(ti => findTag(resolvedTags, ti)))
+      source <- select
+      tagSources <- Stream.eval(RTagSource.findBySource(source.sid))
+      tags <- Stream.eval(tagSources.traverse(ti => findTag(resolvedTags, ti)))
     } yield SourceData(source, tags.flatten)
   }
 
@@ -67,7 +66,7 @@ object SourceData {
 
   def insert(data: RSource, tags: List[String]): ConnectionIO[Int] =
     for {
-      n0   <- RSource.insert(data)
+      n0 <- RSource.insert(data)
       tags <- RTag.findAllByNameOrId(tags, data.cid)
       n1 <- tags.traverse(tag =>
         RTagSource.createNew[ConnectionIO](data.sid, tag.tagId).flatMap(RTagSource.insert)
@@ -76,9 +75,9 @@ object SourceData {
 
   def update(data: RSource, tags: List[String]): ConnectionIO[Int] =
     for {
-      n0   <- RSource.updateNoCounter(data)
+      n0 <- RSource.updateNoCounter(data)
       tags <- RTag.findAllByNameOrId(tags, data.cid)
-      _    <- RTagSource.deleteSourceTags(data.sid)
+      _ <- RTagSource.deleteSourceTags(data.sid)
       n1 <- tags.traverse(tag =>
         RTagSource.createNew[ConnectionIO](data.sid, tag.tagId).flatMap(RTagSource.insert)
       )
diff --git a/modules/store/src/main/scala/docspell/store/records/TagItemName.scala b/modules/store/src/main/scala/docspell/store/records/TagItemName.scala
index b84e38cf..749bd229 100644
--- a/modules/store/src/main/scala/docspell/store/records/TagItemName.scala
+++ b/modules/store/src/main/scala/docspell/store/records/TagItemName.scala
@@ -26,7 +26,7 @@ case class TagItemName(
 
 object TagItemName {
   private val ti = RTagItem.as("ti")
-  private val t  = RTag.as("t")
+  private val t = RTag.as("t")
 
   private val taggedItems =
     from(t).innerJoin(ti, t.tid === ti.tagId)
diff --git a/modules/store/src/main/scala/docspell/store/usertask/UserTaskStore.scala b/modules/store/src/main/scala/docspell/store/usertask/UserTaskStore.scala
index 99ec1d15..96a08351 100644
--- a/modules/store/src/main/scala/docspell/store/usertask/UserTaskStore.scala
+++ b/modules/store/src/main/scala/docspell/store/usertask/UserTaskStore.scala
@@ -33,8 +33,7 @@ import io.circe._
   */
 trait UserTaskStore[F[_]] {
 
-  /** Return all tasks of the given user.
-    */
+  /** Return all tasks of the given user. */
   def getAll(scope: UserTaskScope): Stream[F, UserTask[String]]
 
   /** Return all tasks of the given name and user. The task's arguments are returned as
@@ -61,8 +60,7 @@ trait UserTaskStore[F[_]] {
       implicit E: Encoder[A]
   ): F[Int]
 
-  /** Delete the task with the given id of the given user.
-    */
+  /** Delete the task with the given id of the given user. */
   def deleteTask(scope: UserTaskScope, id: Ident): F[Int]
 
   /** Return the task of the given user and name. If multiple exists, an error is
@@ -91,8 +89,7 @@ trait UserTaskStore[F[_]] {
       implicit E: Encoder[A]
   ): F[UserTask[String]]
 
-  /** Delete all tasks of the given user that have name `name'.
-    */
+  /** Delete all tasks of the given user that have name `name'. */
   def deleteAll(scope: UserTaskScope, name: Ident): F[Int]
 }
 
diff --git a/modules/store/src/test/scala/docspell/store/StoreFixture.scala b/modules/store/src/test/scala/docspell/store/StoreFixture.scala
index 37ed4f0d..6f741230 100644
--- a/modules/store/src/test/scala/docspell/store/StoreFixture.scala
+++ b/modules/store/src/test/scala/docspell/store/StoreFixture.scala
@@ -26,7 +26,7 @@ trait StoreFixture extends CatsEffectFunFixtures { self: CatsEffectSuite =>
     for {
       ds <- StoreFixture.dataSource(cfg)
       xa <- StoreFixture.makeXA(ds)
-      _  <- Resource.eval(FlywayMigrate.run[IO](cfg))
+      _ <- Resource.eval(FlywayMigrate.run[IO](cfg))
     } yield xa
   }
 
@@ -34,7 +34,7 @@ trait StoreFixture extends CatsEffectFunFixtures { self: CatsEffectSuite =>
     val cfg = StoreFixture.memoryDB("test")
     for {
       store <- StoreFixture.store(cfg)
-      _     <- Resource.eval(store.migrate)
+      _ <- Resource.eval(store.migrate)
     } yield store
   }
 }
diff --git a/modules/store/src/test/scala/docspell/store/generator/ItemQueryGeneratorTest.scala b/modules/store/src/test/scala/docspell/store/generator/ItemQueryGeneratorTest.scala
index c63463e8..9f9a9995 100644
--- a/modules/store/src/test/scala/docspell/store/generator/ItemQueryGeneratorTest.scala
+++ b/modules/store/src/test/scala/docspell/store/generator/ItemQueryGeneratorTest.scala
@@ -51,14 +51,14 @@ class ItemQueryGeneratorTest extends FunSuite {
   }
 
   test("!conc:*") {
-    val q      = ItemQueryParser.parseUnsafe("!conc:*")
-    val cond   = ItemQueryGenerator(now, tables, Ident.unsafe("coll"))(q)
+    val q = ItemQueryParser.parseUnsafe("!conc:*")
+    val cond = ItemQueryGenerator(now, tables, Ident.unsafe("coll"))(q)
     val expect = not(tables.concPers.name.like("%") || tables.concEquip.name.like("%"))
     assertEquals(cond, expect)
   }
 
   test("attach.id with wildcard") {
-    val q    = ItemQueryParser.parseUnsafe("attach.id=abcde*")
+    val q = ItemQueryParser.parseUnsafe("attach.id=abcde*")
     val cond = ItemQueryGenerator(now, tables, Ident.unsafe("coll"))(q)
     val expect = tables.item.id.in(
       Select(
@@ -72,7 +72,7 @@ class ItemQueryGeneratorTest extends FunSuite {
   }
 
   test("attach.id with equals") {
-    val q    = ItemQueryParser.parseUnsafe("attach.id=abcde")
+    val q = ItemQueryParser.parseUnsafe("attach.id=abcde")
     val cond = ItemQueryGenerator(now, tables, Ident.unsafe("coll"))(q)
     val expect = tables.item.id.in(
       Select(
diff --git a/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala b/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala
index 46b0d5f6..569f6b0f 100644
--- a/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala
+++ b/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala
@@ -16,7 +16,7 @@ import munit.FunSuite
 class H2MigrateTest extends FunSuite {
 
   test("h2 empty schema migration") {
-    val jdbc   = StoreFixture.memoryDB("h2test")
+    val jdbc = StoreFixture.memoryDB("h2test")
     val result = FlywayMigrate.run[IO](jdbc).unsafeRunSync()
     assert(result.migrationsExecuted > 0)
   }
diff --git a/modules/store/src/test/scala/docspell/store/qb/QueryBuilderTest.scala b/modules/store/src/test/scala/docspell/store/qb/QueryBuilderTest.scala
index 9a0c820b..d42d263f 100644
--- a/modules/store/src/test/scala/docspell/store/qb/QueryBuilderTest.scala
+++ b/modules/store/src/test/scala/docspell/store/qb/QueryBuilderTest.scala
@@ -14,8 +14,8 @@ import munit._
 class QueryBuilderTest extends FunSuite {
 
   test("simple") {
-    val c        = CourseRecord.as("c")
-    val owner    = PersonRecord.as("p1")
+    val c = CourseRecord.as("c")
+    val owner = PersonRecord.as("p1")
     val lecturer = PersonRecord.as("p2")
 
     val proj = select(c.all, owner.all, lecturer.all)
diff --git a/modules/store/src/test/scala/docspell/store/qb/impl/SelectBuilderTest.scala b/modules/store/src/test/scala/docspell/store/qb/impl/SelectBuilderTest.scala
index 6cbcf66e..55a8f601 100644
--- a/modules/store/src/test/scala/docspell/store/qb/impl/SelectBuilderTest.scala
+++ b/modules/store/src/test/scala/docspell/store/qb/impl/SelectBuilderTest.scala
@@ -15,8 +15,8 @@ import munit._
 class SelectBuilderTest extends FunSuite {
 
   test("basic fragment") {
-    val c        = CourseRecord.as("c")
-    val owner    = PersonRecord.as("o")
+    val c = CourseRecord.as("c")
+    val owner = PersonRecord.as("o")
     val lecturer = PersonRecord.as("l")
 
     val proj = select(c.all)
@@ -28,7 +28,7 @@ class SelectBuilderTest extends FunSuite {
       owner.name === "Harald"
     )
 
-    val q    = Select(proj, table, cond)
+    val q = Select(proj, table, cond)
     val frag = SelectBuilder(q)
     assertEquals(
       frag.toString,
diff --git a/modules/store/src/test/scala/docspell/store/qb/model/CourseRecord.scala b/modules/store/src/test/scala/docspell/store/qb/model/CourseRecord.scala
index 265d41eb..1f8402a7 100644
--- a/modules/store/src/test/scala/docspell/store/qb/model/CourseRecord.scala
+++ b/modules/store/src/test/scala/docspell/store/qb/model/CourseRecord.scala
@@ -24,11 +24,11 @@ object CourseRecord {
 
     override val tableName = "course"
 
-    val id         = Column[Long]("id", this)
-    val name       = Column[String]("name", this)
-    val ownerId    = Column[Long]("owner_id", this)
+    val id = Column[Long]("id", this)
+    val name = Column[String]("name", this)
+    val ownerId = Column[Long]("owner_id", this)
     val lecturerId = Column[Long]("lecturer_id", this)
-    val lessons    = Column[Int]("lessons", this)
+    val lessons = Column[Int]("lessons", this)
 
     val all = NonEmptyList.of[Column[_]](id, name, ownerId, lecturerId, lessons)
   }
diff --git a/modules/store/src/test/scala/docspell/store/qb/model/PersonRecord.scala b/modules/store/src/test/scala/docspell/store/qb/model/PersonRecord.scala
index 315c57aa..2600cf15 100644
--- a/modules/store/src/test/scala/docspell/store/qb/model/PersonRecord.scala
+++ b/modules/store/src/test/scala/docspell/store/qb/model/PersonRecord.scala
@@ -19,8 +19,8 @@ object PersonRecord {
 
     val tableName = "person"
 
-    val id      = Column[Long]("id", this)
-    val name    = Column[String]("name", this)
+    val id = Column[Long]("id", this)
+    val name = Column[String]("name", this)
     val created = Column[Timestamp]("created", this)
 
     val all = NonEmptyList.of[Column[_]](id, name, created)
diff --git a/modules/store/src/test/scala/docspell/store/queries/QJobTest.scala b/modules/store/src/test/scala/docspell/store/queries/QJobTest.scala
index 2f100e45..cd439777 100644
--- a/modules/store/src/test/scala/docspell/store/queries/QJobTest.scala
+++ b/modules/store/src/test/scala/docspell/store/queries/QJobTest.scala
@@ -22,11 +22,11 @@ import munit._
 class QJobTest extends CatsEffectSuite with StoreFixture {
   private[this] val c = new AtomicLong(0)
 
-  private val worker       = Ident.unsafe("joex1")
+  private val worker = Ident.unsafe("joex1")
   private val initialPause = Duration.seconds(5)
-  private val nowTs        = Timestamp(Instant.parse("2021-06-26T14:54:00Z"))
-  private val group1       = Ident.unsafe("group1")
-  private val group2       = Ident.unsafe("group2")
+  private val nowTs = Timestamp(Instant.parse("2021-06-26T14:54:00Z"))
+  private val group1 = Ident.unsafe("group1")
+  private val group2 = Ident.unsafe("group2")
 
   def createJob(group: Ident): RJob =
     RJob.newJob[Unit](
@@ -44,7 +44,7 @@ class QJobTest extends CatsEffectSuite with StoreFixture {
   xa.test("set group must insert or update") { tx =>
     val res =
       for {
-        _   <- RJobGroupUse.setGroup(RJobGroupUse(group1, worker)).transact(tx)
+        _ <- RJobGroupUse.setGroup(RJobGroupUse(group1, worker)).transact(tx)
         res <- RJobGroupUse.findGroup(worker).transact(tx)
       } yield res
 
@@ -57,7 +57,7 @@ class QJobTest extends CatsEffectSuite with StoreFixture {
         .map(createJob)
         .map(RJob.insert)
         .traverse(_.transact(tx))
-      _    <- RJobGroupUse.deleteAll.transact(tx)
+      _ <- RJobGroupUse.deleteAll.transact(tx)
       next <- QJob.selectNextGroup(worker, nowTs, initialPause).transact(tx)
     } yield next
 
@@ -70,8 +70,8 @@ class QJobTest extends CatsEffectSuite with StoreFixture {
         .map(createJob)
         .map(RJob.insert)
         .traverse(_.transact(tx))
-      _    <- RJobGroupUse.deleteAll.transact(tx)
-      _    <- RJobGroupUse.setGroup(RJobGroupUse(group1, worker)).transact(tx)
+      _ <- RJobGroupUse.deleteAll.transact(tx)
+      _ <- RJobGroupUse.setGroup(RJobGroupUse(group1, worker)).transact(tx)
       next <- QJob.selectNextGroup(worker, nowTs, initialPause).transact(tx)
     } yield next
 
@@ -84,8 +84,8 @@ class QJobTest extends CatsEffectSuite with StoreFixture {
         .map(createJob)
         .map(RJob.insert)
         .traverse(_.transact(tx))
-      _    <- RJobGroupUse.deleteAll.transact(tx)
-      _    <- RJobGroupUse.setGroup(RJobGroupUse(group2, worker)).transact(tx)
+      _ <- RJobGroupUse.deleteAll.transact(tx)
+      _ <- RJobGroupUse.setGroup(RJobGroupUse(group2, worker)).transact(tx)
       next <- QJob.selectNextGroup(worker, nowTs, initialPause).transact(tx)
     } yield next
 
diff --git a/modules/totp/src/main/scala/docspell/totp/Key.scala b/modules/totp/src/main/scala/docspell/totp/Key.scala
index aeb9b583..0ac5beef 100644
--- a/modules/totp/src/main/scala/docspell/totp/Key.scala
+++ b/modules/totp/src/main/scala/docspell/totp/Key.scala
@@ -43,7 +43,7 @@ object Key {
     if (dataStr.isEmpty) Left(s"No separator found in key string: $str")
     else
       for {
-        mac  <- Mac.fromString(macStr)
+        mac <- Mac.fromString(macStr)
         data <- ByteVector.fromBase32Descriptive(dataStr.dropWhile(_ == ':'))
       } yield Key(data, mac)
   }
diff --git a/modules/totp/src/main/scala/docspell/totp/Mac.scala b/modules/totp/src/main/scala/docspell/totp/Mac.scala
index 84c6951e..4995f496 100644
--- a/modules/totp/src/main/scala/docspell/totp/Mac.scala
+++ b/modules/totp/src/main/scala/docspell/totp/Mac.scala
@@ -17,15 +17,15 @@ sealed trait Mac {
 }
 object Mac {
   case object Sha1 extends Mac {
-    val identifier    = TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA1
+    val identifier = TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA1
     val keyLengthBits = 160
   }
   case object Sha256 extends Mac {
-    val identifier    = TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA256
+    val identifier = TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA256
     val keyLengthBits = 256
   }
   case object Sha512 extends Mac {
-    val identifier    = TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA512
+    val identifier = TimeBasedOneTimePasswordGenerator.TOTP_ALGORITHM_HMAC_SHA512
     val keyLengthBits = 512
   }
 
diff --git a/modules/totp/src/main/scala/docspell/totp/Totp.scala b/modules/totp/src/main/scala/docspell/totp/Totp.scala
index 0a5288ec..7fe4c8c9 100644
--- a/modules/totp/src/main/scala/docspell/totp/Totp.scala
+++ b/modules/totp/src/main/scala/docspell/totp/Totp.scala
@@ -37,7 +37,7 @@ object Totp {
   def apply(setts: Settings): Totp =
     new Totp {
 
-      val settings          = setts
+      val settings = setts
       private val generator = makeGenerator(setts)
 
       def generate(key: Key, time: Instant): OnetimePassword =
diff --git a/modules/totp/src/test/scala/docspell/totp/KeyTest.scala b/modules/totp/src/test/scala/docspell/totp/KeyTest.scala
index 6aca0482..9f895508 100644
--- a/modules/totp/src/test/scala/docspell/totp/KeyTest.scala
+++ b/modules/totp/src/test/scala/docspell/totp/KeyTest.scala
@@ -18,7 +18,7 @@ class KeyTest extends FunSuite {
 
   test("generate and read in key") {
     val jkey = Key.generateJavaKey(Mac.Sha1)
-    val key  = Key.fromSecretKey(jkey).fold(sys.error, identity)
+    val key = Key.fromSecretKey(jkey).fold(sys.error, identity)
     assertEquals(jkey, key.toJavaKey)
   }
 
@@ -30,9 +30,9 @@ class KeyTest extends FunSuite {
   }
 
   test("encode/decode json") {
-    val key     = Key.generate[IO](Mac.Sha1).unsafeRunSync()
+    val key = Key.generate[IO](Mac.Sha1).unsafeRunSync()
     val keyJson = key.asJson
-    val newKey  = keyJson.as[Key].fold(throw _, identity)
+    val newKey = keyJson.as[Key].fold(throw _, identity)
     assertEquals(key, newKey)
   }
 }
diff --git a/modules/totp/src/test/scala/docspell/totp/TotpTest.scala b/modules/totp/src/test/scala/docspell/totp/TotpTest.scala
index f6528a69..0d77ee89 100644
--- a/modules/totp/src/test/scala/docspell/totp/TotpTest.scala
+++ b/modules/totp/src/test/scala/docspell/totp/TotpTest.scala
@@ -20,7 +20,7 @@ import scodec.bits.ByteVector
 class TotpTest extends FunSuite {
 
   val totp = Totp.default
-  val key  = Key(ByteVector.fromValidBase64("GGFWIWYnHB8F5Dp87iS2HP86k4A="), Mac.Sha1)
+  val key = Key(ByteVector.fromValidBase64("GGFWIWYnHB8F5Dp87iS2HP86k4A="), Mac.Sha1)
   val time = Instant.parse("2021-08-29T18:42:00Z")
 
   test("generate password") {
@@ -34,12 +34,12 @@ class TotpTest extends FunSuite {
   }
 
   for {
-    mac  <- Mac.all.toList
+    mac <- Mac.all.toList
     plen <- PassLength.all.toList
   } test(s"generate ${mac.identifier} with ${plen.toInt} characters") {
-    val key  = Key.generate[IO](mac).unsafeRunSync()
+    val key = Key.generate[IO](mac).unsafeRunSync()
     val totp = Totp(Settings(mac, plen, 30.seconds))
-    val otp  = totp.generate(key, time)
+    val otp = totp.generate(key, time)
     assertEquals(otp.pass.length, plen.toInt)
   }
 
diff --git a/project/Cmd.scala b/project/Cmd.scala
index 9fc27547..9d0c8533 100644
--- a/project/Cmd.scala
+++ b/project/Cmd.scala
@@ -23,7 +23,7 @@ object Cmd {
 
   def exec(cmd: Seq[String], wd: Option[File]): Result = {
     val capt = new Capture
-    val rc   = Process(cmd, wd).!(capt.logger)
+    val rc = Process(cmd, wd).!(capt.logger)
     Result(rc, capt.out.get.mkString("\n"), capt.err.get.mkString("\n"))
   }
 
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
index 1c3598ec..3494f845 100644
--- a/project/Dependencies.scala
+++ b/project/Dependencies.scala
@@ -5,49 +5,49 @@ import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._
 
 object Dependencies {
 
-  val BcryptVersion           = "0.4"
+  val BcryptVersion = "0.4"
   val BetterMonadicForVersion = "0.3.1"
-  val BinnyVersion            = "0.1.0"
-  val CalevVersion            = "0.6.0"
-  val CatsParseVersion        = "0.3.4"
-  val CirceVersion            = "0.14.1"
-  val ClipboardJsVersion      = "2.0.6"
-  val DoobieVersion           = "1.0.0-RC1"
-  val EmilVersion             = "0.10.0-M3"
-  val FlexmarkVersion         = "0.62.2"
-  val FlywayVersion           = "7.15.0"
-  val Fs2Version              = "3.1.2"
-  val Fs2CronVersion          = "0.7.1"
-  val H2Version               = "1.4.200"
-  val Http4sVersion           = "0.23.4"
-  val Icu4jVersion            = "69.1"
-  val javaOtpVersion          = "0.3.0"
-  val JsoupVersion            = "1.14.2"
-  val JwtScalaVersion         = "9.0.1"
-  val KindProjectorVersion    = "0.10.3"
-  val KittensVersion          = "2.3.2"
-  val LevigoJbig2Version      = "2.0"
-  val Log4sVersion            = "1.10.0"
-  val LogbackVersion          = "1.2.6"
-  val MariaDbVersion          = "2.7.4"
-  val MUnitVersion            = "0.7.29"
-  val MUnitCatsEffectVersion  = "1.0.5"
-  val OrganizeImportsVersion  = "0.5.0"
-  val PdfboxVersion           = "2.0.24"
-  val PoiVersion              = "4.1.2"
-  val PostgresVersion         = "42.2.23"
-  val PureConfigVersion       = "0.16.0"
-  val ScalaJavaTimeVersion    = "2.3.0"
-  val ScodecBitsVersion       = "1.1.28"
-  val Slf4jVersion            = "1.7.32"
-  val StanfordNlpVersion      = "4.2.2"
-  val TikaVersion             = "2.1.0"
-  val YamuscaVersion          = "0.8.1"
-  val SwaggerUIVersion        = "3.52.1"
-  val TestContainerVersion    = "0.39.8"
-  val TwelveMonkeysVersion    = "3.7.0"
-  val JQueryVersion           = "3.5.1"
-  val ViewerJSVersion         = "0.5.9"
+  val BinnyVersion = "0.1.0"
+  val CalevVersion = "0.6.0"
+  val CatsParseVersion = "0.3.4"
+  val CirceVersion = "0.14.1"
+  val ClipboardJsVersion = "2.0.6"
+  val DoobieVersion = "1.0.0-RC1"
+  val EmilVersion = "0.10.0-M3"
+  val FlexmarkVersion = "0.62.2"
+  val FlywayVersion = "7.15.0"
+  val Fs2Version = "3.1.2"
+  val Fs2CronVersion = "0.7.1"
+  val H2Version = "1.4.200"
+  val Http4sVersion = "0.23.4"
+  val Icu4jVersion = "69.1"
+  val javaOtpVersion = "0.3.0"
+  val JsoupVersion = "1.14.2"
+  val JwtScalaVersion = "9.0.1"
+  val KindProjectorVersion = "0.10.3"
+  val KittensVersion = "2.3.2"
+  val LevigoJbig2Version = "2.0"
+  val Log4sVersion = "1.10.0"
+  val LogbackVersion = "1.2.6"
+  val MariaDbVersion = "2.7.4"
+  val MUnitVersion = "0.7.29"
+  val MUnitCatsEffectVersion = "1.0.5"
+  val OrganizeImportsVersion = "0.5.0"
+  val PdfboxVersion = "2.0.24"
+  val PoiVersion = "4.1.2"
+  val PostgresVersion = "42.2.23"
+  val PureConfigVersion = "0.16.0"
+  val ScalaJavaTimeVersion = "2.3.0"
+  val ScodecBitsVersion = "1.1.28"
+  val Slf4jVersion = "1.7.32"
+  val StanfordNlpVersion = "4.2.2"
+  val TikaVersion = "2.1.0"
+  val YamuscaVersion = "0.8.1"
+  val SwaggerUIVersion = "3.52.1"
+  val TestContainerVersion = "0.39.8"
+  val TwelveMonkeysVersion = "3.7.0"
+  val JQueryVersion = "3.5.1"
+  val ViewerJSVersion = "0.5.9"
 
   val jwtScala = Seq(
     "com.github.jwt-scala" %% "jwt-circe" % JwtScalaVersion
@@ -62,8 +62,8 @@ object Dependencies {
   )
 
   val testContainer = Seq(
-    "com.dimafeng" %% "testcontainers-scala-munit"      % TestContainerVersion,
-    "com.dimafeng" %% "testcontainers-scala-mariadb"    % TestContainerVersion,
+    "com.dimafeng" %% "testcontainers-scala-munit" % TestContainerVersion,
+    "com.dimafeng" %% "testcontainers-scala-mariadb" % TestContainerVersion,
     "com.dimafeng" %% "testcontainers-scala-postgresql" % TestContainerVersion
   )
 
@@ -103,8 +103,8 @@ object Dependencies {
   )
 
   val poi = Seq(
-    "org.apache.poi" % "poi"            % PoiVersion,
-    "org.apache.poi" % "poi-ooxml"      % PoiVersion,
+    "org.apache.poi" % "poi" % PoiVersion,
+    "org.apache.poi" % "poi-ooxml" % PoiVersion,
     "org.apache.poi" % "poi-scratchpad" % PoiVersion
   ).map(
     _.excludeAll(
@@ -115,8 +115,8 @@ object Dependencies {
   // https://github.com/vsch/flexmark-java
   // BSD 2-Clause
   val flexmark = Seq(
-    "com.vladsch.flexmark" % "flexmark"                       % FlexmarkVersion,
-    "com.vladsch.flexmark" % "flexmark-ext-tables"            % FlexmarkVersion,
+    "com.vladsch.flexmark" % "flexmark" % FlexmarkVersion,
+    "com.vladsch.flexmark" % "flexmark-ext-tables" % FlexmarkVersion,
     "com.vladsch.flexmark" % "flexmark-ext-gfm-strikethrough" % FlexmarkVersion
   ).map(
     _.excludeAll(
@@ -145,7 +145,7 @@ object Dependencies {
     "com.github.eikek" %% "emil-common" % EmilVersion
   )
   val emil = Seq(
-    "com.github.eikek" %% "emil-common"   % EmilVersion,
+    "com.github.eikek" %% "emil-common" % EmilVersion,
     "com.github.eikek" %% "emil-javamail" % EmilVersion
   )
   val emilDoobie = Seq(
@@ -214,7 +214,7 @@ object Dependencies {
 
   val fs2 = Seq(
     "co.fs2" %% "fs2-core" % Fs2Version,
-    "co.fs2" %% "fs2-io"   % Fs2Version
+    "co.fs2" %% "fs2-io" % Fs2Version
   )
 
   val http4sClient = Seq(
@@ -235,7 +235,7 @@ object Dependencies {
 
   val circe = Seq(
     "io.circe" %% "circe-generic" % CirceVersion,
-    "io.circe" %% "circe-parser"  % CirceVersion
+    "io.circe" %% "circe-parser" % CirceVersion
   )
 
   // https://github.com/Log4s/log4s;ASL 2.0
@@ -269,13 +269,13 @@ object Dependencies {
   // https://github.com/tpolecat/doobie
   // MIT
   val doobie = Seq(
-    "org.tpolecat" %% "doobie-core"   % DoobieVersion,
+    "org.tpolecat" %% "doobie-core" % DoobieVersion,
     "org.tpolecat" %% "doobie-hikari" % DoobieVersion
   )
 
   val binny = Seq(
-    "com.github.eikek" %% "binny-core"        % BinnyVersion,
-    "com.github.eikek" %% "binny-jdbc"        % BinnyVersion,
+    "com.github.eikek" %% "binny-core" % BinnyVersion,
+    "com.github.eikek" %% "binny-jdbc" % BinnyVersion,
     "com.github.eikek" %% "binny-tika-detect" % BinnyVersion
   )
 
@@ -290,8 +290,8 @@ object Dependencies {
   )
 
   val munit = Seq(
-    "org.scalameta" %% "munit"               % MUnitVersion,
-    "org.scalameta" %% "munit-scalacheck"    % MUnitVersion,
+    "org.scalameta" %% "munit" % MUnitVersion,
+    "org.scalameta" %% "munit-scalacheck" % MUnitVersion,
     "org.typelevel" %% "munit-cats-effect-3" % MUnitCatsEffectVersion
   )
 
@@ -299,8 +299,8 @@ object Dependencies {
   val betterMonadicFor = "com.olegpy" %% "better-monadic-for" % BetterMonadicForVersion
 
   val webjars = Seq(
-    "org.webjars" % "swagger-ui"   % SwaggerUIVersion,
-    "org.webjars" % "viewerjs"     % ViewerJSVersion,
+    "org.webjars" % "swagger-ui" % SwaggerUIVersion,
+    "org.webjars" % "viewerjs" % ViewerJSVersion,
     "org.webjars" % "clipboard.js" % ClipboardJsVersion
   )
 
diff --git a/project/NerModelsPlugin.scala b/project/NerModelsPlugin.scala
index 50be5c79..a2d60869 100644
--- a/project/NerModelsPlugin.scala
+++ b/project/NerModelsPlugin.scala
@@ -19,7 +19,7 @@ object NerModelsPlugin extends AutoPlugin {
   object autoImport {
     val NerModels = config("NerModels")
 
-    val nerModelsFilter    = settingKey[String => Boolean]("Which files to keep.")
+    val nerModelsFilter = settingKey[String => Boolean]("Which files to keep.")
     val nerModelsRunFilter = taskKey[Seq[File]]("Extract files from libraryDependencies")
 
   }
diff --git a/project/StylesPlugin.scala b/project/StylesPlugin.scala
index 83b551f5..5bb1b507 100644
--- a/project/StylesPlugin.scala
+++ b/project/StylesPlugin.scala
@@ -17,12 +17,12 @@ object StylesPlugin extends AutoPlugin {
     sealed trait StylesMode
     object StylesMode {
       case object Prod extends StylesMode
-      case object Dev  extends StylesMode
+      case object Dev extends StylesMode
     }
 
-    val stylesDirectory  = settingKey[File]("The directory containing source styles")
-    val stylesOutputDir  = settingKey[File]("The directory to put the final outcome")
-    val stylesMode       = settingKey[StylesMode]("The compile mode, dev or production")
+    val stylesDirectory = settingKey[File]("The directory containing source styles")
+    val stylesOutputDir = settingKey[File]("The directory to put the final outcome")
+    val stylesMode = settingKey[StylesMode]("The compile mode, dev or production")
     val stylesNpxCommand = settingKey[String]("The npx executable")
     val stylesNpmCommand =
       settingKey[String]("The npm executable for installing dependencies")
@@ -42,15 +42,15 @@ object StylesPlugin extends AutoPlugin {
         "META-INF" / "resources" / "webjars" / name.value / version.value,
       stylesNpxCommand := "npx",
       stylesNpmCommand := "npm",
-      stylesMode       := StylesMode.Dev,
+      stylesMode := StylesMode.Dev,
       stylesBuild := {
         val logger = streams.value.log
-        val npx    = stylesNpxCommand.value
-        val npm    = stylesNpmCommand.value
-        val inDir  = stylesDirectory.value
+        val npx = stylesNpxCommand.value
+        val npm = stylesNpmCommand.value
+        val inDir = stylesDirectory.value
         val outDir = stylesOutputDir.value
-        val wd     = (Compile / baseDirectory).value
-        val mode   = stylesMode.value
+        val wd = (Compile / baseDirectory).value
+        val mode = stylesMode.value
         npmInstall(npm, wd, logger)
         val files = postCss(npx, inDir, outDir, wd, mode, logger) ++
           copyWebfonts(wd, outDir, logger) ++
@@ -60,8 +60,8 @@ object StylesPlugin extends AutoPlugin {
       },
       stylesInstall := {
         val logger = streams.value.log
-        val npm    = stylesNpmCommand.value
-        val wd     = (LocalRootProject / baseDirectory).value
+        val npm = stylesNpmCommand.value
+        val wd = (LocalRootProject / baseDirectory).value
         npmInstall(npm, wd, logger)
 
       }
diff --git a/project/ZolaPlugin.scala b/project/ZolaPlugin.scala
index 9051f94b..b6e8811d 100644
--- a/project/ZolaPlugin.scala
+++ b/project/ZolaPlugin.scala
@@ -7,9 +7,9 @@ import scala.sys.process._
 object ZolaPlugin extends AutoPlugin {
 
   object autoImport {
-    val zolaRootDir   = settingKey[File]("The root directory of zola")
+    val zolaRootDir = settingKey[File]("The root directory of zola")
     val zolaOutputDir = settingKey[File]("The directory to put the final site")
-    val zolaCommand   = settingKey[String]("The zola executable")
+    val zolaCommand = settingKey[String]("The zola executable")
     val zolaTestBaseUrl =
       settingKey[String]("The base-url to use when building the test site.")
 
@@ -28,9 +28,9 @@ object ZolaPlugin extends AutoPlugin {
 
   def zolaSettings: Seq[Setting[_]] =
     Seq(
-      zolaRootDir     := baseDirectory.value / "site",
-      zolaOutputDir   := target.value / "zola-site",
-      zolaCommand     := "zola",
+      zolaRootDir := baseDirectory.value / "site",
+      zolaOutputDir := target.value / "zola-site",
+      zolaCommand := "zola",
       zolaTestBaseUrl := "http://localhost:1234",
       zolaBuild := {
         val logger = streams.value.log
@@ -40,7 +40,7 @@ object ZolaPlugin extends AutoPlugin {
         logger.info("Website built")
       },
       zolaBuildTest := {
-        val logger  = streams.value.log
+        val logger = streams.value.log
         val baseurl = zolaTestBaseUrl.value
         logger.info("Building web site (test) using zola ...")
         (Compile / resources).value
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 97612248..f673ecb9 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,14 +1,14 @@
-addSbtPlugin("ch.epfl.scala"      % "sbt-scalafix"             % "0.9.31")
-addSbtPlugin("com.eed3si9n"       % "sbt-buildinfo"            % "0.10.0")
-addSbtPlugin("com.github.eikek"   % "sbt-openapi-schema"       % "0.8.2")
-addSbtPlugin("com.github.sbt"     % "sbt-pgp"                  % "2.1.2")
-addSbtPlugin("com.github.sbt"     % "sbt-release"              % "1.1.0")
-addSbtPlugin("com.typesafe.sbt"   % "sbt-git"                  % "1.0.1")
-addSbtPlugin("com.typesafe.sbt"   % "sbt-native-packager"      % "1.8.1")
-addSbtPlugin("de.heikoseeberger"  % "sbt-header"               % "5.6.0")
-addSbtPlugin("io.kevinlee"        % "sbt-github-pages"         % "0.7.0")
-addSbtPlugin("io.spray"           % "sbt-revolver"             % "0.9.1")
+addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.31")
+addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0")
+addSbtPlugin("com.github.eikek" % "sbt-openapi-schema" % "0.8.2")
+addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
+addSbtPlugin("com.github.sbt" % "sbt-release" % "1.1.0")
+addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.1")
+addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.8.1")
+addSbtPlugin("de.heikoseeberger" % "sbt-header" % "5.6.0")
+addSbtPlugin("io.kevinlee" % "sbt-github-pages" % "0.7.0")
+addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")
 addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.1.0")
-addSbtPlugin("org.scala-js"       % "sbt-scalajs"              % "1.7.0")
-addSbtPlugin("org.scalameta"      % "sbt-scalafmt"             % "2.4.3")
-addSbtPlugin("org.xerial.sbt"     % "sbt-sonatype"             % "3.9.10")
+addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.7.0")
+addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
+addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.10")