diff --git a/docs/website/overrides/main.html b/docs/website/overrides/main.html
new file mode 100644
index 0000000..bc1e8e6
--- /dev/null
+++ b/docs/website/overrides/main.html
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+
+{% block htmltitle %}
+ {% if page.toc | first is defined %}
+
{{ page.toc.items[0].title }} - {{ config.site_name }}
+ {% else %}
+ {{ super() }}
+ {% endif %}
+{% endblock %}
--
2.51.2
From ad6351a11e32669a0c0fb3d986e2247a8c00f903 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 11 Feb 2026 09:20:23 +0100
Subject: [PATCH 02/71] upgrade: OpenSavvy Containers 0.8.5
---
.gitlab-ci.main.kts | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/.gitlab-ci.main.kts b/.gitlab-ci.main.kts
index fc2cf2c..1800401 100755
--- a/.gitlab-ci.main.kts
+++ b/.gitlab-ci.main.kts
@@ -7,8 +7,10 @@ import opensavvy.gitlab.ci.*
import opensavvy.gitlab.ci.Environment.EnvironmentTier.Development
import opensavvy.gitlab.ci.script.shell
-// https://gitlab.com/opensavvy/automation/containers/-/releases
-val ciContainers = "0.8.4"
+/**
+ * [OpenSavvy's CI container images](https://gitlab.com/opensavvy/automation/containers/-/releases)
+ */
+val ciContainers = "0.8.5"
/**
* The URL of the website built by /docs/website.
--
2.51.2
From 566fbf66182b25a2b62d4a18f8699a65af0b1526 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 19:36:35 +0100
Subject: [PATCH 03/71] build(idea): Add run configuration to run only JVM
tests
---
.idea/runConfigurations/Check__JVM_only_.xml | 28 ++++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 .idea/runConfigurations/Check__JVM_only_.xml
diff --git a/.idea/runConfigurations/Check__JVM_only_.xml b/.idea/runConfigurations/Check__JVM_only_.xml
new file mode 100644
index 0000000..026288f
--- /dev/null
+++ b/.idea/runConfigurations/Check__JVM_only_.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ false
+ false
+ true
+ false
+ false
+
+
+
\ No newline at end of file
--
2.51.2
From a1f3dae33619468c70468b6d743fb554f28e2a4a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:12:26 +0100
Subject: [PATCH 04/71] upgrade: Kotlin 2.3.0
---
gradle.properties | 3 ++-
gradle/common.versions.toml | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/gradle.properties b/gradle.properties
index 9f2627a..55c1ee1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -24,7 +24,8 @@ buildCacheUrl=https://gradle.canet.dev
# Configuration on demand allows Gradle to only configure projects which take part in the build.
# See https://docs.gradle.org/current/userguide/multi_project_configuration_and_execution.html#sec:configuration_on_demand
-org.gradle.configureondemand=true
+# TODO Disabled until https://youtrack.jetbrains.com/issue/KT-52074
+org.gradle.configureondemand=false
# Enables cross-compilation for Kotlin Multiplatform.
# This device will attempt to compile all configured Kotlin Native platforms,
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 8a4885e..f9c7937 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -5,7 +5,7 @@
[versions]
# https://kotlinlang.org/docs/releases.html#release-details
-kotlin = "2.2.21"
+kotlin = "2.3.0"
# https://github.com/google/ksp/releases
ksp = "2.3.2"
--
2.51.2
From 98ed08921933500fd4c5360070242300686ecd68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:12:35 +0100
Subject: [PATCH 05/71] upgrade: KSP 2.3.4
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index f9c7937..8dafc9a 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -8,7 +8,7 @@
kotlin = "2.3.0"
# https://github.com/google/ksp/releases
-ksp = "2.3.2"
+ksp = "2.3.4"
# https://github.com/JetBrains/compose-multiplatform/releases
compose = "1.8.2"
--
2.51.2
From a38c15ec8b72b7b8bd5280ee68fc1fc9c752b463 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:12:43 +0100
Subject: [PATCH 06/71] upgrade: Compose 1.10.0
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 8dafc9a..e927654 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -11,7 +11,7 @@ kotlin = "2.3.0"
ksp = "2.3.4"
# https://github.com/JetBrains/compose-multiplatform/releases
-compose = "1.8.2"
+compose = "1.10.0"
# https://github.com/kotest/kotest/releases
kotest = "6.0.4"
--
2.51.2
From 057a36800cc3a27e149b859f35479b47a8d21417 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:12:54 +0100
Subject: [PATCH 07/71] upgrade: TestBalloon 0.8.0
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index e927654..c14ba19 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -17,7 +17,7 @@ compose = "1.10.0"
kotest = "6.0.4"
# https://github.com/infix-de/testBalloon/releases
-testBalloon = "0.7.1-K2.2.21"
+testBalloon = "0.8.0-K2.3.0"
# https://gitlab.com/opensavvy/groundwork/pedestal/-/releases
pedestal = "3.1.1"
--
2.51.2
From 820649dd45f28c3c8ab54238dc306b55666c8306 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:13:02 +0100
Subject: [PATCH 08/71] upgrade: Pedestal 3.2.0
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index c14ba19..e5f9057 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -20,7 +20,7 @@ kotest = "6.0.4"
testBalloon = "0.8.0-K2.3.0"
# https://gitlab.com/opensavvy/groundwork/pedestal/-/releases
-pedestal = "3.1.1"
+pedestal = "3.2.0"
# https://prepared.opensavvy.dev/news
prepared = "2.2.0"
--
2.51.2
From 6369bea9b2874c0f784edb03fe2af89d0050ba30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:13:10 +0100
Subject: [PATCH 09/71] upgrade: Prepared 2.3.0
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index e5f9057..1631355 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -23,7 +23,7 @@ testBalloon = "0.8.0-K2.3.0"
pedestal = "3.2.0"
# https://prepared.opensavvy.dev/news
-prepared = "2.2.0"
+prepared = "2.3.0"
# https://spine.opensavvy.dev/news
spine = "0.9.0"
--
2.51.2
From a3a27cc244e44752dc215af217ae3a63b1b269b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 21 Jan 2026 20:13:21 +0100
Subject: [PATCH 10/71] upgrade: NodeJS 24.13.0
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 1631355..8a74a7a 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -35,7 +35,7 @@ ktmongo = "0.25.1"
jetbrains-annotations = "26.0.2-1"
# https://nodejs.org/en/download
-nodejs = "24.12.0"
+nodejs = "24.13.0"
[plugins]
kotlin = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
--
2.51.2
From 903f3adf73ed7687716ec2b71adaec568b3a8189 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Tue, 27 Jan 2026 16:25:50 +0100
Subject: [PATCH 11/71] upgrade: Kotest 6.1.1
---
gradle/common.versions.toml | 3 ++-
gradle/templates/template-app/build.gradle.kts | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 8a74a7a..09803cb 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -14,7 +14,7 @@ ksp = "2.3.4"
compose = "1.10.0"
# https://github.com/kotest/kotest/releases
-kotest = "6.0.4"
+kotest = "6.1.1"
# https://github.com/infix-de/testBalloon/releases
testBalloon = "0.8.0-K2.3.0"
@@ -57,6 +57,7 @@ testBalloon = { id = "de.infix.testBalloon", version.ref = "testBalloon" }
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
kotlin-test-junit5 = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin" }
+kotest-framework = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" }
kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
kotest-assertions-collections = { module = "io.kotest:kotest-assertions-collections", version.ref = "kotest" }
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" }
diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts
index a8ceed2..3c4b0e8 100644
--- a/gradle/templates/template-app/build.gradle.kts
+++ b/gradle/templates/template-app/build.gradle.kts
@@ -48,5 +48,6 @@ kotlin {
sourceSets.commonTest.dependencies {
implementation(libsCommon.opensavvy.prepared.kotest)
+ implementation(libsCommon.kotest.framework)
}
}
--
2.51.2
From de22f3cfd2b05f60f0d1b95fa4d6bd9516550b70 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Tue, 27 Jan 2026 16:26:10 +0100
Subject: [PATCH 12/71] upgrade: TestBalloon 0.8.2
---
gradle/common.versions.toml | 4 +++-
gradle/templates/template-lib/build.gradle.kts | 1 +
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 09803cb..7ae16a2 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -17,7 +17,7 @@ compose = "1.10.0"
kotest = "6.1.1"
# https://github.com/infix-de/testBalloon/releases
-testBalloon = "0.8.0-K2.3.0"
+testBalloon = "0.8.2-K2.3.0"
# https://gitlab.com/opensavvy/groundwork/pedestal/-/releases
pedestal = "3.2.0"
@@ -62,6 +62,8 @@ kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref =
kotest-assertions-collections = { module = "io.kotest:kotest-assertions-collections", version.ref = "kotest" }
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" }
+testBalloon = { module = "de.infix.testBalloon:testBalloon-framework-core", version.ref = "testBalloon" }
+
jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" }
opensavvy-pedestal-progress = { module = "dev.opensavvy.pedestal:progress", version.ref = "pedestal" }
diff --git a/gradle/templates/template-lib/build.gradle.kts b/gradle/templates/template-lib/build.gradle.kts
index 0e03cb8..cff2ec6 100644
--- a/gradle/templates/template-lib/build.gradle.kts
+++ b/gradle/templates/template-lib/build.gradle.kts
@@ -43,6 +43,7 @@ kotlin {
sourceSets.commonTest.dependencies {
implementation(libsCommon.opensavvy.prepared.testBalloon)
+ implementation(libsCommon.testBalloon)
implementation(libsCommon.kotlin.test)
}
}
--
2.51.2
From 78612f8bc871da6418fbd75ac879392959497ccd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Tue, 27 Jan 2026 22:59:36 +0100
Subject: [PATCH 13/71] build(gradle): Use bundles to facilitate using
TestBalloon and Kotest
---
gradle/common.versions.toml | 15 +++++++++++++++
gradle/templates/template-app/build.gradle.kts | 3 +--
gradle/templates/template-lib/build.gradle.kts | 4 +---
3 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 7ae16a2..e79d1fb 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -106,3 +106,18 @@ opensavvy-ktmongo-driver-coroutines = { module = "dev.opensavvy.ktmongo:driver-c
opensavvy-ktmongo-driver-coroutines-kmongo = { module = "dev.opensavvy.ktmongo:driver-coroutines-kmongo", version.ref = "ktmongo" }
[bundles]
+# A bundle of dependencies to use Prepared with the TestBalloon runner.
+# Requires applying the plugin 'libsCommon.plugins.testBalloon'.
+testBalloon = [
+ "opensavvy-prepared-testBalloon",
+ "testBalloon", # Force the version of the TestBalloon accompanying library to match the plugin's
+ "kotlin-test", # Force the Kotlin stdlib to match the KGP version, important on JS
+]
+
+# A bundle of dependencies to use Prepared with the Kotest runner.
+# Requires applying the plugins 'libsCommon.plugins.kotest' and 'libsCommon.plugins.ksp'.
+kotest = [
+ "opensavvy-prepared-kotest",
+ "kotest-framework",
+ "kotest-assertions",
+]
diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts
index 3c4b0e8..c5517bf 100644
--- a/gradle/templates/template-app/build.gradle.kts
+++ b/gradle/templates/template-app/build.gradle.kts
@@ -47,7 +47,6 @@ kotlin {
}
sourceSets.commonTest.dependencies {
- implementation(libsCommon.opensavvy.prepared.kotest)
- implementation(libsCommon.kotest.framework)
+ implementation(libsCommon.bundles.kotest)
}
}
diff --git a/gradle/templates/template-lib/build.gradle.kts b/gradle/templates/template-lib/build.gradle.kts
index cff2ec6..5040e16 100644
--- a/gradle/templates/template-lib/build.gradle.kts
+++ b/gradle/templates/template-lib/build.gradle.kts
@@ -42,9 +42,7 @@ kotlin {
}
sourceSets.commonTest.dependencies {
- implementation(libsCommon.opensavvy.prepared.testBalloon)
- implementation(libsCommon.testBalloon)
- implementation(libsCommon.kotlin.test)
+ implementation(libsCommon.bundles.testBalloon)
}
}
--
2.51.2
From 9001322d0512d6c0d904cc0e69231fc646fdedb1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 11 Feb 2026 09:15:31 +0100
Subject: [PATCH 14/71] upgrade: Gradle Conventions 2.3.1
---
gradle/conventions/settings.gradle.kts | 2 +-
settings.gradle.kts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/gradle/conventions/settings.gradle.kts b/gradle/conventions/settings.gradle.kts
index f74bd11..90bd5ec 100644
--- a/gradle/conventions/settings.gradle.kts
+++ b/gradle/conventions/settings.gradle.kts
@@ -48,7 +48,7 @@ pluginManagement {
}
plugins {
- id("dev.opensavvy.conventions.settings") version "2.2.0"
+ id("dev.opensavvy.conventions.settings") version "2.3.1"
}
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 09ecbe9..a442d7b 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -55,7 +55,7 @@ pluginManagement {
}
plugins {
- id("dev.opensavvy.conventions.settings") version "2.2.0"
+ id("dev.opensavvy.conventions.settings") version "2.3.1"
}
include(
--
2.51.2
From acb94f972fa408fc9103ee7543f419e7faf8849b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 11 Feb 2026 09:17:14 +0100
Subject: [PATCH 15/71] upgrade(gradle): Automatically run the build with a
Java 25 JDK
---
gradle/gradle-daemon-jvm.properties | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties
index c5df377..c0f7bef 100644
--- a/gradle/gradle-daemon-jvm.properties
+++ b/gradle/gradle-daemon-jvm.properties
@@ -1,11 +1,12 @@
#This file is generated by updateDaemonJvm
-toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/6d0adbce30460017fe61d2993dfa663e/redirect
-toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/50f16d2dc2bb80a421afc1af38fc92e3/redirect
-toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/6d0adbce30460017fe61d2993dfa663e/redirect
-toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/50f16d2dc2bb80a421afc1af38fc92e3/redirect
-toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/4f4ebe4f162f6deb29540c4ebe629d79/redirect
-toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/79d5995ef1c3e4df39a3b2f545cada5e/redirect
-toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/6d0adbce30460017fe61d2993dfa663e/redirect
-toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/50f16d2dc2bb80a421afc1af38fc92e3/redirect
-toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/61fdd87038cf8b094dadad8566609a29/redirect
-toolchainVersion=24
+toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
+toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd495626d2ee49a75447e3fdc6afb287/redirect
+toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
+toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd495626d2ee49a75447e3fdc6afb287/redirect
+toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/d4fd992c9557644e637ebe98263e0ae7/redirect
+toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/faa12903720d410b387cc69ccafb1a74/redirect
+toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1630f7ebef05444cb27a2709ea0249b3/redirect
+toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/cd495626d2ee49a75447e3fdc6afb287/redirect
+toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/8e1d9ee5d0f13e442218f6884a306da1/redirect
+toolchainVendor=ADOPTIUM
+toolchainVersion=25
--
2.51.2
From 90efe09c65cde94fad5450dad1e62b83ec60c655 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Wed, 11 Feb 2026 14:35:43 +0100
Subject: [PATCH 16/71] build(gradle): Increase the maximum heap & metaspace
sizes
---
gradle.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle.properties b/gradle.properties
index 55c1ee1..1757137 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -50,5 +50,5 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
kotlin.js.yarn=false
# System resource usage
-org.gradle.jvmargs=-Xmx3g -Xms200m -XX:MaxMetaspaceSize=512m -XX:+UseCompressedOops -XX:+UseG1GC -XX:NewRatio=3 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=60000 -XX:-G1PeriodicGCInvokesConcurrent
+org.gradle.jvmargs=-Xmx4g -Xms200m -XX:MaxMetaspaceSize=640m -XX:+UseCompressedOops -XX:+UseG1GC -XX:NewRatio=3 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=60000 -XX:-G1PeriodicGCInvokesConcurrent
kotlin.daemon.jvmargs=-Xmx3g -Xms128m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:NewRatio=2 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=40 -XX:G1PeriodicGCInterval=15000 -XX:-G1PeriodicGCInvokesConcurrent
--
2.51.2
From ddba7a26405bc20344b24d839396cb96d82d386d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Fri, 13 Feb 2026 18:38:57 +0100
Subject: [PATCH 17/71] upgrade: Kotest 6.1.3
---
gradle/common.versions.toml | 2 +-
gradle/templates/template-app/build.gradle.kts | 5 +++++
.../template-app/src/commonTest/kotlin/HelloWorldKotest.kt | 7 +++++++
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index e79d1fb..4a00b0e 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -14,7 +14,7 @@ ksp = "2.3.4"
compose = "1.10.0"
# https://github.com/kotest/kotest/releases
-kotest = "6.1.1"
+kotest = "6.1.3"
# https://github.com/infix-de/testBalloon/releases
testBalloon = "0.8.2-K2.3.0"
diff --git a/gradle/templates/template-app/build.gradle.kts b/gradle/templates/template-app/build.gradle.kts
index c5517bf..4d3eb76 100644
--- a/gradle/templates/template-app/build.gradle.kts
+++ b/gradle/templates/template-app/build.gradle.kts
@@ -50,3 +50,8 @@ kotlin {
implementation(libsCommon.bundles.kotest)
}
}
+
+tasks.withType {
+ // Kotest doesn't report test correctly as of now
+ failOnNoDiscoveredTests = false
+}
diff --git a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt
index b54c189..714df6c 100644
--- a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt
+++ b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt
@@ -1,5 +1,6 @@
package opensavvy.playground.core
+import io.kotest.core.spec.style.FunSpec
import opensavvy.prepared.runner.kotest.PreparedSpec
class HelloWorldKotestTest : PreparedSpec({
@@ -9,3 +10,9 @@ class HelloWorldKotestTest : PreparedSpec({
check("Hello World!" == message)
}
})
+
+class FooTest : FunSpec({
+ test("test") {
+ check(true)
+ }
+})
--
2.51.2
From e251e62883d4f504af091035e61d4769bd3d43e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Fri, 13 Feb 2026 18:42:19 +0100
Subject: [PATCH 18/71] upgrade: Prepared 2.3.1
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 4a00b0e..f39a1f3 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -23,7 +23,7 @@ testBalloon = "0.8.2-K2.3.0"
pedestal = "3.2.0"
# https://prepared.opensavvy.dev/news
-prepared = "2.3.0"
+prepared = "2.3.1"
# https://spine.opensavvy.dev/news
spine = "0.9.0"
--
2.51.2
From 3dd824bb8e30c7ad70d409d9285f969a26ea76df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Fri, 13 Feb 2026 18:43:34 +0100
Subject: [PATCH 19/71] upgrade: Spine 0.9.1
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index f39a1f3..591d365 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -26,7 +26,7 @@ pedestal = "3.2.0"
prepared = "2.3.1"
# https://spine.opensavvy.dev/news
-spine = "0.9.0"
+spine = "0.9.1"
# https://ktmongo.opensavvy.dev/news
ktmongo = "0.25.1"
--
2.51.2
From 99efdbb6d8c2795189fd2e5d3642ada96896db03 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Fri, 13 Feb 2026 18:43:45 +0100
Subject: [PATCH 20/71] upgrade: KtMongo 0.26.1
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 591d365..e3e477d 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -29,7 +29,7 @@ prepared = "2.3.1"
spine = "0.9.1"
# https://ktmongo.opensavvy.dev/news
-ktmongo = "0.25.1"
+ktmongo = "0.26.1"
# https://github.com/JetBrains/java-annotations/releases
jetbrains-annotations = "26.0.2-1"
--
2.51.2
From 43ef50cb391f52e042f1d9c1354bc78f55f22fe5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Sun, 15 Feb 2026 12:17:08 +0100
Subject: [PATCH 21/71] ci(gitlab): Test that our tests can deal with Unicode
characters in test names
---
.../src/commonTest/kotlin/HelloWorldKotest.kt | 5 +++++
.../src/commonTest/kotlin/HelloWorldTest.kt | 11 -----------
.../kotlin/HelloWorldTestBalloonTest.kt | 18 ++++++++++++++++++
3 files changed, 23 insertions(+), 11 deletions(-)
delete mode 100644 gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt
create mode 100644 gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt
diff --git a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt
index 714df6c..eaf764c 100644
--- a/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt
+++ b/gradle/templates/template-app/src/commonTest/kotlin/HelloWorldKotest.kt
@@ -9,6 +9,11 @@ class HelloWorldKotestTest : PreparedSpec({
@Suppress("SimplifyBooleanWithConstants") // The compiler knows this test will always succeed
check("Hello World!" == message)
}
+
+ test("Yay • \u2606\u2606\u2606\u2606 Unicode!") {
+ // This test verifies that our CI is able to handle Unicode characters in test names.
+ // See https://gitlab.com/gitlab-org/gitlab/-/issues/580885
+ }
})
class FooTest : FunSpec({
diff --git a/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt b/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt
deleted file mode 100644
index 23918b6..0000000
--- a/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTest.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package opensavvy.playground.core
-
-import opensavvy.prepared.runner.testballoon.preparedSuite
-
-val HelloWorldTest by preparedSuite {
-
- test("Hello world!") {
- @Suppress("SimplifyBooleanWithConstants") // The compiler knows this test will always succeed
- check("Hello World!" == message)
- }
-}
diff --git a/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt b/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt
new file mode 100644
index 0000000..e6a9052
--- /dev/null
+++ b/gradle/templates/template-lib/src/commonTest/kotlin/HelloWorldTestBalloonTest.kt
@@ -0,0 +1,18 @@
+package opensavvy.playground.core
+
+import opensavvy.prepared.runner.testballoon.preparedSuite
+
+val HelloWorldTestBalloonTest by preparedSuite {
+
+ test("Hello world!") {
+ @Suppress("SimplifyBooleanWithConstants") // The compiler knows this test will always succeed
+ check("Hello World!" == message)
+ }
+
+ suite("Nested suite with Unicode \u2606") {
+ test("Yay • \u2606\u2606\u2606\u2606 Unicode!") {
+ // This test verifies that our CI is able to handle Unicode characters in test names.
+ // See https://gitlab.com/gitlab-org/gitlab/-/issues/580885
+ }
+ }
+}
--
2.51.2
From 79dbdf5ff83ec689a15eb8c7c71d401359846104 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Mon, 16 Feb 2026 15:27:20 +0100
Subject: [PATCH 22/71] ci(gitlab): Strip non-latin-1 characters from test
report names on non-JVM platforms
This is a workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/580885.
---
.gitlab-ci.main.kts | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/.gitlab-ci.main.kts b/.gitlab-ci.main.kts
index b4874bf..f68ca4d 100755
--- a/.gitlab-ci.main.kts
+++ b/.gitlab-ci.main.kts
@@ -24,6 +24,33 @@ val siteUrl = "\$CI_PAGES_URL"
fun Job.opensavvyImage(name: String) =
image("registry.gitlab.com/opensavvy/automation/containers/$name", ciContainers)
+// region GitLab
+
+/**
+ * Renames all JUnit XML test reports to remove non-latin-1 characters, because GitLab crashes in their presence.
+ *
+ * See [GITLAB-580885](https://gitlab.com/gitlab-org/gitlab/-/issues/580885).
+ */
+fun Job.stripUnicodeTestReports() {
+ afterScript {
+ // language="Shell Script"
+ shell($$"""
+ find . -path '*/build/test-results/*/TEST-*.xml' -print0 |
+ grep -zP '[^\x00-\x{00FF}]' |
+ while IFS= read -r -d '' f; do
+ d="$(dirname "$f")"
+ b="$(basename "$f")"
+ nb=$(printf '%s' "$b" | LC_ALL=C sed -E \
+ -e 's/[\xc4-\xdf][\x80-\xbf]/-/g' \
+ -e 's/[\xe0-\xef][\x80-\xbf]{2}/-/g' \
+ -e 's/[\xf0-\xf4][\x80-\xbf]{3}/-/g')
+ mv -- "$f" "$d/$nb"
+ done
+ """.trimIndent())
+ }
+}
+
+// endregion
// region Kotlin Multiplatform
fun Job.jvm() {
@@ -34,16 +61,22 @@ fun Job.jvm() {
fun Job.jsBrowser() {
useGradle()
opensavvyImage("chromium")
+
+ stripUnicodeTestReports()
}
fun Job.jsNode() {
useGradle()
opensavvyImage("nodejs")
+
+ stripUnicodeTestReports()
}
fun Job.nativeLinuxX64() {
useGradle()
opensavvyImage("java")
+
+ stripUnicodeTestReports()
}
fun Job.nativeIosArm64() {
--
2.51.2
From f4d0814c9b15e37fce8c2a265b7c0a54a6f37af4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 21:15:25 +0100
Subject: [PATCH 23/71] build: Add our Telegram SDK to the common dependencies
---
gradle/common.versions.toml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index e3e477d..086b155 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -31,6 +31,9 @@ spine = "0.9.1"
# https://ktmongo.opensavvy.dev/news
ktmongo = "0.26.1"
+# https://gitlab.com/opensavvy/telegram-bot/-/releases
+telegram-bot = "0.1.2"
+
# https://github.com/JetBrains/java-annotations/releases
jetbrains-annotations = "26.0.2-1"
@@ -105,6 +108,9 @@ opensavvy-ktmongo-driver-sync-java = { module = "dev.opensavvy.ktmongo:driver-sy
opensavvy-ktmongo-driver-coroutines = { module = "dev.opensavvy.ktmongo:driver-coroutines", version.ref = "ktmongo" }
opensavvy-ktmongo-driver-coroutines-kmongo = { module = "dev.opensavvy.ktmongo:driver-coroutines-kmongo", version.ref = "ktmongo" }
+opensavvy-telegramBot = { module = "dev.opensavvy.telegram:sdk", version.ref = "telegram-bot" }
+opensavvy-telegramBot-entities = { module = "dev.opensavvy.telegram:entities", version.ref = "telegram-bot" }
+
[bundles]
# A bundle of dependencies to use Prepared with the TestBalloon runner.
# Requires applying the plugin 'libsCommon.plugins.testBalloon'.
--
2.51.2
From 64acfa3ce656a20fb35777383048d58091e90063 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 21:16:24 +0100
Subject: [PATCH 24/71] upgrade: KtMongo 0.26.2
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 086b155..a5640c6 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -29,7 +29,7 @@ prepared = "2.3.1"
spine = "0.9.1"
# https://ktmongo.opensavvy.dev/news
-ktmongo = "0.26.1"
+ktmongo = "0.26.2"
# https://gitlab.com/opensavvy/telegram-bot/-/releases
telegram-bot = "0.1.2"
--
2.51.2
From fed8c3793bde22ce846e00f0babe7593c1ca23dc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 21:16:38 +0100
Subject: [PATCH 25/71] upgrade: Spine 0.9.2
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index a5640c6..c736117 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -26,7 +26,7 @@ pedestal = "3.2.0"
prepared = "2.3.1"
# https://spine.opensavvy.dev/news
-spine = "0.9.1"
+spine = "0.9.2"
# https://ktmongo.opensavvy.dev/news
ktmongo = "0.26.2"
--
2.51.2
From 16c2ec9bd5ff79b5e82051ba30a6a76892bb90fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 21:16:54 +0100
Subject: [PATCH 26/71] upgrade: Prepared 2.4.0
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index c736117..d5a873a 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -23,7 +23,7 @@ testBalloon = "0.8.2-K2.3.0"
pedestal = "3.2.0"
# https://prepared.opensavvy.dev/news
-prepared = "2.3.1"
+prepared = "2.4.0"
# https://spine.opensavvy.dev/news
spine = "0.9.2"
--
2.51.2
From fc6557db57dc302fc4e4efc2c60d733df0af30e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 21:17:24 +0100
Subject: [PATCH 27/71] upgrade: TestBalloon 0.8.3
---
gradle/common.versions.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index d5a873a..62f4d47 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -17,7 +17,7 @@ compose = "1.10.0"
kotest = "6.1.3"
# https://github.com/infix-de/testBalloon/releases
-testBalloon = "0.8.2-K2.3.0"
+testBalloon = "0.8.3-K2.3.0"
# https://gitlab.com/opensavvy/groundwork/pedestal/-/releases
pedestal = "3.2.0"
--
2.51.2
From 7ce5b2802863a8c7f98f268b89d8bbba90702c16 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 21:18:17 +0100
Subject: [PATCH 28/71] upgrade: Kotlin 2.3.10
---
gradle/common.versions.toml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml
index 62f4d47..12d3da7 100644
--- a/gradle/common.versions.toml
+++ b/gradle/common.versions.toml
@@ -5,7 +5,7 @@
[versions]
# https://kotlinlang.org/docs/releases.html#release-details
-kotlin = "2.3.0"
+kotlin = "2.3.10"
# https://github.com/google/ksp/releases
ksp = "2.3.4"
@@ -126,4 +126,5 @@ kotest = [
"opensavvy-prepared-kotest",
"kotest-framework",
"kotest-assertions",
+ "kotlin-test", # Force the Kotlin stdlib to match the KGP version, important on JS
]
--
2.51.2
From 2e34937560bc110ae1c9b65943a6e45003572820 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?=
Date: Thu, 26 Feb 2026 22:18:13 +0100
Subject: [PATCH 29/71] upgrade: Gradle 9.3.1
---
gradle/wrapper/gradle-wrapper.jar | Bin 45633 -> 46175 bytes
gradle/wrapper/gradle-wrapper.properties | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index f8e1ee3125fe0768e9a76ee977ac089eb657005e..61285a659d17295f1de7c53e24fdf13ad755c379 100644
GIT binary patch
delta 37058
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%0D^un_d*+Wz$GS4TE4|!V
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
delta 36446
zcmccrg6ZHBrVZKr^?po-0`r)dl;li4KH8`*I<5CaqHA(e$2<$iM|;cKgEDu|E}K3<
zqEg`gp~;=>@(0?D_}ms7pH#Vj{!eYqzP-!`7|JAV)?c6eWa549oetAKDNZ-O_ta?f
zPP0W9W_IUHQ~D^!+tr|Q&b8x-%u}T)W*;8<%xH+6xB5hv&87RsY|VA``|JJU=KuM2
z-YdC-qgZgRkjwHd&R=e6CQX0A{8q{C<=n56G>)p)XE7yTn3cA4dc|s9qZcW0M^ANM
zNzm!-bDz2O(9+~tC2vDBFN&ILcm90#j_rzsj9tglj@|;Tc~jP15c~hKl|Be|2B@iroc&FTYWR+wWct9oqSIF&7MCN
zt3tE`{xSu4vvd3oP|s9iWMC+mys=4k@*G3C$<-@F>r;bo`w0h%#I|qa$!+)McKy&~
z5trfZy);C3$`7Xi&n^jX1&Me*Dbzdh{{{IEp}ig#j{JC2{zG_QM>SiP
zcZKC|qw4ir&)-U~`}_ABvjb;0&wGBpdDHJ}+>W^`JZ+hd#;d+b!6CaZn)tkv+%`4;
z#;gTB4tA*S4+Jc~fv%)N<*{=hAy-nltqTt&Gq)7rZt&@B8~L
zK9hy=<~~o?6q%M6;bhUaG`K9@La#7zpN+A3@VV@y_{!Vt#{^d2)O8o_=Lt6Oxz!hU
zL3Z8DMGI!RC7#SP*|9W~Gjr`rer?4w23t;luRQo