OpenSavvy's Avatar

OpenSavvy

@opensavvy.dev

Open source projects with a deep focus on quality, automation and security. https://opensavvy.dev Maintained by @ivcanet.bsky.social and Maxime Girardet

12
Followers
10
Following
27
Posts
01.10.2025
Joined
Posts Following

Latest posts by OpenSavvy @opensavvy.dev

Preview
Date and time - OpenSavvy Prepared Magicless testing framework for Kotlin Multiplatform, featuring time management, parameterization and isolated fixtures.

Prepared 2.4.1 brings stable time control with Kotlin 2.3.0!

prepared.opensavvy.dev/features/tim...

07.03.2026 20:42 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Note that without KtMongo, the official libraries bson-kotlin and bson-kotlinx serialize Instant and Uuid differently!

06.03.2026 16:38 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
ObjectId - OpenSavvy KtMongo The next MongoDB driver for Kotlin

KtMongo's ObjectId and other BSON types can be serialized identically using:
β€’ The official library bson-kotlin
β€’ The official library bson-kotlinx
β€’ Our Multiplatform library bson-multiplatform

ktmongo.opensavvy.dev/api/-kotlin%...

06.03.2026 16:38 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Screenshot of https://dokka-mkdocs.opensavvy.dev/api/-library%20module/opensavvy.dokka.material.mkdocs.example/foo2.html

Screenshot of https://dokka-mkdocs.opensavvy.dev/api/-library%20module/opensavvy.dokka.material.mkdocs.example/foo2.html

Dokka for Material MkDocs 0.5.4 is out!

β€’ Kotlin 2.3.0
β€’ Gradle 9.2.1
β€’ Dokka 2.1.0
β€’ Native breadcrumb support

dokka-mkdocs.opensavvy.dev

01.03.2026 17:18 πŸ‘ 4 πŸ” 2 πŸ’¬ 0 πŸ“Œ 0
Preview
Query parameters - OpenSavvy Spine Share your Ktor endpoints between client and server

Spine 0.9.2 brings fixes for explicit null query parameters

Thanks again @skye.codes!

spine.opensavvy.dev/parameters.h...

21.02.2026 11:27 πŸ‘ 2 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
Preview
0.8.2 β€’ Kotlin 2.3.0 and documentation website improvements - Vite for Kotlin Use ViteJS in your Gradle and Kotlin projects

@vite.dev for @kotlinlang.org 0.8.2 now supports Kotlin 2.3.0!

We've also made a few improvements to the UX of the website.

vite-kotlin.opensavvy.dev/news/2026/02...

19.02.2026 19:29 πŸ‘ 5 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
2.4.0 β€’ Conditionally ignore tests and better stack traces for fixtures - OpenSavvy Prepared Magicless testing framework for Kotlin Multiplatform, featuring time management, parameterization and isolated fixtures.

Prepared 2.4.0 is out:

β€’ Conditionally ignore tests
β€’ Better exception handling of fixtures
β€’ Bug fixes

prepared.opensavvy.dev/news/2026/02...

14.02.2026 22:57 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

OpenSavvy ❀️ Arrow

10.02.2026 18:06 πŸ‘ 3 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0

Spine is really cool! If you’re looking for a great way of doing typesafe routing in Ktor check it out!

Now also with Arrow-kt support 😍

10.02.2026 07:38 πŸ‘ 5 πŸ” 1 πŸ’¬ 1 πŸ“Œ 1
Preview
OpenSavvy Spine Share your Ktor endpoints between client and server

Learn more: spine.opensavvy.dev

09.02.2026 21:18 πŸ‘ 3 πŸ” 0 πŸ’¬ 0 πŸ“Œ 1
		routeWithRaise(User.get) {
			val id = idOf(User)

			val user = dataLock.withLock("get $id") { data.find { it.id == id } }

			ensureNotNull(user) { NotFound(id) }

			respond(user)
		}

routeWithRaise(User.get) { val id = idOf(User) val user = dataLock.withLock("get $id") { data.find { it.id == id } } ensureNotNull(user) { NotFound(id) } respond(user) }

Spine 0.9.1 comes with bug fixes for #Arrow compatibility for typed #Ktor endpoints:

Thanks @skye.codes for the contribution!

09.02.2026 21:11 πŸ‘ 5 πŸ” 2 πŸ’¬ 2 πŸ“Œ 0
βœ— a: 
     βœ“ 0: 1
     βœ“ 1: 2
     βœ— 2: (field not present)
          "Bob"

check(a == b) { (a diff b) ?: "no diff" }
      | |  |
      | |  {"a": [1, 2, "Bob"]}
      | false
      {"a": [1, 2]}

βœ— a: βœ“ 0: 1 βœ“ 1: 2 βœ— 2: (field not present) "Bob" check(a == b) { (a diff b) ?: "no diff" } | | | | | {"a": [1, 2, "Bob"]} | false {"a": [1, 2]}

With KtMongo 0.26.0, easily compare two complex BSON documents or arrays

Particularly useful in tests to understand what changed!

ktmongo.opensavvy.dev

03.02.2026 18:22 πŸ‘ 2 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0

test("Multiple indices") {
	check(multiDoc().select<String>("$.a[0, 3][0:1:2]").toList() == listOf("a", "d"))
}

test("Multiple indices") { check(multiDoc().select<String>("$.a[0, 3][0:1:2]").toList() == listOf("a", "d")) }

With KtMongo 0.26.0, use complex JSONPath expressions to find data in your BSON documents!

ktmongo.opensavvy.dev

03.02.2026 18:18 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image

We can't view our own profile anymore though

28.01.2026 23:44 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Our domain name is now verified again!

28.01.2026 23:41 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Preview
opensavvy.bsky.social/ktmongo The next MongoDB driver for Kotlin

We're now on @tangled.org!

tangled.org/opensavvy.bs...

28.01.2026 20:26 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
All modules

Pedestal 3.2.0 adds:

β€’ 32-bit optimized EnumSet
β€’ Multiplatform weak references
β€’ Multiplatform weak value maps

pedestal.opensavvy.dev/api-docs/

07.01.2026 08:20 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
@Serializable
data class Test1(
	@field:BsonId
	val a: NameStrategyProfile,
)

@Serializable data class Test1( @field:BsonId val a: NameStrategyProfile, )

Starting in KtMongo 0.25.0, the KtMongo '/' notation recognizes KMongo's @BsonId and KotlinX.Serialization's @SerialName when using the KMongo compatibility module.

Users can add support for their own annotations by overriding PropertyNameStrategy. Learn more β†’ ktmongo.opensavvy.dev/api/-mongo-d...

30.12.2025 17:55 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image

We now provide a custom #Docker image specifically for compiling #GitLab CI pipelines in #Kotlin

gitlab-ci-kts.opensavvy.dev/tutorials/in...

27.12.2025 13:52 πŸ‘ 4 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

val document = context().write(bob)

val age: String = bobDoc() at BsonPath.parse("$.pets[1].age")

val document = context().write(bob) val age: String = bobDoc() at BsonPath.parse("$.pets[1].age")

In KtMongo 0.25.0, the new experimental BsonPath class allows extracting #MongoDB documents using #JSONPath queries!

Currently only a subset of the JSONPath syntax is supported, more will be added in coming versions. Send us your feedback!

ktmongo.opensavvy.dev/api/-kotlin%...

26.12.2025 16:54 πŸ‘ 3 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
0.7.0 β€’ Vite 8 beta support, experimental WasmJS support, bug fixes - Vite for Kotlin Use ViteJS in your Gradle and Kotlin projects

Vite for Kotlin 0.7.0 is out!

You can now use #vite 8 in your #kotlin projects, with experimental WasmJS support and important bug fixes!

vite-kotlin.opensavvy.dev/news/2025/12...

13.12.2025 10:43 πŸ‘ 3 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
			val dokka by job {
				image("openjdk")

				script {
					gradlew.task("dokkaHtmlMultiModule")
					shell("mv build/dokka/htmlMultiModule documentation")
				}

				artifacts {
					include("documentation")
					exposeAs("Documentation")
				}
			}

val dokka by job { image("openjdk") script { gradlew.task("dokkaHtmlMultiModule") shell("mv build/dokka/htmlMultiModule documentation") } artifacts { include("documentation") exposeAs("Documentation") } }

Kotlin is a great language for scripting, and has much better support in IDEs.

Use loops, built-in plugins (showcased: the Gradle plugin) and quality-of-life goodies, like automatic shell color highlighting!

03.12.2025 21:02 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
.gitlab-ci.main.kts Generate your GitLab CI pipeline with Kotlin.

Tired of writing your #GitLab CI in YAML?

With gitlab-ci.main.kts 0.7.2, you can write your GitLab CI in #Kotlin!

gitlab-ci-kts.opensavvy.dev

03.12.2025 21:00 πŸ‘ 2 πŸ” 1 πŸ’¬ 1 πŸ“Œ 0
Transitive resources for Kotlin Embed static resources in your Kotlin JS or multiplatform libraries.

Have you tried creating a Kotlin Multiplatform library module and discovered its src/xxxMain/resources files are not available in the downstream application modules?

Introducing the Kotlin Resource plugins 0.6.0 with Gradle 9 support and a brand new docs site!

kotlin-resources.opensavvy.dev

22.11.2025 13:57 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Code:

test("My test") {
    log(12 + 5) { "Important intermediary result" }
}

Output:

Β» Logged β€˜17’
  Important intermediary result
  log(12 + 5)
         |
         17

Code: test("My test") { log(12 + 5) { "Important intermediary result" } } Output: Β» Logged β€˜17’ Important intermediary result log(12 + 5) | 17

What if you could easily analyze intermediate values in your tests?

Learn how with Prepared and Power Assert β†’ prepared.opensavvy.dev/api/-suite/o...

11.11.2025 20:54 πŸ‘ 2 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
News - OpenSavvy Prepared Magicless testing framework for Kotlin Multiplatform, featuring time management, parameterization and isolated fixtures.

Prepared 2.2.0 is out!

Prepared is your favorite Kotlin test DSL: running on top of any framework, declare complex tests cases easily.

β€’ Improved inner-test logging
β€’ Kotest 6 support
β€’ TestBalloon 0.7.1 support

Read the full changelog β†’ prepared.opensavvy.dev/news/2025/11...

11.11.2025 20:49 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image

KtMongo 0.24.0 is out, with our new mascot, Mokodee!

This version contains new syntax sugar for $unset, and improvements to the documentation.

ktmongo.opensavvy.dev/news/2025/10...

22.10.2025 21:06 πŸ‘ 4 πŸ” 2 πŸ’¬ 2 πŸ“Œ 0

Hey everyone!

This is the new account for OpenSavvy news.

Learn more about us at opensavvy.dev

02.10.2025 17:29 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 1